diff --git a/.github/workflows/web-codestyle.yml b/.github/workflows/web-codestyle.yml new file mode 100644 index 00000000..df5e0185 --- /dev/null +++ b/.github/workflows/web-codestyle.yml @@ -0,0 +1,35 @@ +name: Web Codestyle + +on: + workflow_dispatch: + push: + branches: [ main ] + paths: + - '**/web/*.js' + - '**/web/*.ts' + - '.github/workflows/web-codestyle.yml' + pull_request: + branches: [ main, 'v[0-9]+.[0-9]+' ] + paths: + - '**/web/*.js' + - '**/web/*.ts' + - '.github/workflows/web-codestyle.yml' + +jobs: + check-web-codestyle: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Set up Node.js LTS + uses: actions/setup-node@v3 + with: + node-version: lts/* + + - name: Pre-build dependencies + run: npm install yarn + + - name: Run Binding Linter + run: yarn && yarn lint + working-directory: binding/web diff --git a/.github/workflows/web-demos.yml b/.github/workflows/web-demos.yml new file mode 100644 index 00000000..2e7de442 --- /dev/null +++ b/.github/workflows/web-demos.yml @@ -0,0 +1,41 @@ +name: Web Demos + +on: + workflow_dispatch: + push: + branches: [ main ] + paths: + - 'demo/web/**' + - '!demo/web/README.md' + - '.github/workflows/web-demos.yml' + pull_request: + branches: [ main, 'v[0-9]+.[0-9]+' ] + paths: + - 'demo/web/**' + - '!demo/web/README.md' + - '.github/workflows/web-demos.yml' + +defaults: + run: + working-directory: demo/web + +jobs: + build: + runs-on: ${{ matrix.machine }} + + strategy: + matrix: + machine: [pv-linux, pv-ios, pv-windows] + + steps: + - uses: actions/checkout@v3 + + - name: Install and build Web Binding + run: yarn && yarn copywasm && yarn build + working-directory: binding/web + + - name: Setup demo + run: yarn setup-demo http://${{secrets.PV_CICD_RES_SERVER_AUTHORITY}}/github/xpu/res/phi2-290.bin/latest/phi2-290.bin phi2-290.bin + + - name: Install dependencies + run: yarn install diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml new file mode 100644 index 00000000..9563e606 --- /dev/null +++ b/.github/workflows/web.yml @@ -0,0 +1,48 @@ +name: Web + +on: + workflow_dispatch: + push: + branches: [ main ] + paths: + - 'binding/web/**' + - '!binding/web/README.md' + - 'lib/wasm/**' + - '.github/workflows/web.yml' + pull_request: + branches: [ main, 'v[0-9]+.[0-9]+' ] + paths: + - 'binding/web/**' + - '!binding/web/README.md' + - 'lib/wasm/**' + - '.github/workflows/web.yml' + +defaults: + run: + working-directory: binding/web + +jobs: + build: + runs-on: ${{ matrix.machine }} + + strategy: + matrix: + machine: [pv-linux, pv-ios, pv-windows] + + steps: + - uses: actions/checkout@v3 + + - name: Install dependencies + run: yarn install + + - name: Copy libs + run: yarn copywasm + + - name: Build + run: yarn build + + - name: Prepare Test + run: yarn setup-test http://${{secrets.PV_CICD_RES_SERVER_AUTHORITY}}/github/picollm/res/phi2-290.bin/latest/phi2-290.bin phi2-290.bin + + - name: Test Web Worker + run: yarn test --env ACCESS_KEY=${{secrets.PV_VALID_ACCESS_KEY}} diff --git a/binding/web/.babelrc b/binding/web/.babelrc new file mode 100644 index 00000000..2fdda153 --- /dev/null +++ b/binding/web/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["@babel/preset-env"], + "plugins": ["@babel/plugin-transform-runtime"] +} diff --git a/binding/web/.eslintignore b/binding/web/.eslintignore new file mode 100644 index 00000000..2a3f354f --- /dev/null +++ b/binding/web/.eslintignore @@ -0,0 +1,5 @@ +node_modules +dist +lib +rollup.config.js +.eslintrc.js \ No newline at end of file diff --git a/binding/web/.eslintrc.js b/binding/web/.eslintrc.js new file mode 100644 index 00000000..b1d0ee17 --- /dev/null +++ b/binding/web/.eslintrc.js @@ -0,0 +1,470 @@ +// Rules reference: http://eslint.org/docs/rules/ +module.exports = { + env: { + browser: true, + node: true, + es6: true, + mocha: true + }, + + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 2018 + }, + + ignorePatterns: ['**/*.js', 'node_modules', 'dist'], + overrides: [ + { + files: ['src/**/*.ts'], + extends: ['plugin:@typescript-eslint/recommended'], + rules: { + '@typescript-eslint/no-parameter-properties': 2, + '@typescript-eslint/no-explicit-any': 0, + '@typescript-eslint/no-var-requires': 2, + '@typescript-eslint/no-non-null-assertion': 0, + '@typescript-eslint/no-use-before-define': 2, + '@typescript-eslint/camelcase': 0, + '@typescript-eslint/no-empty-interface': 2, + '@typescript-eslint/explicit-function-return-type': 2, + '@typescript-eslint/ban-ts-comment': 0, + '@typescript-eslint/no-empty-function': [2, { "allow": ["constructors"] }], + '@typescript-eslint/no-inferrable-types': [ + 2, + { + ignoreParameters: true, + ignoreProperties: true + } + ], + '@typescript-eslint/no-shadow': 2 + } + }, + { + files: ['test/**/*.ts', 'cypress/**/*.ts'], + extends: ['plugin:cypress/recommended'], + rules: { + 'no-unused-expressions': 0, + 'no-unused-vars': 0, + 'cypress/unsafe-to-chain-command': 0 + } + } + ], + + rules: { + //========================================================================= + //==================== Possible Errors ==================================== + //========================================================================= + + // disallow trailing commas in object literals + 'comma-dangle': [0, 'always-multiline'], //TODO: need discussion + // disallow assignment in conditional expressions + 'no-cond-assign': [2, 'always'], + // disallow use of console + 'no-console': 1, + // disallow use of constant expressions in conditions + 'no-constant-condition': [2, { checkLoops: false }], + // disallow control characters in regular expressions + 'no-control-regex': 2, + // disallow use of debugger + 'no-debugger': 2, + // disallow duplicate arguments in functions + 'no-dupe-args': 2, + // disallow duplicate keys when creating object literals + 'no-dupe-keys': 2, + // disallow a duplicate case label. + 'no-duplicate-case': 2, + // disallow the use of empty character classes in regular expressions + 'no-empty-character-class': 2, + // disallow empty statements + 'no-empty': 2, + // disallow assigning to the exception in a catch block + 'no-ex-assign': 2, + // disallow double-negation boolean casts in a boolean context + 'no-extra-boolean-cast': 2, + // disallow unnecessary parentheses + 'no-extra-parens': [2, 'functions'], + // disallow unnecessary semicolons + 'no-extra-semi': 2, + // disallow overwriting functions written as function declarations + 'no-func-assign': 2, + // disallow function or variable declarations in nested blocks + 'no-inner-declarations': 2, + // disallow invalid regular expression strings in the RegExp constructor + 'no-invalid-regexp': 2, + // disallow irregular whitespace outside of strings and comments + 'no-irregular-whitespace': 2, + // disallow negation of the left operand of an in expression + 'no-negated-in-lhs': 2, + // disallow the use of object properties of the global object (Math and JSON) as functions + 'no-obj-calls': 2, + // disallow multiple spaces in a regular expression literal + 'no-regex-spaces': 2, + // disallow sparse arrays + 'no-sparse-arrays': 2, + // Avoid code that looks like two expressions but is actually one + 'no-unexpected-multiline': 2, + // disallow unreachable statements after a return, throw, continue, or break statement + 'no-unreachable': 2, + // disallow comparisons with the value NaN + 'use-isnan': 2, + // ensure JSDoc comments are valid + 'valid-jsdoc': [ + 0, + { + requireReturn: false, + requireReturnDescription: false + } + ], + // ensure that the results of typeof are compared against a valid string + 'valid-typeof': 2, + + //========================================================================= + //==================== Best Practices ===================================== + //========================================================================= + // Enforces getter/setter pairs in objects + 'accessor-pairs': 2, + // treat var statements as if they were block scoped + 'block-scoped-var': 2, + // specify the maximum cyclomatic complexity allowed in a program + complexity: [0, 11], + // require return statements to either always or never specify values + 'consistent-return': 2, + // specify curly brace conventions for all control statements + curly: [2, 'multi-line'], + // require default case in switch statements + 'default-case': 2, + // encourages use of dot notation whenever possible + 'dot-notation': [2, { allowKeywords: true }], + // enforces consistent newlines before or after dots + 'dot-location': [2, 'property'], + // require the use of === and !== + eqeqeq: 2, + // make sure for-in loops have an if statement + 'guard-for-in': 2, + // disallow the use of alert, confirm, and prompt + 'no-alert': 2, + // disallow use of arguments.caller or arguments.callee + 'no-caller': 2, + // disallow lexical declarations in case clauses + 'no-case-declarations': 0, + // disallow division operators explicitly at beginning of regular expression + 'no-div-regex': 2, + // disallow else after a return in an if + 'no-else-return': 2, + // disallow use of empty destructuring patterns + 'no-empty-pattern': 2, + // disallow comparisons to null without a type-checking operator + 'no-eq-null': 2, + // disallow use of eval() + 'no-eval': 2, + // disallow adding to native types + 'no-extend-native': 2, + // disallow unnecessary function binding + 'no-extra-bind': 2, + // disallow fallthrough of case statements + 'no-fallthrough': 2, + // disallow the use of leading or trailing decimal points in numeric literals + 'no-floating-decimal': 2, + // disallow the type conversions with shorter notations + 'no-implicit-coercion': 2, + // disallow use of eval()-like methods + 'no-implied-eval': 2, + // disallow this keywords outside of classes or class-like objects + 'no-invalid-this': 0, + // disallow usage of __iterator__ property + 'no-iterator': 2, + // disallow use of labeled statements + 'no-labels': 2, + // disallow unnecessary nested blocks + 'no-lone-blocks': 2, + // disallow creation of functions within loops + 'no-loop-func': 2, + // disallow the use of magic numbers + 'no-magic-numbers': 0, //TODO: need discussion + // disallow use of multiple spaces + 'no-multi-spaces': 2, + // disallow use of multiline strings + 'no-multi-str': 2, + // disallow reassignments of native objects + 'no-native-reassign': 2, + // disallow use of new operator for Function object + 'no-new-func': 2, + // disallows creating new instances of String,Number, and Boolean + 'no-new-wrappers': 2, + // disallow use of new operator when not part of the assignment or comparison + 'no-new': 2, + // disallow use of octal escape sequences in string literals, such as + // var foo = "Copyright \251"; + 'no-octal-escape': 2, + // disallow use of (old style) octal literals + 'no-octal': 2, + // disallow reassignment of function parameters + 'no-param-reassign': 2, + // disallow use of process.env + 'no-process-env': 2, + // disallow usage of __proto__ property + 'no-proto': 2, + // disallow declaring the same variable more then once + 'no-redeclare': 2, + // disallow use of assignment in return statement + 'no-return-assign': 2, + // disallow use of `javascript:` urls. + 'no-script-url': 2, + // disallow comparisons where both sides are exactly the same + 'no-self-compare': 2, + // disallow use of comma operator + 'no-sequences': 2, + // restrict what can be thrown as an exception + 'no-throw-literal': 0, + // disallow usage of expressions in statement position + 'no-unused-expressions': 2, + // disallow unnecessary .call() and .apply() + 'no-useless-call': 2, + // disallow unnecessary concatenation of literals or template literals + 'no-useless-concat': 2, + // disallow use of void operator + 'no-void': 2, + // disallow usage of configurable warning terms in comments: e.g. todo + 'no-warning-comments': [ + 1, + { terms: ['todo', 'fixme', 'xxx'], location: 'start' } + ], + // disallow use of the with statement + 'no-with': 2, + // require use of the second argument for parseInt() + radix: 2, + // requires to declare all vars on top of their containing scope + 'vars-on-top': 0, + // require immediate function invocation to be wrapped in parentheses + 'wrap-iife': [2, 'any'], + // require or disallow Yoda conditions + yoda: 2, + + // //========================================================================= + // //==================== Strict Mode ======================================== + // //========================================================================= + // require that all functions are run in strict mode + // "strict": [2, "global"], + // + //========================================================================= + //==================== Variables ========================================== + //========================================================================= + // enforce or disallow variable initializations at definition + 'init-declarations': 0, + // disallow the catch clause parameter name being the same as a variable in the outer scope + 'no-catch-shadow': 0, + // disallow deletion of variables + 'no-delete-var': 2, + // disallow labels that share a name with a variable + 'no-label-var': 2, + // disallow shadowing of names such as arguments + 'no-shadow-restricted-names': 2, + // disallow declaration of variables already declared in the outer scope + 'no-shadow': 0, + // disallow use of undefined when initializing variables + 'no-undef-init': 0, + // disallow use of undeclared variables unless mentioned in a /*global */ block + 'no-undef': 2, + // disallow use of undefined variable + 'no-undefined': 0, + // disallow declaration of variables that are not used in the code + 'no-unused-vars': [1, { vars: 'local', args: 'after-used' }], + // disallow use of variables before they are defined + 'no-use-before-define': 2, + + //========================================================================= + //==================== Node.js ============================================ + //========================================================================= + // enforce return after a callback + 'callback-return': 0, + // disallow require() outside of the top-level module scope + 'global-require': 2, + // enforces error handling in callbacks (node environment) + 'handle-callback-err': 2, + // disallow mixing regular variable and require declarations + 'no-mixed-requires': 2, + // disallow use of new operator with the require function + 'no-new-require': 2, + // disallow string concatenation with __dirname and __filename + 'no-path-concat': 1, + // disallow process.exit() + 'no-process-exit': 2, + // restrict usage of specified node modules + 'no-restricted-modules': 0, + // disallow use of synchronous methods (off by default) + 'no-sync': 0, + + //========================================================================= + //==================== Stylistic Issues =================================== + //========================================================================= + // enforce spacing inside array brackets + 'array-bracket-spacing': 0, + // disallow or enforce spaces inside of single line blocks + 'block-spacing': 1, + // enforce one true brace style + 'brace-style': [1, '1tbs', { allowSingleLine: true }], + // require camel case names + camelcase: [1, { properties: 'always' }], + // enforce spacing before and after comma + 'comma-spacing': [1, { before: false, after: true }], + // enforce one true comma style + 'comma-style': [1, 'last'], + // require or disallow padding inside computed properties + 'computed-property-spacing': 0, + // enforces consistent naming when capturing the current execution context + 'consistent-this': 0, + // enforce newline at the end of file, with no multiple empty lines + 'eol-last': 1, + // require function expressions to have a name + 'func-names': 0, + // enforces use of function declarations or expressions + 'func-style': 0, + // this option enforces minimum and maximum identifier lengths (variable names, property names etc.) + 'id-length': 0, + // require identifiers to match the provided regular expression + 'id-match': 0, + // this option sets a specific tab width for your code + indent: [1, 2, { SwitchCase: 1 }], + // specify whether double or single quotes should be used in JSX attributes + 'jsx-quotes': [1, 'prefer-double'], + // enforces spacing between keys and values in object literal properties + 'key-spacing': [1, { beforeColon: false, afterColon: true }], + // disallow mixed "LF" and "CRLF" as linebreaks + 'linebreak-style': 0, + // enforces empty lines around comments + 'lines-around-comment': 0, + // specify the maximum depth that blocks can be nested + 'max-depth': [0, 4], + // specify the maximum length of a line in your program + 'max-len': [0, 80, 4], + // specify the maximum depth callbacks can be nested + 'max-nested-callbacks': 0, + // limits the number of parameters that can be used in the function declaration. + 'max-params': [0, 3], + // specify the maximum number of statement allowed in a function + 'max-statements': [0, 10], + // require a capital letter for constructors + 'new-cap': [1, { newIsCap: true }], + // disallow the omission of parentheses when invoking a constructor with no arguments + 'new-parens': 0, + // allow/disallow an empty newline after var statement + 'newline-after-var': 0, + // disallow use of the Array constructor + 'no-array-constructor': 0, + // disallow use of bitwise operators + 'no-bitwise': 0, + // disallow use of the continue statement + 'no-continue': 0, + // disallow comments inline after code + 'no-inline-comments': 0, + // disallow if as the only statement in an else block + 'no-lonely-if': 0, + // disallow mixed spaces and tabs for indentation + 'no-mixed-spaces-and-tabs': 1, + // disallow multiple empty lines + 'no-multiple-empty-lines': [1, { max: 2, maxEOF: 1 }], + // disallow negated conditions + 'no-negated-condition': 0, + // disallow nested ternary expressions + 'no-nested-ternary': 1, + // disallow use of the Object constructor + 'no-new-object': 1, + // disallow use of unary operators, ++ and -- + 'no-plusplus': 0, + // disallow use of certain syntax in code + 'no-restricted-syntax': 0, + // disallow space between function identifier and application + 'no-spaced-func': 1, + // disallow the use of ternary operators + 'no-ternary': 0, + // disallow trailing whitespace at the end of lines + 'no-trailing-spaces': 1, + // disallow dangling underscores in identifiers + 'no-underscore-dangle': 0, + // disallow the use of Boolean literals in conditional expressions + 'no-unneeded-ternary': 0, + // require or disallow padding inside curly braces + 'object-curly-spacing': ["error", "always"], + // allow just one var statement per function + 'one-var': [1, 'never'], + // require assignment operator shorthand where possible or prohibit it entirely + 'operator-assignment': 0, + // enforce operators to be placed before or after line breaks + 'operator-linebreak': 0, + // enforce padding within blocks + 'padded-blocks': [1, 'never'], + // require quotes around object literal property names + 'quote-props': 0, + // specify whether double or single quotes should be used + quotes: 0, + // Require JSDoc comment + 'require-jsdoc': 0, + // enforce spacing before and after semicolons + 'semi-spacing': [1, { before: false, after: true }], + // require or disallow use of semicolons instead of ASI + semi: [1, 'always'], + // sort variables within the same declaration block + 'sort-vars': 0, + // require a space after certain keywords + 'keyword-spacing': 1, + // require or disallow space before blocks + 'space-before-blocks': 1, + // require or disallow space before function opening parenthesis + 'space-before-function-paren': [0, { anonymous: 'always', named: 'never' }], + // require or disallow space before blocks + 'space-in-parens': 0, + // require spaces around operators + 'space-infix-ops': 1, + // Require or disallow spaces before/after unary operators + 'space-unary-ops': 0, + // require or disallow a space immediately following the // or /* in a comment + 'spaced-comment': [ + 1, + 'always', + { + exceptions: ['-', '+', '/', '='], + markers: ['=', '!', '/'] // space here to support sprockets directives + } + ], + // require regex literals to be wrapped in parentheses + 'wrap-regex': 0, + + //========================================================================= + //==================== ES6 Rules ========================================== + //========================================================================= + 'arrow-body-style': [1, 'as-needed'], + // require parens in arrow function arguments + 'arrow-parens': [1, 'as-needed'], + // require space before/after arrow function"s arrow + 'arrow-spacing': 1, + // verify super() callings in constructors + 'constructor-super': 1, + // enforce the spacing around the * in generator functions + 'generator-star-spacing': 1, + // disallow arrow functions where a condition is expected + 'no-confusing-arrow': 1, + // disallow modifying variables of class declarations + 'no-class-assign': 1, + // disallow modifying variables that are declared using const + 'no-const-assign': 1, + // disallow duplicate name in class members + 'no-dupe-class-members': 1, + // disallow to use this/super before super() calling in constructors. + 'no-this-before-super': 1, + // require let or const instead of var + 'no-var': 0, //TODO: enable on full migration to es6 + // require method and property shorthand syntax for object literals + 'object-shorthand': 0, + // suggest using arrow functions as callbacks + 'prefer-arrow-callback': 0, //TODO: enable on full migration to es6 + // suggest using of const declaration for variables that are never modified after declared + 'prefer-const': 0, //TODO: enable on full migration to es6 + // suggest using Reflect methods where applicable + 'prefer-reflect': 0, + // suggest using the spread operator instead of .apply() + 'prefer-spread': 0, + // suggest using template literals instead of strings concatenation + 'prefer-template': 0, //TODO: enable on full migration to es6 + // disallow generator functions that do not have yield + 'require-yield': 0 + } +}; diff --git a/binding/web/.gitignore b/binding/web/.gitignore new file mode 100644 index 00000000..9b03e8d8 --- /dev/null +++ b/binding/web/.gitignore @@ -0,0 +1,7 @@ +node_modules +dist +lib/* +!lib/.gitkeep +test/*.bin +.idea/ +test_data.jsons \ No newline at end of file diff --git a/binding/web/.npmignore b/binding/web/.npmignore new file mode 100644 index 00000000..7a863b77 --- /dev/null +++ b/binding/web/.npmignore @@ -0,0 +1,7 @@ +.idea +node_modules +.DS_Store +test +lib +keywords +cypress diff --git a/binding/web/.prettierignore b/binding/web/.prettierignore new file mode 100644 index 00000000..3a4cc450 --- /dev/null +++ b/binding/web/.prettierignore @@ -0,0 +1,2 @@ +.eslintrc.js +src/wasm/pv_octopus* diff --git a/binding/web/.prettierrc b/binding/web/.prettierrc new file mode 100644 index 00000000..8a9f3802 --- /dev/null +++ b/binding/web/.prettierrc @@ -0,0 +1,8 @@ +{ + "semi": true, + "trailingComma": "es5", + "singleQuote": true, + "printWidth": 80, + "tabWidth": 2, + "arrowParens": "avoid" +} diff --git a/binding/web/README.md b/binding/web/README.md new file mode 100644 index 00000000..4ef8a7a4 --- /dev/null +++ b/binding/web/README.md @@ -0,0 +1 @@ +# picoLLM Binding for Web diff --git a/binding/web/cypress.config.ts b/binding/web/cypress.config.ts new file mode 100644 index 00000000..cd9bd0ff --- /dev/null +++ b/binding/web/cypress.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'cypress'; + +export default defineConfig({ + env: {}, + e2e: { + defaultCommandTimeout: 1000000, + supportFile: 'cypress/support/index.ts', + specPattern: 'test/*.test.{js,jsx,ts,tsx}', + video: false, + screenshotOnRunFailure: false, + }, +}); diff --git a/binding/web/cypress/fixtures/.gitkeep b/binding/web/cypress/fixtures/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/binding/web/cypress/support/commands.ts b/binding/web/cypress/support/commands.ts new file mode 100644 index 00000000..8070660b --- /dev/null +++ b/binding/web/cypress/support/commands.ts @@ -0,0 +1,20 @@ +Cypress.Commands.add('readFiles', (files: string[]) => { + const chunks: any[] = []; + + for (const file of files) { + for (let i = 0; i < 5; i++) { + try { + cy.readFile(file, null, { timeout: 30000 }).then(chunk => { + chunks.push(new Blob([chunk])); + }); + break; + } catch (e) { + // silently fail and try again + // eslint-disable-next-line cypress/no-unnecessary-waiting + cy.wait(500); + } + } + } + + cy.then(() => chunks); +}); diff --git a/binding/web/cypress/support/component-index.html b/binding/web/cypress/support/component-index.html new file mode 100644 index 00000000..b90d95a0 --- /dev/null +++ b/binding/web/cypress/support/component-index.html @@ -0,0 +1,12 @@ + + + + + + + Components App + + +
+ + diff --git a/binding/web/cypress/support/index.ts b/binding/web/cypress/support/index.ts new file mode 100644 index 00000000..8d54d128 --- /dev/null +++ b/binding/web/cypress/support/index.ts @@ -0,0 +1,9 @@ +import './commands'; + +declare global { + namespace Cypress { + interface Chainable { + readFiles(files: string[]): Chainable; + } + } +} diff --git a/binding/web/cypress/tsconfig.json b/binding/web/cypress/tsconfig.json new file mode 100644 index 00000000..fb78f5f3 --- /dev/null +++ b/binding/web/cypress/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "types": ["cypress", "node"] + }, + "include": [ + "../test/**/*.ts", + "./**/*.ts" + ], + "exclude": [] +} diff --git a/binding/web/lib/.gitkeep b/binding/web/lib/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/binding/web/module.d.ts b/binding/web/module.d.ts new file mode 100644 index 00000000..af7897a8 --- /dev/null +++ b/binding/web/module.d.ts @@ -0,0 +1,9 @@ +declare module "*.wasm" { + const content: string; + export default content; +} + +declare module 'web-worker:*' { + const WorkerFactory: new () => Worker; + export default WorkerFactory; +} diff --git a/binding/web/package.json b/binding/web/package.json new file mode 100644 index 00000000..38a4e88a --- /dev/null +++ b/binding/web/package.json @@ -0,0 +1,69 @@ +{ + "name": "@picovoice/picollm-web", + "description": "", + "author": "Picovoice Inc", + "license": "Apache-2.0", + "version": "0.1.0", + "keywords": [ + "web", + "voice", + "speech", + "recognition", + "ai", + "offline", + "dom", + "llm" + ], + "entry": "src/index.ts", + "module": "dist/esm/index.js", + "iife": "dist/iife/index.js", + "types": "dist/types/index.d.ts", + "scripts": { + "build:all": "rollup --config", + "build:types": "tsc --declaration --declarationMap --emitDeclarationOnly --outDir ./dist/types", + "build": "npm-run-all --parallel build:**", + "lint": "eslint . --ext .js,.ts", + "prepack": "npm-run-all build", + "start": "cross-env TARGET='debug' rollup --config --watch", + "watch": "rollup --config --watch", + "format": "prettier --write \"**/*.{js,ts,json}\"", + "copywasm": "node scripts/copy_wasm.js", + "setup-test": "node scripts/setup_test.js", + "test": "cypress run --spec test/picollm.test.ts --browser chrome --headed" + }, + "dependencies": { + "@picovoice/web-utils": "~1.4.0" + }, + "devDependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-runtime": "^7.21.0", + "@babel/preset-env": "^7.20.2", + "@babel/runtime": "^7.21.0", + "@rollup/plugin-babel": "^6.0.3", + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-node-resolve": "^15.0.1", + "@rollup/plugin-terser": "^0.4.0", + "@rollup/pluginutils": "^5.0.2", + "@types/node": "^18.11.9", + "@types/pv-xpu-web-worker": "../../lib/wasm/dist/types/xpu_web_worker", + "@typescript-eslint/eslint-plugin": "^5.51.0", + "@typescript-eslint/parser": "^5.51.0", + "async-mutex": "^0.4.0", + "cross-env": "^7.0.3", + "cypress": "^12.8.1", + "eslint": "^8.22.0", + "eslint-plugin-cypress": "^2.12.1", + "npm-run-all": "^4.1.5", + "prettier": "^2.8.3", + "pv-xpu-web-worker": "../../lib/wasm/dist/xpu_web_worker/esm", + "rollup": "^2.79.1", + "rollup-plugin-typescript2": "^0.34.1", + "rollup-plugin-web-worker-loader": "^1.6.1", + "tslib": "^2.5.0", + "typescript": "^4.9.5", + "wasm-feature-detect": "^1.5.0" + }, + "engines": { + "node": ">=16" + } +} diff --git a/binding/web/rollup.config.js b/binding/web/rollup.config.js new file mode 100644 index 00000000..813c7a38 --- /dev/null +++ b/binding/web/rollup.config.js @@ -0,0 +1,75 @@ +'use strict'; +const path = require('path'); +const { nodeResolve } = require('@rollup/plugin-node-resolve'); +const commonjs = require('@rollup/plugin-commonjs'); +const typescript = require('rollup-plugin-typescript2'); +const workerLoader = require('rollup-plugin-web-worker-loader'); +const pkg = require('./package.json'); +const { babel } = require('@rollup/plugin-babel'); +const terser = require('@rollup/plugin-terser'); +const { DEFAULT_EXTENSIONS } = require('@babel/core'); +const { base64 } = require('@picovoice/web-utils/plugins'); + +const extensions = [...DEFAULT_EXTENSIONS, '.ts']; + +console.log(process.env.TARGET); +console.log(extensions); + +function capitalizeFirstLetter(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} + +const iifeBundleName = pkg.name + .split('@picovoice/')[1] + .split('-') + .map(word => capitalizeFirstLetter(word)) + .join(''); +console.log(iifeBundleName); + +export default { + input: [path.resolve(__dirname, pkg.entry)], + output: [ + { + file: path.resolve(__dirname, pkg.module), + format: 'esm', + sourcemap: false, + }, + { + file: path.resolve(__dirname, 'dist', 'esm', 'index.min.js'), + format: 'esm', + sourcemap: false, + plugins: [terser()], + }, + { + file: path.resolve(__dirname, pkg.iife), + format: 'iife', + name: iifeBundleName, + sourcemap: false, + }, + { + file: path.resolve(__dirname, 'dist', 'iife', 'index.min.js'), + format: 'iife', + name: iifeBundleName, + sourcemap: false, + plugins: [terser()], + }, + ], + plugins: [ + nodeResolve({ extensions }), + commonjs(), + workerLoader({ targetPlatform: 'browser', sourcemap: false }), + typescript({ + typescript: require('typescript'), + cacheRoot: path.resolve(__dirname, '.rts2_cache'), + clean: true, + }), + babel({ + extensions: extensions, + babelHelpers: 'runtime', + exclude: '**/node_modules/**', + }), + base64({ + include: ['./lib/**/*.wasm'], + }) + ], +}; diff --git a/binding/web/scripts/copy_wasm.js b/binding/web/scripts/copy_wasm.js new file mode 100644 index 00000000..899ac2c6 --- /dev/null +++ b/binding/web/scripts/copy_wasm.js @@ -0,0 +1,33 @@ +const fs = require("fs"); +const { join } = require("path"); + +const wasmFiles = [ + "pv_picollm.wasm", + "pv_picollm_simd.wasm", + "pv_picollm_web_worker_helper.wasm", + "pv_picollm_web_worker_helper_simd.wasm", +] + +console.log("Copying the WASM model..."); + +const sourceDirectory = join( + __dirname, + "..", + "..", + "..", + "lib", + "wasm" +); + +const outputDirectory = join(__dirname, "..", "lib"); + +try { + fs.mkdirSync(outputDirectory, { recursive: true }); + wasmFiles.forEach(file => { + fs.copyFileSync(join(sourceDirectory, file), join(outputDirectory, file)) + }) +} catch (error) { + console.error(error); +} + +console.log("... Done!"); diff --git a/binding/web/scripts/setup_test.js b/binding/web/scripts/setup_test.js new file mode 100644 index 00000000..3499dbf0 --- /dev/null +++ b/binding/web/scripts/setup_test.js @@ -0,0 +1,56 @@ +const http = require('http'); +const fs = require('fs'); +const path = require('path'); + +const chunkSize = 1024 * 1024 * 128; // 128MB + +const url = process.argv[2]; +const fileName = process.argv[3]; +const splitFile = path.parse(fileName); +const outputFile = path.join(__dirname, '..', 'test', splitFile.name); + +console.log(`Downloading file...`); + +http.get(url, res => { + let currentChunkSize = 0; + let currentChunk = 0; + + const testData = { + modelName: splitFile.name, + modelFiles: [], + }; + + let modelFileName = `${outputFile}-${currentChunk}${splitFile.ext}`; + let modelFile = fs.createWriteStream(modelFileName); + testData.modelFiles.push(modelFileName); + + res.on('data', chunk => { + if (currentChunkSize + chunk.length > chunkSize) { + modelFile.close(); + currentChunk += 1; + currentChunkSize = 0; + + modelFileName = `${outputFile}-${currentChunk}${splitFile.ext}`; + modelFile = fs.createWriteStream(modelFileName); + testData.modelFiles.push(modelFileName); + } + + modelFile.write(chunk); + currentChunkSize += chunk.length; + }); + + res.on('end', () => { + modelFile.close(); + console.log('Download Complete!'); + + const jsonTestData = JSON.stringify(testData); + const jsonTestFile = path.join(__dirname, '..', 'test', 'test_data.json'); + fs.writeFile(jsonTestFile, jsonTestData, err => { + if (err) { + console.error('Error writing test JSON file:', err); + return; + } + console.log('Test JSON file has been saved successfully!'); + }); + }); +}); diff --git a/binding/web/src/index.ts b/binding/web/src/index.ts new file mode 100644 index 00000000..c4a31256 --- /dev/null +++ b/binding/web/src/index.ts @@ -0,0 +1,23 @@ +import { PicoLLM } from './picollm'; + +import { + PicoLLMInitOptions, + PicoLLMGenerateOptions, + PicoLLMModel, +} from './types'; + +import picoLLMWasm from '../lib/pv_picollm.wasm'; +import picoLLMWasmSimd from '../lib/pv_picollm_simd.wasm'; + +import * as PicoLLMErrors from './picollm_errors'; + +PicoLLM.setWasm(picoLLMWasm); +PicoLLM.setWasmSimd(picoLLMWasmSimd); + +export { + PicoLLM, + PicoLLMGenerateOptions, + PicoLLMInitOptions, + PicoLLMModel, + PicoLLMErrors, +}; diff --git a/binding/web/src/picollm.ts b/binding/web/src/picollm.ts new file mode 100644 index 00000000..cb05d51c --- /dev/null +++ b/binding/web/src/picollm.ts @@ -0,0 +1,1366 @@ +/* + Copyright 2024 Picovoice Inc. + + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" + file accompanying this source. + + 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. +*/ + +/* eslint camelcase: 0 */ + +import { Mutex } from 'async-mutex'; + +import { + aligned_alloc_type, + arrayBufferToStringAtIndex, + base64ToUint8Array, + buildWasm, + isAccessKeyValid, + pv_free_type, + PvError, + unsignedAddress, +} from '@picovoice/web-utils'; + +import { simd } from 'wasm-feature-detect'; + +import initXpu from 'pv-xpu-web-worker'; + +import { + PicoLLMModel, + PvStatus, + PicoLLMCompletion, + PicoLLMInitOptions, + PicoLLMGenerateOptions, + PicoLLMUsage, + PicoLLMEndpoint, + PicoLLMCompletionToken, + PicoLLMToken, +} from './types'; + +import * as PicoLLMErrors from './picollm_errors'; +import { pvStatusToException } from './picollm_errors'; + +import picoLLMWebWorkerHelper from '../lib/pv_picollm_web_worker_helper.wasm'; +import picoLLMWebWorkerHelperSimd from '../lib/pv_picollm_web_worker_helper_simd.wasm'; +import { loadModel } from './utils'; + +export class PicoLLMStreamCallback { + private _wasmMemory: WebAssembly.Memory | undefined; + + private _userCallback?: (token: string) => void; + + public constructor(memory: WebAssembly.Memory) { + this._wasmMemory = memory; + } + + public release(): void { + this._wasmMemory = undefined; + } + + public setUserCallback(userCallback?: (token: string) => void): void { + this._userCallback = userCallback; + } + + public streamCallbackWasm = (tokenAddress: number): void => { + if (this._wasmMemory === undefined) { + return; + } + + const tokenAddressUnsigned = unsignedAddress(tokenAddress); + const memoryBufferUint8 = new Uint8Array(this._wasmMemory.buffer); + const token = arrayBufferToStringAtIndex( + memoryBufferUint8, + tokenAddressUnsigned + ); + if (this._userCallback) { + this._userCallback(token); + } + }; +} + +/** + * WebAssembly function types + */ +type pv_picollm_init_type = ( + accessKey: number, + modelPath: number, + device: number, + object: number +) => Promise; +type pv_picollm_delete_type = (object: number) => Promise; +type pv_picollm_generate_type = ( + object: number, + prompt: number, + completionTokenLimit: number, + stopPhrases: number, + numStopPhrases: number, + seed: number, + presencePenalty: number, + frequencyPenalty: number, + temperature: number, + topP: number, + num_top_choices: number, + stream_callback: number, + usage: number, + endpoint: number, + completion_tokens: number, + num_completion_tokens: number, + completion: number +) => Promise; +type pv_picollm_delete_completion_tokens_type = ( + object: number, + numCompletionTokens: number +) => Promise; +type pv_picollm_delete_completion_type = (completion: number) => Promise; +type pv_picollm_tokenize_type = ( + object: number, + text: number, + bos: boolean, + eos: boolean, + numTokens: number, + tokens: number +) => Promise; +type pv_picollm_delete_tokens_type = (tokens: number) => Promise; +type pv_picollm_forward_type = ( + object: number, + token: number, + numLogits: number, + logits: number +) => Promise; +type pv_picollm_delete_logits_type = (logits: number) => Promise; +type pv_picollm_reset_type = (object: number) => Promise; +type pv_picollm_model_type = (object: number, model: number) => Promise; +type pv_picollm_context_length_type = ( + object: number, + contextLength: number +) => Promise; +type pv_picollm_version_type = () => Promise; +type pv_picollm_max_top_choices_type = () => Promise; +type pv_picollm_list_hardware_devices_type = ( + hardwareDevices: number, + numHardwareDevices: number +) => Promise; +type pv_picollm_free_hardware_devices_type = ( + hardwareDevices: number, + numHardwareDevices: number +) => Promise; +type pv_set_sdk_type = (sdk: number) => Promise; +type pv_get_error_stack_type = ( + messageStack: number, + messageStackDepth: number +) => Promise; +type pv_free_error_stack_type = (messageStack: number) => Promise; + +/** + * JavaScript/WebAssembly Binding for picoLLM. + */ + +type PicoLLMWasmOutput = { + aligned_alloc: aligned_alloc_type; + memory: WebAssembly.Memory; + pvFree: pv_free_type; + + contextLength: number; + maxTopChoices: number; + model: string; + version: string; + streamCallback: PicoLLMStreamCallback; + + objectAddress: number; + messageStackAddressAddressAddress: number; + messageStackDepthAddress: number; + + pvPicoLLMDelete: pv_picollm_delete_type; + pvPicoLLMGenerate: pv_picollm_generate_type; + pvPicoLLMDeleteCompletionTokens: pv_picollm_delete_completion_tokens_type; + pvPicoLLMDeleteCompletion: pv_picollm_delete_completion_type; + pvPicoLLMTokenize: pv_picollm_tokenize_type; + pvPicoLLMDeleteTokens: pv_picollm_delete_tokens_type; + pvPicoLLMForward: pv_picollm_forward_type; + pvPicoLLMDeleteLogits: pv_picollm_delete_logits_type; + pvPicoLLMReset: pv_picollm_reset_type; + pvGetErrorStack: pv_get_error_stack_type; + pvFreeErrorStack: pv_free_error_stack_type; +}; + +const DEFAULT_DEVICE = 'cpu:1'; + +export class PicoLLM { + private readonly _pvPicoLLMDelete: pv_picollm_delete_type; + private readonly _pvPicoLLMGenerate: pv_picollm_generate_type; + private readonly _pvPicoLLMDeleteCompletionTokens: pv_picollm_delete_completion_tokens_type; + private readonly _pvPicoLLMDeleteCompletion: pv_picollm_delete_completion_type; + private readonly _pvPicoLLMTokenize: pv_picollm_tokenize_type; + private readonly _pvPicoLLMDeleteTokens: pv_picollm_delete_tokens_type; + private readonly _pvPicoLLMForward: pv_picollm_forward_type; + private readonly _pvPicoLLMDeleteLogits: pv_picollm_delete_logits_type; + private readonly _pvPicoLLMReset: pv_picollm_reset_type; + private readonly _pvGetErrorStack: pv_get_error_stack_type; + private readonly _pvFreeErrorStack: pv_free_error_stack_type; + + private _wasmMemory: WebAssembly.Memory | undefined; + private readonly _aligned_alloc: aligned_alloc_type; + private readonly _pvFree: pv_free_type; + private readonly _functionMutex: Mutex; + + private readonly _objectAddress: number; + private readonly _messageStackAddressAddressAddress: number; + private readonly _messageStackDepthAddress: number; + + private readonly _contextLength: number; + private readonly _maxTopChoices: number; + private readonly _model: string; + private readonly _version: string; + private readonly _streamCallback: PicoLLMStreamCallback; + + private static _wasm: string; + private static _wasmSimd: string; + private static _sdk: string = 'web'; + + private static _picoLLMMutex = new Mutex(); + + private constructor(handleWasm: PicoLLMWasmOutput) { + this._contextLength = handleWasm.contextLength; + this._maxTopChoices = handleWasm.maxTopChoices; + this._model = handleWasm.model; + this._version = handleWasm.version; + this._streamCallback = handleWasm.streamCallback; + + this._pvPicoLLMDelete = handleWasm.pvPicoLLMDelete; + this._pvPicoLLMGenerate = handleWasm.pvPicoLLMGenerate; + this._pvPicoLLMDeleteCompletionTokens = + handleWasm.pvPicoLLMDeleteCompletionTokens; + this._pvPicoLLMDeleteCompletion = handleWasm.pvPicoLLMDeleteCompletion; + this._pvPicoLLMTokenize = handleWasm.pvPicoLLMTokenize; + this._pvPicoLLMDeleteTokens = handleWasm.pvPicoLLMDeleteTokens; + this._pvPicoLLMForward = handleWasm.pvPicoLLMForward; + this._pvPicoLLMDeleteLogits = handleWasm.pvPicoLLMDeleteLogits; + this._pvPicoLLMReset = handleWasm.pvPicoLLMReset; + + this._pvGetErrorStack = handleWasm.pvGetErrorStack; + this._pvFreeErrorStack = handleWasm.pvFreeErrorStack; + + this._wasmMemory = handleWasm.memory; + this._pvFree = handleWasm.pvFree; + this._aligned_alloc = handleWasm.aligned_alloc; + + this._functionMutex = new Mutex(); + + this._objectAddress = handleWasm.objectAddress; + this._messageStackAddressAddressAddress = + handleWasm.messageStackAddressAddressAddress; + this._messageStackDepthAddress = handleWasm.messageStackDepthAddress; + } + + /** + * Get model's context length. + */ + get contextLength(): number { + return this._contextLength; + } + + /** + * Get maximum number of top choices for generate. + */ + get maxTopChoices(): number { + return this._maxTopChoices; + } + + /** + * Get the model's name. + */ + get model(): string { + return this._model; + } + + /** + * Get PicoLLM version. + */ + get version(): string { + return this._version; + } + + public static setSdk(sdk: string): void { + PicoLLM._sdk = sdk; + } + + /** + * Creates an instance of PicoLLM. + * + * @param accessKey + * @param model + * @param options Optional init configuration arguments, see PicoLLMInitOptions for details. + * + * @returns An instance of the PicoLLM. + */ + public static async create( + accessKey: string, + model: PicoLLMModel, + options: PicoLLMInitOptions = {} + ): Promise { + const modelPath = await loadModel(model); + + return this._init(accessKey, modelPath, options); + } + + /** + * Set base64 wasm file. + * @param wasm Base64'd wasm file to use to initialize wasm. + */ + public static setWasm(wasm: string): void { + if (this._wasm === undefined) { + this._wasm = wasm; + } + } + + /** + * Set base64 wasm file with SIMD feature. + * @param wasmSimd Base64'd wasm file to use to initialize wasm. + */ + public static setWasmSimd(wasmSimd: string): void { + if (this._wasmSimd === undefined) { + this._wasmSimd = wasmSimd; + } + } + + private static async _init( + accessKey: string, + modelPath: string, + options: PicoLLMInitOptions = {} + ): Promise { + const { device = DEFAULT_DEVICE } = options; + + if (!isAccessKeyValid(accessKey)) { + throw new PicoLLMErrors.PicoLLMInvalidArgumentError('Invalid AccessKey'); + } + + return new Promise((resolve, reject) => { + PicoLLM._picoLLMMutex + .runExclusive(async () => { + const isSimd = await simd(); + const wasmOutput = await PicoLLM.initWasm( + isSimd ? this._wasmSimd : this._wasm, + accessKey, + modelPath, + device + ); + return new PicoLLM(wasmOutput); + }) + .then((result: PicoLLM) => { + resolve(result); + }) + .catch((error: any) => { + reject(error); + }); + }); + } + + /** + * + */ + public async generate( + prompt: string, + options: PicoLLMGenerateOptions = {} + ): Promise { + const { + completionTokenLimit = -1, + stopPhrases = [], + seed = -1, + presencePenalty = 0, + frequencyPenalty = 0, + temperature = 0, + topP = 1, + numTopChoices = 0, + streamCallback, + } = options; + + this._streamCallback.setUserCallback(streamCallback); + + return new Promise((resolve, reject) => { + this._functionMutex + .runExclusive(async () => { + if (this._wasmMemory === undefined) { + throw new PicoLLMErrors.PicoLLMInvalidStateError( + 'Attempted to call PicoLLM generate after release.' + ); + } + + let memoryBufferUint8 = new Uint8Array(this._wasmMemory.buffer); + + const promptAddress = await this._aligned_alloc( + Uint8Array.BYTES_PER_ELEMENT, + (prompt.length + 1) * Uint8Array.BYTES_PER_ELEMENT + ); + if (promptAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for prompt' + ); + } + for (let i = 0; i < prompt.length; i++) { + memoryBufferUint8[promptAddress + i] = prompt.charCodeAt(i); + } + memoryBufferUint8[promptAddress + prompt.length] = 0; + + const stopPhrasesAddressAddress = + stopPhrases.length === 0 + ? 0 + : await this._aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + stopPhrases.length * Int32Array.BYTES_PER_ELEMENT + ); + + const stopPhrasesAddressList: number[] = []; + for (const stopPhrase of stopPhrases) { + const stopPhrasesEncoded = new TextEncoder().encode(stopPhrase); + const stopPhraseAddress = await this._aligned_alloc( + Uint8Array.BYTES_PER_ELEMENT, + (stopPhrasesEncoded.length + 1) * Uint8Array.BYTES_PER_ELEMENT + ); + if (stopPhraseAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for stopPhrase' + ); + } + memoryBufferUint8.set(stopPhrasesEncoded, stopPhraseAddress); + memoryBufferUint8[ + stopPhraseAddress + stopPhrasesEncoded.length + ] = 0; + stopPhrasesAddressList.push(stopPhraseAddress); + } + + const memoryBufferInt32 = new Int32Array(this._wasmMemory.buffer); + if (stopPhrasesAddressAddress > 0) { + memoryBufferInt32.set( + new Int32Array(stopPhrasesAddressList), + stopPhrasesAddressAddress / Int32Array.BYTES_PER_ELEMENT + ); + } + + const usageAddress = await this._aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT * 2 + ); + if (usageAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for usage' + ); + } + + const endpointAddress = await this._aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (endpointAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for endpoint' + ); + } + + const numCompletionTokensAddress = await this._aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (numCompletionTokensAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for numCompletionTokens' + ); + } + + const completionTokensAddressAddress = await this._aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (completionTokensAddressAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for completionTokens' + ); + } + + const completionAddressAddress = await this._aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (completionAddressAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for completion' + ); + } + + const status = await this._pvPicoLLMGenerate( + this._objectAddress, + promptAddress, + completionTokenLimit, + stopPhrasesAddressAddress, + stopPhrasesAddressList.length, + seed, + presencePenalty, + frequencyPenalty, + temperature, + topP, + numTopChoices, + 0, + usageAddress, + endpointAddress, + completionTokensAddressAddress, + numCompletionTokensAddress, + completionAddressAddress + ); + + memoryBufferUint8 = new Uint8Array(this._wasmMemory.buffer); + await this._pvFree(promptAddress); + await this._pvFree(stopPhrasesAddressAddress); + for (const stopPhraseAddress of stopPhrasesAddressList) { + await this._pvFree(stopPhraseAddress); + } + + const memoryBufferView = new DataView(this._wasmMemory.buffer); + if (status !== PvStatus.SUCCESS) { + const messageStack = await PicoLLM.getMessageStack( + this._pvGetErrorStack, + this._pvFreeErrorStack, + this._messageStackAddressAddressAddress, + this._messageStackDepthAddress, + memoryBufferView, + memoryBufferUint8 + ); + + throw pvStatusToException(status, 'Generate failed', messageStack); + } + + const usage: PicoLLMUsage = { + promptTokens: memoryBufferView.getInt32(usageAddress, true), + completionTokens: memoryBufferView.getInt32( + usageAddress + Int32Array.BYTES_PER_ELEMENT, + true + ), + }; + await this._pvFree(usageAddress); + + const endpoint: PicoLLMEndpoint = memoryBufferView.getInt32( + endpointAddress, + true + ); + await this._pvFree(endpointAddress); + + const numCompletionTokens = memoryBufferView.getInt32( + numCompletionTokensAddress, + true + ); + await this._pvFree(numCompletionTokensAddress); + + const completionTokensAddress = unsignedAddress( + memoryBufferView.getInt32(completionTokensAddressAddress, true) + ); + + let completionTokensPtr = completionTokensAddress; + const completionTokens: PicoLLMCompletionToken[] = []; + for (let i = 0; i < numCompletionTokens; i++) { + const tokenAddress = memoryBufferView.getInt32( + completionTokensPtr, + true + ); + const completionToken = arrayBufferToStringAtIndex( + memoryBufferUint8, + tokenAddress + ); + completionTokensPtr += Int32Array.BYTES_PER_ELEMENT; + + const completionLogProb = memoryBufferView.getFloat32( + completionTokensPtr, + true + ); + completionTokensPtr += Float32Array.BYTES_PER_ELEMENT; + + const token: PicoLLMToken = { + token: completionToken, + logProb: completionLogProb, + }; + + const numTopChoicesReturn = memoryBufferView.getInt32( + completionTokensPtr, + true + ); + completionTokensPtr += Int32Array.BYTES_PER_ELEMENT; + + const topChoices: PicoLLMToken[] = []; + let topChoicesPtr = unsignedAddress( + memoryBufferView.getInt32(completionTokensPtr, true) + ); + for (let j = 0; j < numTopChoicesReturn; j++) { + const topChoiceTokenAddress = unsignedAddress( + memoryBufferView.getInt32(topChoicesPtr, true) + ); + const topChoiceToken = arrayBufferToStringAtIndex( + memoryBufferUint8, + topChoiceTokenAddress + ); + topChoicesPtr += Int32Array.BYTES_PER_ELEMENT; + + const topChoiceLogProb = memoryBufferView.getFloat32( + topChoicesPtr, + true + ); + topChoicesPtr += Float32Array.BYTES_PER_ELEMENT; + + topChoices.push({ + token: topChoiceToken, + logProb: topChoiceLogProb, + }); + } + + completionTokensPtr += Int32Array.BYTES_PER_ELEMENT; + completionTokens.push({ + token, + topChoices, + }); + } + + await this._pvPicoLLMDeleteCompletionTokens( + completionTokensAddress, + numCompletionTokens + ); + await this._pvFree(completionTokensAddressAddress); + + const completionAddress = unsignedAddress( + memoryBufferView.getInt32(completionAddressAddress, true) + ); + const completion = arrayBufferToStringAtIndex( + memoryBufferUint8, + completionAddress + ); + + await this._pvPicoLLMDeleteCompletion(completionAddress); + await this._pvFree(completionAddressAddress); + + return { + usage, + endpoint, + completionTokens, + completion, + }; + }) + .then((result: PicoLLMCompletion) => { + resolve(result); + }) + .catch((error: any) => { + reject(error); + }); + }); + } + + public async tokenize( + text: string, + bos: boolean, + eos: boolean + ): Promise { + return new Promise((resolve, reject) => { + this._functionMutex + .runExclusive(async () => { + if (this._wasmMemory === undefined) { + throw new PicoLLMErrors.PicoLLMInvalidStateError( + 'Attempted to call PicoLLM tokenize after release.' + ); + } + + let memoryBufferUint8 = new Uint8Array(this._wasmMemory.buffer); + + const textAddress = await this._aligned_alloc( + Uint8Array.BYTES_PER_ELEMENT, + (text.length + 1) * Uint8Array.BYTES_PER_ELEMENT + ); + if (textAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for text' + ); + } + for (let i = 0; i < text.length; i++) { + memoryBufferUint8[textAddress + i] = text.charCodeAt(i); + } + memoryBufferUint8[textAddress + text.length] = 0; + + const numTokensAddress = await this._aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (numTokensAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for numTokens' + ); + } + + const tokensAddressAddress = await this._aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (tokensAddressAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for tokens' + ); + } + + const status = await this._pvPicoLLMTokenize( + this._objectAddress, + textAddress, + bos, + eos, + numTokensAddress, + tokensAddressAddress + ); + + memoryBufferUint8 = new Uint8Array(this._wasmMemory.buffer); + await this._pvFree(textAddress); + + const memoryBufferView = new DataView(this._wasmMemory.buffer); + if (status !== PvStatus.SUCCESS) { + const messageStack = await PicoLLM.getMessageStack( + this._pvGetErrorStack, + this._pvFreeErrorStack, + this._messageStackAddressAddressAddress, + this._messageStackDepthAddress, + memoryBufferView, + memoryBufferUint8 + ); + + throw pvStatusToException(status, 'Tokenize failed', messageStack); + } + + const numTokens = memoryBufferView.getInt32(numTokensAddress, true); + await this._pvFree(numTokensAddress); + + const tokens: number[] = []; + const tokensAddress = unsignedAddress( + memoryBufferView.getInt32(tokensAddressAddress, true) + ); + for (let i = 0; i < numTokens; i++) { + tokens.push( + memoryBufferView.getInt32( + tokensAddress + i * Int32Array.BYTES_PER_ELEMENT, + true + ) + ); + } + + await this._pvPicoLLMDeleteTokens(tokensAddress); + await this._pvFree(tokensAddressAddress); + + return tokens; + }) + .then((result: number[]) => { + resolve(result); + }) + .catch((error: any) => { + reject(error); + }); + }); + } + + public async forward(token: number): Promise { + return new Promise((resolve, reject) => { + this._functionMutex + .runExclusive(async () => { + if (this._wasmMemory === undefined) { + throw new PicoLLMErrors.PicoLLMInvalidStateError( + 'Attempted to call PicoLLM forward after release.' + ); + } + + const numLogitsAddress = await this._aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (numLogitsAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for numLogits' + ); + } + + const logitsAddressAddress = await this._aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (logitsAddressAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for logits' + ); + } + + const status = await this._pvPicoLLMForward( + this._objectAddress, + token, + numLogitsAddress, + logitsAddressAddress + ); + + const memoryBufferUint8 = new Uint8Array(this._wasmMemory.buffer); + const memoryBufferView = new DataView(this._wasmMemory.buffer); + + if (status !== PvStatus.SUCCESS) { + const messageStack = await PicoLLM.getMessageStack( + this._pvGetErrorStack, + this._pvFreeErrorStack, + this._messageStackAddressAddressAddress, + this._messageStackDepthAddress, + memoryBufferView, + memoryBufferUint8 + ); + + throw pvStatusToException(status, 'Forward failed', messageStack); + } + + const numLogits = memoryBufferView.getInt32(numLogitsAddress, true); + await this._pvFree(numLogitsAddress); + + const logits: number[] = []; + const logitsAddress = unsignedAddress( + memoryBufferView.getInt32(logitsAddressAddress, true) + ); + for (let i = 0; i < numLogits; i++) { + logits.push( + memoryBufferView.getFloat32( + logitsAddress + i * Float32Array.BYTES_PER_ELEMENT, + true + ) + ); + } + + await this._pvPicoLLMDeleteLogits(logitsAddress); + await this._pvFree(logitsAddressAddress); + + return logits; + }) + .then((result: number[]) => { + resolve(result); + }) + .catch((error: any) => { + reject(error); + }); + }); + } + + public async reset(): Promise { + return new Promise((resolve, reject) => { + this._functionMutex + .runExclusive(async () => { + if (this._wasmMemory === undefined) { + throw new PicoLLMErrors.PicoLLMInvalidStateError( + 'Attempted to call PicoLLM forward after release.' + ); + } + const status = await this._pvPicoLLMReset(this._objectAddress); + + const memoryBufferUint8 = new Uint8Array(this._wasmMemory.buffer); + const memoryBufferView = new DataView(this._wasmMemory.buffer); + if (status !== PvStatus.SUCCESS) { + const messageStack = await PicoLLM.getMessageStack( + this._pvGetErrorStack, + this._pvFreeErrorStack, + this._messageStackAddressAddressAddress, + this._messageStackDepthAddress, + memoryBufferView, + memoryBufferUint8 + ); + + throw pvStatusToException(status, 'Reset failed', messageStack); + } + }) + .then(() => { + resolve(); + }) + .catch((error: any) => { + reject(error); + }); + }); + } + + /** + * Releases resources acquired by WebAssembly module. + */ + public async release(): Promise { + await this._pvPicoLLMDelete(this._objectAddress); + await this._pvFree(this._messageStackAddressAddressAddress); + await this._pvFree(this._messageStackDepthAddress); + this._streamCallback.release(); + + delete this._wasmMemory; + this._wasmMemory = undefined; + } + + public static async listHardwareDevices(): Promise { + return new Promise((resolve, reject) => { + PicoLLM._picoLLMMutex + .runExclusive(async () => { + const memory: WebAssembly.Memory = new WebAssembly.Memory({ + initial: 4096, + }); + + const isSimd = await simd(); + const picoLLMWorkerWasmBuffer = isSimd + ? base64ToUint8Array(picoLLMWebWorkerHelperSimd) + : base64ToUint8Array(picoLLMWebWorkerHelper); + const picoLLMWasmBuffer = isSimd ? this._wasmSimd : this._wasm; + + const xpuWebWorkerImports = initXpu(memory, picoLLMWorkerWasmBuffer); + + const pvError = new PvError(); + + const streamCallback = new PicoLLMStreamCallback(memory); + + const exports = await buildWasm(memory, picoLLMWasmBuffer, pvError, { + ...xpuWebWorkerImports, + stream_callback_wasm: streamCallback.streamCallbackWasm, + }); + xpuWebWorkerImports.aligned_alloc = exports.aligned_alloc; + + const aligned_alloc = exports.aligned_alloc as aligned_alloc_type; + const pv_free = exports.pv_free as pv_free_type; + const pv_picollm_list_hardware_devices = + exports.pv_picollm_list_hardware_devices as pv_picollm_list_hardware_devices_type; + const pv_picollm_free_hardware_devices = + exports.pv_picollm_free_hardware_devices as pv_picollm_free_hardware_devices_type; + const pv_get_error_stack = + exports.pv_get_error_stack as pv_get_error_stack_type; + const pv_free_error_stack = + exports.pv_free_error_stack as pv_free_error_stack_type; + + const hardwareDevicesAddressAddress = await aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (hardwareDevicesAddressAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for hardwareDevices' + ); + } + + const numHardwareDevicesAddress = await aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (numHardwareDevicesAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for numHardwareDevices' + ); + } + + const status: PvStatus = await pv_picollm_list_hardware_devices( + hardwareDevicesAddressAddress, + numHardwareDevicesAddress + ); + + const messageStackDepthAddress = await aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (!messageStackDepthAddress) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory for messageStackDepth' + ); + } + + const messageStackAddressAddressAddress = await aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (!messageStackAddressAddressAddress) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory messageStack' + ); + } + + const memoryBufferView = new DataView(memory.buffer); + const memoryBufferUint8 = new Uint8Array(memory.buffer); + if (status !== PvStatus.SUCCESS) { + const messageStack = await PicoLLM.getMessageStack( + pv_get_error_stack, + pv_free_error_stack, + messageStackAddressAddressAddress, + messageStackDepthAddress, + memoryBufferView, + memoryBufferUint8 + ); + await pv_free(messageStackAddressAddressAddress); + await pv_free(messageStackDepthAddress); + + throw pvStatusToException( + status, + 'Get context length failed', + messageStack, + pvError + ); + } + await pv_free(messageStackAddressAddressAddress); + await pv_free(messageStackDepthAddress); + + const numHardwareDevices: number = memoryBufferView.getInt32( + numHardwareDevicesAddress, + true + ); + await pv_free(numHardwareDevicesAddress); + + const hardwareDevicesAddress = unsignedAddress( + memoryBufferView.getInt32(hardwareDevicesAddressAddress, true) + ); + + const hardwareDevices: string[] = []; + for (let i = 0; i < numHardwareDevices; i++) { + const deviceAddress = memoryBufferView.getInt32( + hardwareDevicesAddress + i * Int32Array.BYTES_PER_ELEMENT, + true + ); + hardwareDevices.push( + arrayBufferToStringAtIndex(memoryBufferUint8, deviceAddress) + ); + } + await pv_picollm_free_hardware_devices( + hardwareDevicesAddress, + numHardwareDevices + ); + await pv_free(hardwareDevicesAddressAddress); + + return hardwareDevices; + }) + .then((result: string[]) => { + resolve(result); + }) + .catch((error: any) => { + reject(error); + }); + }); + } + + private static async initWasm( + wasmBase64: string, + accessKey: string, + modelPath: string, + device: string + ): Promise { + const memory = new WebAssembly.Memory({ initial: 4096 }); + + let memoryBufferUint8 = new Uint8Array(memory.buffer); + + const isSimd = await simd(); + const picoLLMWorkerWasmBuffer = isSimd + ? base64ToUint8Array(picoLLMWebWorkerHelperSimd) + : base64ToUint8Array(picoLLMWebWorkerHelper); + + const xpuWebWorkerImports = initXpu(memory, picoLLMWorkerWasmBuffer); + + const pvError = new PvError(); + + const streamCallback = new PicoLLMStreamCallback(memory); + + const exports = await buildWasm(memory, wasmBase64, pvError, { + ...xpuWebWorkerImports, + stream_callback_wasm: streamCallback.streamCallbackWasm, + }); + xpuWebWorkerImports.aligned_alloc = exports.aligned_alloc; + + const aligned_alloc = exports.aligned_alloc as aligned_alloc_type; + const pv_free = exports.pv_free as pv_free_type; + + const pv_picollm_init = exports.pv_picollm_init as pv_picollm_init_type; + const pv_picollm_delete = + exports.pv_picollm_delete as pv_picollm_delete_type; + const pv_picollm_generate = + exports.pv_picollm_generate as pv_picollm_generate_type; + const pv_picollm_delete_completion_tokens = + exports.pv_picollm_delete_completion_tokens as pv_picollm_delete_completion_tokens_type; + const pv_picollm_delete_completion = + exports.pv_picollm_delete_completion as pv_picollm_delete_completion_type; + const pv_picollm_tokenize = + exports.pv_picollm_tokenize as pv_picollm_tokenize_type; + const pv_picollm_delete_tokens = + exports.pv_picollm_delete_tokens as pv_picollm_delete_tokens_type; + const pv_picollm_forward = + exports.pv_picollm_forward as pv_picollm_forward_type; + const pv_picollm_delete_logits = + exports.pv_picollm_delete_logits as pv_picollm_delete_logits_type; + const pv_picollm_reset = exports.pv_picollm_reset as pv_picollm_reset_type; + + const pv_picollm_model = exports.pv_picollm_model as pv_picollm_model_type; + const pv_picollm_context_length = + exports.pv_picollm_context_length as pv_picollm_context_length_type; + const pv_picollm_version = + exports.pv_picollm_version as pv_picollm_version_type; + const pv_picollm_max_top_choices = + exports.pv_picollm_max_top_choices as pv_picollm_max_top_choices_type; + const pv_set_sdk = exports.pv_set_sdk as pv_set_sdk_type; + const pv_get_error_stack = + exports.pv_get_error_stack as pv_get_error_stack_type; + const pv_free_error_stack = + exports.pv_free_error_stack as pv_free_error_stack_type; + + const objectAddressAddress = await aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (objectAddressAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); + } + + const accessKeyAddress = await aligned_alloc( + Uint8Array.BYTES_PER_ELEMENT, + (accessKey.length + 1) * Uint8Array.BYTES_PER_ELEMENT + ); + if (accessKeyAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); + } + for (let i = 0; i < accessKey.length; i++) { + memoryBufferUint8[accessKeyAddress + i] = accessKey.charCodeAt(i); + } + memoryBufferUint8[accessKeyAddress + accessKey.length] = 0; + + const modelPathEncoded = new TextEncoder().encode(modelPath); + const modelPathAddress = await aligned_alloc( + Uint8Array.BYTES_PER_ELEMENT, + (modelPathEncoded.length + 1) * Uint8Array.BYTES_PER_ELEMENT + ); + + if (modelPathAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); + } + + memoryBufferUint8.set(modelPathEncoded, modelPathAddress); + memoryBufferUint8[modelPathAddress + modelPathEncoded.length] = 0; + + const deviceAddress = await aligned_alloc( + Uint8Array.BYTES_PER_ELEMENT, + (device.length + 1) * Uint8Array.BYTES_PER_ELEMENT + ); + if (deviceAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); + } + for (let i = 0; i < device.length; i++) { + memoryBufferUint8[deviceAddress + i] = device.charCodeAt(i); + } + memoryBufferUint8[deviceAddress + device.length] = 0; + + const sdkEncoded = new TextEncoder().encode(this._sdk); + const sdkAddress = await aligned_alloc( + Uint8Array.BYTES_PER_ELEMENT, + (sdkEncoded.length + 1) * Uint8Array.BYTES_PER_ELEMENT + ); + if (!sdkAddress) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); + } + memoryBufferUint8.set(sdkEncoded, sdkAddress); + memoryBufferUint8[sdkAddress + sdkEncoded.length] = 0; + await pv_set_sdk(sdkAddress); + + const messageStackDepthAddress = await aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (!messageStackDepthAddress) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); + } + + const messageStackAddressAddressAddress = await aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (!messageStackAddressAddressAddress) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); + } + + let status: PvStatus = await pv_picollm_init( + accessKeyAddress, + modelPathAddress, + deviceAddress, + objectAddressAddress + ); + + await pv_free(accessKeyAddress); + await pv_free(modelPathAddress); + await pv_free(deviceAddress); + + const memoryBufferView = new DataView(memory.buffer); + memoryBufferUint8 = new Uint8Array(memory.buffer); + + if (status !== PvStatus.SUCCESS) { + const messageStack = await PicoLLM.getMessageStack( + pv_get_error_stack, + pv_free_error_stack, + messageStackAddressAddressAddress, + messageStackDepthAddress, + memoryBufferView, + memoryBufferUint8 + ); + + throw pvStatusToException( + status, + 'Initialization failed', + messageStack, + pvError + ); + } + + const objectAddress = memoryBufferView.getInt32(objectAddressAddress, true); + await pv_free(objectAddressAddress); + + const maxTopChoices = await pv_picollm_max_top_choices(); + + const versionAddress = await pv_picollm_version(); + const version = arrayBufferToStringAtIndex( + memoryBufferUint8, + versionAddress + ); + + const contextLengthAddress = await aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + + if (contextLengthAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); + } + + status = await pv_picollm_context_length( + objectAddress, + contextLengthAddress + ); + if (status !== PvStatus.SUCCESS) { + const messageStack = await PicoLLM.getMessageStack( + pv_get_error_stack, + pv_free_error_stack, + messageStackAddressAddressAddress, + messageStackDepthAddress, + memoryBufferView, + memoryBufferUint8 + ); + + throw pvStatusToException( + status, + 'Get context length failed', + messageStack, + pvError + ); + } + + const contextLength = memoryBufferView.getInt32(contextLengthAddress, true); + await pv_free(contextLengthAddress); + + const modelAddressAddress = await aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (modelAddressAddress === 0) { + throw new PicoLLMErrors.PicoLLMOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); + } + status = await pv_picollm_model(objectAddress, modelAddressAddress); + if (status !== PvStatus.SUCCESS) { + const messageStack = await PicoLLM.getMessageStack( + pv_get_error_stack, + pv_free_error_stack, + messageStackAddressAddressAddress, + messageStackDepthAddress, + memoryBufferView, + memoryBufferUint8 + ); + + throw pvStatusToException( + status, + 'Failed to get model name', + messageStack, + pvError + ); + } + + const modelAddress = memoryBufferView.getInt32(modelAddressAddress, true); + await pv_free(modelAddressAddress); + const model = arrayBufferToStringAtIndex(memoryBufferUint8, modelAddress); + + return { + aligned_alloc, + memory: memory, + pvFree: pv_free, + + streamCallback: streamCallback, + contextLength: contextLength, + maxTopChoices: maxTopChoices, + model: model, + version: version, + + objectAddress: objectAddress, + messageStackAddressAddressAddress: messageStackAddressAddressAddress, + messageStackDepthAddress: messageStackDepthAddress, + + pvPicoLLMDelete: pv_picollm_delete, + pvPicoLLMGenerate: pv_picollm_generate, + pvPicoLLMDeleteCompletionTokens: pv_picollm_delete_completion_tokens, + pvPicoLLMDeleteCompletion: pv_picollm_delete_completion, + pvPicoLLMTokenize: pv_picollm_tokenize, + pvPicoLLMDeleteTokens: pv_picollm_delete_tokens, + pvPicoLLMForward: pv_picollm_forward, + pvPicoLLMDeleteLogits: pv_picollm_delete_logits, + pvPicoLLMReset: pv_picollm_reset, + + pvGetErrorStack: pv_get_error_stack, + pvFreeErrorStack: pv_free_error_stack, + }; + } + + private static async getMessageStack( + pv_get_error_stack: pv_get_error_stack_type, + pv_free_error_stack: pv_free_error_stack_type, + messageStackAddressAddressAddress: number, + messageStackDepthAddress: number, + memoryBufferView: DataView, + memoryBufferUint8: Uint8Array + ): Promise { + const status = await pv_get_error_stack( + messageStackAddressAddressAddress, + messageStackDepthAddress + ); + if (status !== PvStatus.SUCCESS) { + throw pvStatusToException(status, 'Unable to get PicoLLM error state'); + } + + const messageStackAddressAddress = memoryBufferView.getInt32( + messageStackAddressAddressAddress, + true + ); + + const messageStackDepth = memoryBufferView.getInt32( + messageStackDepthAddress, + true + ); + const messageStack: string[] = []; + for (let i = 0; i < messageStackDepth; i++) { + const messageStackAddress = memoryBufferView.getInt32( + messageStackAddressAddress + i * Int32Array.BYTES_PER_ELEMENT, + true + ); + const message = arrayBufferToStringAtIndex( + memoryBufferUint8, + messageStackAddress + ); + messageStack.push(message); + } + + await pv_free_error_stack(messageStackAddressAddress); + + return messageStack; + } +} diff --git a/binding/web/src/picollm_errors.ts b/binding/web/src/picollm_errors.ts new file mode 100644 index 00000000..3e5bdee4 --- /dev/null +++ b/binding/web/src/picollm_errors.ts @@ -0,0 +1,190 @@ +// +// Copyright 2024 Picovoice Inc. +// +// You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" +// file accompanying this source. +// +// 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. +// + +import { PvError } from "@picovoice/web-utils"; +import { PvStatus } from "./types"; + +class PicoLLMError extends Error { + private readonly _status: PvStatus; + private readonly _shortMessage: string; + private readonly _messageStack: string[]; + + constructor(status: PvStatus, message: string, messageStack: string[] = [], pvError: PvError | null = null) { + super(PicoLLMError.errorToString(message, messageStack, pvError)); + this._status = status; + this.name = 'PicoLLMError'; + this._shortMessage = message; + this._messageStack = messageStack; + } + + get status(): PvStatus { + return this._status; + } + + get shortMessage(): string { + return this._shortMessage; + } + + get messageStack(): string[] { + return this._messageStack; + } + + private static errorToString( + initial: string, + messageStack: string[], + pvError: PvError | null = null, + ): string { + let msg = initial; + + if (pvError) { + const pvErrorMessage = pvError.getErrorString(); + if (pvErrorMessage.length > 0) { + msg += `\nDetails: ${pvErrorMessage}`; + } + } + + if (messageStack.length > 0) { + msg += `: ${messageStack.reduce((acc, value, index) => + acc + '\n [' + index + '] ' + value, '')}`; + } + + return msg; + } +} + +class PicoLLMOutOfMemoryError extends PicoLLMError { + constructor(message: string, messageStack?: string[], pvError: PvError | null = null) { + super(PvStatus.OUT_OF_MEMORY, message, messageStack, pvError); + this.name = 'PicoLLMOutOfMemoryError'; + } +} + +class PicoLLMIOError extends PicoLLMError { + constructor(message: string, messageStack: string[] = [], pvError: PvError | null = null) { + super(PvStatus.IO_ERROR, message, messageStack, pvError); + this.name = 'PicoLLMIOError'; + } +} + +class PicoLLMInvalidArgumentError extends PicoLLMError { + constructor(message: string, messageStack: string[] = [], pvError: PvError | null = null) { + super(PvStatus.INVALID_ARGUMENT, message, messageStack, pvError); + this.name = 'PicoLLMInvalidArgumentError'; + } +} + +class PicoLLMStopIterationError extends PicoLLMError { + constructor(message: string, messageStack: string[] = [], pvError: PvError | null = null) { + super(PvStatus.STOP_ITERATION, message, messageStack, pvError); + this.name = 'PicoLLMStopIterationError'; + } +} + +class PicoLLMKeyError extends PicoLLMError { + constructor(message: string, messageStack: string[] = [], pvError: PvError | null = null) { + super(PvStatus.KEY_ERROR, message, messageStack, pvError); + this.name = 'PicoLLMKeyError'; + } +} + +class PicoLLMInvalidStateError extends PicoLLMError { + constructor(message: string, messageStack: string[] = [], pvError: PvError | null = null) { + super(PvStatus.INVALID_STATE, message, messageStack, pvError); + this.name = 'PicoLLMInvalidStateError'; + } +} + +class PicoLLMRuntimeError extends PicoLLMError { + constructor(message: string, messageStack: string[] = [], pvError: PvError | null = null) { + super(PvStatus.RUNTIME_ERROR, message, messageStack, pvError); + this.name = 'PicoLLMRuntimeError'; + } +} + +class PicoLLMActivationError extends PicoLLMError { + constructor(message: string, messageStack: string[] = [], pvError: PvError | null = null) { + super(PvStatus.ACTIVATION_ERROR, message, messageStack, pvError); + this.name = 'PicoLLMActivationError'; + } +} + +class PicoLLMActivationLimitReachedError extends PicoLLMError { + constructor(message: string, messageStack: string[] = [], pvError: PvError | null = null) { + super(PvStatus.ACTIVATION_LIMIT_REACHED, message, messageStack, pvError); + this.name = 'PicoLLMActivationLimitReachedError'; + } +} + +class PicoLLMActivationThrottledError extends PicoLLMError { + constructor(message: string, messageStack: string[] = [], pvError: PvError | null = null) { + super(PvStatus.ACTIVATION_THROTTLED, message, messageStack, pvError); + this.name = 'PicoLLMActivationThrottledError'; + } +} + +class PicoLLMActivationRefusedError extends PicoLLMError { + constructor(message: string, messageStack: string[] = [], pvError: PvError | null = null) { + super(PvStatus.ACTIVATION_REFUSED, message, messageStack, pvError); + this.name = 'PicoLLMActivationRefusedError'; + } +} + +export { + PicoLLMError, + PicoLLMOutOfMemoryError, + PicoLLMIOError, + PicoLLMInvalidArgumentError, + PicoLLMStopIterationError, + PicoLLMKeyError, + PicoLLMInvalidStateError, + PicoLLMRuntimeError, + PicoLLMActivationError, + PicoLLMActivationLimitReachedError, + PicoLLMActivationThrottledError, + PicoLLMActivationRefusedError, +}; + + +export function pvStatusToException( + pvStatus: PvStatus, + errorMessage: string, + messageStack: string[] = [], + pvError: PvError | null = null +): PicoLLMError { + switch (pvStatus) { + case PvStatus.OUT_OF_MEMORY: + return new PicoLLMOutOfMemoryError(errorMessage, messageStack, pvError); + case PvStatus.IO_ERROR: + return new PicoLLMIOError(errorMessage, messageStack, pvError); + case PvStatus.INVALID_ARGUMENT: + return new PicoLLMInvalidArgumentError(errorMessage, messageStack, pvError); + case PvStatus.STOP_ITERATION: + return new PicoLLMStopIterationError(errorMessage, messageStack, pvError); + case PvStatus.KEY_ERROR: + return new PicoLLMKeyError(errorMessage, messageStack, pvError); + case PvStatus.INVALID_STATE: + return new PicoLLMInvalidStateError(errorMessage, messageStack, pvError); + case PvStatus.RUNTIME_ERROR: + return new PicoLLMRuntimeError(errorMessage, messageStack, pvError); + case PvStatus.ACTIVATION_ERROR: + return new PicoLLMActivationError(errorMessage, messageStack, pvError); + case PvStatus.ACTIVATION_LIMIT_REACHED: + return new PicoLLMActivationLimitReachedError(errorMessage, messageStack, pvError); + case PvStatus.ACTIVATION_THROTTLED: + return new PicoLLMActivationThrottledError(errorMessage, messageStack, pvError); + case PvStatus.ACTIVATION_REFUSED: + return new PicoLLMActivationRefusedError(errorMessage, messageStack, pvError); + default: + // eslint-disable-next-line no-console + console.warn(`Unmapped error code: ${pvStatus}`); + return new PicoLLMError(pvStatus, errorMessage); + } +} diff --git a/binding/web/src/types.ts b/binding/web/src/types.ts new file mode 100644 index 00000000..5b625fd7 --- /dev/null +++ b/binding/web/src/types.ts @@ -0,0 +1,77 @@ +/* + Copyright 2024 Picovoice Inc. + + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" + file accompanying this source. + + 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. +*/ + +export enum PvStatus { + SUCCESS = 10000, + OUT_OF_MEMORY, + IO_ERROR, + INVALID_ARGUMENT, + STOP_ITERATION, + KEY_ERROR, + INVALID_STATE, + RUNTIME_ERROR, + ACTIVATION_ERROR, + ACTIVATION_LIMIT_REACHED, + ACTIVATION_THROTTLED, + ACTIVATION_REFUSED, +} + +export enum PicoLLMEndpoint { + END_OF_SENTENCE, + COMPLETION_TOKEN_LIMIT_REACHED, + STOP_PHRASE_ENCOUNTERED, +} + +export type PicoLLMModel = { + modelFile: string | File | Blob | (string | File | Blob)[]; + cacheFilePath?: string; + cacheFileVersion?: number; + cacheFileOverwrite?: boolean; + numFetchRetries?: number; +}; + +export type PicoLLMInitOptions = { + device?: string; +}; + +export type PicoLLMGenerateOptions = { + completionTokenLimit?: number; + stopPhrases?: string[]; + seed?: number; + presencePenalty?: number; + frequencyPenalty?: number; + temperature?: number; + topP?: number; + numTopChoices?: number; + streamCallback?: (token: string) => void; +}; + +export type PicoLLMUsage = { + promptTokens: number; + completionTokens: number; +}; + +export type PicoLLMToken = { + token: string; + logProb: number; +}; + +export type PicoLLMCompletionToken = { + token: PicoLLMToken; + topChoices: PicoLLMToken[]; +}; + +export type PicoLLMCompletion = { + usage: PicoLLMUsage; + endpoint: PicoLLMEndpoint; + completionTokens: PicoLLMCompletionToken[]; + completion: string; +}; diff --git a/binding/web/src/utils.ts b/binding/web/src/utils.ts new file mode 100644 index 00000000..604ef9b3 --- /dev/null +++ b/binding/web/src/utils.ts @@ -0,0 +1,128 @@ +/* + Copyright 2024 Picovoice Inc. + + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" + file accompanying this source. + + 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. +*/ + +/* eslint camelcase: 0 */ + +import { PicoLLMModel } from './types'; +import * as PicoLLMErrors from './picollm_errors'; + +import { open } from '@picovoice/web-utils'; + +const BACKOFF_CAP_MILLISECONDS = 5000; +const BACKOFF_START_MILLISECONDS = 2; + +async function getModelFileStream( + modelFile: File | Blob +): Promise> { + try { + return modelFile.stream().getReader(); + } catch (e) { + throw new PicoLLMErrors.PicoLLMInvalidArgumentError( + `Unable to read model from ${modelFile}` + ); + } +} + +async function fetchModelStream( + modelUrl: string, + numFetchRetries: number +): Promise> { + if (numFetchRetries < 0) { + throw Error('numFetchRetries must be a positive number'); + } + + let waitTimeMilliseconds = BACKOFF_START_MILLISECONDS; + const delay = (delayMilliseconds: number): Promise => + new Promise(resolve => { + setTimeout(resolve, delayMilliseconds); + }); + + let numAttemptsLeft: number = numFetchRetries + 1; + let error: Error | null = null; + while (numAttemptsLeft > 0) { + error = null; + try { + const res = await fetch(modelUrl, { + cache: 'no-cache', + }); + if (res.ok && res.body) { + return res.body.getReader(); + } + error = new PicoLLMErrors.PicoLLMInvalidArgumentError( + `Unable to get model from '${modelUrl}'` + ); + } catch (e: any) { + error = new PicoLLMErrors.PicoLLMIOError( + `Failed to fetch model from '${modelUrl}': ${e.message}` + ); + } + + numAttemptsLeft--; + await delay(waitTimeMilliseconds); + waitTimeMilliseconds = Math.min( + BACKOFF_CAP_MILLISECONDS, + waitTimeMilliseconds * BACKOFF_START_MILLISECONDS + ); + } + + if (error !== null) { + throw error; + } else { + throw new PicoLLMErrors.PicoLLMIOError( + `Unexpected error encountered while fetching model from '${modelUrl}'` + ); + } +} + +export async function loadModel(model: PicoLLMModel): Promise { + if (model === undefined || model === null) { + throw new PicoLLMErrors.PicoLLMInvalidArgumentError( + 'The model is undefined / empty' + ); + } + + const { + modelFile, + cacheFilePath = 'picollm_model', + cacheFileVersion = 0, + cacheFileOverwrite = false, + numFetchRetries = 0, + } = model; + + const pvFile = await open(cacheFilePath, 'w'); + if ( + cacheFileOverwrite || + pvFile.meta === undefined || + cacheFileVersion > pvFile.meta.version! + ) { + const modelChunks = Array.isArray(modelFile) ? modelFile : [modelFile]; + for (const modelChunk of modelChunks) { + const reader = + typeof modelChunk === 'string' + ? await fetchModelStream(modelChunk as string, numFetchRetries) + : await getModelFileStream(modelChunk as File | Blob); + + while (true) { + const { done, value } = await reader.read(); + if (done) { + break; + } + if (value) { + await pvFile.write(value); + } + } + } + + pvFile.close(); + } + + return cacheFilePath; +} diff --git a/binding/web/test/picollm.test.ts b/binding/web/test/picollm.test.ts new file mode 100644 index 00000000..c61a0b8d --- /dev/null +++ b/binding/web/test/picollm.test.ts @@ -0,0 +1,55 @@ +import { PicoLLM, PicoLLMModel } from '../'; + +// @ts-ignore +import { modelName, modelFiles } from './test_data.json'; + +const ACCESS_KEY = Cypress.env('ACCESS_KEY'); + +describe('PicoLLM basic tests', function () { + it('List hardware devices', async () => { + const hardwareDevices: string[] = await PicoLLM.listHardwareDevices(); + expect(Array.isArray(hardwareDevices)).to.be.true; + expect(hardwareDevices).length.to.be.greaterThan(0); + }); + + it(`Generate with ${modelName}`, () => { + try { + cy.readFiles(modelFiles).then(async chunks => { + const model: PicoLLMModel = { modelFile: chunks }; + const picoLLM = await PicoLLM.create(ACCESS_KEY, model); + expect(picoLLM.contextLength).to.be.greaterThan(0); + expect(picoLLM.maxTopChoices).to.be.greaterThan(0); + expect(typeof picoLLM.version).to.eq('string'); + expect(picoLLM.version).length.to.be.greaterThan(0); + expect(typeof picoLLM.model).to.eq('string'); + expect(picoLLM.model).length.to.be.greaterThan(0); + + const genResult = await picoLLM.generate('what is your name?', { + completionTokenLimit: 10, + numTopChoices: 2, + }); + expect(typeof genResult.completion).to.eq('string'); + expect(genResult.completion).length.to.be.greaterThan(0); + expect(genResult.usage.completionTokens).to.be.greaterThan(0); + expect(genResult.usage.promptTokens).to.be.greaterThan(0); + expect(genResult.completionTokens).length.to.be.greaterThan(0); + expect(genResult.endpoint).to.be.greaterThan(-1); + + const tokenResult = await picoLLM.tokenize( + 'what is your name?', + false, + false + ); + expect(tokenResult).length.to.be.greaterThan(0); + + const forwardResult = await picoLLM.forward(tokenResult[0]); + expect(forwardResult).length.to.be.greaterThan(0); + + await picoLLM.reset(); + await picoLLM.release(); + }); + } catch (e) { + expect(e).to.be.undefined; + } + }); +}); diff --git a/binding/web/tsconfig.json b/binding/web/tsconfig.json new file mode 100644 index 00000000..ea8e366f --- /dev/null +++ b/binding/web/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "allowJs": true, + "allowSyntheticDefaultImports": true, + "downlevelIteration": true, + "isolatedModules": false, + "lib": ["esnext", "dom"], + "module": "esnext", + "moduleResolution": "node", + "noEmit": false, + "outDir": "./dist", + "removeComments": false, + "resolveJsonModule": true, + "sourceMap": true, + "strict": true, + "target": "esnext", + "types": ["node"] + }, + "include": ["src", "module.d.ts", "node_modules/@picovoice/pv-xpu"], + "exclude": ["node_modules"] +} diff --git a/binding/web/yarn.lock b/binding/web/yarn.lock new file mode 100644 index 00000000..27d85b2d --- /dev/null +++ b/binding/web/yarn.lock @@ -0,0 +1,4161 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== + +"@babel/core@^7.21.3": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" + integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.7" + "@babel/parser" "^7.23.6" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== + dependencies: + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.15": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz#b2e6826e0e20d337143655198b79d58fdc9bd43d" + integrity sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz#64df615451cb30e94b59a9696022cffac9a10088" + integrity sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-define-polyfill-provider@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz#465805b7361f461e86c680f1de21eaf88c25901b" + integrity sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + 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" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.23.7": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.8.tgz#fc6b2d65b16847fd50adddbd4232c76378959e34" + integrity sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.22.15", "@babel/parser@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" + integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" + integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.23.3" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b" + integrity sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" + integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz#3aa0b4f2fa3788b5226ef9346cf6d16ec61f99cd" + integrity sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" + integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + +"@babel/plugin-transform-block-scoped-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" + integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" + integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" + integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" + integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.23.8": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92" + integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" + integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.15" + +"@babel/plugin-transform-destructuring@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" + integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" + integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" + integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" + integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" + integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" + integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e" + integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" + integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" + integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" + integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" + integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" + integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" + integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" + integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/plugin-transform-modules-umd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" + integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" + integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" + integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" + integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" + integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== + dependencies: + "@babel/compat-data" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.23.3" + +"@babel/plugin-transform-object-super@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" + integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + +"@babel/plugin-transform-optional-catch-binding@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" + integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.23.3", "@babel/plugin-transform-optional-chaining@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" + integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" + integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" + integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" + integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" + integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" + integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.21.0": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz#52bbd20054855beb9deae3bee9ceb05289c343e6" + integrity sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.7" + babel-plugin-polyfill-corejs3 "^0.8.7" + babel-plugin-polyfill-regenerator "^0.5.4" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" + integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" + integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" + integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" + integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" + integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" + integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" + integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" + integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" + integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.20.2": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.8.tgz#7d6f8171ea7c221ecd28059e65ad37c20e441e3e" + integrity sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.23.3" + "@babel/plugin-syntax-import-attributes" "^7.23.3" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.23.3" + "@babel/plugin-transform-async-generator-functions" "^7.23.7" + "@babel/plugin-transform-async-to-generator" "^7.23.3" + "@babel/plugin-transform-block-scoped-functions" "^7.23.3" + "@babel/plugin-transform-block-scoping" "^7.23.4" + "@babel/plugin-transform-class-properties" "^7.23.3" + "@babel/plugin-transform-class-static-block" "^7.23.4" + "@babel/plugin-transform-classes" "^7.23.8" + "@babel/plugin-transform-computed-properties" "^7.23.3" + "@babel/plugin-transform-destructuring" "^7.23.3" + "@babel/plugin-transform-dotall-regex" "^7.23.3" + "@babel/plugin-transform-duplicate-keys" "^7.23.3" + "@babel/plugin-transform-dynamic-import" "^7.23.4" + "@babel/plugin-transform-exponentiation-operator" "^7.23.3" + "@babel/plugin-transform-export-namespace-from" "^7.23.4" + "@babel/plugin-transform-for-of" "^7.23.6" + "@babel/plugin-transform-function-name" "^7.23.3" + "@babel/plugin-transform-json-strings" "^7.23.4" + "@babel/plugin-transform-literals" "^7.23.3" + "@babel/plugin-transform-logical-assignment-operators" "^7.23.4" + "@babel/plugin-transform-member-expression-literals" "^7.23.3" + "@babel/plugin-transform-modules-amd" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-umd" "^7.23.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.23.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" + "@babel/plugin-transform-numeric-separator" "^7.23.4" + "@babel/plugin-transform-object-rest-spread" "^7.23.4" + "@babel/plugin-transform-object-super" "^7.23.3" + "@babel/plugin-transform-optional-catch-binding" "^7.23.4" + "@babel/plugin-transform-optional-chaining" "^7.23.4" + "@babel/plugin-transform-parameters" "^7.23.3" + "@babel/plugin-transform-private-methods" "^7.23.3" + "@babel/plugin-transform-private-property-in-object" "^7.23.4" + "@babel/plugin-transform-property-literals" "^7.23.3" + "@babel/plugin-transform-regenerator" "^7.23.3" + "@babel/plugin-transform-reserved-words" "^7.23.3" + "@babel/plugin-transform-shorthand-properties" "^7.23.3" + "@babel/plugin-transform-spread" "^7.23.3" + "@babel/plugin-transform-sticky-regex" "^7.23.3" + "@babel/plugin-transform-template-literals" "^7.23.3" + "@babel/plugin-transform-typeof-symbol" "^7.23.3" + "@babel/plugin-transform-unicode-escapes" "^7.23.3" + "@babel/plugin-transform-unicode-property-regex" "^7.23.3" + "@babel/plugin-transform-unicode-regex" "^7.23.3" + "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.7" + babel-plugin-polyfill-corejs3 "^0.8.7" + babel-plugin-polyfill-regenerator "^0.5.4" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.21.0", "@babel/runtime@^7.8.4": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.8.tgz#8ee6fe1ac47add7122902f257b8ddf55c898f650" + integrity sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" + integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@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.6" + "@babel/types" "^7.23.6" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.4.4": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@cypress/request@2.88.12": + version "2.88.12" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.12.tgz#ba4911431738494a85e93fb04498cb38bc55d590" + integrity sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + http-signature "~1.3.6" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + performance-now "^2.1.0" + qs "~6.10.3" + safe-buffer "^5.1.2" + tough-cookie "^4.1.3" + tunnel-agent "^0.6.0" + uuid "^8.3.2" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + 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" + +"@eslint/js@8.56.0": + version "8.56.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" + integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== + +"@humanwhocodes/config-array@^0.11.13": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.22" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" + integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@picovoice/web-utils@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@picovoice/web-utils/-/web-utils-1.4.0.tgz#ebcf5847b61311217d0db95cdd8c1721484435af" + integrity sha512-7xwnXzQEOj3a9x58RsZ77ykrmrQg6+HI8NfzHXlqqlAewunnZ7VaLEhdJVtzaM+rOzTUJOTL0bqbx2eOgHEbyw== + dependencies: + commander "^10.0.1" + +"@rollup/plugin-babel@^6.0.3": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz#bd698e351fa9aa9619fcae780aea2a603d98e4c4" + integrity sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@rollup/pluginutils" "^5.0.1" + +"@rollup/plugin-commonjs@^24.0.1": + version "24.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-24.1.0.tgz#79e54bd83bb64396761431eee6c44152ef322100" + integrity sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + commondir "^1.0.1" + estree-walker "^2.0.2" + glob "^8.0.3" + is-reference "1.2.1" + magic-string "^0.27.0" + +"@rollup/plugin-node-resolve@^15.0.1": + version "15.2.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9" + integrity sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-builtin-module "^3.2.1" + is-module "^1.0.0" + resolve "^1.22.1" + +"@rollup/plugin-terser@^0.4.0": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz#15dffdb3f73f121aa4fbb37e7ca6be9aeea91962" + integrity sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A== + dependencies: + serialize-javascript "^6.0.1" + smob "^1.0.0" + terser "^5.17.4" + +"@rollup/pluginutils@^4.1.2": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" + integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.0.2": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" + integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/node@*": + version "20.11.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.5.tgz#be10c622ca7fcaa3cf226cf80166abc31389d86e" + integrity sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w== + dependencies: + undici-types "~5.26.4" + +"@types/node@^16.18.39": + version "16.18.74" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.74.tgz#af518a0abafe8ab453f04c12ee62cfad75a8ca8d" + integrity sha512-eEn8RkzZFcT0gb8qyi0CcfSOQnLE+NbGLIIaxGGmjn/N35v/C3M8ohxcpSlNlCv+H8vPpMGmrGDdCkzr8xu2tQ== + +"@types/node@^18.11.9": + version "18.19.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.9.tgz#6c2624c3a05bfa3a2735c533f95597ffacbb5608" + integrity sha512-oZFKlC8l5YtzGQNT4zC2PiSSKzQVZ8bAwwd+EYdPLtyk0nSEq6O16SkK+rkkT2eflDAbormJgEF3QnH3oDrTSw== + dependencies: + undici-types "~5.26.4" + +"@types/pv-xpu-web-worker@../../lib/wasm/dist/types/xpu_web_worker": + version "0.0.0" + +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== + +"@types/semver@^7.3.12": + version "7.5.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== + +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== + +"@types/sizzle@^2.3.2": + version "2.3.8" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627" + integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg== + +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^5.51.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.51.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.8.2, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-mutex@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.1.tgz#bccf55b96f2baf8df90ed798cb5544a1f6ee4c2c" + integrity sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA== + dependencies: + tslib "^2.4.0" + +async@^3.2.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +babel-plugin-polyfill-corejs2@^0.4.7: + version "0.4.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz#dbcc3c8ca758a290d47c3c6a490d59429b0d2269" + integrity sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.5.0" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04" + integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.4" + core-js-compat "^3.33.1" + +babel-plugin-polyfill-regenerator@^0.5.4: + version "0.5.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz#8b0c8fc6434239e5d7b8a9d1f832bb2b0310f06a" + integrity sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.5.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.22.2: + version "4.22.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" + integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== + dependencies: + caniuse-lite "^1.0.30001565" + electron-to-chromium "^1.4.601" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +cachedir@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" + integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001565: + version "1.0.30001579" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz#45c065216110f46d6274311a4b3fcf6278e0852a" + integrity sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-table3@~0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +core-js-compat@^3.31.0, core-js-compat@^3.33.1: + version "3.35.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.35.1.tgz#215247d7edb9e830efa4218ff719beb2803555e2" + integrity sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw== + dependencies: + browserslist "^4.22.2" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cypress@^12.8.1: + version "12.17.4" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.17.4.tgz#b4dadf41673058493fa0d2362faa3da1f6ae2e6c" + integrity sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ== + dependencies: + "@cypress/request" "2.88.12" + "@cypress/xvfb" "^1.2.4" + "@types/node" "^16.18.39" + "@types/sinonjs__fake-timers" "8.1.1" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + buffer "^5.6.0" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.1" + commander "^6.2.1" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.4" + enquirer "^2.3.6" + eventemitter2 "6.4.7" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + figures "^3.2.0" + fs-extra "^9.1.0" + getos "^3.2.1" + is-ci "^3.0.0" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr2 "^3.8.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.8" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + process "^0.11.10" + proxy-from-env "1.0.0" + request-progress "^3.0.0" + semver "^7.5.3" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + yauzl "^2.10.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +dayjs@^1.10.4: + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +electron-to-chromium@^1.4.601: + version "1.4.643" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.643.tgz#081a20c5534db91e66ef094f68624960f674768f" + integrity sha512-QHscvvS7gt155PtoRC0dR2ilhL8E9LHhfTQEq1uD5AL0524rBLAwpAREFH06f87/e45B9XkR6Ki5dbhbCsVEIg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" + +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-plugin-cypress@^2.12.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.1.tgz#336afa7e8e27451afaf65aa359c9509e0a4f3a7b" + integrity sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w== + dependencies: + globals "^13.20.0" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.22.0: + version "8.56.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" + integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.56.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" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^2.0.1, estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eventemitter2@6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== + +execa@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" + integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== + dependencies: + reusify "^1.0.4" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0, globals@^13.20.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +http-signature@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +internal-slot@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.2, is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-reference@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +listr2@^3.8.3: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + +make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-inspect@^1.13.1, object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + 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" + +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.2.2, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^2.8.3: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pv-xpu-web-worker@../../lib/wasm/dist/xpu_web_worker/esm: + version "0.0.0" + +qs@~6.10.3: + version "6.10.5" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" + integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== + dependencies: + throttleit "^1.0.0" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.1: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-typescript2@^0.34.1: + version "0.34.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.34.1.tgz#c457f155a71d133c142689213fce78694e30d0be" + integrity sha512-P4cHLtGikESmqi1CA+tdMDUv8WbQV48mzPYt77TSTOPJpERyZ9TXdDgjSDix8Fkqce6soYz3+fa4lrC93IEkcw== + dependencies: + "@rollup/pluginutils" "^4.1.2" + find-cache-dir "^3.3.2" + fs-extra "^10.0.0" + semver "^7.3.7" + tslib "^2.4.0" + +rollup-plugin-web-worker-loader@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-web-worker-loader/-/rollup-plugin-web-worker-loader-1.6.1.tgz#9d7a27575b64b0780fe4e8b3bc87470d217e485f" + integrity sha512-4QywQSz1NXFHKdyiou16mH3ijpcfLtLGOrAqvAqu1Gx+P8+zj+3gwC2BSL/VW1d+LW4nIHC8F7d7OXhs9UdR2A== + +rollup@^2.79.1: + version "2.79.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.5.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" + integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== + dependencies: + call-bind "^1.0.5" + get-intrinsic "^1.2.2" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.2.tgz#3ba32bdb3ea35f940ee87e5087c60ee786c3f6c5" + integrity sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ== + dependencies: + call-bind "^1.0.5" + get-intrinsic "^1.2.2" + is-regex "^1.1.4" + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.0.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.7, semver@^7.5.3: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +set-function-length@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" + integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== + dependencies: + define-data-property "^1.1.1" + function-bind "^1.1.2" + get-intrinsic "^1.2.2" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +smob@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/smob/-/smob-1.4.1.tgz#66270e7df6a7527664816c5b577a23f17ba6f5b5" + integrity sha512-9LK+E7Hv5R9u4g4C3p+jjLstaLe11MDsL21UpYaCNmapvMkYhqCV4A/f/3gyH8QjMyh6l68q9xC85vihY9ahMQ== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + +sshpk@^1.14.1: + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.padend@^3.0.0: + version "3.1.5" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz#311ef3a4e3c557dd999cdf88fbdde223f2ac0f95" + integrity sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +terser@^5.17.4: + version "5.27.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.27.0.tgz#70108689d9ab25fef61c4e93e808e9fd092bf20c" + integrity sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +throttleit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" + integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +wasm-feature-detect@^1.5.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/wasm-feature-detect/-/wasm-feature-detect-1.6.1.tgz#21c7c35f9b233d71d2948d4a8b3e2098c452b940" + integrity sha512-R1i9ED8UlLu/foILNB1ck9XS63vdtqU/tP1MCugVekETp/ySCrBZRk5I/zI67cI1wlQYeSonNm1PLjDHZDNg6g== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.11, which-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/demo/web/.gitignore b/demo/web/.gitignore new file mode 100644 index 00000000..d8b1de58 --- /dev/null +++ b/demo/web/.gitignore @@ -0,0 +1,7 @@ +node_modules +.rts2_cache/ +.idea/ +dist/ +*.log +.DS_Store +scripts/*.bin diff --git a/demo/web/README.md b/demo/web/README.md new file mode 100644 index 00000000..6c58c1a7 --- /dev/null +++ b/demo/web/README.md @@ -0,0 +1 @@ +# picoLLM Demo for Web diff --git a/demo/web/index.html b/demo/web/index.html new file mode 100644 index 00000000..f87539ea --- /dev/null +++ b/demo/web/index.html @@ -0,0 +1,101 @@ + + + + + + + +

picoLLM Web Demo

+
+ + +

+ + +

OR

+ + +

+ +
+
+ + + +
+
+
+
+
+ + diff --git a/demo/web/package.json b/demo/web/package.json new file mode 100644 index 00000000..6a104bc2 --- /dev/null +++ b/demo/web/package.json @@ -0,0 +1,25 @@ +{ + "name": "picollm-web-demo", + "version": "0.1.0", + "description": "A basic demo to show how to use picoLLM for web browsers, using the IIFE version of the library", + "main": "index.js", + "private": true, + "scripts": { + "setup-demo": "node scripts/setup_demo.js", + "start": "yarn run http-server -a localhost -p 5000" + }, + "keywords": [ + "Picovoice", + "browser", + "generative ai", + "llm" + ], + "author": "Picovoice Inc", + "license": "Apache-2.0", + "dependencies": { + "@picovoice/picollm-web": "../../binding/web" + }, + "devDependencies": { + "http-server": "^14.0.0" + } +} diff --git a/demo/web/scripts/setup_demo.js b/demo/web/scripts/setup_demo.js new file mode 100644 index 00000000..d2b6c3b1 --- /dev/null +++ b/demo/web/scripts/setup_demo.js @@ -0,0 +1,19 @@ +const http = require('http'); +const fs = require('fs'); +const { join } = require('path'); + +const url = process.argv[2]; +const fileName = "mvm-weights.bin"; +const outputFile = join(__dirname, fileName); + +console.log(`Downloading file...'`) + +const file = fs.createWriteStream(outputFile); +const request = http.get(url, (res) => { + res.pipe(file); + + file.on("finish", () => { + file.close(); + console.log("Download Completed."); + }); +}); diff --git a/demo/web/yarn.lock b/demo/web/yarn.lock new file mode 100644 index 00000000..9a501b21 --- /dev/null +++ b/demo/web/yarn.lock @@ -0,0 +1,318 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@picovoice/picollm-web@../../binding/web": + version "0.1.0" + dependencies: + "@picovoice/web-utils" "~1.4.0" + +"@picovoice/web-utils@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@picovoice/web-utils/-/web-utils-1.4.0.tgz#ebcf5847b61311217d0db95cdd8c1721484435af" + integrity sha512-7xwnXzQEOj3a9x58RsZ77ykrmrQg6+HI8NfzHXlqqlAewunnZ7VaLEhdJVtzaM+rOzTUJOTL0bqbx2eOgHEbyw== + dependencies: + commander "^10.0.1" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +async@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +basic-auth@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +call-bind@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +corser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" + integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +follow-redirects@^1.0.0: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-server@^14.0.0: + version "14.1.1" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-14.1.1.tgz#d60fbb37d7c2fdff0f0fbff0d0ee6670bd285e2e" + integrity sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A== + dependencies: + basic-auth "^2.0.1" + chalk "^4.1.2" + corser "^2.0.1" + he "^1.2.0" + html-encoding-sniffer "^3.0.0" + http-proxy "^1.18.1" + mime "^1.6.0" + minimist "^1.2.6" + opener "^1.5.1" + portfinder "^1.0.28" + secure-compare "3.0.1" + union "~0.5.0" + url-join "^4.0.1" + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +lodash@^4.17.14: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +mime@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +opener@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +portfinder@^1.0.28: + version "1.0.32" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" + integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== + dependencies: + async "^2.6.4" + debug "^3.2.7" + mkdirp "^0.5.6" + +qs@^6.4.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +secure-compare@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" + integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== + +set-function-length@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" + integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== + dependencies: + define-data-property "^1.1.1" + function-bind "^1.1.2" + get-intrinsic "^1.2.2" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +union@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" + integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== + dependencies: + qs "^6.4.0" + +url-join@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" + integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/index.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/index.d.ts new file mode 100644 index 00000000..198a0b36 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/index.d.ts @@ -0,0 +1,5 @@ +import { PvPicollmAttentionAction } from "./pv_picollm_attention_types"; +import { getPicollmAttentionWasmFunctions } from "./pv_picollm_attention"; +import { pvPicollmAttentionActionMap } from "./pv_picollm_attention_worker"; +export { PvPicollmAttentionAction, getPicollmAttentionWasmFunctions, pvPicollmAttentionActionMap, }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/index.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/index.d.ts.map new file mode 100644 index 00000000..e008829f --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_attention/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,OAAO,EACL,wBAAwB,EACxB,gCAAgC,EAChC,2BAA2B,GAC5B,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention.d.ts new file mode 100644 index 00000000..03087477 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention.d.ts @@ -0,0 +1,9 @@ +export declare const getPicollmAttentionWasmFunctions: (memory: WebAssembly.Memory) => { + pv_picollm_attention_precompute_encoding_web_worker_wasm: (objAddress: number, encodingAddress: number, dimension: number, steps: number, theta: number, statusAddress: number) => Promise; + pv_picollm_attention_encode_web_worker_wasm: (objAddress: number, xAddress: number, newEncodingAddress: number, n: number, numHeads: number, ropeInterleaved: number, headDimension: number, ropeDimension: number, position: number, statusAddress: number) => Promise; + pv_picollm_attention_attend_web_worker_wasm: (objAddress: number, numHeads: number, numKvHeads: number, windowLength: number, headDimension: number, keysAddress: number, keyInterceptsAddress: number, keySlopesAddress: number, valuesAddress: number, valueInterceptsAddress: number, valueSlopesAddress: number, position: number, queryAddress: number, n: number, outputAddress: number, statusAddress: number) => Promise; + pv_picollm_attention_update_keys_web_worker_wasm: (objAddress: number, numKvHeads: number, windowLength: number, headDimension: number, keysAddress: number, keyInterceptsAddress: number, keySlopesAddress: number, position: number, n: number, tfAddress: number, statusAddress: number) => Promise; + pv_picollm_attention_update_values_web_worker_wasm: (objAddress: number, numKvHeads: number, windowLength: number, headDimension: number, valuesAddress: number, valueInterceptsAddress: number, valueSlopesAddress: number, position: number, n: number, tfAddress: number, statusAddress: number) => Promise; + pv_picollm_attention_transpose_query_web_worker_wasm: (objAddress: number, n: number, tfAddress: number, hfAddress: number, numHeads: number, headDimension: number, statusAddress: number) => Promise; +}; +//# sourceMappingURL=pv_picollm_attention.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention.d.ts.map new file mode 100644 index 00000000..7c244bf4 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_attention.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gCAAgC,WAAY,YAAY,MAAM;2EAS3D,MAAM,mBACD,MAAM,aACZ,MAAM,SACV,MAAM,SACN,MAAM,iBACE,MAAM;8DA6BT,MAAM,YACR,MAAM,sBACI,MAAM,KACvB,MAAM,YACC,MAAM,mBACC,MAAM,iBACR,MAAM,iBACN,MAAM,YACX,MAAM,iBACD,MAAM;8DAkCT,MAAM,YACR,MAAM,cACJ,MAAM,gBACJ,MAAM,iBACL,MAAM,eACR,MAAM,wBACG,MAAM,oBACV,MAAM,iBACT,MAAM,0BACG,MAAM,sBACV,MAAM,YAChB,MAAM,gBACF,MAAM,KACjB,MAAM,iBACM,MAAM,iBACN,MAAM;mEA8CT,MAAM,cACN,MAAM,gBACJ,MAAM,iBACL,MAAM,eACR,MAAM,wBACG,MAAM,oBACV,MAAM,YACd,MAAM,KACb,MAAM,aACE,MAAM,iBACF,MAAM;qEAqCT,MAAM,cACN,MAAM,gBACJ,MAAM,iBACL,MAAM,iBACN,MAAM,0BACG,MAAM,sBACV,MAAM,YAChB,MAAM,KACb,MAAM,aACE,MAAM,iBACF,MAAM;uEAqCT,MAAM,KACf,MAAM,aACE,MAAM,aACN,MAAM,YACP,MAAM,iBACD,MAAM,iBACN,MAAM;CAqCxB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_types.d.ts new file mode 100644 index 00000000..87e80f86 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_types.d.ts @@ -0,0 +1,83 @@ +import { PvXpuType } from "../types"; +export declare enum PvPicollmAttentionAction { + ATTENTION_PRECOMPUTE_ENCODING = 200, + ATTENTION_ENCODE = 201, + ATTENTION_ATTEND = 202, + ATTENTION_UPDATE_KEYS = 203, + ATTENTION_UPDATE_VALUES = 204, + ATTENTION_TRANSPOSE_QUERY = 205 +} +export type AttentionPrecomputeEncodingType = { + encodingAddress: number; + dimension: number; + steps: number; + theta: number; +} & PvXpuType<{ + pv_picollm_attention_precompute_encoding: (encodingAddress: number, dimension: number, steps: number, theta: number) => void; +}>; +export type AttentionEncodeType = { + xAddress: number; + newEncodingAddress: number; + n: number; + numHeads: number; + ropeInterleaved: number; + headDimension: number; + ropeDimension: number; + position: number; +} & PvXpuType<{ + pv_picollm_attention_encode: (xAddress: number, newEncodingAddress: number, n: number, numHeads: number, ropeInterleaved: number, headDimension: number, ropeDimension: number, position: number) => void; +}>; +export type AttentionAttendType = { + numHeads: number; + numKvHeads: number; + windowLength: number; + headDimension: number; + keysAddress: number; + keyInterceptsAddress: number; + keySlopesAddress: number; + valuesAddress: number; + valueInterceptsAddress: number; + valueSlopesAddress: number; + position: number; + queryAddress: number; + n: number; + outputAddress: number; +} & PvXpuType<{ + pv_picollm_attention_attend: (numHeads: number, numKvHeads: number, windowLength: number, headDimension: number, keysAddress: number, keyInterceptsAddress: number, keySlopesAddress: number, valuesAddress: number, valueInterceptsAddress: number, valueSlopesAddress: number, position: number, queryAddress: number, n: number, outputAddress: number) => void; +}>; +export type AttentionUpdateKeysType = { + numKvHeads: number; + windowLength: number; + headDimension: number; + keysAddress: number; + keyInterceptsAddress: number; + keySlopesAddress: number; + position: number; + n: number; + tfAddress: number; +} & PvXpuType<{ + pv_picollm_attention_update_keys: (numKvHeads: number, windowLength: number, headDimension: number, keysAddress: number, keyInterceptsAddress: number, keySlopesAddress: number, position: number, n: number, tfAddress: number) => void; +}>; +export type AttentionUpdateValuesType = { + numKvHeads: number; + windowLength: number; + headDimension: number; + valuesAddress: number; + valueInterceptsAddress: number; + valueSlopesAddress: number; + position: number; + n: number; + tfAddress: number; +} & PvXpuType<{ + pv_picollm_attention_update_values: (numKvHeads: number, windowLength: number, headDimension: number, valuesAddress: number, valueInterceptsAddress: number, valueSlopesAddress: number, position: number, n: number, tfAddress: number) => void; +}>; +export type AttentionTransposeQueryType = { + n: number; + tfAddress: number; + hfAddress: number; + numHeads: number; + headDimension: number; +} & PvXpuType<{ + pv_picollm_attention_transpose_query: (n: number, tfAddress: number, hfAddress: number, numHeads: number, headDimension: number) => void; +}>; +//# sourceMappingURL=pv_picollm_attention_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_types.d.ts.map new file mode 100644 index 00000000..12202ec4 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_attention_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,wBAAwB;IAClC,6BAA6B,MAAM;IACnC,gBAAgB,MAAA;IAChB,gBAAgB,MAAA;IAChB,qBAAqB,MAAA;IACrB,uBAAuB,MAAA;IACvB,yBAAyB,MAAA;CAC1B;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,SAAS,CAAC;IACZ,wCAAwC,EAAE,CACxC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,KACV,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,2BAA2B,EAAE,CAC3B,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,MAAM,EAC1B,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,SAAS,CAAC;IACZ,2BAA2B,EAAE,CAC3B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,oBAAoB,EAAE,MAAM,EAC5B,gBAAgB,EAAE,MAAM,EACxB,aAAa,EAAE,MAAM,EACrB,sBAAsB,EAAE,MAAM,EAC9B,kBAAkB,EAAE,MAAM,EAC1B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,CAAC,EAAE,MAAM,EACT,aAAa,EAAE,MAAM,KAClB,IAAI,CAAA;CACV,CAAC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,SAAS,CAAC;IACZ,gCAAgC,EAAE,CAChC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,oBAAoB,EAAE,MAAM,EAC5B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,MAAM,EAChB,CAAC,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,KACd,IAAI,CAAA;CACV,CAAC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,SAAS,CAAC;IACZ,kCAAkC,EAAE,CAClC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,sBAAsB,EAAE,MAAM,EAC9B,kBAAkB,EAAE,MAAM,EAC1B,QAAQ,EAAE,MAAM,EAChB,CAAC,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,KACd,IAAI,CAAA;CACV,CAAC,CAAC;AAEH,MAAM,MAAM,2BAA2B,GAAG;IACxC,CAAC,EAAE,MAAM,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,SAAS,CAAC;IACZ,oCAAoC,EAAE,CACpC,CAAC,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,KAClB,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_worker.d.ts new file mode 100644 index 00000000..04d619ab --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_worker.d.ts @@ -0,0 +1,3 @@ +import { PvPicollmAttentionAction } from './pv_picollm_attention_types'; +export declare const pvPicollmAttentionActionMap: Partial>; +//# sourceMappingURL=pv_picollm_attention_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_worker.d.ts.map new file mode 100644 index 00000000..295ca173 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_worker.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_attention_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_attention/pv_picollm_attention_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAOL,wBAAwB,EACzB,MAAM,8BAA8B,CAAC;AAyQtC,eAAO,MAAM,2BAA2B,EAAE,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,CAOnG,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/index.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/index.d.ts new file mode 100644 index 00000000..bf0db51a --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/index.d.ts @@ -0,0 +1,5 @@ +import { PvPicollmFeedForwardAction } from "./pv_picollm_feed_forward_types"; +import { getPicollmFeedForwardWasmFunctions } from "./pv_picollm_feed_forward"; +import { pvPicollmFeedForwardActionMap } from "./pv_picollm_feed_forward_worker"; +export { PvPicollmFeedForwardAction, getPicollmFeedForwardWasmFunctions, pvPicollmFeedForwardActionMap, }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/index.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/index.d.ts.map new file mode 100644 index 00000000..cbca7d8a --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_feed_forward/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAEjF,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,EAClC,6BAA6B,GAC9B,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward.d.ts new file mode 100644 index 00000000..0a23225e --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward.d.ts @@ -0,0 +1,7 @@ +export declare const getPicollmFeedForwardWasmFunctions: (memory: WebAssembly.Memory) => { + pv_picollm_feed_forward_silu_web_worker_wasm: (objAddress: number, n: number, xAddress: number, statusAddress: number) => Promise; + pv_picollm_feed_forward_gelu_web_worker_wasm: (objAddress: number, n: number, xAddress: number, statusAddress: number) => Promise; + pv_picollm_feed_forward_almost_gelu_web_worker_wasm: (objAddress: number, n: number, xAddress: number, statusAddress: number) => Promise; + pv_picollm_feed_forward_multiply_buffers_web_worker_wasm: (objAddress: number, n: number, xAddress: number, yAddress: number, statusAddress: number) => Promise; +}; +//# sourceMappingURL=pv_picollm_feed_forward.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward.d.ts.map new file mode 100644 index 00000000..3fdc5e87 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_feed_forward.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kCAAkC,WAAY,YAAY,MAAM;+DAS7D,MAAM,KACf,MAAM,YACC,MAAM,iBACD,MAAM;+DA2BT,MAAM,KACf,MAAM,YACC,MAAM,iBACD,MAAM;sEA2BT,MAAM,KACf,MAAM,YACC,MAAM,iBACD,MAAM;2EA0BT,MAAM,KACf,MAAM,YACC,MAAM,YACN,MAAM,iBACD,MAAM;CAkCxB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.d.ts new file mode 100644 index 00000000..1f90f8b8 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.d.ts @@ -0,0 +1,33 @@ +import { PvXpuType } from "../types"; +export declare enum PvPicollmFeedForwardAction { + FEED_FORWARD_SILU = 300, + FEED_FORWARD_GELU = 301, + FEED_FORWARD_ALMOST_GELU = 302, + FEED_FORWARD_MULTIPLY_BUFFERS = 303 +} +export type FeedForwardSiluType = { + n: number; + xAddress: number; +} & PvXpuType<{ + pv_picollm_feed_forward_silu: (n: number, xAddress: number) => void; +}>; +export type FeedForwardGeluType = { + n: number; + xAddress: number; +} & PvXpuType<{ + pv_picollm_feed_forward_gelu: (n: number, xAddress: number) => void; +}>; +export type FeedForwardAlmostGeluType = { + n: number; + xAddress: number; +} & PvXpuType<{ + pv_picollm_feed_forward_almost_gelu: (n: number, xAddress: number) => void; +}>; +export type FeedForwardMultiplyBuffersType = { + n: number; + xAddress: number; + yAddress: number; +} & PvXpuType<{ + pv_picollm_feed_forward_multiply_buffers: (n: number, xAddress: number, yAddress: number) => void; +}>; +//# sourceMappingURL=pv_picollm_feed_forward_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.d.ts.map new file mode 100644 index 00000000..4d6ad504 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_feed_forward_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,0BAA0B;IACpC,iBAAiB,MAAM;IACvB,iBAAiB,MAAA;IACjB,wBAAwB,MAAA;IACxB,6BAA6B,MAAA;CAC9B;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,4BAA4B,EAAE,CAC5B,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,4BAA4B,EAAE,CAC5B,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG;IACtC,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,mCAAmC,EAAE,CACnC,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,8BAA8B,GAAG;IAC3C,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,wCAAwC,EAAE,CACxC,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.d.ts new file mode 100644 index 00000000..be5df4ce --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.d.ts @@ -0,0 +1,3 @@ +import { PvPicollmFeedForwardAction } from './pv_picollm_feed_forward_types'; +export declare const pvPicollmFeedForwardActionMap: Partial>; +//# sourceMappingURL=pv_picollm_feed_forward_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.d.ts.map new file mode 100644 index 00000000..919b760a --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_feed_forward_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_feed_forward/pv_picollm_feed_forward_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,0BAA0B,EAC3B,MAAM,iCAAiC,CAAC;AAyHzC,eAAO,MAAM,6BAA6B,EAAE,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,CAKvG,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/index.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/index.d.ts new file mode 100644 index 00000000..4328d3a7 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/index.d.ts @@ -0,0 +1,5 @@ +import { PvPicollmGateAction } from "./pv_picollm_gate_types"; +import { getPicollmGateWasmFunctions } from "./pv_picollm_gate"; +import { pvPicollmGateActionMap } from "./pv_picollm_gate_worker"; +export { PvPicollmGateAction, getPicollmGateWasmFunctions, pvPicollmGateActionMap, }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/index.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/index.d.ts.map new file mode 100644 index 00000000..d98b6bad --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_gate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,GACvB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate.d.ts new file mode 100644 index 00000000..12860463 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate.d.ts @@ -0,0 +1,4 @@ +export declare const getPicollmGateWasmFunctions: (memory: WebAssembly.Memory) => { + pv_picollm_gate_forward_web_worker_wasm: (objAddress: number, n: number, k: number, numExperts: number, indicesAddress: number, weightsAddress: number, yAddress: number, statusAddress: number) => Promise; +}; +//# sourceMappingURL=pv_picollm_gate.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate.d.ts.map new file mode 100644 index 00000000..5175db8c --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_gate.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,2BAA2B,WAAY,YAAY,MAAM;0DAStD,MAAM,KACf,MAAM,KACN,MAAM,cACG,MAAM,kBACF,MAAM,kBACN,MAAM,YACZ,MAAM,iBACD,MAAM;CAmCxB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.d.ts new file mode 100644 index 00000000..e8ae8c28 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.d.ts @@ -0,0 +1,15 @@ +import { PvXpuType } from "../types"; +export declare enum PvPicollmGateAction { + GATE_FORWARD = 400 +} +export type GateForwardType = { + n: number; + k: number; + numExperts: number; + indicesAddress: number; + weightsAddress: number; + yAddress: number; +} & PvXpuType<{ + pv_picollm_gate_forward: (n: number, k: number, numExperts: number, indicesAddress: number, weightsAddress: number, yAddress: number) => void; +}>; +//# sourceMappingURL=pv_picollm_gate_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.d.ts.map new file mode 100644 index 00000000..fe509d92 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_gate_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,mBAAmB;IAC7B,YAAY,MAAM;CACnB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,uBAAuB,EAAE,CACvB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.d.ts new file mode 100644 index 00000000..db5d47b7 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.d.ts @@ -0,0 +1,3 @@ +import { PvPicollmGateAction } from './pv_picollm_gate_types'; +export declare const pvPicollmGateActionMap: Partial>; +//# sourceMappingURL=pv_picollm_gate_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.d.ts.map new file mode 100644 index 00000000..5a346705 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_gate_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_gate/pv_picollm_gate_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAyCjC,eAAO,MAAM,sBAAsB,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAEzF,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/index.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/index.d.ts new file mode 100644 index 00000000..1eb32119 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/index.d.ts @@ -0,0 +1,5 @@ +import { PvPicollmMoeTransformerAction } from "./pv_picollm_moe_transformer_types"; +import { getPicollmMoeTransformerWasmFunctions } from "./pv_picollm_moe_transformer"; +import { pvPicollmMoeTransformerActionMap } from "./pv_picollm_moe_transformer_worker"; +export { PvPicollmMoeTransformerAction, getPicollmMoeTransformerWasmFunctions, pvPicollmMoeTransformerActionMap, }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/index.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/index.d.ts.map new file mode 100644 index 00000000..415e8a59 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_moe_transformer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,qCAAqC,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAC;AAEvF,OAAO,EACL,6BAA6B,EAC7B,qCAAqC,EACrC,gCAAgC,GACjC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer.d.ts new file mode 100644 index 00000000..45d01adb --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer.d.ts @@ -0,0 +1,6 @@ +export declare const getPicollmMoeTransformerWasmFunctions: (memory: WebAssembly.Memory) => { + pv_picollm_moe_transformer_add_to_buffer_web_worker_wasm: (objAddress: number, n: number, xAddress: number, bufferAddress: number, statusAddress: number) => Promise; + pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer_web_worker_wasm: (objAddress: number, n: number, weightsIndex: number, yIndex: number, weightsAddress: number, xAddress: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_moe_transformer_add_buffers_web_worker_wasm: (objAddress: number, n: number, buffer1Address: number, buffer2Address: number, yAddress: number, statusAddress: number) => Promise; +}; +//# sourceMappingURL=pv_picollm_moe_transformer.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer.d.ts.map new file mode 100644 index 00000000..de32486e --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_moe_transformer.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,qCAAqC,WAAY,YAAY,MAAM;2EAShE,MAAM,KACf,MAAM,YACC,MAAM,iBACD,MAAM,iBACN,MAAM;+FA6BT,MAAM,KACf,MAAM,gBACK,MAAM,UACZ,MAAM,kBACE,MAAM,YACZ,MAAM,YACN,MAAM,iBACD,MAAM;yEAiCT,MAAM,KACf,MAAM,kBACO,MAAM,kBACN,MAAM,YACZ,MAAM,iBACD,MAAM;CAmCxB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.d.ts new file mode 100644 index 00000000..a89a24f6 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.d.ts @@ -0,0 +1,32 @@ +import { PvXpuType } from "../types"; +export declare enum PvPicollmMoeTransformerAction { + ADD_TO_BUFFER = 500, + MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER = 501, + ADD_BUFFERS = 502 +} +export type MoeTransformerAddToBufferType = { + n: number; + xAddress: number; + bufferAddress: number; +} & PvXpuType<{ + pv_picollm_moe_transformer_add_to_buffer: (n: number, xAddress: number, bufferAddress: number) => void; +}>; +export type MoeTransformerMultiplyWeightAndAddToBufferType = { + n: number; + weightsIndex: number; + yIndex: number; + weightsAddress: number; + xAddress: number; + yAddress: number; +} & PvXpuType<{ + pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer: (n: number, weightsIndex: number, yIndex: number, weightsAddress: number, xAddress: number, yAddress: number) => void; +}>; +export type MoeTransformerAddBuffersType = { + n: number; + buffer1Address: number; + buffer2Address: number; + yAddress: number; +} & PvXpuType<{ + pv_picollm_moe_transformer_add_buffers: (n: number, buffer1Address: number, buffer2Address: number, yAddress: number) => void; +}>; +//# sourceMappingURL=pv_picollm_moe_transformer_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.d.ts.map new file mode 100644 index 00000000..2feba587 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_moe_transformer_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,6BAA6B;IACvC,aAAa,MAAM;IACnB,iCAAiC,MAAA;IACjC,WAAW,MAAA;CACZ;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,SAAS,CAAC;IACZ,wCAAwC,EAAE,CACxC,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,KAClB,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,8CAA8C,GAAG;IAC3D,CAAC,EAAE,MAAM,CAAC;IACV,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,4DAA4D,EAAE,CAC5D,CAAC,EAAE,MAAM,EACT,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG;IACzC,CAAC,EAAE,MAAM,CAAC;IACV,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,sCAAsC,EAAE,CACtC,CAAC,EAAE,MAAM,EACT,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.d.ts new file mode 100644 index 00000000..2a0c1bd1 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.d.ts @@ -0,0 +1,3 @@ +import { PvPicollmMoeTransformerAction } from './pv_picollm_moe_transformer_types'; +export declare const pvPicollmMoeTransformerActionMap: Partial>; +//# sourceMappingURL=pv_picollm_moe_transformer_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.d.ts.map new file mode 100644 index 00000000..ccae345c --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_moe_transformer_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_moe_transformer/pv_picollm_moe_transformer_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,6BAA6B,EAC9B,MAAM,oCAAoC,CAAC;AA4G5C,eAAO,MAAM,gCAAgC,EAAE,OAAO,CAAC,MAAM,CAAC,6BAA6B,EAAE,gBAAgB,CAAC,CAI7G,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/index.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/index.d.ts new file mode 100644 index 00000000..7a2bf326 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/index.d.ts @@ -0,0 +1,5 @@ +import { PvPicollmNormAction } from "./pv_picollm_norm_types"; +import { getPicollmNormWasmFunctions } from "./pv_picollm_norm"; +import { pvPicollmNormActionMap } from "./pv_picollm_norm_worker"; +export { PvPicollmNormAction, getPicollmNormWasmFunctions, pvPicollmNormActionMap, }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/index.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/index.d.ts.map new file mode 100644 index 00000000..af92c3ed --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_norm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,GACvB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm.d.ts new file mode 100644 index 00000000..3b5f3af0 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm.d.ts @@ -0,0 +1,4 @@ +export declare const getPicollmNormWasmFunctions: (memory: WebAssembly.Memory) => { + pv_picollm_norm_forward_web_worker_wasm: (objAddress: number, dimension: number, eps: number, weightAddress: number, n: number, xOffset: number, xAddress: number, yOffset: number, yAddress: number, statusAddress: number) => Promise; +}; +//# sourceMappingURL=pv_picollm_norm.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm.d.ts.map new file mode 100644 index 00000000..c2802fc5 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_norm.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,2BAA2B,WAAY,YAAY,MAAM;0DAStD,MAAM,aACP,MAAM,OACZ,MAAM,iBACI,MAAM,KAClB,MAAM,WACA,MAAM,YACL,MAAM,WACP,MAAM,YACL,MAAM,iBACD,MAAM;CAqCxB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.d.ts new file mode 100644 index 00000000..5c72edd1 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.d.ts @@ -0,0 +1,17 @@ +import { PvXpuType } from "../types"; +export declare enum PvPicollmNormAction { + NORM_FORWARD = 600 +} +export type NormForwardType = { + dimension: number; + eps: number; + weightAddress: number; + n: number; + xOffset: number; + xAddress: number; + yOffset: number; + yAddress: number; +} & PvXpuType<{ + pv_picollm_norm_forward: (dimension: number, eps: number, weightAddress: number, n: number, xAddress: number, yAddress: number) => void; +}>; +//# sourceMappingURL=pv_picollm_norm_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.d.ts.map new file mode 100644 index 00000000..a5b4e6a2 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_norm_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,mBAAmB;IAC7B,YAAY,MAAM;CACnB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,uBAAuB,EAAE,CACvB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.d.ts new file mode 100644 index 00000000..6899300f --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.d.ts @@ -0,0 +1,3 @@ +import { PvPicollmNormAction } from './pv_picollm_norm_types'; +export declare const pvPicollmNormActionMap: Partial>; +//# sourceMappingURL=pv_picollm_norm_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.d.ts.map new file mode 100644 index 00000000..7eb68d24 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_norm_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_norm/pv_picollm_norm_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AA2CjC,eAAO,MAAM,sBAAsB,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAEzF,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/index.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/index.d.ts new file mode 100644 index 00000000..69e3c07f --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/index.d.ts @@ -0,0 +1,5 @@ +import { PvPicollmNormLayerAction } from "./pv_picollm_norm_layer_types"; +import { getPicollmNormLayerWasmFunctions } from "./pv_picollm_norm_layer"; +import { pvPicollmNormLayerActionMap } from "./pv_picollm_norm_layer_worker"; +export { PvPicollmNormLayerAction, getPicollmNormLayerWasmFunctions, pvPicollmNormLayerActionMap, }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/index.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/index.d.ts.map new file mode 100644 index 00000000..b8afcf80 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_norm_layer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAE7E,OAAO,EACL,wBAAwB,EACxB,gCAAgC,EAChC,2BAA2B,GAC5B,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer.d.ts new file mode 100644 index 00000000..ee3fdf4e --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer.d.ts @@ -0,0 +1,4 @@ +export declare const getPicollmNormLayerWasmFunctions: (memory: WebAssembly.Memory) => { + pv_picollm_norm_layer_forward_web_worker_wasm: (objAddress: number, dimension: number, eps: number, weightAddress: number, biasAddress: number, n: number, xOffset: number, xAddress: number, yOffset: number, yAddress: number, statusAddress: number) => Promise; +}; +//# sourceMappingURL=pv_picollm_norm_layer.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer.d.ts.map new file mode 100644 index 00000000..73559698 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_norm_layer.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gCAAgC,WAAY,YAAY,MAAM;gEAS3D,MAAM,aACP,MAAM,OACZ,MAAM,iBACI,MAAM,eACR,MAAM,KAChB,MAAM,WACA,MAAM,YACL,MAAM,WACP,MAAM,YACL,MAAM,iBACD,MAAM;CAuCxB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.d.ts new file mode 100644 index 00000000..87eccab4 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.d.ts @@ -0,0 +1,18 @@ +import { PvXpuType } from "../types"; +export declare enum PvPicollmNormLayerAction { + NORM_LAYER_FORWARD = 800 +} +export type NormLayerForwardType = { + dimension: number; + eps: number; + weightAddress: number; + biasAddress: number; + n: number; + xOffset: number; + xAddress: number; + yOffset: number; + yAddress: number; +} & PvXpuType<{ + pv_picollm_norm_layer_forward: (dimension: number, eps: number, weightAddress: number, biasAddress: number, n: number, xAddress: number, yAddress: number) => void; +}>; +//# sourceMappingURL=pv_picollm_norm_layer_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.d.ts.map new file mode 100644 index 00000000..ec5971f3 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_norm_layer_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,wBAAwB;IAClC,kBAAkB,MAAM;CACzB;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,6BAA6B,EAAE,CAC7B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.d.ts new file mode 100644 index 00000000..cba33da6 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.d.ts @@ -0,0 +1,3 @@ +import { PvPicollmNormLayerAction } from './pv_picollm_norm_layer_types'; +export declare const pvPicollmNormLayerActionMap: Partial>; +//# sourceMappingURL=pv_picollm_norm_layer_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.d.ts.map new file mode 100644 index 00000000..1e84c381 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_norm_layer_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_norm_layer/pv_picollm_norm_layer_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,wBAAwB,EACzB,MAAM,+BAA+B,CAAC;AA8CvC,eAAO,MAAM,2BAA2B,EAAE,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,CAEnG,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/index.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/index.d.ts new file mode 100644 index 00000000..2faa09c4 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/index.d.ts @@ -0,0 +1,5 @@ +import { PvPicollmTransformerAction } from "./pv_picollm_transformer_types"; +import { getPicollmTransformerWasmFunctions } from "./pv_picollm_transformer"; +import { pvPicollmTransformerActionMap } from "./pv_picollm_transformer_worker"; +export { PvPicollmTransformerAction, getPicollmTransformerWasmFunctions, pvPicollmTransformerActionMap, }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/index.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/index.d.ts.map new file mode 100644 index 00000000..94854bfb --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_transformer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,EAClC,6BAA6B,GAC9B,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer.d.ts new file mode 100644 index 00000000..2258c698 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer.d.ts @@ -0,0 +1,5 @@ +export declare const getPicollmTransformerWasmFunctions: (memory: WebAssembly.Memory) => { + pv_picollm_transformer_add_to_buffer_web_worker_wasm: (objAddress: number, n: number, xAddress: number, bufferAddress: number, statusAddress: number) => Promise; + pv_picollm_transformer_add_buffers_web_worker_wasm: (objAddress: number, n: number, buffer1Address: number, buffer2Address: number, yAddress: number, statusAddress: number) => Promise; +}; +//# sourceMappingURL=pv_picollm_transformer.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer.d.ts.map new file mode 100644 index 00000000..75e2198f --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_transformer.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kCAAkC,WAAY,YAAY,MAAM;uEAS7D,MAAM,KACf,MAAM,YACC,MAAM,iBACD,MAAM,iBACN,MAAM;qEA6BT,MAAM,KACf,MAAM,kBACO,MAAM,kBACN,MAAM,YACZ,MAAM,iBACD,MAAM;CAkCxB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.d.ts new file mode 100644 index 00000000..19aa8a6b --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.d.ts @@ -0,0 +1,21 @@ +import { PvXpuType } from "../types"; +export declare enum PvPicollmTransformerAction { + ADD_TO_BUFFER = 700, + ADD_BUFFERS = 701 +} +export type TransformerAddToBufferType = { + n: number; + xAddress: number; + bufferAddress: number; +} & PvXpuType<{ + pv_picollm_transformer_add_to_buffer: (n: number, xAddress: number, bufferAddress: number) => void; +}>; +export type TransformerAddBuffersType = { + n: number; + buffer1Address: number; + buffer2Address: number; + yAddress: number; +} & PvXpuType<{ + pv_picollm_transformer_add_buffers: (n: number, buffer1Address: number, buffer2Address: number, yAddress: number) => void; +}>; +//# sourceMappingURL=pv_picollm_transformer_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.d.ts.map new file mode 100644 index 00000000..38036b0e --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_transformer_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,0BAA0B;IACpC,aAAa,MAAM;IACnB,WAAW,MAAA;CACZ;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,SAAS,CAAC;IACZ,oCAAoC,EAAE,CACpC,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,KAClB,IAAI,CAAC;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG;IACtC,CAAC,EAAE,MAAM,CAAC;IACV,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,kCAAkC,EAAE,CAClC,CAAC,EAAE,MAAM,EACT,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;CACX,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.d.ts new file mode 100644 index 00000000..93b3be8c --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.d.ts @@ -0,0 +1,3 @@ +import { PvPicollmTransformerAction } from './pv_picollm_transformer_types'; +export declare const pvPicollmTransformerActionMap: Partial>; +//# sourceMappingURL=pv_picollm_transformer_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.d.ts.map new file mode 100644 index 00000000..f330db89 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_transformer_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_transformer/pv_picollm_transformer_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,0BAA0B,EAC3B,MAAM,gCAAgC,CAAC;AAqExC,eAAO,MAAM,6BAA6B,EAAE,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,CAGvG,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/index.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/index.d.ts new file mode 100644 index 00000000..e9132da7 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/index.d.ts @@ -0,0 +1,5 @@ +import { PvPicollmWeightAction } from "./pv_picollm_weight_types"; +import { getPicollmWeightWasmFunctions } from "./pv_picollm_weight"; +import { pvPicollmWeightActionMap } from "./pv_picollm_weight_worker"; +export { PvPicollmWeightAction, getPicollmWeightWasmFunctions, pvPicollmWeightActionMap, }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/index.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/index.d.ts.map new file mode 100644 index 00000000..6d557527 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_weight/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,wBAAwB,GACzB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.d.ts new file mode 100644 index 00000000..d31c146f --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.d.ts @@ -0,0 +1,8 @@ +export declare const getPicollmWeightWasmFunctions: (memory: WebAssembly.Memory) => { + pv_picollm_weight_block_mixed_16x8_preprocess_blocks_web_worker_wasm: (objAddress: number, shapeAddress: number, numBitDepths: number, bitDepthsAddress: number, bitDepthsStartAddress: number, numBlockBytes: number, blocksAddress: number, statusAddress: number) => Promise; + pv_picollm_weight_block_mixed_16x8_forward_single_web_worker_wasm: (objAddress: number, shapeAddress: number, indicesAddress: number, numBitDepths: number, bitDepthsStartAddress: number, bitDepthsAddress: number, numMetas: number, metasAddress: number, numBlockBytes: number, blocksAddress: number, xOffset: number, xAddress: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_weight_block_mixed_16x8_forward_multiple_web_worker_wasm: (objAddress: number, shapeAddress: number, indicesAddress: number, numBitDepths: number, bitDepthsStartAddress: number, bitDepthsAddress: number, numMetas: number, metasAddress: number, numBlockBytes: number, blocksAddress: number, n: number, xOffset: number, xAddress: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_weight_block_mixed_16x8_add_bias_web_worker_wasm: (objAddress: number, n: number, dimension: number, yAddress: number, biasAddress: number, statusAddress: number) => Promise; + pv_picollm_weight_float_forward_web_worker_wasm: (objAddress: number, n: number, nc: number, nr: number, wAddress: number, xOffset: number, xAddress: number, yAddress: number, statusAddress: number) => Promise; +}; +//# sourceMappingURL=pv_picollm_weight.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.d.ts.map new file mode 100644 index 00000000..10d918dd --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_weight.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,6BAA6B,WAAY,YAAY,MAAM;uFASxD,MAAM,gBACJ,MAAM,gBACN,MAAM,oBACF,MAAM,yBACD,MAAM,iBACd,MAAM,iBACN,MAAM,iBACN,MAAM;oFAqCT,MAAM,gBACJ,MAAM,kBACJ,MAAM,gBACR,MAAM,yBACG,MAAM,oBACX,MAAM,YACd,MAAM,gBACF,MAAM,iBACL,MAAM,iBACN,MAAM,WACZ,MAAM,YACL,MAAM,YACN,MAAM,iBACD,MAAM;sFA+CT,MAAM,gBACJ,MAAM,kBACJ,MAAM,gBACR,MAAM,yBACG,MAAM,oBACX,MAAM,YACd,MAAM,gBACF,MAAM,iBACL,MAAM,iBACN,MAAM,KAClB,MAAM,WACA,MAAM,YACL,MAAM,YACN,MAAM,iBACD,MAAM;8EAgDT,MAAM,KACf,MAAM,aACE,MAAM,YACP,MAAM,eACH,MAAM,iBACJ,MAAM;kEA6BT,MAAM,KACf,MAAM,MACL,MAAM,MACN,MAAM,YACA,MAAM,WACP,MAAM,YACL,MAAM,YACN,MAAM,iBACD,MAAM;CAuCxB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_types.d.ts new file mode 100644 index 00000000..3c83de4e --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_types.d.ts @@ -0,0 +1,68 @@ +import { PvXpuType } from "../types"; +export declare enum PvPicollmWeightAction { + WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS = 100, + WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE = 101, + WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE = 102, + WEIGHT_BLOCK_MIXED_16X8_ADD_BIAS = 103, + WEIGHT_FLOAT_FORWARD = 104 +} +export type WeightBlockMixed16x8PreprocessBlocksType = { + shape: Int32Array; + bitDepths: Int32Array; + bitDepthStarts: Int32Array; + numBlockBytes: number; + blocksAddress: number; +} & PvXpuType<{ + pv_picollm_weight_block_mixed_16x8_preprocess_blocks: (shapeAddress: number, numBitDepths: number, bitDepthsAddress: number, bitDepthStartsAddress: number, blocksAddress: number) => void; +}>; +export type WeightBlockMixed16x8ForwardSingleType = { + shape: Int32Array; + indicesAddress: number; + bitDepths: Int32Array; + bitDepthStarts: Int32Array; + numMetas: number; + metasAddress: number; + numBlockBytes: number; + blocksAddress: number; + xOffset: number; + xAddress: number; + yAddress: number; +} & PvXpuType<{ + pv_picollm_weight_block_mixed_16x8_forward_single: (shapeAddress: number, indicesAddress: number, numBitDepths: number, bitDepthsAddress: number, bitDepthStartsAddress: number, metasAddress: number, blocksAddress: number, xAddress: number, yAddress: number) => void; +}>; +export type WeightBlockMixed16x8ForwardMultipleType = { + shape: Int32Array; + indicesAddress: number; + bitDepths: Int32Array; + bitDepthStarts: Int32Array; + numMetas: number; + metasAddress: number; + numBlockBytes: number; + blocksAddress: number; + n: number; + xOffset: number; + xAddress: number; + yAddress: number; +} & PvXpuType<{ + pv_picollm_weight_block_mixed_16x8_forward_multiple: (shapeAddress: number, indicesAddress: number, numBitDepths: number, bitDepthsAddress: number, bitDepthStartsAddress: number, metasAddress: number, blocksAddress: number, n: number, xAddress: number, yAddress: number) => void; +}>; +export type WeightBlockMixed16x8AddBiasType = { + n: number; + dimension: number; + yAddress: number; + biasAddress: number; +} & PvXpuType<{ + pv_picollm_weight_block_mixed_16x8_add_bias: (n: number, dimension: number, yAddress: number, biasAddress: number) => void; +}>; +export type WeightFloatForwardType = { + n: number; + nc: number; + nr: number; + wAddress: number; + xOffset: number; + xAddress: number; + yAddress: number; +} & PvXpuType<{ + pv_picollm_weight_float_forward: (n: number, nc: number, nr: number, wAddress: number, xAddress: number, yAddress: number) => void; +}>; +//# sourceMappingURL=pv_picollm_weight_types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_types.d.ts.map new file mode 100644 index 00000000..7389ad92 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_types.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_weight_types.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,oBAAY,qBAAqB;IAC/B,yCAAyC,MAAM;IAC/C,sCAAsC,MAAA;IACtC,wCAAwC,MAAA;IACxC,gCAAgC,MAAA;IAChC,oBAAoB,MAAA;CACrB;AAED,MAAM,MAAM,wCAAwC,GAAG;IACrD,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,UAAU,CAAC;IACtB,cAAc,EAAE,UAAU,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,SAAS,CAAC;IACZ,oDAAoD,EAAE,CACpD,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,qBAAqB,EAAE,MAAM,EAC7B,aAAa,EAAE,MAAM,KAClB,IAAI,CAAA;CACV,CAAC,CAAC;AAEH,MAAM,MAAM,qCAAqC,GAAG;IAClD,KAAK,EAAE,UAAU,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,UAAU,CAAC;IACtB,cAAc,EAAE,UAAU,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,iDAAiD,EAAE,CACjD,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,qBAAqB,EAAE,MAAM,EAC7B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAA;CACV,CAAC,CAAC;AAEH,MAAM,MAAM,uCAAuC,GAAG;IACpD,KAAK,EAAE,UAAU,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,UAAU,CAAC;IACtB,cAAc,EAAE,UAAU,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,mDAAmD,EAAE,CACnD,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,qBAAqB,EAAE,MAAM,EAC7B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAA;CACV,CAAC,CAAC;AAEH,MAAM,MAAM,+BAA+B,GAAG;IAC5C,CAAC,EAAE,MAAM,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,SAAS,CAAC;IACZ,2CAA2C,EAAE,CAC3C,CAAC,EAAE,MAAM,EACT,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,IAAI,CAAA;CACV,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACnC,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAAC;IACZ,+BAA+B,EAAE,CAC/B,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,IAAI,CAAA;CACV,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_worker.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_worker.d.ts new file mode 100644 index 00000000..597af6c9 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_worker.d.ts @@ -0,0 +1,3 @@ +import { PvPicollmWeightAction } from './pv_picollm_weight_types'; +export declare const pvPicollmWeightActionMap: Partial>; +//# sourceMappingURL=pv_picollm_weight_worker.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_worker.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_worker.d.ts.map new file mode 100644 index 00000000..dca1e8b3 --- /dev/null +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_worker.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pv_picollm_weight_worker.d.ts","sourceRoot":"","sources":["../../../../../src/xpu_web_worker/src/pv_picollm_weight/pv_picollm_weight_worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,qBAAqB,EACtB,MAAM,2BAA2B,CAAC;AAkSnC,eAAO,MAAM,wBAAwB,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAM7F,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_xpu.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/pv_xpu.d.ts index 4dac955a..74739553 100644 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_xpu.d.ts +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_xpu.d.ts @@ -1,11 +1,40 @@ declare const initXpu: (memory: WebAssembly.Memory, xpuHelperWasm?: Uint8Array) => { + pv_picollm_weight_block_mixed_16x8_preprocess_blocks_web_worker_wasm: (objAddress: number, shapeAddress: number, numBitDepths: number, bitDepthsAddress: number, bitDepthsStartAddress: number, numBlockBytes: number, blocksAddress: number, statusAddress: number) => Promise; + pv_picollm_weight_block_mixed_16x8_forward_single_web_worker_wasm: (objAddress: number, shapeAddress: number, indicesAddress: number, numBitDepths: number, bitDepthsStartAddress: number, bitDepthsAddress: number, numMetas: number, metasAddress: number, numBlockBytes: number, blocksAddress: number, xOffset: number, xAddress: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_weight_block_mixed_16x8_forward_multiple_web_worker_wasm: (objAddress: number, shapeAddress: number, indicesAddress: number, numBitDepths: number, bitDepthsStartAddress: number, bitDepthsAddress: number, numMetas: number, metasAddress: number, numBlockBytes: number, blocksAddress: number, n: number, xOffset: number, xAddress: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_weight_block_mixed_16x8_add_bias_web_worker_wasm: (objAddress: number, n: number, dimension: number, yAddress: number, biasAddress: number, statusAddress: number) => Promise; + pv_picollm_weight_float_forward_web_worker_wasm: (objAddress: number, n: number, nc: number, nr: number, wAddress: number, xOffset: number, xAddress: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_transformer_add_to_buffer_web_worker_wasm: (objAddress: number, n: number, xAddress: number, bufferAddress: number, statusAddress: number) => Promise; + pv_picollm_transformer_add_buffers_web_worker_wasm: (objAddress: number, n: number, buffer1Address: number, buffer2Address: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_norm_layer_forward_web_worker_wasm: (objAddress: number, dimension: number, eps: number, weightAddress: number, biasAddress: number, n: number, xOffset: number, xAddress: number, yOffset: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_norm_forward_web_worker_wasm: (objAddress: number, dimension: number, eps: number, weightAddress: number, n: number, xOffset: number, xAddress: number, yOffset: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_moe_transformer_add_to_buffer_web_worker_wasm: (objAddress: number, n: number, xAddress: number, bufferAddress: number, statusAddress: number) => Promise; + pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer_web_worker_wasm: (objAddress: number, n: number, weightsIndex: number, yIndex: number, weightsAddress: number, xAddress: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_moe_transformer_add_buffers_web_worker_wasm: (objAddress: number, n: number, buffer1Address: number, buffer2Address: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_gate_forward_web_worker_wasm: (objAddress: number, n: number, k: number, numExperts: number, indicesAddress: number, weightsAddress: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_feed_forward_silu_web_worker_wasm: (objAddress: number, n: number, xAddress: number, statusAddress: number) => Promise; + pv_picollm_feed_forward_gelu_web_worker_wasm: (objAddress: number, n: number, xAddress: number, statusAddress: number) => Promise; + pv_picollm_feed_forward_almost_gelu_web_worker_wasm: (objAddress: number, n: number, xAddress: number, statusAddress: number) => Promise; + pv_picollm_feed_forward_multiply_buffers_web_worker_wasm: (objAddress: number, n: number, xAddress: number, yAddress: number, statusAddress: number) => Promise; + pv_picollm_attention_precompute_encoding_web_worker_wasm: (objAddress: number, encodingAddress: number, dimension: number, steps: number, theta: number, statusAddress: number) => Promise; + pv_picollm_attention_encode_web_worker_wasm: (objAddress: number, xAddress: number, newEncodingAddress: number, n: number, numHeads: number, ropeInterleaved: number, headDimension: number, ropeDimension: number, position: number, statusAddress: number) => Promise; + pv_picollm_attention_attend_web_worker_wasm: (objAddress: number, numHeads: number, numKvHeads: number, windowLength: number, headDimension: number, keysAddress: number, keyInterceptsAddress: number, keySlopesAddress: number, valuesAddress: number, valueInterceptsAddress: number, valueSlopesAddress: number, position: number, queryAddress: number, n: number, outputAddress: number, statusAddress: number) => Promise; + pv_picollm_attention_update_keys_web_worker_wasm: (objAddress: number, numKvHeads: number, windowLength: number, headDimension: number, keysAddress: number, keyInterceptsAddress: number, keySlopesAddress: number, position: number, n: number, tfAddress: number, statusAddress: number) => Promise; + pv_picollm_attention_update_values_web_worker_wasm: (objAddress: number, numKvHeads: number, windowLength: number, headDimension: number, valuesAddress: number, valueInterceptsAddress: number, valueSlopesAddress: number, position: number, n: number, tfAddress: number, statusAddress: number) => Promise; + pv_picollm_attention_transpose_query_web_worker_wasm: (objAddress: number, n: number, tfAddress: number, hfAddress: number, numHeads: number, headDimension: number, statusAddress: number) => Promise; pv_matrix_vector_multiply_web_worker_wasm: (objAddress: number, matrixAddress: number, vectorAddress: number, m: number, n: number, resultAddress: number, statusAddress: number) => Promise; + aligned_alloc: (alignment: number, size: number) => Promise; + pv_xpu_web_worker_device_info_wasm: (browserNameAddressAddress: number, browserVersionAddressAddress: number, osNameAddressAddress: number, numCoresAddress: number, statusAddress: number) => Promise; pv_xpu_web_worker_device_init_wasm: (objAddress: number, numWorkers: number, statusAddress: number) => Promise; pv_xpu_web_worker_device_cleanup_wasm: (objAddress: number) => void; pv_xpu_web_worker_device_mem_alloc_wasm: (objAddress: number, memAddress: number, sizeBytes: number, batchSize: number, isShared: number, statusAddress: number) => Promise; pv_xpu_web_worker_device_mem_free_wasm: (memAddress: number) => Promise; - pv_xpu_web_worker_device_mem_copy_to_xpu_wasm: (memAddress: number, hostAddress: number, sizeBytes: number) => Promise; - pv_xpu_web_worker_device_mem_copy_from_xpu_wasm: (memAddress: number, hostAddress: number, sizeBytes: number) => Promise; + pv_xpu_web_worker_device_mem_copy_to_xpu_wasm: (memAddress: number, hostAddress: number, offset: number, sizeBytes: number) => Promise; + pv_xpu_web_worker_device_mem_copy_from_xpu_wasm: (memAddress: number, hostAddress: number, offset: number, sizeBytes: number) => Promise; + pv_xpu_web_worker_device_mem_memset_wasm: (memAddress: number, fillByte: number, sizeBytes: number) => Promise; + pv_xpu_web_worker_get_max_workers_wasm: (maxWorkersAddress: number) => Promise; + pv_xpu_web_worker_timer_start_wasm: (objAddress: number) => Promise; + pv_xpu_web_worker_timer_stop_wasm: (objAddress: number) => Promise; }; -export { initXpu }; +export { initXpu, }; //# sourceMappingURL=pv_xpu.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/pv_xpu.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/pv_xpu.d.ts.map index 11af7075..d634af77 100644 --- a/lib/wasm/dist/types/xpu_web_worker/src/pv_xpu.d.ts.map +++ b/lib/wasm/dist/types/xpu_web_worker/src/pv_xpu.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"pv_xpu.d.ts","sourceRoot":"","sources":["../../../../src/xpu_web_worker/src/pv_xpu.ts"],"names":[],"mappings":"AASA,QAAA,MAAM,OAAO,WACH,YAAY,MAAM,kBACV,UAAU;;qDASiB,MAAM,cAAc,MAAM,iBAAiB,MAAM,KAAG,QAAQ,IAAI,CAAC;wDA0BpE,MAAM;0DAahC,MAAM,cACN,MAAM,aACP,MAAM,aACN,MAAM,YACP,MAAM,iBACD,MAAM,KACpB,QAAQ,IAAI,CAAC;yDAoD8B,MAAM,KAAG,QAAQ,IAAI,CAAC;gEAoBjB,MAAM,eAAe,MAAM,aAAa,MAAM,KAAG,QAAQ,IAAI,CAAC;kEAqC5D,MAAM,eAAe,MAAM,aAAa,MAAM,KAAG,QAAQ,IAAI,CAAC;CA6DpH,CAAC;AAEF,OAAO,EACL,OAAO,EACR,CAAC"} \ No newline at end of file +{"version":3,"file":"pv_xpu.d.ts","sourceRoot":"","sources":["../../../../src/xpu_web_worker/src/pv_xpu.ts"],"names":[],"mappings":"AAoBA,QAAA,MAAM,OAAO,WACH,YAAY,MAAM,kBACV,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;+BAqaG,MAAM,QAAQ,MAAM,KAAG,QAAQ,MAAM,CAAC;oEA7ZtC,MAAM,gCACH,MAAM,wBACd,MAAM,mBACX,MAAM,iBACR,MAAM,KAAG,QAAQ,IAAI,CAAC;qDAoEI,MAAM,cAAc,MAAM,iBAAiB,MAAM,KAAG,QAAQ,IAAI,CAAC;wDAgCpE,MAAM;0DAehC,MAAM,cACN,MAAM,aACP,MAAM,aACN,MAAM,YACP,MAAM,iBACD,MAAM,KACpB,QAAQ,IAAI,CAAC;yDAuD8B,MAAM,KAAG,QAAQ,IAAI,CAAC;gEAuBtD,MAAM,eACL,MAAM,UACX,MAAM,aACH,MAAM,KAChB,QAAQ,IAAI,CAAC;kEAoDF,MAAM,eACL,MAAM,UACX,MAAM,aACH,MAAM,KAChB,QAAQ,IAAI,CAAC;2DA6DgC,MAAM,YAAY,MAAM,aAAa,MAAM,KAAG,QAAQ,IAAI,CAAC;gEAwClD,MAAM,KAAG,QAAQ,IAAI,CAAC;qDAQjE,MAAM;oDAqBN,MAAM;CAwDrB,CAAC;AAEF,OAAO,EACL,OAAO,GACR,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/types.d.ts b/lib/wasm/dist/types/xpu_web_worker/src/types.d.ts index 9e8be192..6fdfa5e8 100644 --- a/lib/wasm/dist/types/xpu_web_worker/src/types.d.ts +++ b/lib/wasm/dist/types/xpu_web_worker/src/types.d.ts @@ -4,8 +4,11 @@ export declare enum PvXpuAction { FREE = 2, COPY_TO_XPU = 3, COPY_FROM_XPU = 4, - MATRIX_VECTOR_MULTIPLY = 5, - SYNC_VECTOR = 6 + MEMSET = 5, + TIMER_START = 6, + TIMER_STOP = 7, + MATRIX_VECTOR_MULTIPLY = 8, + SYNC_VECTOR = 9 } export type XpuType = { deviceMem: Set; @@ -18,4 +21,47 @@ export type MemType = { allocSize: number; chunkSize: number; }; +export type ExportType = { + aligned_alloc: (alignment: number, size: number) => number; + free: (ptr: number) => void; +}; +export type MemAllocType = Map; +export type PvXpuType = { + globals: { + exports: ExportType & T; + memory: WebAssembly.Memory; + memAlloc: MemAllocType; + }; +}; +export type InitType = { + wasm: Uint8Array; +}; +export type AllocMemType = { + size: number; + memAddress: number; +}; +export type FreeMemType = { + memAddress: number; +}; +export type CopyToXpuType = { + memAddress: number; + offset: number; + buffer: Uint8Array; +}; +export type CopyFromXpuType = { + memAddress: number; + offset: number; + size: number; +}; +export type MemsetType = { + memAddress: number; + fillByte: number; + size: number; +}; +export type TimerStartType = { + workerIndex: number; +}; //# sourceMappingURL=types.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_web_worker/src/types.d.ts.map b/lib/wasm/dist/types/xpu_web_worker/src/types.d.ts.map index d60786fa..07fb1f4b 100644 --- a/lib/wasm/dist/types/xpu_web_worker/src/types.d.ts.map +++ b/lib/wasm/dist/types/xpu_web_worker/src/types.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/xpu_web_worker/src/types.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,IAAI,IAAA;IACJ,KAAK,IAAA;IACL,IAAI,IAAA;IACJ,WAAW,IAAA;IACX,aAAa,IAAA;IAGb,sBAAsB,IAAA;IACtB,WAAW,IAAA;CACZ;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC"} \ No newline at end of file +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/xpu_web_worker/src/types.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,IAAI,IAAA;IACJ,KAAK,IAAA;IACL,IAAI,IAAA;IACJ,WAAW,IAAA;IACX,aAAa,IAAA;IACb,MAAM,IAAA;IACN,WAAW,IAAA;IACX,UAAU,IAAA;IAGV,sBAAsB,IAAA;IACtB,WAAW,IAAA;CACZ;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAExF,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB,OAAO,EAAE;QACP,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC;QACxB,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;QAC3B,QAAQ,EAAE,YAAY,CAAA;KACvB,CAAA;CACF,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,UAAU,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_webgpu/src/devices.d.ts b/lib/wasm/dist/types/xpu_webgpu/src/devices.d.ts deleted file mode 100644 index 853ae655..00000000 --- a/lib/wasm/dist/types/xpu_webgpu/src/devices.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -/// -import { DeviceType } from "./types"; -export declare const gpuDevices: Map; -export declare const gpuBuffers: Map; -//# sourceMappingURL=devices.d.ts.map \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_webgpu/src/devices.d.ts.map b/lib/wasm/dist/types/xpu_webgpu/src/devices.d.ts.map deleted file mode 100644 index a6e7e791..00000000 --- a/lib/wasm/dist/types/xpu_webgpu/src/devices.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../../../src/xpu_webgpu/src/devices.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,eAAO,MAAM,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAQ5C,CAAC;AAEJ,eAAO,MAAM,UAAU;mBAGJ,MAAM;YACb,SAAS;;EAGlB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_webgpu/src/pv_mvm.d.ts.map b/lib/wasm/dist/types/xpu_webgpu/src/pv_mvm.d.ts.map index c12e556b..d28ca583 100644 --- a/lib/wasm/dist/types/xpu_webgpu/src/pv_mvm.d.ts.map +++ b/lib/wasm/dist/types/xpu_webgpu/src/pv_mvm.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"pv_mvm.d.ts","sourceRoot":"","sources":["../../../../src/xpu_webgpu/src/pv_mvm.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,UAAU,EAAE,MAAM,SAAS,CAAC;AA8GjE,eAAO,MAAM,SAAS,EAAE,UAEvB,CAAC;AAEF,eAAO,MAAM,mBAAmB,WAAY,YAAY,MAAM;wDAO9C,MAAM,iBACH,MAAM,iBACN,MAAM,KAClB,MAAM,KACN,MAAM,iBACM,MAAM,iBACN,MAAM;CAkFxB,CAAC"} \ No newline at end of file +{"version":3,"file":"pv_mvm.d.ts","sourceRoot":"","sources":["../../../../src/xpu_webgpu/src/pv_mvm.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,UAAU,EAAE,MAAM,SAAS,CAAC;AA8GjE,eAAO,MAAM,SAAS,EAAE,UAEvB,CAAC;AAEF,eAAO,MAAM,mBAAmB,WAAY,YAAY,MAAM;wDAO9C,MAAM,iBACH,MAAM,iBACN,MAAM,KAClB,MAAM,KACN,MAAM,iBACM,MAAM,iBACN,MAAM;CA0ExB,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/types/xpu_webgpu/src/pv_xpu.d.ts b/lib/wasm/dist/types/xpu_webgpu/src/pv_xpu.d.ts index 86d8b716..bde81b14 100644 --- a/lib/wasm/dist/types/xpu_webgpu/src/pv_xpu.d.ts +++ b/lib/wasm/dist/types/xpu_webgpu/src/pv_xpu.d.ts @@ -1,11 +1,12 @@ declare const initXpu: (memory: WebAssembly.Memory, _wasm?: Uint8Array) => { pv_matrix_vector_multiply_webgpu_wasm: (objAddress: number, matrixAddress: number, vectorAddress: number, m: number, n: number, resultAddress: number, statusAddress: number) => Promise; pv_xpu_webgpu_device_init_wasm: (objAddress: number, statusAddress: number) => Promise; - pv_xpu_webgpu_device_load_shader_wasm: (objAddress: number, _libNameAddress: number, shaderNameAddress: number, statusAddress: number) => void; + pv_xpu_webgpu_device_load_shader_func_wasm: (objAddress: number, shaderNameAddress: number, statusAddress: number) => void; pv_xpu_webgpu_device_mem_alloc_wasm: (objAddress: number, memAddress: number, sizeBytes: number, isOutput: boolean, statusAddress: number) => void; pv_xpu_webgpu_device_mem_free_wasm: (memAddress: number) => void; - pv_xpu_webgpu_device_mem_copy_to_xpu_wasm: (memAddress: number, hostAddress: number, sizeBytes: number) => Promise; - pv_xpu_webgpu_device_mem_copy_from_xpu_wasm: (memAddress: number, hostAddress: number, sizeBytes: number) => Promise; + pv_xpu_webgpu_device_mem_copy_to_xpu_wasm: (memAddress: number, hostAddress: number, offset: number, sizeBytes: number) => Promise; + pv_xpu_webgpu_device_mem_copy_from_xpu_wasm: (memAddress: number, hostAddress: number, offset: number, sizeBytes: number) => Promise; + pv_xpu_webgpu_device_mem_memset_wasm: (memAddress: number, fillByte: number, sizeBytes: number) => Promise; pv_xpu_webgpu_device_cleanup_wasm: (objAddress: number) => void; }; export { initXpu }; diff --git a/lib/wasm/dist/types/xpu_webgpu/src/pv_xpu.d.ts.map b/lib/wasm/dist/types/xpu_webgpu/src/pv_xpu.d.ts.map index 431a178e..925d62d3 100644 --- a/lib/wasm/dist/types/xpu_webgpu/src/pv_xpu.d.ts.map +++ b/lib/wasm/dist/types/xpu_webgpu/src/pv_xpu.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"pv_xpu.d.ts","sourceRoot":"","sources":["../../../../src/xpu_webgpu/src/pv_xpu.ts"],"names":[],"mappings":"AAwBA,QAAA,MAAM,OAAO,WACH,YAAY,MAAM,UAClB,UAAU;;iDAQJ,MAAM,iBACH,MAAM,KACpB,QAAQ,IAAI,CAAC;wDAsDF,MAAM,mBACD,MAAM,qBACJ,MAAM,iBACV,MAAM;sDA2BT,MAAM,cACN,MAAM,aACP,MAAM,YACP,OAAO,iBACF,MAAM,KACpB,IAAI;qDA8BiC,MAAM,KAAG,IAAI;4DAavC,MAAM,eACL,MAAM,aACR,MAAM,KAChB,QAAQ,IAAI,CAAC;8DA2BF,MAAM,eACL,MAAM,aACR,MAAM,KAChB,QAAQ,IAAI,CAAC;oDA7HwB,MAAM;CAoK/C,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"pv_xpu.d.ts","sourceRoot":"","sources":["../../../../src/xpu_webgpu/src/pv_xpu.ts"],"names":[],"mappings":"AAwBA,QAAA,MAAM,OAAO,WACH,YAAY,MAAM,UAClB,UAAU;;iDAQJ,MAAM,iBACH,MAAM,KACpB,QAAQ,IAAI,CAAC;6DAsDF,MAAM,qBACC,MAAM,iBACV,MAAM;sDA2BT,MAAM,cACN,MAAM,aACP,MAAM,YACP,OAAO,iBACF,MAAM,KACpB,IAAI;qDA8BiC,MAAM,KAAG,IAAI;4DAavC,MAAM,eACL,MAAM,UACX,MAAM,aACH,MAAM,KAChB,QAAQ,IAAI,CAAC;8DA2BF,MAAM,eACL,MAAM,UACX,MAAM,aACH,MAAM,KAChB,QAAQ,IAAI,CAAC;uDAwCF,MAAM,YACR,MAAM,aACL,MAAM,KAChB,QAAQ,IAAI,CAAC;oDAzKwB,MAAM;CA4M/C,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"} \ No newline at end of file diff --git a/lib/wasm/dist/xpu_web_worker/esm/index.js b/lib/wasm/dist/xpu_web_worker/esm/index.js index 77953df5..ad0c31bd 100644 --- a/lib/wasm/dist/xpu_web_worker/esm/index.js +++ b/lib/wasm/dist/xpu_web_worker/esm/index.js @@ -1 +1,5986 @@ -function I(g){return I="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},I(g)}function g(g){var C=function(g,C){if("object"!=I(g)||!g)return g;var A=g[Symbol.toPrimitive];if(void 0!==A){var e=A.call(g,C||"default");if("object"!=I(e))return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===C?String:Number)(g)}(g,"string");return"symbol"==I(C)?C:String(C)}function C(I,C,A){return(C=g(C))in I?Object.defineProperty(I,C,{value:A,enumerable:!0,configurable:!0,writable:!0}):I[C]=A,I}function A(I,g,C,A,e,c,i){try{var o=I[c](i),t=o.value}catch(I){return void C(I)}o.done?g(t):Promise.resolve(t).then(A,e)}function e(I){return function(){var g=this,C=arguments;return new Promise((function(e,c){var i=I.apply(g,C);function o(I){A(i,e,c,o,t,"next",I)}function t(I){A(i,e,c,o,t,"throw",I)}o(void 0)}))}}function c(I){return I&&I.__esModule&&Object.prototype.hasOwnProperty.call(I,"default")?I.default:I}var i={exports:{}},o={exports:{}};!function(I){function g(C){return I.exports=g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},I.exports.__esModule=!0,I.exports.default=I.exports,g(C)}I.exports=g,I.exports.__esModule=!0,I.exports.default=I.exports}(o);var t=o.exports;!function(I){var g=t.default;function C(){I.exports=C=function(){return e},I.exports.__esModule=!0,I.exports.default=I.exports;var A,e={},c=Object.prototype,i=c.hasOwnProperty,o=Object.defineProperty||function(I,g,C){I[g]=C.value},t="function"==typeof Symbol?Symbol:{},l=t.iterator||"@@iterator",n=t.asyncIterator||"@@asyncIterator",b=t.toStringTag||"@@toStringTag";function r(I,g,C){return Object.defineProperty(I,g,{value:C,enumerable:!0,configurable:!0,writable:!0}),I[g]}try{r({},"")}catch(A){r=function(I,g,C){return I[g]=C}}function d(I,g,C,A){var e=g&&g.prototype instanceof y?g:y,c=Object.create(e.prototype),i=new k(A||[]);return o(c,"_invoke",{value:w(I,C,i)}),c}function Z(I,g,C){try{return{type:"normal",arg:I.call(g,C)}}catch(I){return{type:"throw",arg:I}}}e.wrap=d;var m="suspendedStart",u="suspendedYield",a="executing",s="completed",B={};function y(){}function G(){}function H(){}var h={};r(h,l,(function(){return this}));var V=Object.getPrototypeOf,X=V&&V(V(Y([])));X&&X!==c&&i.call(X,l)&&(h=X);var S=H.prototype=y.prototype=Object.create(h);function p(I){["next","throw","return"].forEach((function(g){r(I,g,(function(I){return this._invoke(g,I)}))}))}function W(I,C){function A(e,c,o,t){var l=Z(I[e],I,c);if("throw"!==l.type){var n=l.arg,b=n.value;return b&&"object"==g(b)&&i.call(b,"__await")?C.resolve(b.__await).then((function(I){A("next",I,o,t)}),(function(I){A("throw",I,o,t)})):C.resolve(b).then((function(I){n.value=I,o(n)}),(function(I){return A("throw",I,o,t)}))}t(l.arg)}var e;o(this,"_invoke",{value:function(I,g){function c(){return new C((function(C,e){A(I,g,C,e)}))}return e=e?e.then(c,c):c()}})}function w(I,g,C){var e=m;return function(c,i){if(e===a)throw new Error("Generator is already running");if(e===s){if("throw"===c)throw i;return{value:A,done:!0}}for(C.method=c,C.arg=i;;){var o=C.delegate;if(o){var t=J(o,C);if(t){if(t===B)continue;return t}}if("next"===C.method)C.sent=C._sent=C.arg;else if("throw"===C.method){if(e===m)throw e=s,C.arg;C.dispatchException(C.arg)}else"return"===C.method&&C.abrupt("return",C.arg);e=a;var l=Z(I,g,C);if("normal"===l.type){if(e=C.done?s:u,l.arg===B)continue;return{value:l.arg,done:C.done}}"throw"===l.type&&(e=s,C.method="throw",C.arg=l.arg)}}}function J(I,g){var C=g.method,e=I.iterator[C];if(e===A)return g.delegate=null,"throw"===C&&I.iterator.return&&(g.method="return",g.arg=A,J(I,g),"throw"===g.method)||"return"!==C&&(g.method="throw",g.arg=new TypeError("The iterator does not provide a '"+C+"' method")),B;var c=Z(e,I.iterator,g.arg);if("throw"===c.type)return g.method="throw",g.arg=c.arg,g.delegate=null,B;var i=c.arg;return i?i.done?(g[I.resultName]=i.value,g.next=I.nextLoc,"return"!==g.method&&(g.method="next",g.arg=A),g.delegate=null,B):i:(g.method="throw",g.arg=new TypeError("iterator result is not an object"),g.delegate=null,B)}function R(I){var g={tryLoc:I[0]};1 in I&&(g.catchLoc=I[1]),2 in I&&(g.finallyLoc=I[2],g.afterLoc=I[3]),this.tryEntries.push(g)}function K(I){var g=I.completion||{};g.type="normal",delete g.arg,I.completion=g}function k(I){this.tryEntries=[{tryLoc:"root"}],I.forEach(R,this),this.reset(!0)}function Y(I){if(I||""===I){var C=I[l];if(C)return C.call(I);if("function"==typeof I.next)return I;if(!isNaN(I.length)){var e=-1,c=function g(){for(;++e=0;--e){var c=this.tryEntries[e],o=c.completion;if("root"===c.tryLoc)return C("end");if(c.tryLoc<=this.prev){var t=i.call(c,"catchLoc"),l=i.call(c,"finallyLoc");if(t&&l){if(this.prev=0;--C){var A=this.tryEntries[C];if(A.tryLoc<=this.prev&&i.call(A,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),K(C),B}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var A=C.completion;if("throw"===A.type){var e=A.arg;K(C)}return e}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:Y(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=A),B}},e}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(i);var l=(0,i.exports)(),n=l;try{regeneratorRuntime=l}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=l:Function("r","regeneratorRuntime = r")(l)}var b=c(n);function r(I,g,C){var A=void 0===g?null:g,e=function(I,g){var C=atob(I);if(g){for(var A=new Uint8Array(C.length),e=0,c=C.length;e=I.length?{done:!0}:{done:!1,value:I[A++]}},e:function(I){throw I},f:e}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var c,i=!0,o=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return i=I.done,I},e:function(I){o=!0,c=I},f:function(){try{i||null==C.return||C.return()}finally{if(o)throw c}}}}function G(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,A=new Array(g);C=I.length?{done:!0}:{done:!1,value:I[A++]}},e:function(I){throw I},f:e}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var c,i=!0,o=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return i=I.done,I},e:function(I){o=!0,c=I},f:function(){try{i||null==C.return||C.return()}finally{if(o)throw c}}}}function S(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,A=new Array(g);Ce)){g.next=33;break}return r.set(y.slice(0,e-s),A+s),g.abrupt("break",38);case 33:r.set(y,A+s),s+=y.length;case 35:B++,g.next=26;break;case 38:case"end":return g.stop()}}),g)})));return function(I,C,A){return g.apply(this,arguments)}}();return function(I){for(var g=1;g0&&s.set(B[y],y*d);for(m=[],G=0;G= 0; --o) { + var i = this.tryEntries[o], + a = i.completion; + if ("root" === i.tryLoc) return handle("end"); + if (i.tryLoc <= this.prev) { + var c = n.call(i, "catchLoc"), + u = n.call(i, "finallyLoc"); + if (c && u) { + if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); + if (this.prev < i.finallyLoc) return handle(i.finallyLoc); + } else if (c) { + if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); + } else { + if (!u) throw new Error("try statement without catch or finally"); + if (this.prev < i.finallyLoc) return handle(i.finallyLoc); + } + } + } + }, + abrupt: function abrupt(t, e) { + for (var r = this.tryEntries.length - 1; r >= 0; --r) { + var o = this.tryEntries[r]; + if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { + var i = o; + break; + } + } + i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); + var a = i ? i.completion : {}; + return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); + }, + complete: function complete(t, e) { + if ("throw" === t.type) throw t.arg; + return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; + }, + finish: function finish(t) { + for (var e = this.tryEntries.length - 1; e >= 0; --e) { + var r = this.tryEntries[e]; + if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; + } + }, + "catch": function _catch(t) { + for (var e = this.tryEntries.length - 1; e >= 0; --e) { + var r = this.tryEntries[e]; + if (r.tryLoc === t) { + var n = r.completion; + if ("throw" === n.type) { + var o = n.arg; + resetTryEntry(r); + } + return o; + } + } + throw new Error("illegal catch attempt"); + }, + delegateYield: function delegateYield(e, r, n) { + return this.delegate = { + iterator: values(e), + resultName: r, + nextLoc: n + }, "next" === this.method && (this.arg = t), y; + } + }, e; + } + module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports; +} (regeneratorRuntime$2)); + +var regeneratorRuntimeExports$1 = regeneratorRuntime$2.exports; + +// TODO(Babel 8): Remove this file. + +var runtime$1 = regeneratorRuntimeExports$1(); +var regenerator = runtime$1; + +// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736= +try { + regeneratorRuntime = runtime$1; +} catch (accidentalStrictMode) { + if (typeof globalThis === "object") { + globalThis.regeneratorRuntime = runtime$1; + } else { + Function("r", "regeneratorRuntime = r")(runtime$1); + } +} + +var _regeneratorRuntime = /*@__PURE__*/getDefaultExportFromCjs(regenerator); + +// NOTE: this list must be up-to-date with browsers listed in +// test/acceptance/useragentstrings.yml +const BROWSER_ALIASES_MAP = { + 'Amazon Silk': 'amazon_silk', + 'Android Browser': 'android', + Bada: 'bada', + BlackBerry: 'blackberry', + Chrome: 'chrome', + Chromium: 'chromium', + Electron: 'electron', + Epiphany: 'epiphany', + Firefox: 'firefox', + Focus: 'focus', + Generic: 'generic', + 'Google Search': 'google_search', + Googlebot: 'googlebot', + 'Internet Explorer': 'ie', + 'K-Meleon': 'k_meleon', + Maxthon: 'maxthon', + 'Microsoft Edge': 'edge', + 'MZ Browser': 'mz', + 'NAVER Whale Browser': 'naver', + Opera: 'opera', + 'Opera Coast': 'opera_coast', + PhantomJS: 'phantomjs', + Puffin: 'puffin', + QupZilla: 'qupzilla', + QQ: 'qq', + QQLite: 'qqlite', + Safari: 'safari', + Sailfish: 'sailfish', + 'Samsung Internet for Android': 'samsung_internet', + SeaMonkey: 'seamonkey', + Sleipnir: 'sleipnir', + Swing: 'swing', + Tizen: 'tizen', + 'UC Browser': 'uc', + Vivaldi: 'vivaldi', + 'WebOS Browser': 'webos', + WeChat: 'wechat', + 'Yandex Browser': 'yandex', + Roku: 'roku', +}; + +const BROWSER_MAP = { + amazon_silk: 'Amazon Silk', + android: 'Android Browser', + bada: 'Bada', + blackberry: 'BlackBerry', + chrome: 'Chrome', + chromium: 'Chromium', + electron: 'Electron', + epiphany: 'Epiphany', + firefox: 'Firefox', + focus: 'Focus', + generic: 'Generic', + googlebot: 'Googlebot', + google_search: 'Google Search', + ie: 'Internet Explorer', + k_meleon: 'K-Meleon', + maxthon: 'Maxthon', + edge: 'Microsoft Edge', + mz: 'MZ Browser', + naver: 'NAVER Whale Browser', + opera: 'Opera', + opera_coast: 'Opera Coast', + phantomjs: 'PhantomJS', + puffin: 'Puffin', + qupzilla: 'QupZilla', + qq: 'QQ Browser', + qqlite: 'QQ Browser Lite', + safari: 'Safari', + sailfish: 'Sailfish', + samsung_internet: 'Samsung Internet for Android', + seamonkey: 'SeaMonkey', + sleipnir: 'Sleipnir', + swing: 'Swing', + tizen: 'Tizen', + uc: 'UC Browser', + vivaldi: 'Vivaldi', + webos: 'WebOS Browser', + wechat: 'WeChat', + yandex: 'Yandex Browser', +}; + +const PLATFORMS_MAP = { + tablet: 'tablet', + mobile: 'mobile', + desktop: 'desktop', + tv: 'tv', +}; + +const OS_MAP = { + WindowsPhone: 'Windows Phone', + Windows: 'Windows', + MacOS: 'macOS', + iOS: 'iOS', + Android: 'Android', + WebOS: 'WebOS', + BlackBerry: 'BlackBerry', + Bada: 'Bada', + Tizen: 'Tizen', + Linux: 'Linux', + ChromeOS: 'Chrome OS', + PlayStation4: 'PlayStation 4', + Roku: 'Roku', +}; + +const ENGINE_MAP = { + EdgeHTML: 'EdgeHTML', + Blink: 'Blink', + Trident: 'Trident', + Presto: 'Presto', + Gecko: 'Gecko', + WebKit: 'WebKit', +}; + +class Utils { + /** + * Get first matched item for a string + * @param {RegExp} regexp + * @param {String} ua + * @return {Array|{index: number, input: string}|*|boolean|string} + */ + static getFirstMatch(regexp, ua) { + const match = ua.match(regexp); + return (match && match.length > 0 && match[1]) || ''; + } + + /** + * Get second matched item for a string + * @param regexp + * @param {String} ua + * @return {Array|{index: number, input: string}|*|boolean|string} + */ + static getSecondMatch(regexp, ua) { + const match = ua.match(regexp); + return (match && match.length > 1 && match[2]) || ''; + } + + /** + * Match a regexp and return a constant or undefined + * @param {RegExp} regexp + * @param {String} ua + * @param {*} _const Any const that will be returned if regexp matches the string + * @return {*} + */ + static matchAndReturnConst(regexp, ua, _const) { + if (regexp.test(ua)) { + return _const; + } + return void (0); + } + + static getWindowsVersionName(version) { + switch (version) { + case 'NT': return 'NT'; + case 'XP': return 'XP'; + case 'NT 5.0': return '2000'; + case 'NT 5.1': return 'XP'; + case 'NT 5.2': return '2003'; + case 'NT 6.0': return 'Vista'; + case 'NT 6.1': return '7'; + case 'NT 6.2': return '8'; + case 'NT 6.3': return '8.1'; + case 'NT 10.0': return '10'; + default: return undefined; + } + } + + /** + * Get macOS version name + * 10.5 - Leopard + * 10.6 - Snow Leopard + * 10.7 - Lion + * 10.8 - Mountain Lion + * 10.9 - Mavericks + * 10.10 - Yosemite + * 10.11 - El Capitan + * 10.12 - Sierra + * 10.13 - High Sierra + * 10.14 - Mojave + * 10.15 - Catalina + * + * @example + * getMacOSVersionName("10.14") // 'Mojave' + * + * @param {string} version + * @return {string} versionName + */ + static getMacOSVersionName(version) { + const v = version.split('.').splice(0, 2).map(s => parseInt(s, 10) || 0); + v.push(0); + if (v[0] !== 10) return undefined; + switch (v[1]) { + case 5: return 'Leopard'; + case 6: return 'Snow Leopard'; + case 7: return 'Lion'; + case 8: return 'Mountain Lion'; + case 9: return 'Mavericks'; + case 10: return 'Yosemite'; + case 11: return 'El Capitan'; + case 12: return 'Sierra'; + case 13: return 'High Sierra'; + case 14: return 'Mojave'; + case 15: return 'Catalina'; + default: return undefined; + } + } + + /** + * Get Android version name + * 1.5 - Cupcake + * 1.6 - Donut + * 2.0 - Eclair + * 2.1 - Eclair + * 2.2 - Froyo + * 2.x - Gingerbread + * 3.x - Honeycomb + * 4.0 - Ice Cream Sandwich + * 4.1 - Jelly Bean + * 4.4 - KitKat + * 5.x - Lollipop + * 6.x - Marshmallow + * 7.x - Nougat + * 8.x - Oreo + * 9.x - Pie + * + * @example + * getAndroidVersionName("7.0") // 'Nougat' + * + * @param {string} version + * @return {string} versionName + */ + static getAndroidVersionName(version) { + const v = version.split('.').splice(0, 2).map(s => parseInt(s, 10) || 0); + v.push(0); + if (v[0] === 1 && v[1] < 5) return undefined; + if (v[0] === 1 && v[1] < 6) return 'Cupcake'; + if (v[0] === 1 && v[1] >= 6) return 'Donut'; + if (v[0] === 2 && v[1] < 2) return 'Eclair'; + if (v[0] === 2 && v[1] === 2) return 'Froyo'; + if (v[0] === 2 && v[1] > 2) return 'Gingerbread'; + if (v[0] === 3) return 'Honeycomb'; + if (v[0] === 4 && v[1] < 1) return 'Ice Cream Sandwich'; + if (v[0] === 4 && v[1] < 4) return 'Jelly Bean'; + if (v[0] === 4 && v[1] >= 4) return 'KitKat'; + if (v[0] === 5) return 'Lollipop'; + if (v[0] === 6) return 'Marshmallow'; + if (v[0] === 7) return 'Nougat'; + if (v[0] === 8) return 'Oreo'; + if (v[0] === 9) return 'Pie'; + return undefined; + } + + /** + * Get version precisions count + * + * @example + * getVersionPrecision("1.10.3") // 3 + * + * @param {string} version + * @return {number} + */ + static getVersionPrecision(version) { + return version.split('.').length; + } + + /** + * Calculate browser version weight + * + * @example + * compareVersions('1.10.2.1', '1.8.2.1.90') // 1 + * compareVersions('1.010.2.1', '1.09.2.1.90'); // 1 + * compareVersions('1.10.2.1', '1.10.2.1'); // 0 + * compareVersions('1.10.2.1', '1.0800.2'); // -1 + * compareVersions('1.10.2.1', '1.10', true); // 0 + * + * @param {String} versionA versions versions to compare + * @param {String} versionB versions versions to compare + * @param {boolean} [isLoose] enable loose comparison + * @return {Number} comparison result: -1 when versionA is lower, + * 1 when versionA is bigger, 0 when both equal + */ + /* eslint consistent-return: 1 */ + static compareVersions(versionA, versionB, isLoose = false) { + // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2 + const versionAPrecision = Utils.getVersionPrecision(versionA); + const versionBPrecision = Utils.getVersionPrecision(versionB); + + let precision = Math.max(versionAPrecision, versionBPrecision); + let lastPrecision = 0; + + const chunks = Utils.map([versionA, versionB], (version) => { + const delta = precision - Utils.getVersionPrecision(version); + + // 2) "9" -> "9.0" (for precision = 2) + const _version = version + new Array(delta + 1).join('.0'); + + // 3) "9.0" -> ["000000000"", "000000009"] + return Utils.map(_version.split('.'), chunk => new Array(20 - chunk.length).join('0') + chunk).reverse(); + }); + + // adjust precision for loose comparison + if (isLoose) { + lastPrecision = precision - Math.min(versionAPrecision, versionBPrecision); + } + + // iterate in reverse order by reversed chunks array + precision -= 1; + while (precision >= lastPrecision) { + // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true) + if (chunks[0][precision] > chunks[1][precision]) { + return 1; + } + + if (chunks[0][precision] === chunks[1][precision]) { + if (precision === lastPrecision) { + // all version chunks are same + return 0; + } + + precision -= 1; + } else if (chunks[0][precision] < chunks[1][precision]) { + return -1; + } + } + + return undefined; + } + + /** + * Array::map polyfill + * + * @param {Array} arr + * @param {Function} iterator + * @return {Array} + */ + static map(arr, iterator) { + const result = []; + let i; + if (Array.prototype.map) { + return Array.prototype.map.call(arr, iterator); + } + for (i = 0; i < arr.length; i += 1) { + result.push(iterator(arr[i])); + } + return result; + } + + /** + * Array::find polyfill + * + * @param {Array} arr + * @param {Function} predicate + * @return {Array} + */ + static find(arr, predicate) { + let i; + let l; + if (Array.prototype.find) { + return Array.prototype.find.call(arr, predicate); + } + for (i = 0, l = arr.length; i < l; i += 1) { + const value = arr[i]; + if (predicate(value, i)) { + return value; + } + } + return undefined; + } + + /** + * Object::assign polyfill + * + * @param {Object} obj + * @param {Object} ...objs + * @return {Object} + */ + static assign(obj, ...assigners) { + const result = obj; + let i; + let l; + if (Object.assign) { + return Object.assign(obj, ...assigners); + } + for (i = 0, l = assigners.length; i < l; i += 1) { + const assigner = assigners[i]; + if (typeof assigner === 'object' && assigner !== null) { + const keys = Object.keys(assigner); + keys.forEach((key) => { + result[key] = assigner[key]; + }); + } + } + return obj; + } + + /** + * Get short version/alias for a browser name + * + * @example + * getBrowserAlias('Microsoft Edge') // edge + * + * @param {string} browserName + * @return {string} + */ + static getBrowserAlias(browserName) { + return BROWSER_ALIASES_MAP[browserName]; + } + + /** + * Get short version/alias for a browser name + * + * @example + * getBrowserAlias('edge') // Microsoft Edge + * + * @param {string} browserAlias + * @return {string} + */ + static getBrowserTypeByAlias(browserAlias) { + return BROWSER_MAP[browserAlias] || ''; + } +} + +/** + * Browsers' descriptors + * + * The idea of descriptors is simple. You should know about them two simple things: + * 1. Every descriptor has a method or property called `test` and a `describe` method. + * 2. Order of descriptors is important. + * + * More details: + * 1. Method or property `test` serves as a way to detect whether the UA string + * matches some certain browser or not. The `describe` method helps to make a result + * object with params that show some browser-specific things: name, version, etc. + * 2. Order of descriptors is important because a Parser goes through them one by one + * in course. For example, if you insert Chrome's descriptor as the first one, + * more then a half of browsers will be described as Chrome, because they will pass + * the Chrome descriptor's test. + * + * Descriptor's `test` could be a property with an array of RegExps, where every RegExp + * will be applied to a UA string to test it whether it matches or not. + * If a descriptor has two or more regexps in the `test` array it tests them one by one + * with a logical sum operation. Parser stops if it has found any RegExp that matches the UA. + * + * Or `test` could be a method. In that case it gets a Parser instance and should + * return true/false to get the Parser know if this browser descriptor matches the UA or not. + */ + +const commonVersionIdentifier = /version\/(\d+(\.?_?\d+)+)/i; + +const browsersList = [ + /* Googlebot */ + { + test: [/googlebot/i], + describe(ua) { + const browser = { + name: 'Googlebot', + }; + const version = Utils.getFirstMatch(/googlebot\/(\d+(\.\d+))/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Opera < 13.0 */ + { + test: [/opera/i], + describe(ua) { + const browser = { + name: 'Opera', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Opera > 13.0 */ + { + test: [/opr\/|opios/i], + describe(ua) { + const browser = { + name: 'Opera', + }; + const version = Utils.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/SamsungBrowser/i], + describe(ua) { + const browser = { + name: 'Samsung Internet for Android', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/Whale/i], + describe(ua) { + const browser = { + name: 'NAVER Whale Browser', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/MZBrowser/i], + describe(ua) { + const browser = { + name: 'MZ Browser', + }; + const version = Utils.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/focus/i], + describe(ua) { + const browser = { + name: 'Focus', + }; + const version = Utils.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/swing/i], + describe(ua) { + const browser = { + name: 'Swing', + }; + const version = Utils.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/coast/i], + describe(ua) { + const browser = { + name: 'Opera Coast', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/opt\/\d+(?:.?_?\d+)+/i], + describe(ua) { + const browser = { + name: 'Opera Touch', + }; + const version = Utils.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/yabrowser/i], + describe(ua) { + const browser = { + name: 'Yandex Browser', + }; + const version = Utils.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/ucbrowser/i], + describe(ua) { + const browser = { + name: 'UC Browser', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/Maxthon|mxios/i], + describe(ua) { + const browser = { + name: 'Maxthon', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/epiphany/i], + describe(ua) { + const browser = { + name: 'Epiphany', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/puffin/i], + describe(ua) { + const browser = { + name: 'Puffin', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/sleipnir/i], + describe(ua) { + const browser = { + name: 'Sleipnir', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/k-meleon/i], + describe(ua) { + const browser = { + name: 'K-Meleon', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/micromessenger/i], + describe(ua) { + const browser = { + name: 'WeChat', + }; + const version = Utils.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/qqbrowser/i], + describe(ua) { + const browser = { + name: (/qqbrowserlite/i).test(ua) ? 'QQ Browser Lite' : 'QQ Browser', + }; + const version = Utils.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/msie|trident/i], + describe(ua) { + const browser = { + name: 'Internet Explorer', + }; + const version = Utils.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/\sedg\//i], + describe(ua) { + const browser = { + name: 'Microsoft Edge', + }; + + const version = Utils.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/edg([ea]|ios)/i], + describe(ua) { + const browser = { + name: 'Microsoft Edge', + }; + + const version = Utils.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/vivaldi/i], + describe(ua) { + const browser = { + name: 'Vivaldi', + }; + const version = Utils.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/seamonkey/i], + describe(ua) { + const browser = { + name: 'SeaMonkey', + }; + const version = Utils.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/sailfish/i], + describe(ua) { + const browser = { + name: 'Sailfish', + }; + + const version = Utils.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/silk/i], + describe(ua) { + const browser = { + name: 'Amazon Silk', + }; + const version = Utils.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/phantom/i], + describe(ua) { + const browser = { + name: 'PhantomJS', + }; + const version = Utils.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/slimerjs/i], + describe(ua) { + const browser = { + name: 'SlimerJS', + }; + const version = Utils.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/blackberry|\bbb\d+/i, /rim\stablet/i], + describe(ua) { + const browser = { + name: 'BlackBerry', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/(web|hpw)[o0]s/i], + describe(ua) { + const browser = { + name: 'WebOS Browser', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/bada/i], + describe(ua) { + const browser = { + name: 'Bada', + }; + const version = Utils.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/tizen/i], + describe(ua) { + const browser = { + name: 'Tizen', + }; + const version = Utils.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/qupzilla/i], + describe(ua) { + const browser = { + name: 'QupZilla', + }; + const version = Utils.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/firefox|iceweasel|fxios/i], + describe(ua) { + const browser = { + name: 'Firefox', + }; + const version = Utils.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/electron/i], + describe(ua) { + const browser = { + name: 'Electron', + }; + const version = Utils.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/MiuiBrowser/i], + describe(ua) { + const browser = { + name: 'Miui', + }; + const version = Utils.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/chromium/i], + describe(ua) { + const browser = { + name: 'Chromium', + }; + const version = Utils.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/chrome|crios|crmo/i], + describe(ua) { + const browser = { + name: 'Chrome', + }; + const version = Utils.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/GSA/i], + describe(ua) { + const browser = { + name: 'Google Search', + }; + const version = Utils.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Android Browser */ + { + test(parser) { + const notLikeAndroid = !parser.test(/like android/i); + const butAndroid = parser.test(/android/i); + return notLikeAndroid && butAndroid; + }, + describe(ua) { + const browser = { + name: 'Android Browser', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* PlayStation 4 */ + { + test: [/playstation 4/i], + describe(ua) { + const browser = { + name: 'PlayStation 4', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Safari */ + { + test: [/safari|applewebkit/i], + describe(ua) { + const browser = { + name: 'Safari', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Something else */ + { + test: [/.*/i], + describe(ua) { + /* Here we try to make sure that there are explicit details about the device + * in order to decide what regexp exactly we want to apply + * (as there is a specific decision based on that conclusion) + */ + const regexpWithoutDeviceSpec = /^(.*)\/(.*) /; + const regexpWithDeviceSpec = /^(.*)\/(.*)[ \t]\((.*)/; + const hasDeviceSpec = ua.search('\\(') !== -1; + const regexp = hasDeviceSpec ? regexpWithDeviceSpec : regexpWithoutDeviceSpec; + return { + name: Utils.getFirstMatch(regexp, ua), + version: Utils.getSecondMatch(regexp, ua), + }; + }, + }, +]; + +var osParsersList = [ + /* Roku */ + { + test: [/Roku\/DVP/], + describe(ua) { + const version = Utils.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i, ua); + return { + name: OS_MAP.Roku, + version, + }; + }, + }, + + /* Windows Phone */ + { + test: [/windows phone/i], + describe(ua) { + const version = Utils.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i, ua); + return { + name: OS_MAP.WindowsPhone, + version, + }; + }, + }, + + /* Windows */ + { + test: [/windows /i], + describe(ua) { + const version = Utils.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i, ua); + const versionName = Utils.getWindowsVersionName(version); + + return { + name: OS_MAP.Windows, + version, + versionName, + }; + }, + }, + + /* Firefox on iPad */ + { + test: [/Macintosh(.*?) FxiOS(.*?)\//], + describe(ua) { + const result = { + name: OS_MAP.iOS, + }; + const version = Utils.getSecondMatch(/(Version\/)(\d[\d.]+)/, ua); + if (version) { + result.version = version; + } + return result; + }, + }, + + /* macOS */ + { + test: [/macintosh/i], + describe(ua) { + const version = Utils.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i, ua).replace(/[_\s]/g, '.'); + const versionName = Utils.getMacOSVersionName(version); + + const os = { + name: OS_MAP.MacOS, + version, + }; + if (versionName) { + os.versionName = versionName; + } + return os; + }, + }, + + /* iOS */ + { + test: [/(ipod|iphone|ipad)/i], + describe(ua) { + const version = Utils.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i, ua).replace(/[_\s]/g, '.'); + + return { + name: OS_MAP.iOS, + version, + }; + }, + }, + + /* Android */ + { + test(parser) { + const notLikeAndroid = !parser.test(/like android/i); + const butAndroid = parser.test(/android/i); + return notLikeAndroid && butAndroid; + }, + describe(ua) { + const version = Utils.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i, ua); + const versionName = Utils.getAndroidVersionName(version); + const os = { + name: OS_MAP.Android, + version, + }; + if (versionName) { + os.versionName = versionName; + } + return os; + }, + }, + + /* WebOS */ + { + test: [/(web|hpw)[o0]s/i], + describe(ua) { + const version = Utils.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i, ua); + const os = { + name: OS_MAP.WebOS, + }; + + if (version && version.length) { + os.version = version; + } + return os; + }, + }, + + /* BlackBerry */ + { + test: [/blackberry|\bbb\d+/i, /rim\stablet/i], + describe(ua) { + const version = Utils.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i, ua) + || Utils.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i, ua) + || Utils.getFirstMatch(/\bbb(\d+)/i, ua); + + return { + name: OS_MAP.BlackBerry, + version, + }; + }, + }, + + /* Bada */ + { + test: [/bada/i], + describe(ua) { + const version = Utils.getFirstMatch(/bada\/(\d+(\.\d+)*)/i, ua); + + return { + name: OS_MAP.Bada, + version, + }; + }, + }, + + /* Tizen */ + { + test: [/tizen/i], + describe(ua) { + const version = Utils.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i, ua); + + return { + name: OS_MAP.Tizen, + version, + }; + }, + }, + + /* Linux */ + { + test: [/linux/i], + describe() { + return { + name: OS_MAP.Linux, + }; + }, + }, + + /* Chrome OS */ + { + test: [/CrOS/], + describe() { + return { + name: OS_MAP.ChromeOS, + }; + }, + }, + + /* Playstation 4 */ + { + test: [/PlayStation 4/], + describe(ua) { + const version = Utils.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i, ua); + return { + name: OS_MAP.PlayStation4, + version, + }; + }, + }, +]; + +/* + * Tablets go first since usually they have more specific + * signs to detect. + */ + +var platformParsersList = [ + /* Googlebot */ + { + test: [/googlebot/i], + describe() { + return { + type: 'bot', + vendor: 'Google', + }; + }, + }, + + /* Huawei */ + { + test: [/huawei/i], + describe(ua) { + const model = Utils.getFirstMatch(/(can-l01)/i, ua) && 'Nova'; + const platform = { + type: PLATFORMS_MAP.mobile, + vendor: 'Huawei', + }; + if (model) { + platform.model = model; + } + return platform; + }, + }, + + /* Nexus Tablet */ + { + test: [/nexus\s*(?:7|8|9|10).*/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Nexus', + }; + }, + }, + + /* iPad */ + { + test: [/ipad/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Apple', + model: 'iPad', + }; + }, + }, + + /* Firefox on iPad */ + { + test: [/Macintosh(.*?) FxiOS(.*?)\//], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Apple', + model: 'iPad', + }; + }, + }, + + /* Amazon Kindle Fire */ + { + test: [/kftt build/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Amazon', + model: 'Kindle Fire HD 7', + }; + }, + }, + + /* Another Amazon Tablet with Silk */ + { + test: [/silk/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Amazon', + }; + }, + }, + + /* Tablet */ + { + test: [/tablet(?! pc)/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + }; + }, + }, + + /* iPod/iPhone */ + { + test(parser) { + const iDevice = parser.test(/ipod|iphone/i); + const likeIDevice = parser.test(/like (ipod|iphone)/i); + return iDevice && !likeIDevice; + }, + describe(ua) { + const model = Utils.getFirstMatch(/(ipod|iphone)/i, ua); + return { + type: PLATFORMS_MAP.mobile, + vendor: 'Apple', + model, + }; + }, + }, + + /* Nexus Mobile */ + { + test: [/nexus\s*[0-6].*/i, /galaxy nexus/i], + describe() { + return { + type: PLATFORMS_MAP.mobile, + vendor: 'Nexus', + }; + }, + }, + + /* Mobile */ + { + test: [/[^-]mobi/i], + describe() { + return { + type: PLATFORMS_MAP.mobile, + }; + }, + }, + + /* BlackBerry */ + { + test(parser) { + return parser.getBrowserName(true) === 'blackberry'; + }, + describe() { + return { + type: PLATFORMS_MAP.mobile, + vendor: 'BlackBerry', + }; + }, + }, + + /* Bada */ + { + test(parser) { + return parser.getBrowserName(true) === 'bada'; + }, + describe() { + return { + type: PLATFORMS_MAP.mobile, + }; + }, + }, + + /* Windows Phone */ + { + test(parser) { + return parser.getBrowserName() === 'windows phone'; + }, + describe() { + return { + type: PLATFORMS_MAP.mobile, + vendor: 'Microsoft', + }; + }, + }, + + /* Android Tablet */ + { + test(parser) { + const osMajorVersion = Number(String(parser.getOSVersion()).split('.')[0]); + return parser.getOSName(true) === 'android' && (osMajorVersion >= 3); + }, + describe() { + return { + type: PLATFORMS_MAP.tablet, + }; + }, + }, + + /* Android Mobile */ + { + test(parser) { + return parser.getOSName(true) === 'android'; + }, + describe() { + return { + type: PLATFORMS_MAP.mobile, + }; + }, + }, + + /* desktop */ + { + test(parser) { + return parser.getOSName(true) === 'macos'; + }, + describe() { + return { + type: PLATFORMS_MAP.desktop, + vendor: 'Apple', + }; + }, + }, + + /* Windows */ + { + test(parser) { + return parser.getOSName(true) === 'windows'; + }, + describe() { + return { + type: PLATFORMS_MAP.desktop, + }; + }, + }, + + /* Linux */ + { + test(parser) { + return parser.getOSName(true) === 'linux'; + }, + describe() { + return { + type: PLATFORMS_MAP.desktop, + }; + }, + }, + + /* PlayStation 4 */ + { + test(parser) { + return parser.getOSName(true) === 'playstation 4'; + }, + describe() { + return { + type: PLATFORMS_MAP.tv, + }; + }, + }, + + /* Roku */ + { + test(parser) { + return parser.getOSName(true) === 'roku'; + }, + describe() { + return { + type: PLATFORMS_MAP.tv, + }; + }, + }, +]; + +/* + * More specific goes first + */ +var enginesParsersList = [ + /* EdgeHTML */ + { + test(parser) { + return parser.getBrowserName(true) === 'microsoft edge'; + }, + describe(ua) { + const isBlinkBased = /\sedg\//i.test(ua); + + // return blink if it's blink-based one + if (isBlinkBased) { + return { + name: ENGINE_MAP.Blink, + }; + } + + // otherwise match the version and return EdgeHTML + const version = Utils.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i, ua); + + return { + name: ENGINE_MAP.EdgeHTML, + version, + }; + }, + }, + + /* Trident */ + { + test: [/trident/i], + describe(ua) { + const engine = { + name: ENGINE_MAP.Trident, + }; + + const version = Utils.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + engine.version = version; + } + + return engine; + }, + }, + + /* Presto */ + { + test(parser) { + return parser.test(/presto/i); + }, + describe(ua) { + const engine = { + name: ENGINE_MAP.Presto, + }; + + const version = Utils.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + engine.version = version; + } + + return engine; + }, + }, + + /* Gecko */ + { + test(parser) { + const isGecko = parser.test(/gecko/i); + const likeGecko = parser.test(/like gecko/i); + return isGecko && !likeGecko; + }, + describe(ua) { + const engine = { + name: ENGINE_MAP.Gecko, + }; + + const version = Utils.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + engine.version = version; + } + + return engine; + }, + }, + + /* Blink */ + { + test: [/(apple)?webkit\/537\.36/i], + describe() { + return { + name: ENGINE_MAP.Blink, + }; + }, + }, + + /* WebKit */ + { + test: [/(apple)?webkit/i], + describe(ua) { + const engine = { + name: ENGINE_MAP.WebKit, + }; + + const version = Utils.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + engine.version = version; + } + + return engine; + }, + }, +]; + +/** + * The main class that arranges the whole parsing process. + */ +class Parser { + /** + * Create instance of Parser + * + * @param {String} UA User-Agent string + * @param {Boolean} [skipParsing=false] parser can skip parsing in purpose of performance + * improvements if you need to make a more particular parsing + * like {@link Parser#parseBrowser} or {@link Parser#parsePlatform} + * + * @throw {Error} in case of empty UA String + * + * @constructor + */ + constructor(UA, skipParsing = false) { + if (UA === void (0) || UA === null || UA === '') { + throw new Error("UserAgent parameter can't be empty"); + } + + this._ua = UA; + + /** + * @typedef ParsedResult + * @property {Object} browser + * @property {String|undefined} [browser.name] + * Browser name, like `"Chrome"` or `"Internet Explorer"` + * @property {String|undefined} [browser.version] Browser version as a String `"12.01.45334.10"` + * @property {Object} os + * @property {String|undefined} [os.name] OS name, like `"Windows"` or `"macOS"` + * @property {String|undefined} [os.version] OS version, like `"NT 5.1"` or `"10.11.1"` + * @property {String|undefined} [os.versionName] OS name, like `"XP"` or `"High Sierra"` + * @property {Object} platform + * @property {String|undefined} [platform.type] + * platform type, can be either `"desktop"`, `"tablet"` or `"mobile"` + * @property {String|undefined} [platform.vendor] Vendor of the device, + * like `"Apple"` or `"Samsung"` + * @property {String|undefined} [platform.model] Device model, + * like `"iPhone"` or `"Kindle Fire HD 7"` + * @property {Object} engine + * @property {String|undefined} [engine.name] + * Can be any of this: `WebKit`, `Blink`, `Gecko`, `Trident`, `Presto`, `EdgeHTML` + * @property {String|undefined} [engine.version] String version of the engine + */ + this.parsedResult = {}; + + if (skipParsing !== true) { + this.parse(); + } + } + + /** + * Get UserAgent string of current Parser instance + * @return {String} User-Agent String of the current object + * + * @public + */ + getUA() { + return this._ua; + } + + /** + * Test a UA string for a regexp + * @param {RegExp} regex + * @return {Boolean} + */ + test(regex) { + return regex.test(this._ua); + } + + /** + * Get parsed browser object + * @return {Object} + */ + parseBrowser() { + this.parsedResult.browser = {}; + + const browserDescriptor = Utils.find(browsersList, (_browser) => { + if (typeof _browser.test === 'function') { + return _browser.test(this); + } + + if (_browser.test instanceof Array) { + return _browser.test.some(condition => this.test(condition)); + } + + throw new Error("Browser's test function is not valid"); + }); + + if (browserDescriptor) { + this.parsedResult.browser = browserDescriptor.describe(this.getUA()); + } + + return this.parsedResult.browser; + } + + /** + * Get parsed browser object + * @return {Object} + * + * @public + */ + getBrowser() { + if (this.parsedResult.browser) { + return this.parsedResult.browser; + } + + return this.parseBrowser(); + } + + /** + * Get browser's name + * @return {String} Browser's name or an empty string + * + * @public + */ + getBrowserName(toLowerCase) { + if (toLowerCase) { + return String(this.getBrowser().name).toLowerCase() || ''; + } + return this.getBrowser().name || ''; + } + + + /** + * Get browser's version + * @return {String} version of browser + * + * @public + */ + getBrowserVersion() { + return this.getBrowser().version; + } + + /** + * Get OS + * @return {Object} + * + * @example + * this.getOS(); + * { + * name: 'macOS', + * version: '10.11.12' + * } + */ + getOS() { + if (this.parsedResult.os) { + return this.parsedResult.os; + } + + return this.parseOS(); + } + + /** + * Parse OS and save it to this.parsedResult.os + * @return {*|{}} + */ + parseOS() { + this.parsedResult.os = {}; + + const os = Utils.find(osParsersList, (_os) => { + if (typeof _os.test === 'function') { + return _os.test(this); + } + + if (_os.test instanceof Array) { + return _os.test.some(condition => this.test(condition)); + } + + throw new Error("Browser's test function is not valid"); + }); + + if (os) { + this.parsedResult.os = os.describe(this.getUA()); + } + + return this.parsedResult.os; + } + + /** + * Get OS name + * @param {Boolean} [toLowerCase] return lower-cased value + * @return {String} name of the OS — macOS, Windows, Linux, etc. + */ + getOSName(toLowerCase) { + const { name } = this.getOS(); + + if (toLowerCase) { + return String(name).toLowerCase() || ''; + } + + return name || ''; + } + + /** + * Get OS version + * @return {String} full version with dots ('10.11.12', '5.6', etc) + */ + getOSVersion() { + return this.getOS().version; + } + + /** + * Get parsed platform + * @return {{}} + */ + getPlatform() { + if (this.parsedResult.platform) { + return this.parsedResult.platform; + } + + return this.parsePlatform(); + } + + /** + * Get platform name + * @param {Boolean} [toLowerCase=false] + * @return {*} + */ + getPlatformType(toLowerCase = false) { + const { type } = this.getPlatform(); + + if (toLowerCase) { + return String(type).toLowerCase() || ''; + } + + return type || ''; + } + + /** + * Get parsed platform + * @return {{}} + */ + parsePlatform() { + this.parsedResult.platform = {}; + + const platform = Utils.find(platformParsersList, (_platform) => { + if (typeof _platform.test === 'function') { + return _platform.test(this); + } + + if (_platform.test instanceof Array) { + return _platform.test.some(condition => this.test(condition)); + } + + throw new Error("Browser's test function is not valid"); + }); + + if (platform) { + this.parsedResult.platform = platform.describe(this.getUA()); + } + + return this.parsedResult.platform; + } + + /** + * Get parsed engine + * @return {{}} + */ + getEngine() { + if (this.parsedResult.engine) { + return this.parsedResult.engine; + } + + return this.parseEngine(); + } + + /** + * Get engines's name + * @return {String} Engines's name or an empty string + * + * @public + */ + getEngineName(toLowerCase) { + if (toLowerCase) { + return String(this.getEngine().name).toLowerCase() || ''; + } + return this.getEngine().name || ''; + } + + /** + * Get parsed platform + * @return {{}} + */ + parseEngine() { + this.parsedResult.engine = {}; + + const engine = Utils.find(enginesParsersList, (_engine) => { + if (typeof _engine.test === 'function') { + return _engine.test(this); + } + + if (_engine.test instanceof Array) { + return _engine.test.some(condition => this.test(condition)); + } + + throw new Error("Browser's test function is not valid"); + }); + + if (engine) { + this.parsedResult.engine = engine.describe(this.getUA()); + } + + return this.parsedResult.engine; + } + + /** + * Parse full information about the browser + * @returns {Parser} + */ + parse() { + this.parseBrowser(); + this.parseOS(); + this.parsePlatform(); + this.parseEngine(); + + return this; + } + + /** + * Get parsed result + * @return {ParsedResult} + */ + getResult() { + return Utils.assign({}, this.parsedResult); + } + + /** + * Check if parsed browser matches certain conditions + * + * @param {Object} checkTree It's one or two layered object, + * which can include a platform or an OS on the first layer + * and should have browsers specs on the bottom-laying layer + * + * @returns {Boolean|undefined} Whether the browser satisfies the set conditions or not. + * Returns `undefined` when the browser is no described in the checkTree object. + * + * @example + * const browser = Bowser.getParser(window.navigator.userAgent); + * if (browser.satisfies({chrome: '>118.01.1322' })) + * // or with os + * if (browser.satisfies({windows: { chrome: '>118.01.1322' } })) + * // or with platforms + * if (browser.satisfies({desktop: { chrome: '>118.01.1322' } })) + */ + satisfies(checkTree) { + const platformsAndOSes = {}; + let platformsAndOSCounter = 0; + const browsers = {}; + let browsersCounter = 0; + + const allDefinitions = Object.keys(checkTree); + + allDefinitions.forEach((key) => { + const currentDefinition = checkTree[key]; + if (typeof currentDefinition === 'string') { + browsers[key] = currentDefinition; + browsersCounter += 1; + } else if (typeof currentDefinition === 'object') { + platformsAndOSes[key] = currentDefinition; + platformsAndOSCounter += 1; + } + }); + + if (platformsAndOSCounter > 0) { + const platformsAndOSNames = Object.keys(platformsAndOSes); + const OSMatchingDefinition = Utils.find(platformsAndOSNames, name => (this.isOS(name))); + + if (OSMatchingDefinition) { + const osResult = this.satisfies(platformsAndOSes[OSMatchingDefinition]); + + if (osResult !== void 0) { + return osResult; + } + } + + const platformMatchingDefinition = Utils.find( + platformsAndOSNames, + name => (this.isPlatform(name)), + ); + if (platformMatchingDefinition) { + const platformResult = this.satisfies(platformsAndOSes[platformMatchingDefinition]); + + if (platformResult !== void 0) { + return platformResult; + } + } + } + + if (browsersCounter > 0) { + const browserNames = Object.keys(browsers); + const matchingDefinition = Utils.find(browserNames, name => (this.isBrowser(name, true))); + + if (matchingDefinition !== void 0) { + return this.compareVersion(browsers[matchingDefinition]); + } + } + + return undefined; + } + + /** + * Check if the browser name equals the passed string + * @param browserName The string to compare with the browser name + * @param [includingAlias=false] The flag showing whether alias will be included into comparison + * @returns {boolean} + */ + isBrowser(browserName, includingAlias = false) { + const defaultBrowserName = this.getBrowserName().toLowerCase(); + let browserNameLower = browserName.toLowerCase(); + const alias = Utils.getBrowserTypeByAlias(browserNameLower); + + if (includingAlias && alias) { + browserNameLower = alias.toLowerCase(); + } + return browserNameLower === defaultBrowserName; + } + + compareVersion(version) { + let expectedResults = [0]; + let comparableVersion = version; + let isLoose = false; + + const currentBrowserVersion = this.getBrowserVersion(); + + if (typeof currentBrowserVersion !== 'string') { + return void 0; + } + + if (version[0] === '>' || version[0] === '<') { + comparableVersion = version.substr(1); + if (version[1] === '=') { + isLoose = true; + comparableVersion = version.substr(2); + } else { + expectedResults = []; + } + if (version[0] === '>') { + expectedResults.push(1); + } else { + expectedResults.push(-1); + } + } else if (version[0] === '=') { + comparableVersion = version.substr(1); + } else if (version[0] === '~') { + isLoose = true; + comparableVersion = version.substr(1); + } + + return expectedResults.indexOf( + Utils.compareVersions(currentBrowserVersion, comparableVersion, isLoose), + ) > -1; + } + + isOS(osName) { + return this.getOSName(true) === String(osName).toLowerCase(); + } + + isPlatform(platformType) { + return this.getPlatformType(true) === String(platformType).toLowerCase(); + } + + isEngine(engineName) { + return this.getEngineName(true) === String(engineName).toLowerCase(); + } + + /** + * Is anything? Check if the browser is called "anything", + * the OS called "anything" or the platform called "anything" + * @param {String} anything + * @param [includingAlias=false] The flag showing whether alias will be included into comparison + * @returns {Boolean} + */ + is(anything, includingAlias = false) { + return this.isBrowser(anything, includingAlias) || this.isOS(anything) + || this.isPlatform(anything); + } + + /** + * Check if any of the given values satisfies this.is(anything) + * @param {String[]} anythings + * @returns {Boolean} + */ + some(anythings = []) { + return anythings.some(anything => this.is(anything)); + } +} + +/*! + * Bowser - a browser detector + * https://github.com/lancedikson/bowser + * MIT License | (c) Dustin Diaz 2012-2015 + * MIT License | (c) Denis Demchenko 2015-2019 + */ + +/** + * Bowser class. + * Keep it simple as much as it can be. + * It's supposed to work with collections of {@link Parser} instances + * rather then solve one-instance problems. + * All the one-instance stuff is located in Parser class. + * + * @class + * @classdesc Bowser is a static object, that provides an API to the Parsers + * @hideconstructor + */ +class Bowser { + /** + * Creates a {@link Parser} instance + * + * @param {String} UA UserAgent string + * @param {Boolean} [skipParsing=false] Will make the Parser postpone parsing until you ask it + * explicitly. Same as `skipParsing` for {@link Parser}. + * @returns {Parser} + * @throws {Error} when UA is not a String + * + * @example + * const parser = Bowser.getParser(window.navigator.userAgent); + * const result = parser.getResult(); + */ + static getParser(UA, skipParsing = false) { + if (typeof UA !== 'string') { + throw new Error('UserAgent should be a string'); + } + return new Parser(UA, skipParsing); + } + + /** + * Creates a {@link Parser} instance and runs {@link Parser.getResult} immediately + * + * @param UA + * @return {ParsedResult} + * + * @example + * const result = Bowser.parse(window.navigator.userAgent); + */ + static parse(UA) { + return (new Parser(UA)).getResult(); + } + + static get BROWSER_MAP() { + return BROWSER_MAP; + } + + static get ENGINE_MAP() { + return ENGINE_MAP; + } + + static get OS_MAP() { + return OS_MAP; + } + + static get PLATFORMS_MAP() { + return PLATFORMS_MAP; + } +} + +var regeneratorRuntime$1 = {exports: {}}; + +var _typeof$1 = {exports: {}}; + +_typeof$1.exports; + +(function (module) { + function _typeof(o) { + "@babel/helpers - typeof"; + + return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { + return typeof o; + } : function (o) { + return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; + }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(o); + } + module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports; +} (_typeof$1)); + +var _typeofExports = _typeof$1.exports; + +regeneratorRuntime$1.exports; + +(function (module) { + var _typeof = _typeofExports["default"]; + function _regeneratorRuntime() { + module.exports = _regeneratorRuntime = function _regeneratorRuntime() { + return e; + }, module.exports.__esModule = true, module.exports["default"] = module.exports; + var t, + e = {}, + r = Object.prototype, + n = r.hasOwnProperty, + o = Object.defineProperty || function (t, e, r) { + t[e] = r.value; + }, + i = "function" == typeof Symbol ? Symbol : {}, + a = i.iterator || "@@iterator", + c = i.asyncIterator || "@@asyncIterator", + u = i.toStringTag || "@@toStringTag"; + function define(t, e, r) { + return Object.defineProperty(t, e, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }), t[e]; + } + try { + define({}, ""); + } catch (t) { + define = function define(t, e, r) { + return t[e] = r; + }; + } + function wrap(t, e, r, n) { + var i = e && e.prototype instanceof Generator ? e : Generator, + a = Object.create(i.prototype), + c = new Context(n || []); + return o(a, "_invoke", { + value: makeInvokeMethod(t, r, c) + }), a; + } + function tryCatch(t, e, r) { + try { + return { + type: "normal", + arg: t.call(e, r) + }; + } catch (t) { + return { + type: "throw", + arg: t + }; + } + } + e.wrap = wrap; + var h = "suspendedStart", + l = "suspendedYield", + f = "executing", + s = "completed", + y = {}; + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + var p = {}; + define(p, a, function () { + return this; + }); + var d = Object.getPrototypeOf, + v = d && d(d(values([]))); + v && v !== r && n.call(v, a) && (p = v); + var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); + function defineIteratorMethods(t) { + ["next", "throw", "return"].forEach(function (e) { + define(t, e, function (t) { + return this._invoke(e, t); + }); + }); + } + function AsyncIterator(t, e) { + function invoke(r, o, i, a) { + var c = tryCatch(t[r], t, o); + if ("throw" !== c.type) { + var u = c.arg, + h = u.value; + return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { + invoke("next", t, i, a); + }, function (t) { + invoke("throw", t, i, a); + }) : e.resolve(h).then(function (t) { + u.value = t, i(u); + }, function (t) { + return invoke("throw", t, i, a); + }); + } + a(c.arg); + } + var r; + o(this, "_invoke", { + value: function value(t, n) { + function callInvokeWithMethodAndArg() { + return new e(function (e, r) { + invoke(t, n, e, r); + }); + } + return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); + } + }); + } + function makeInvokeMethod(e, r, n) { + var o = h; + return function (i, a) { + if (o === f) throw new Error("Generator is already running"); + if (o === s) { + if ("throw" === i) throw a; + return { + value: t, + done: !0 + }; + } + for (n.method = i, n.arg = a;;) { + var c = n.delegate; + if (c) { + var u = maybeInvokeDelegate(c, n); + if (u) { + if (u === y) continue; + return u; + } + } + if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { + if (o === h) throw o = s, n.arg; + n.dispatchException(n.arg); + } else "return" === n.method && n.abrupt("return", n.arg); + o = f; + var p = tryCatch(e, r, n); + if ("normal" === p.type) { + if (o = n.done ? s : l, p.arg === y) continue; + return { + value: p.arg, + done: n.done + }; + } + "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); + } + }; + } + function maybeInvokeDelegate(e, r) { + var n = r.method, + o = e.iterator[n]; + if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; + var i = tryCatch(o, e.iterator, r.arg); + if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; + var a = i.arg; + return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); + } + function pushTryEntry(t) { + var e = { + tryLoc: t[0] + }; + 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); + } + function resetTryEntry(t) { + var e = t.completion || {}; + e.type = "normal", delete e.arg, t.completion = e; + } + function Context(t) { + this.tryEntries = [{ + tryLoc: "root" + }], t.forEach(pushTryEntry, this), this.reset(!0); + } + function values(e) { + if (e || "" === e) { + var r = e[a]; + if (r) return r.call(e); + if ("function" == typeof e.next) return e; + if (!isNaN(e.length)) { + var o = -1, + i = function next() { + for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; + return next.value = t, next.done = !0, next; + }; + return i.next = i; + } + } + throw new TypeError(_typeof(e) + " is not iterable"); + } + return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { + value: GeneratorFunctionPrototype, + configurable: !0 + }), o(GeneratorFunctionPrototype, "constructor", { + value: GeneratorFunction, + configurable: !0 + }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { + var e = "function" == typeof t && t.constructor; + return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); + }, e.mark = function (t) { + return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; + }, e.awrap = function (t) { + return { + __await: t + }; + }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { + return this; + }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { + void 0 === i && (i = Promise); + var a = new AsyncIterator(wrap(t, r, n, o), i); + return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { + return t.done ? t.value : a.next(); + }); + }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { + return this; + }), define(g, "toString", function () { + return "[object Generator]"; + }), e.keys = function (t) { + var e = Object(t), + r = []; + for (var n in e) r.push(n); + return r.reverse(), function next() { + for (; r.length;) { + var t = r.pop(); + if (t in e) return next.value = t, next.done = !1, next; + } + return next.done = !0, next; + }; + }, e.values = values, Context.prototype = { + constructor: Context, + reset: function reset(e) { + if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); + }, + stop: function stop() { + this.done = !0; + var t = this.tryEntries[0].completion; + if ("throw" === t.type) throw t.arg; + return this.rval; + }, + dispatchException: function dispatchException(e) { + if (this.done) throw e; + var r = this; + function handle(n, o) { + return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; + } + for (var o = this.tryEntries.length - 1; o >= 0; --o) { + var i = this.tryEntries[o], + a = i.completion; + if ("root" === i.tryLoc) return handle("end"); + if (i.tryLoc <= this.prev) { + var c = n.call(i, "catchLoc"), + u = n.call(i, "finallyLoc"); + if (c && u) { + if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); + if (this.prev < i.finallyLoc) return handle(i.finallyLoc); + } else if (c) { + if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); + } else { + if (!u) throw new Error("try statement without catch or finally"); + if (this.prev < i.finallyLoc) return handle(i.finallyLoc); + } + } + } + }, + abrupt: function abrupt(t, e) { + for (var r = this.tryEntries.length - 1; r >= 0; --r) { + var o = this.tryEntries[r]; + if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { + var i = o; + break; + } + } + i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); + var a = i ? i.completion : {}; + return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); + }, + complete: function complete(t, e) { + if ("throw" === t.type) throw t.arg; + return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; + }, + finish: function finish(t) { + for (var e = this.tryEntries.length - 1; e >= 0; --e) { + var r = this.tryEntries[e]; + if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; + } + }, + "catch": function _catch(t) { + for (var e = this.tryEntries.length - 1; e >= 0; --e) { + var r = this.tryEntries[e]; + if (r.tryLoc === t) { + var n = r.completion; + if ("throw" === n.type) { + var o = n.arg; + resetTryEntry(r); + } + return o; + } + } + throw new Error("illegal catch attempt"); + }, + delegateYield: function delegateYield(e, r, n) { + return this.delegate = { + iterator: values(e), + resultName: r, + nextLoc: n + }, "next" === this.method && (this.arg = t), y; + } + }, e; + } + module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports; +} (regeneratorRuntime$1)); + +var regeneratorRuntimeExports = regeneratorRuntime$1.exports; + +// TODO(Babel 8): Remove this file. + +var runtime = regeneratorRuntimeExports(); + +// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736= +try { + regeneratorRuntime = runtime; +} catch (accidentalStrictMode) { + if (typeof globalThis === "object") { + globalThis.regeneratorRuntime = runtime; + } else { + Function("r", "regeneratorRuntime = r")(runtime); + } +} + +function _classCallCheck$1(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _typeof(o) { + "@babel/helpers - typeof"; + + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { + return typeof o; + } : function (o) { + return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; + }, _typeof(o); +} + +function _toPrimitive(input, hint) { + if (_typeof(input) !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (_typeof(res) !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); +} + +function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return _typeof(key) === "symbol" ? key : String(key); +} + +function _defineProperties$1(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); + } +} +function _createClass$1(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$1(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$1(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; +} + +/* + Copyright 2022-2023 Picovoice Inc. + + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" + file accompanying this source. + + 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. +*/ +/** + * BasePvFile Class + * This class mocks the file system using in-memory storage. + */ +var PvFile = /*#__PURE__*/function () { + function PvFile() { + _classCallCheck$1(this, PvFile); + this._path = ''; + } + /** + * Getter for file's meta information. + */ + _createClass$1(PvFile, [{ + key: "meta", + get: function get() { + if (this._meta === undefined) { + return undefined; + } + return Object.assign({ + version: 0 + }, this._meta); + } + /** + * Get the file pointer from the _filePtrs map. + * @param ptr The pointer to BasePvFile instance to get from the map. + * @returns BasePvFile returns the current file instance related to ptr. + */ + }], [{ + key: "getPtr", + value: function getPtr(ptr) { + if (PvFile._filePtrs.has(ptr)) { + return PvFile._filePtrs.get(ptr); + } + throw new Error('File instance not found.'); + } + /** + * Saves the BasePvFile instance to the map with an associated ptr. + * @param ptr The file pointer to save as the key. + * @param instance The BasePvFile instance to save as the value. + */ + }, { + key: "setPtr", + value: function setPtr(ptr, instance) { + PvFile._filePtrs.set(ptr, instance); + } + /** + * Removes the ptr from the _filePtrs map. + * @param ptr The file pointer to remove. + */ + }, { + key: "removePtr", + value: function removePtr(ptr) { + PvFile._filePtrs["delete"](ptr); + } + }]); + return PvFile; +}(); +PvFile._filePtrs = new Map(); +/** + * Cast a signed address to unsigned address. + * + * @param address The address to cast to unsigned address. + */ +function unsignedAddress(address) { + if (address < 0) { + return address >>> 0; + } + return address; +} + +function decodeBase64(base64, enableUnicode) { + var binaryString = atob(base64); + if (enableUnicode) { + var binaryView = new Uint8Array(binaryString.length); + for (var i = 0, n = binaryString.length; i < n; ++i) { + binaryView[i] = binaryString.charCodeAt(i); + } + return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer)); + } + return binaryString; +} + +function createURL(base64, sourcemapArg, enableUnicodeArg) { + var sourcemap = sourcemapArg === undefined ? null : sourcemapArg; + var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg; + var source = decodeBase64(base64, enableUnicode); + var start = source.indexOf('\n', 10) + 1; + var body = source.substring(start) + (sourcemap ? '\/\/# sourceMappingURL=' + sourcemap : ''); + var blob = new Blob([body], { type: 'application/javascript' }); + return URL.createObjectURL(blob); +} + +function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) { + var url; + return function WorkerFactory(options) { + url = url || createURL(base64, sourcemapArg, enableUnicodeArg); + return new Worker(url, options); + }; +} + +var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gX3R5cGVvZiQzKG8pIHsKICAgICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7CgogICAgcmV0dXJuIF90eXBlb2YkMyA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsKICAgICAgcmV0dXJuIHR5cGVvZiBvOwogICAgfSA6IGZ1bmN0aW9uIChvKSB7CiAgICAgIHJldHVybiBvICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG87CiAgICB9LCBfdHlwZW9mJDMobyk7CiAgfQoKICBmdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7CiAgICBpZiAoIm9iamVjdCIgIT0gX3R5cGVvZiQzKHQpIHx8ICF0KSByZXR1cm4gdDsKICAgIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOwogICAgaWYgKHZvaWQgMCAhPT0gZSkgewogICAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8ICJkZWZhdWx0Iik7CiAgICAgIGlmICgib2JqZWN0IiAhPSBfdHlwZW9mJDMoaSkpIHJldHVybiBpOwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwogICAgfQogICAgcmV0dXJuICgic3RyaW5nIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7CiAgfQoKICBmdW5jdGlvbiB0b1Byb3BlcnR5S2V5KHQpIHsKICAgIHZhciBpID0gdG9QcmltaXRpdmUodCwgInN0cmluZyIpOwogICAgcmV0dXJuICJzeW1ib2wiID09IF90eXBlb2YkMyhpKSA/IGkgOiBTdHJpbmcoaSk7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7CiAgICBrZXkgPSB0b1Byb3BlcnR5S2V5KGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsKICAgIHRyeSB7CiAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsKICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIHJlamVjdChlcnJvcik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpbmZvLmRvbmUpIHsKICAgICAgcmVzb2x2ZSh2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgYXJncyA9IGFyZ3VtZW50czsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsKICAgICAgICB9CiAgICAgICAgX25leHQodW5kZWZpbmVkKTsKICAgICAgfSk7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMkMSAoeCkgewogIAlyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4OwogIH0KCiAgdmFyIHJlZ2VuZXJhdG9yUnVudGltZSQyID0ge2V4cG9ydHM6IHt9fTsKCiAgdmFyIF90eXBlb2YkMiA9IHtleHBvcnRzOiB7fX07CgogIF90eXBlb2YkMi5leHBvcnRzOwoKICAoZnVuY3Rpb24gKG1vZHVsZSkgewogIAlmdW5jdGlvbiBfdHlwZW9mKG8pIHsKICAJICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAJICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsKICAJICAgIHJldHVybiB0eXBlb2YgbzsKICAJICB9IDogZnVuY3Rpb24gKG8pIHsKICAJICAgIHJldHVybiBvICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG87CiAgCSAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0cyksIF90eXBlb2Yobyk7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChfdHlwZW9mJDIpKTsKCiAgdmFyIF90eXBlb2ZFeHBvcnRzJDEgPSBfdHlwZW9mJDIuZXhwb3J0czsKCiAgcmVnZW5lcmF0b3JSdW50aW1lJDIuZXhwb3J0czsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJdmFyIF90eXBlb2YgPSBfdHlwZW9mRXhwb3J0cyQxWyJkZWZhdWx0Il07CiAgCWZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAJICAgIHJldHVybiBlOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7CiAgCSAgdmFyIHQsCiAgCSAgICBlID0ge30sCiAgCSAgICByID0gT2JqZWN0LnByb3RvdHlwZSwKICAJICAgIG4gPSByLmhhc093blByb3BlcnR5LAogIAkgICAgbyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAodCwgZSwgcikgewogIAkgICAgICB0W2VdID0gci52YWx1ZTsKICAJICAgIH0sCiAgCSAgICBpID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sID8gU3ltYm9sIDoge30sCiAgCSAgICBhID0gaS5pdGVyYXRvciB8fCAiQEBpdGVyYXRvciIsCiAgCSAgICBjID0gaS5hc3luY0l0ZXJhdG9yIHx8ICJAQGFzeW5jSXRlcmF0b3IiLAogIAkgICAgdSA9IGkudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogIAkgIGZ1bmN0aW9uIGRlZmluZSh0LCBlLCByKSB7CiAgCSAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGUsIHsKICAJICAgICAgdmFsdWU6IHIsCiAgCSAgICAgIGVudW1lcmFibGU6ICEwLAogIAkgICAgICBjb25maWd1cmFibGU6ICEwLAogIAkgICAgICB3cml0YWJsZTogITAKICAJICAgIH0pLCB0W2VdOwogIAkgIH0KICAJICB0cnkgewogIAkgICAgZGVmaW5lKHt9LCAiIik7CiAgCSAgfSBjYXRjaCAodCkgewogIAkgICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKHQsIGUsIHIpIHsKICAJICAgICAgcmV0dXJuIHRbZV0gPSByOwogIAkgICAgfTsKICAJICB9CiAgCSAgZnVuY3Rpb24gd3JhcCh0LCBlLCByLCBuKSB7CiAgCSAgICB2YXIgaSA9IGUgJiYgZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBlIDogR2VuZXJhdG9yLAogIAkgICAgICBhID0gT2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSksCiAgCSAgICAgIGMgPSBuZXcgQ29udGV4dChuIHx8IFtdKTsKICAJICAgIHJldHVybiBvKGEsICJfaW52b2tlIiwgewogIAkgICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZCh0LCByLCBjKQogIAkgICAgfSksIGE7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHRyeUNhdGNoKHQsIGUsIHIpIHsKICAJICAgIHRyeSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgCSAgICAgICAgYXJnOiB0LmNhbGwoZSwgcikKICAJICAgICAgfTsKICAJICAgIH0gY2F0Y2ggKHQpIHsKICAJICAgICAgcmV0dXJuIHsKICAJICAgICAgICB0eXBlOiAidGhyb3ciLAogIAkgICAgICAgIGFyZzogdAogIAkgICAgICB9OwogIAkgICAgfQogIAkgIH0KICAJICBlLndyYXAgPSB3cmFwOwogIAkgIHZhciBoID0gInN1c3BlbmRlZFN0YXJ0IiwKICAJICAgIGwgPSAic3VzcGVuZGVkWWllbGQiLAogIAkgICAgZiA9ICJleGVjdXRpbmciLAogIAkgICAgcyA9ICJjb21wbGV0ZWQiLAogIAkgICAgeSA9IHt9OwogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fQogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KICAJICB2YXIgcCA9IHt9OwogIAkgIGRlZmluZShwLCBhLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KTsKICAJICB2YXIgZCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAJICAgIHYgPSBkICYmIGQoZCh2YWx1ZXMoW10pKSk7CiAgCSAgdiAmJiB2ICE9PSByICYmIG4uY2FsbCh2LCBhKSAmJiAocCA9IHYpOwogIAkgIHZhciBnID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocCk7CiAgCSAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHQpIHsKICAJICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgCSAgICAgIGRlZmluZSh0LCBlLCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UoZSwgdCk7CiAgCSAgICAgIH0pOwogIAkgICAgfSk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IodCwgZSkgewogIAkgICAgZnVuY3Rpb24gaW52b2tlKHIsIG8sIGksIGEpIHsKICAJICAgICAgdmFyIGMgPSB0cnlDYXRjaCh0W3JdLCB0LCBvKTsKICAJICAgICAgaWYgKCJ0aHJvdyIgIT09IGMudHlwZSkgewogIAkgICAgICAgIHZhciB1ID0gYy5hcmcsCiAgCSAgICAgICAgICBoID0gdS52YWx1ZTsKICAJICAgICAgICByZXR1cm4gaCAmJiAib2JqZWN0IiA9PSBfdHlwZW9mKGgpICYmIG4uY2FsbChoLCAiX19hd2FpdCIpID8gZS5yZXNvbHZlKGguX19hd2FpdCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgaW52b2tlKCJuZXh0IiwgdCwgaSwgYSk7CiAgCSAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHsKICAJICAgICAgICAgIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KSA6IGUucmVzb2x2ZShoKS50aGVuKGZ1bmN0aW9uICh0KSB7CiAgCSAgICAgICAgICB1LnZhbHVlID0gdCwgaSh1KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KTsKICAJICAgICAgfQogIAkgICAgICBhKGMuYXJnKTsKICAJICAgIH0KICAJICAgIHZhciByOwogIAkgICAgbyh0aGlzLCAiX2ludm9rZSIsIHsKICAJICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHQsIG4pIHsKICAJICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAJICAgICAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSwgcikgewogIAkgICAgICAgICAgICBpbnZva2UodCwgbiwgZSwgcik7CiAgCSAgICAgICAgICB9KTsKICAJICAgICAgICB9CiAgCSAgICAgICAgcmV0dXJuIHIgPSByID8gci50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogIAkgICAgICB9CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChlLCByLCBuKSB7CiAgCSAgICB2YXIgbyA9IGg7CiAgCSAgICByZXR1cm4gZnVuY3Rpb24gKGksIGEpIHsKICAJICAgICAgaWYgKG8gPT09IGYpIHRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpOwogIAkgICAgICBpZiAobyA9PT0gcykgewogIAkgICAgICAgIGlmICgidGhyb3ciID09PSBpKSB0aHJvdyBhOwogIAkgICAgICAgIHJldHVybiB7CiAgCSAgICAgICAgICB2YWx1ZTogdCwKICAJICAgICAgICAgIGRvbmU6ICEwCiAgCSAgICAgICAgfTsKICAJICAgICAgfQogIAkgICAgICBmb3IgKG4ubWV0aG9kID0gaSwgbi5hcmcgPSBhOzspIHsKICAJICAgICAgICB2YXIgYyA9IG4uZGVsZWdhdGU7CiAgCSAgICAgICAgaWYgKGMpIHsKICAJICAgICAgICAgIHZhciB1ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShjLCBuKTsKICAJICAgICAgICAgIGlmICh1KSB7CiAgCSAgICAgICAgICAgIGlmICh1ID09PSB5KSBjb250aW51ZTsKICAJICAgICAgICAgICAgcmV0dXJuIHU7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICAgIGlmICgibmV4dCIgPT09IG4ubWV0aG9kKSBuLnNlbnQgPSBuLl9zZW50ID0gbi5hcmc7ZWxzZSBpZiAoInRocm93IiA9PT0gbi5tZXRob2QpIHsKICAJICAgICAgICAgIGlmIChvID09PSBoKSB0aHJvdyBvID0gcywgbi5hcmc7CiAgCSAgICAgICAgICBuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKTsKICAJICAgICAgICB9IGVsc2UgInJldHVybiIgPT09IG4ubWV0aG9kICYmIG4uYWJydXB0KCJyZXR1cm4iLCBuLmFyZyk7CiAgCSAgICAgICAgbyA9IGY7CiAgCSAgICAgICAgdmFyIHAgPSB0cnlDYXRjaChlLCByLCBuKTsKICAJICAgICAgICBpZiAoIm5vcm1hbCIgPT09IHAudHlwZSkgewogIAkgICAgICAgICAgaWYgKG8gPSBuLmRvbmUgPyBzIDogbCwgcC5hcmcgPT09IHkpIGNvbnRpbnVlOwogIAkgICAgICAgICAgcmV0dXJuIHsKICAJICAgICAgICAgICAgdmFsdWU6IHAuYXJnLAogIAkgICAgICAgICAgICBkb25lOiBuLmRvbmUKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgfQogIAkgICAgICAgICJ0aHJvdyIgPT09IHAudHlwZSAmJiAobyA9IHMsIG4ubWV0aG9kID0gInRocm93Iiwgbi5hcmcgPSBwLmFyZyk7CiAgCSAgICAgIH0KICAJICAgIH07CiAgCSAgfQogIAkgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgcikgewogIAkgICAgdmFyIG4gPSByLm1ldGhvZCwKICAJICAgICAgbyA9IGUuaXRlcmF0b3Jbbl07CiAgCSAgICBpZiAobyA9PT0gdCkgcmV0dXJuIHIuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBuICYmIGUuaXRlcmF0b3JbInJldHVybiJdICYmIChyLm1ldGhvZCA9ICJyZXR1cm4iLCByLmFyZyA9IHQsIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgciksICJ0aHJvdyIgPT09IHIubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbiAmJiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBuICsgIicgbWV0aG9kIikpLCB5OwogIAkgICAgdmFyIGkgPSB0cnlDYXRjaChvLCBlLml0ZXJhdG9yLCByLmFyZyk7CiAgCSAgICBpZiAoInRocm93IiA9PT0gaS50eXBlKSByZXR1cm4gci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IGkuYXJnLCByLmRlbGVnYXRlID0gbnVsbCwgeTsKICAJICAgIHZhciBhID0gaS5hcmc7CiAgCSAgICByZXR1cm4gYSA/IGEuZG9uZSA/IChyW2UucmVzdWx0TmFtZV0gPSBhLnZhbHVlLCByLm5leHQgPSBlLm5leHRMb2MsICJyZXR1cm4iICE9PSByLm1ldGhvZCAmJiAoci5tZXRob2QgPSAibmV4dCIsIHIuYXJnID0gdCksIHIuZGVsZWdhdGUgPSBudWxsLCB5KSA6IGEgOiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksIHIuZGVsZWdhdGUgPSBudWxsLCB5KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gewogIAkgICAgICB0cnlMb2M6IHRbMF0KICAJICAgIH07CiAgCSAgICAxIGluIHQgJiYgKGUuY2F0Y2hMb2MgPSB0WzFdKSwgMiBpbiB0ICYmIChlLmZpbmFsbHlMb2MgPSB0WzJdLCBlLmFmdGVyTG9jID0gdFszXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGUpOwogIAkgIH0KICAJICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gdC5jb21wbGV0aW9uIHx8IHt9OwogIAkgICAgZS50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSBlLmFyZywgdC5jb21wbGV0aW9uID0gZTsKICAJICB9CiAgCSAgZnVuY3Rpb24gQ29udGV4dCh0KSB7CiAgCSAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogIAkgICAgICB0cnlMb2M6ICJyb290IgogIAkgICAgfV0sIHQuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsKICAJICB9CiAgCSAgZnVuY3Rpb24gdmFsdWVzKGUpIHsKICAJICAgIGlmIChlIHx8ICIiID09PSBlKSB7CiAgCSAgICAgIHZhciByID0gZVthXTsKICAJICAgICAgaWYgKHIpIHJldHVybiByLmNhbGwoZSk7CiAgCSAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBlLm5leHQpIHJldHVybiBlOwogIAkgICAgICBpZiAoIWlzTmFOKGUubGVuZ3RoKSkgewogIAkgICAgICAgIHZhciBvID0gLTEsCiAgCSAgICAgICAgICBpID0gZnVuY3Rpb24gbmV4dCgpIHsKICAJICAgICAgICAgICAgZm9yICg7ICsrbyA8IGUubGVuZ3RoOykgaWYgKG4uY2FsbChlLCBvKSkgcmV0dXJuIG5leHQudmFsdWUgPSBlW29dLCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgICAgICAgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgcmV0dXJuIGkubmV4dCA9IGk7CiAgCSAgICAgIH0KICAJICAgIH0KICAJICAgIHRocm93IG5ldyBUeXBlRXJyb3IoX3R5cGVvZihlKSArICIgaXMgbm90IGl0ZXJhYmxlIik7CiAgCSAgfQogIAkgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgbyhnLCAiY29uc3RydWN0b3IiLCB7CiAgCSAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsCiAgCSAgICBjb25maWd1cmFibGU6ICEwCiAgCSAgfSksIG8oR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBlLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAodCkgewogIAkgICAgdmFyIGUgPSAiZnVuY3Rpb24iID09IHR5cGVvZiB0ICYmIHQuY29uc3RydWN0b3I7CiAgCSAgICByZXR1cm4gISFlICYmIChlID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAiR2VuZXJhdG9yRnVuY3Rpb24iID09PSAoZS5kaXNwbGF5TmFtZSB8fCBlLm5hbWUpKTsKICAJICB9LCBlLm1hcmsgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZih0LCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAodC5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKHQsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpKSwgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGcpLCB0OwogIAkgIH0sIGUuYXdyYXAgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIHsKICAJICAgICAgX19hd2FpdDogdAogIAkgICAgfTsKICAJICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGMsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pLCBlLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBlLmFzeW5jID0gZnVuY3Rpb24gKHQsIHIsIG4sIG8sIGkpIHsKICAJICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IFByb21pc2UpOwogIAkgICAgdmFyIGEgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKHQsIHIsIG4sIG8pLCBpKTsKICAJICAgIHJldHVybiBlLmlzR2VuZXJhdG9yRnVuY3Rpb24ocikgPyBhIDogYS5uZXh0KCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICByZXR1cm4gdC5kb25lID8gdC52YWx1ZSA6IGEubmV4dCgpOwogIAkgICAgfSk7CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKGcpLCBkZWZpbmUoZywgdSwgIkdlbmVyYXRvciIpLCBkZWZpbmUoZywgYSwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSksIGRlZmluZShnLCAidG9TdHJpbmciLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gIltvYmplY3QgR2VuZXJhdG9yXSI7CiAgCSAgfSksIGUua2V5cyA9IGZ1bmN0aW9uICh0KSB7CiAgCSAgICB2YXIgZSA9IE9iamVjdCh0KSwKICAJICAgICAgciA9IFtdOwogIAkgICAgZm9yICh2YXIgbiBpbiBlKSByLnB1c2gobik7CiAgCSAgICByZXR1cm4gci5yZXZlcnNlKCksIGZ1bmN0aW9uIG5leHQoKSB7CiAgCSAgICAgIGZvciAoOyByLmxlbmd0aDspIHsKICAJICAgICAgICB2YXIgdCA9IHIucG9wKCk7CiAgCSAgICAgICAgaWYgKHQgaW4gZSkgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgfQogIAkgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICB9OwogIAkgIH0sIGUudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAJICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogIAkgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KGUpIHsKICAJICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB0LCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gIm5leHQiLCB0aGlzLmFyZyA9IHQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhZSkgZm9yICh2YXIgciBpbiB0aGlzKSAidCIgPT09IHIuY2hhckF0KDApICYmIG4uY2FsbCh0aGlzLCByKSAmJiAhaXNOYU4oK3Iuc2xpY2UoMSkpICYmICh0aGlzW3JdID0gdCk7CiAgCSAgICB9LAogIAkgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKICAJICAgICAgdGhpcy5kb25lID0gITA7CiAgCSAgICAgIHZhciB0ID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gdGhpcy5ydmFsOwogIAkgICAgfSwKICAJICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihlKSB7CiAgCSAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGU7CiAgCSAgICAgIHZhciByID0gdGhpczsKICAJICAgICAgZnVuY3Rpb24gaGFuZGxlKG4sIG8pIHsKICAJICAgICAgICByZXR1cm4gYS50eXBlID0gInRocm93IiwgYS5hcmcgPSBlLCByLm5leHQgPSBuLCBvICYmIChyLm1ldGhvZCA9ICJuZXh0Iiwgci5hcmcgPSB0KSwgISFvOwogIAkgICAgICB9CiAgCSAgICAgIGZvciAodmFyIG8gPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgbyA+PSAwOyAtLW8pIHsKICAJICAgICAgICB2YXIgaSA9IHRoaXMudHJ5RW50cmllc1tvXSwKICAJICAgICAgICAgIGEgPSBpLmNvbXBsZXRpb247CiAgCSAgICAgICAgaWYgKCJyb290IiA9PT0gaS50cnlMb2MpIHJldHVybiBoYW5kbGUoImVuZCIpOwogIAkgICAgICAgIGlmIChpLnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAJICAgICAgICAgIHZhciBjID0gbi5jYWxsKGksICJjYXRjaExvYyIpLAogIAkgICAgICAgICAgICB1ID0gbi5jYWxsKGksICJmaW5hbGx5TG9jIik7CiAgCSAgICAgICAgICBpZiAoYyAmJiB1KSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShpLmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfSBlbHNlIGlmIChjKSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgIH0gZWxzZSB7CiAgCSAgICAgICAgICAgIGlmICghdSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgaS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGkuZmluYWxseUxvYyk7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICB9CiAgCSAgICB9LAogIAkgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodCwgZSkgewogIAkgICAgICBmb3IgKHZhciByID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHIgPj0gMDsgLS1yKSB7CiAgCSAgICAgICAgdmFyIG8gPSB0aGlzLnRyeUVudHJpZXNbcl07CiAgCSAgICAgICAgaWYgKG8udHJ5TG9jIDw9IHRoaXMucHJldiAmJiBuLmNhbGwobywgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBvLmZpbmFsbHlMb2MpIHsKICAJICAgICAgICAgIHZhciBpID0gbzsKICAJICAgICAgICAgIGJyZWFrOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICBpICYmICgiYnJlYWsiID09PSB0IHx8ICJjb250aW51ZSIgPT09IHQpICYmIGkudHJ5TG9jIDw9IGUgJiYgZSA8PSBpLmZpbmFsbHlMb2MgJiYgKGkgPSBudWxsKTsKICAJICAgICAgdmFyIGEgPSBpID8gaS5jb21wbGV0aW9uIDoge307CiAgCSAgICAgIHJldHVybiBhLnR5cGUgPSB0LCBhLmFyZyA9IGUsIGkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGkuZmluYWxseUxvYywgeSkgOiB0aGlzLmNvbXBsZXRlKGEpOwogIAkgICAgfSwKICAJICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSh0LCBlKSB7CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gImJyZWFrIiA9PT0gdC50eXBlIHx8ICJjb250aW51ZSIgPT09IHQudHlwZSA/IHRoaXMubmV4dCA9IHQuYXJnIDogInJldHVybiIgPT09IHQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gdC50eXBlICYmIGUgJiYgKHRoaXMubmV4dCA9IGUpLCB5OwogIAkgICAgfSwKICAJICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKHQpIHsKICAJICAgICAgZm9yICh2YXIgZSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBlID49IDA7IC0tZSkgewogIAkgICAgICAgIHZhciByID0gdGhpcy50cnlFbnRyaWVzW2VdOwogIAkgICAgICAgIGlmIChyLmZpbmFsbHlMb2MgPT09IHQpIHJldHVybiB0aGlzLmNvbXBsZXRlKHIuY29tcGxldGlvbiwgci5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkociksIHk7CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godCkgewogIAkgICAgICBmb3IgKHZhciBlID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGUgPj0gMDsgLS1lKSB7CiAgCSAgICAgICAgdmFyIHIgPSB0aGlzLnRyeUVudHJpZXNbZV07CiAgCSAgICAgICAgaWYgKHIudHJ5TG9jID09PSB0KSB7CiAgCSAgICAgICAgICB2YXIgbiA9IHIuY29tcGxldGlvbjsKICAJICAgICAgICAgIGlmICgidGhyb3ciID09PSBuLnR5cGUpIHsKICAJICAgICAgICAgICAgdmFyIG8gPSBuLmFyZzsKICAJICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShyKTsKICAJICAgICAgICAgIH0KICAJICAgICAgICAgIHJldHVybiBvOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogIAkgICAgfSwKICAJICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoZSwgciwgbikgewogIAkgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAJICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGUpLAogIAkgICAgICAgIHJlc3VsdE5hbWU6IHIsCiAgCSAgICAgICAgbmV4dExvYzogbgogIAkgICAgICB9LCAibmV4dCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHQpLCB5OwogIAkgICAgfQogIAkgIH0sIGU7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMikpOwoKICB2YXIgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyQxID0gcmVnZW5lcmF0b3JSdW50aW1lJDIuZXhwb3J0czsKCiAgLy8gVE9ETyhCYWJlbCA4KTogUmVtb3ZlIHRoaXMgZmlsZS4KCiAgdmFyIHJ1bnRpbWUkMSA9IHJlZ2VuZXJhdG9yUnVudGltZUV4cG9ydHMkMSgpOwogIHZhciByZWdlbmVyYXRvciQxID0gcnVudGltZSQxOwoKICAvLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUvcnVudGltZS5qcyNMNzM2PQogIHRyeSB7CiAgICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgICB9IGVsc2UgewogICAgICBGdW5jdGlvbigiciIsICJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocnVudGltZSQxKTsKICAgIH0KICB9CgogIHZhciBfcmVnZW5lcmF0b3JSdW50aW1lJDEgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMkMShyZWdlbmVyYXRvciQxKTsKCiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHsKICAJcmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDsKICB9CgogIHZhciByZWdlbmVyYXRvclJ1bnRpbWUkMSA9IHtleHBvcnRzOiB7fX07CgogIHZhciBfdHlwZW9mJDEgPSB7ZXhwb3J0czoge319OwoKICBfdHlwZW9mJDEuZXhwb3J0czsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJZnVuY3Rpb24gX3R5cGVvZihvKSB7CiAgCSAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgCSAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgInN5bWJvbCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7CiAgCSAgICByZXR1cm4gdHlwZW9mIG87CiAgCSAgfSA6IGZ1bmN0aW9uIChvKSB7CiAgCSAgICByZXR1cm4gbyAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHMpLCBfdHlwZW9mKG8pOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsgCiAgfSAoX3R5cGVvZiQxKSk7CgogIHZhciBfdHlwZW9mRXhwb3J0cyA9IF90eXBlb2YkMS5leHBvcnRzOwoKICByZWdlbmVyYXRvclJ1bnRpbWUkMS5leHBvcnRzOwoKICAoZnVuY3Rpb24gKG1vZHVsZSkgewogIAl2YXIgX3R5cGVvZiA9IF90eXBlb2ZFeHBvcnRzWyJkZWZhdWx0Il07CiAgCWZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAJICAgIHJldHVybiBlOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7CiAgCSAgdmFyIHQsCiAgCSAgICBlID0ge30sCiAgCSAgICByID0gT2JqZWN0LnByb3RvdHlwZSwKICAJICAgIG4gPSByLmhhc093blByb3BlcnR5LAogIAkgICAgbyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAodCwgZSwgcikgewogIAkgICAgICB0W2VdID0gci52YWx1ZTsKICAJICAgIH0sCiAgCSAgICBpID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sID8gU3ltYm9sIDoge30sCiAgCSAgICBhID0gaS5pdGVyYXRvciB8fCAiQEBpdGVyYXRvciIsCiAgCSAgICBjID0gaS5hc3luY0l0ZXJhdG9yIHx8ICJAQGFzeW5jSXRlcmF0b3IiLAogIAkgICAgdSA9IGkudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogIAkgIGZ1bmN0aW9uIGRlZmluZSh0LCBlLCByKSB7CiAgCSAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGUsIHsKICAJICAgICAgdmFsdWU6IHIsCiAgCSAgICAgIGVudW1lcmFibGU6ICEwLAogIAkgICAgICBjb25maWd1cmFibGU6ICEwLAogIAkgICAgICB3cml0YWJsZTogITAKICAJICAgIH0pLCB0W2VdOwogIAkgIH0KICAJICB0cnkgewogIAkgICAgZGVmaW5lKHt9LCAiIik7CiAgCSAgfSBjYXRjaCAodCkgewogIAkgICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKHQsIGUsIHIpIHsKICAJICAgICAgcmV0dXJuIHRbZV0gPSByOwogIAkgICAgfTsKICAJICB9CiAgCSAgZnVuY3Rpb24gd3JhcCh0LCBlLCByLCBuKSB7CiAgCSAgICB2YXIgaSA9IGUgJiYgZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBlIDogR2VuZXJhdG9yLAogIAkgICAgICBhID0gT2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSksCiAgCSAgICAgIGMgPSBuZXcgQ29udGV4dChuIHx8IFtdKTsKICAJICAgIHJldHVybiBvKGEsICJfaW52b2tlIiwgewogIAkgICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZCh0LCByLCBjKQogIAkgICAgfSksIGE7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHRyeUNhdGNoKHQsIGUsIHIpIHsKICAJICAgIHRyeSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgCSAgICAgICAgYXJnOiB0LmNhbGwoZSwgcikKICAJICAgICAgfTsKICAJICAgIH0gY2F0Y2ggKHQpIHsKICAJICAgICAgcmV0dXJuIHsKICAJICAgICAgICB0eXBlOiAidGhyb3ciLAogIAkgICAgICAgIGFyZzogdAogIAkgICAgICB9OwogIAkgICAgfQogIAkgIH0KICAJICBlLndyYXAgPSB3cmFwOwogIAkgIHZhciBoID0gInN1c3BlbmRlZFN0YXJ0IiwKICAJICAgIGwgPSAic3VzcGVuZGVkWWllbGQiLAogIAkgICAgZiA9ICJleGVjdXRpbmciLAogIAkgICAgcyA9ICJjb21wbGV0ZWQiLAogIAkgICAgeSA9IHt9OwogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fQogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KICAJICB2YXIgcCA9IHt9OwogIAkgIGRlZmluZShwLCBhLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KTsKICAJICB2YXIgZCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAJICAgIHYgPSBkICYmIGQoZCh2YWx1ZXMoW10pKSk7CiAgCSAgdiAmJiB2ICE9PSByICYmIG4uY2FsbCh2LCBhKSAmJiAocCA9IHYpOwogIAkgIHZhciBnID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocCk7CiAgCSAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHQpIHsKICAJICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgCSAgICAgIGRlZmluZSh0LCBlLCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UoZSwgdCk7CiAgCSAgICAgIH0pOwogIAkgICAgfSk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IodCwgZSkgewogIAkgICAgZnVuY3Rpb24gaW52b2tlKHIsIG8sIGksIGEpIHsKICAJICAgICAgdmFyIGMgPSB0cnlDYXRjaCh0W3JdLCB0LCBvKTsKICAJICAgICAgaWYgKCJ0aHJvdyIgIT09IGMudHlwZSkgewogIAkgICAgICAgIHZhciB1ID0gYy5hcmcsCiAgCSAgICAgICAgICBoID0gdS52YWx1ZTsKICAJICAgICAgICByZXR1cm4gaCAmJiAib2JqZWN0IiA9PSBfdHlwZW9mKGgpICYmIG4uY2FsbChoLCAiX19hd2FpdCIpID8gZS5yZXNvbHZlKGguX19hd2FpdCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgaW52b2tlKCJuZXh0IiwgdCwgaSwgYSk7CiAgCSAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHsKICAJICAgICAgICAgIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KSA6IGUucmVzb2x2ZShoKS50aGVuKGZ1bmN0aW9uICh0KSB7CiAgCSAgICAgICAgICB1LnZhbHVlID0gdCwgaSh1KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KTsKICAJICAgICAgfQogIAkgICAgICBhKGMuYXJnKTsKICAJICAgIH0KICAJICAgIHZhciByOwogIAkgICAgbyh0aGlzLCAiX2ludm9rZSIsIHsKICAJICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHQsIG4pIHsKICAJICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAJICAgICAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSwgcikgewogIAkgICAgICAgICAgICBpbnZva2UodCwgbiwgZSwgcik7CiAgCSAgICAgICAgICB9KTsKICAJICAgICAgICB9CiAgCSAgICAgICAgcmV0dXJuIHIgPSByID8gci50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogIAkgICAgICB9CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChlLCByLCBuKSB7CiAgCSAgICB2YXIgbyA9IGg7CiAgCSAgICByZXR1cm4gZnVuY3Rpb24gKGksIGEpIHsKICAJICAgICAgaWYgKG8gPT09IGYpIHRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpOwogIAkgICAgICBpZiAobyA9PT0gcykgewogIAkgICAgICAgIGlmICgidGhyb3ciID09PSBpKSB0aHJvdyBhOwogIAkgICAgICAgIHJldHVybiB7CiAgCSAgICAgICAgICB2YWx1ZTogdCwKICAJICAgICAgICAgIGRvbmU6ICEwCiAgCSAgICAgICAgfTsKICAJICAgICAgfQogIAkgICAgICBmb3IgKG4ubWV0aG9kID0gaSwgbi5hcmcgPSBhOzspIHsKICAJICAgICAgICB2YXIgYyA9IG4uZGVsZWdhdGU7CiAgCSAgICAgICAgaWYgKGMpIHsKICAJICAgICAgICAgIHZhciB1ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShjLCBuKTsKICAJICAgICAgICAgIGlmICh1KSB7CiAgCSAgICAgICAgICAgIGlmICh1ID09PSB5KSBjb250aW51ZTsKICAJICAgICAgICAgICAgcmV0dXJuIHU7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICAgIGlmICgibmV4dCIgPT09IG4ubWV0aG9kKSBuLnNlbnQgPSBuLl9zZW50ID0gbi5hcmc7ZWxzZSBpZiAoInRocm93IiA9PT0gbi5tZXRob2QpIHsKICAJICAgICAgICAgIGlmIChvID09PSBoKSB0aHJvdyBvID0gcywgbi5hcmc7CiAgCSAgICAgICAgICBuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKTsKICAJICAgICAgICB9IGVsc2UgInJldHVybiIgPT09IG4ubWV0aG9kICYmIG4uYWJydXB0KCJyZXR1cm4iLCBuLmFyZyk7CiAgCSAgICAgICAgbyA9IGY7CiAgCSAgICAgICAgdmFyIHAgPSB0cnlDYXRjaChlLCByLCBuKTsKICAJICAgICAgICBpZiAoIm5vcm1hbCIgPT09IHAudHlwZSkgewogIAkgICAgICAgICAgaWYgKG8gPSBuLmRvbmUgPyBzIDogbCwgcC5hcmcgPT09IHkpIGNvbnRpbnVlOwogIAkgICAgICAgICAgcmV0dXJuIHsKICAJICAgICAgICAgICAgdmFsdWU6IHAuYXJnLAogIAkgICAgICAgICAgICBkb25lOiBuLmRvbmUKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgfQogIAkgICAgICAgICJ0aHJvdyIgPT09IHAudHlwZSAmJiAobyA9IHMsIG4ubWV0aG9kID0gInRocm93Iiwgbi5hcmcgPSBwLmFyZyk7CiAgCSAgICAgIH0KICAJICAgIH07CiAgCSAgfQogIAkgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgcikgewogIAkgICAgdmFyIG4gPSByLm1ldGhvZCwKICAJICAgICAgbyA9IGUuaXRlcmF0b3Jbbl07CiAgCSAgICBpZiAobyA9PT0gdCkgcmV0dXJuIHIuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBuICYmIGUuaXRlcmF0b3JbInJldHVybiJdICYmIChyLm1ldGhvZCA9ICJyZXR1cm4iLCByLmFyZyA9IHQsIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgciksICJ0aHJvdyIgPT09IHIubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbiAmJiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBuICsgIicgbWV0aG9kIikpLCB5OwogIAkgICAgdmFyIGkgPSB0cnlDYXRjaChvLCBlLml0ZXJhdG9yLCByLmFyZyk7CiAgCSAgICBpZiAoInRocm93IiA9PT0gaS50eXBlKSByZXR1cm4gci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IGkuYXJnLCByLmRlbGVnYXRlID0gbnVsbCwgeTsKICAJICAgIHZhciBhID0gaS5hcmc7CiAgCSAgICByZXR1cm4gYSA/IGEuZG9uZSA/IChyW2UucmVzdWx0TmFtZV0gPSBhLnZhbHVlLCByLm5leHQgPSBlLm5leHRMb2MsICJyZXR1cm4iICE9PSByLm1ldGhvZCAmJiAoci5tZXRob2QgPSAibmV4dCIsIHIuYXJnID0gdCksIHIuZGVsZWdhdGUgPSBudWxsLCB5KSA6IGEgOiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksIHIuZGVsZWdhdGUgPSBudWxsLCB5KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gewogIAkgICAgICB0cnlMb2M6IHRbMF0KICAJICAgIH07CiAgCSAgICAxIGluIHQgJiYgKGUuY2F0Y2hMb2MgPSB0WzFdKSwgMiBpbiB0ICYmIChlLmZpbmFsbHlMb2MgPSB0WzJdLCBlLmFmdGVyTG9jID0gdFszXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGUpOwogIAkgIH0KICAJICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gdC5jb21wbGV0aW9uIHx8IHt9OwogIAkgICAgZS50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSBlLmFyZywgdC5jb21wbGV0aW9uID0gZTsKICAJICB9CiAgCSAgZnVuY3Rpb24gQ29udGV4dCh0KSB7CiAgCSAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogIAkgICAgICB0cnlMb2M6ICJyb290IgogIAkgICAgfV0sIHQuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsKICAJICB9CiAgCSAgZnVuY3Rpb24gdmFsdWVzKGUpIHsKICAJICAgIGlmIChlIHx8ICIiID09PSBlKSB7CiAgCSAgICAgIHZhciByID0gZVthXTsKICAJICAgICAgaWYgKHIpIHJldHVybiByLmNhbGwoZSk7CiAgCSAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBlLm5leHQpIHJldHVybiBlOwogIAkgICAgICBpZiAoIWlzTmFOKGUubGVuZ3RoKSkgewogIAkgICAgICAgIHZhciBvID0gLTEsCiAgCSAgICAgICAgICBpID0gZnVuY3Rpb24gbmV4dCgpIHsKICAJICAgICAgICAgICAgZm9yICg7ICsrbyA8IGUubGVuZ3RoOykgaWYgKG4uY2FsbChlLCBvKSkgcmV0dXJuIG5leHQudmFsdWUgPSBlW29dLCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgICAgICAgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgcmV0dXJuIGkubmV4dCA9IGk7CiAgCSAgICAgIH0KICAJICAgIH0KICAJICAgIHRocm93IG5ldyBUeXBlRXJyb3IoX3R5cGVvZihlKSArICIgaXMgbm90IGl0ZXJhYmxlIik7CiAgCSAgfQogIAkgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgbyhnLCAiY29uc3RydWN0b3IiLCB7CiAgCSAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsCiAgCSAgICBjb25maWd1cmFibGU6ICEwCiAgCSAgfSksIG8oR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBlLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAodCkgewogIAkgICAgdmFyIGUgPSAiZnVuY3Rpb24iID09IHR5cGVvZiB0ICYmIHQuY29uc3RydWN0b3I7CiAgCSAgICByZXR1cm4gISFlICYmIChlID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAiR2VuZXJhdG9yRnVuY3Rpb24iID09PSAoZS5kaXNwbGF5TmFtZSB8fCBlLm5hbWUpKTsKICAJICB9LCBlLm1hcmsgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZih0LCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAodC5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKHQsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpKSwgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGcpLCB0OwogIAkgIH0sIGUuYXdyYXAgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIHsKICAJICAgICAgX19hd2FpdDogdAogIAkgICAgfTsKICAJICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGMsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pLCBlLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBlLmFzeW5jID0gZnVuY3Rpb24gKHQsIHIsIG4sIG8sIGkpIHsKICAJICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IFByb21pc2UpOwogIAkgICAgdmFyIGEgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKHQsIHIsIG4sIG8pLCBpKTsKICAJICAgIHJldHVybiBlLmlzR2VuZXJhdG9yRnVuY3Rpb24ocikgPyBhIDogYS5uZXh0KCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICByZXR1cm4gdC5kb25lID8gdC52YWx1ZSA6IGEubmV4dCgpOwogIAkgICAgfSk7CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKGcpLCBkZWZpbmUoZywgdSwgIkdlbmVyYXRvciIpLCBkZWZpbmUoZywgYSwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSksIGRlZmluZShnLCAidG9TdHJpbmciLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gIltvYmplY3QgR2VuZXJhdG9yXSI7CiAgCSAgfSksIGUua2V5cyA9IGZ1bmN0aW9uICh0KSB7CiAgCSAgICB2YXIgZSA9IE9iamVjdCh0KSwKICAJICAgICAgciA9IFtdOwogIAkgICAgZm9yICh2YXIgbiBpbiBlKSByLnB1c2gobik7CiAgCSAgICByZXR1cm4gci5yZXZlcnNlKCksIGZ1bmN0aW9uIG5leHQoKSB7CiAgCSAgICAgIGZvciAoOyByLmxlbmd0aDspIHsKICAJICAgICAgICB2YXIgdCA9IHIucG9wKCk7CiAgCSAgICAgICAgaWYgKHQgaW4gZSkgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgfQogIAkgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICB9OwogIAkgIH0sIGUudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAJICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogIAkgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KGUpIHsKICAJICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB0LCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gIm5leHQiLCB0aGlzLmFyZyA9IHQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhZSkgZm9yICh2YXIgciBpbiB0aGlzKSAidCIgPT09IHIuY2hhckF0KDApICYmIG4uY2FsbCh0aGlzLCByKSAmJiAhaXNOYU4oK3Iuc2xpY2UoMSkpICYmICh0aGlzW3JdID0gdCk7CiAgCSAgICB9LAogIAkgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKICAJICAgICAgdGhpcy5kb25lID0gITA7CiAgCSAgICAgIHZhciB0ID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gdGhpcy5ydmFsOwogIAkgICAgfSwKICAJICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihlKSB7CiAgCSAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGU7CiAgCSAgICAgIHZhciByID0gdGhpczsKICAJICAgICAgZnVuY3Rpb24gaGFuZGxlKG4sIG8pIHsKICAJICAgICAgICByZXR1cm4gYS50eXBlID0gInRocm93IiwgYS5hcmcgPSBlLCByLm5leHQgPSBuLCBvICYmIChyLm1ldGhvZCA9ICJuZXh0Iiwgci5hcmcgPSB0KSwgISFvOwogIAkgICAgICB9CiAgCSAgICAgIGZvciAodmFyIG8gPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgbyA+PSAwOyAtLW8pIHsKICAJICAgICAgICB2YXIgaSA9IHRoaXMudHJ5RW50cmllc1tvXSwKICAJICAgICAgICAgIGEgPSBpLmNvbXBsZXRpb247CiAgCSAgICAgICAgaWYgKCJyb290IiA9PT0gaS50cnlMb2MpIHJldHVybiBoYW5kbGUoImVuZCIpOwogIAkgICAgICAgIGlmIChpLnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAJICAgICAgICAgIHZhciBjID0gbi5jYWxsKGksICJjYXRjaExvYyIpLAogIAkgICAgICAgICAgICB1ID0gbi5jYWxsKGksICJmaW5hbGx5TG9jIik7CiAgCSAgICAgICAgICBpZiAoYyAmJiB1KSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShpLmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfSBlbHNlIGlmIChjKSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgIH0gZWxzZSB7CiAgCSAgICAgICAgICAgIGlmICghdSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgaS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGkuZmluYWxseUxvYyk7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICB9CiAgCSAgICB9LAogIAkgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodCwgZSkgewogIAkgICAgICBmb3IgKHZhciByID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHIgPj0gMDsgLS1yKSB7CiAgCSAgICAgICAgdmFyIG8gPSB0aGlzLnRyeUVudHJpZXNbcl07CiAgCSAgICAgICAgaWYgKG8udHJ5TG9jIDw9IHRoaXMucHJldiAmJiBuLmNhbGwobywgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBvLmZpbmFsbHlMb2MpIHsKICAJICAgICAgICAgIHZhciBpID0gbzsKICAJICAgICAgICAgIGJyZWFrOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICBpICYmICgiYnJlYWsiID09PSB0IHx8ICJjb250aW51ZSIgPT09IHQpICYmIGkudHJ5TG9jIDw9IGUgJiYgZSA8PSBpLmZpbmFsbHlMb2MgJiYgKGkgPSBudWxsKTsKICAJICAgICAgdmFyIGEgPSBpID8gaS5jb21wbGV0aW9uIDoge307CiAgCSAgICAgIHJldHVybiBhLnR5cGUgPSB0LCBhLmFyZyA9IGUsIGkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGkuZmluYWxseUxvYywgeSkgOiB0aGlzLmNvbXBsZXRlKGEpOwogIAkgICAgfSwKICAJICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSh0LCBlKSB7CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gImJyZWFrIiA9PT0gdC50eXBlIHx8ICJjb250aW51ZSIgPT09IHQudHlwZSA/IHRoaXMubmV4dCA9IHQuYXJnIDogInJldHVybiIgPT09IHQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gdC50eXBlICYmIGUgJiYgKHRoaXMubmV4dCA9IGUpLCB5OwogIAkgICAgfSwKICAJICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKHQpIHsKICAJICAgICAgZm9yICh2YXIgZSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBlID49IDA7IC0tZSkgewogIAkgICAgICAgIHZhciByID0gdGhpcy50cnlFbnRyaWVzW2VdOwogIAkgICAgICAgIGlmIChyLmZpbmFsbHlMb2MgPT09IHQpIHJldHVybiB0aGlzLmNvbXBsZXRlKHIuY29tcGxldGlvbiwgci5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkociksIHk7CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godCkgewogIAkgICAgICBmb3IgKHZhciBlID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGUgPj0gMDsgLS1lKSB7CiAgCSAgICAgICAgdmFyIHIgPSB0aGlzLnRyeUVudHJpZXNbZV07CiAgCSAgICAgICAgaWYgKHIudHJ5TG9jID09PSB0KSB7CiAgCSAgICAgICAgICB2YXIgbiA9IHIuY29tcGxldGlvbjsKICAJICAgICAgICAgIGlmICgidGhyb3ciID09PSBuLnR5cGUpIHsKICAJICAgICAgICAgICAgdmFyIG8gPSBuLmFyZzsKICAJICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShyKTsKICAJICAgICAgICAgIH0KICAJICAgICAgICAgIHJldHVybiBvOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogIAkgICAgfSwKICAJICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoZSwgciwgbikgewogIAkgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAJICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGUpLAogIAkgICAgICAgIHJlc3VsdE5hbWU6IHIsCiAgCSAgICAgICAgbmV4dExvYzogbgogIAkgICAgICB9LCAibmV4dCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHQpLCB5OwogIAkgICAgfQogIAkgIH0sIGU7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMSkpOwoKICB2YXIgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyA9IHJlZ2VuZXJhdG9yUnVudGltZSQxLmV4cG9ydHM7CgogIC8vIFRPRE8oQmFiZWwgOCk6IFJlbW92ZSB0aGlzIGZpbGUuCgogIHZhciBydW50aW1lID0gcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cygpOwogIHZhciByZWdlbmVyYXRvciA9IHJ1bnRpbWU7CgogIC8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vcGFja2FnZXMvcnVudGltZS9ydW50aW1lLmpzI0w3MzY9CiAgdHJ5IHsKICAgIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOwogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOwogICAgfQogIH0KCiAgdmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMocmVnZW5lcmF0b3IpOwoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQ0KICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZDQogIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SDQogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KICBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgew0KICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH0NCiAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICB9KTsNCiAgfQoKICBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2skMShpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gX3R5cGVvZihvKSB7CiAgICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAgIHJldHVybiBfdHlwZW9mID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmICJzeW1ib2wiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgewogICAgICByZXR1cm4gdHlwZW9mIG87CiAgICB9IDogZnVuY3Rpb24gKG8pIHsKICAgICAgcmV0dXJuIG8gJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2YgbzsKICAgIH0sIF90eXBlb2Yobyk7CiAgfQoKICBmdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsKICAgIGlmIChfdHlwZW9mKGlucHV0KSAhPT0gIm9iamVjdCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsKICAgIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsKICAgIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsKICAgICAgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCAiZGVmYXVsdCIpOwogICAgICBpZiAoX3R5cGVvZihyZXMpICE9PSAib2JqZWN0IikgcmV0dXJuIHJlczsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKTsKICAgIH0KICAgIHJldHVybiAoaGludCA9PT0gInN0cmluZyIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsKICB9CgogIGZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgewogICAgdmFyIGtleSA9IF90b1ByaW1pdGl2ZShhcmcsICJzdHJpbmciKTsKICAgIHJldHVybiBfdHlwZW9mKGtleSkgPT09ICJzeW1ib2wiID8ga2V5IDogU3RyaW5nKGtleSk7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQxKHRhcmdldCwgcHJvcHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOwogICAgfQogIH0KICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MkMShDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQxKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICB9CgogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsKICAgICAgby5fX3Byb3RvX18gPSBwOwogICAgICByZXR1cm4gbzsKICAgIH07CiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOwogIH0KCiAgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7CiAgICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOwogICAgfQogICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7CiAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9CiAgICB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOwogIH0KCiAgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsKICAgIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsKICAgICAgcmV0dXJuIGNhbGw7CiAgICB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpOwogICAgfQogICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7CiAgfQoKICBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgewogICAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7CiAgICB9OwogICAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsKICB9CgogIC8qDQogICAgQ29weXJpZ2h0IDIwMjItMjAyMyBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyoqDQogICAqIEJhc2VQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gUHZGaWxlKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBQdkZpbGUpOwogICAgICB0aGlzLl9wYXRoID0gJyc7CiAgICB9CiAgICAvKioNCiAgICAgKiBHZXR0ZXIgZm9yIGZpbGUncyBtZXRhIGluZm9ybWF0aW9uLg0KICAgICAqLwogICAgX2NyZWF0ZUNsYXNzJDEoUHZGaWxlLCBbewogICAgICBrZXk6ICJtZXRhIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgaWYgKHRoaXMuX21ldGEgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oewogICAgICAgICAgdmVyc2lvbjogMAogICAgICAgIH0sIHRoaXMuX21ldGEpOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogR2V0IHRoZSBmaWxlIHBvaW50ZXIgZnJvbSB0aGUgX2ZpbGVQdHJzIG1hcC4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIHBvaW50ZXIgdG8gQmFzZVB2RmlsZSBpbnN0YW5jZSB0byBnZXQgZnJvbSB0aGUgbWFwLg0KICAgICAgICogQHJldHVybnMgQmFzZVB2RmlsZSByZXR1cm5zIHRoZSBjdXJyZW50IGZpbGUgaW5zdGFuY2UgcmVsYXRlZCB0byBwdHIuDQogICAgICAgKi8KICAgIH1dLCBbewogICAgICBrZXk6ICJnZXRQdHIiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHRyKHB0cikgewogICAgICAgIGlmIChQdkZpbGUuX2ZpbGVQdHJzLmhhcyhwdHIpKSB7CiAgICAgICAgICByZXR1cm4gUHZGaWxlLl9maWxlUHRycy5nZXQocHRyKTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIGluc3RhbmNlIG5vdCBmb3VuZC4nKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFNhdmVzIHRoZSBCYXNlUHZGaWxlIGluc3RhbmNlIHRvIHRoZSBtYXAgd2l0aCBhbiBhc3NvY2lhdGVkIHB0ci4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byBzYXZlIGFzIHRoZSBrZXkuDQogICAgICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gc2F2ZSBhcyB0aGUgdmFsdWUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFB0cihwdHIsIGluc3RhbmNlKSB7CiAgICAgICAgUHZGaWxlLl9maWxlUHRycy5zZXQocHRyLCBpbnN0YW5jZSk7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBSZW1vdmVzIHRoZSBwdHIgZnJvbSB0aGUgX2ZpbGVQdHJzIG1hcC4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byByZW1vdmUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlUHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVB0cihwdHIpIHsKICAgICAgICBQdkZpbGUuX2ZpbGVQdHJzWyJkZWxldGUiXShwdHIpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZGaWxlOwogIH0oKTsKICBQdkZpbGUuX2ZpbGVQdHJzID0gbmV3IE1hcCgpOwoKICBmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQogIGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CiAgLyoqDQogICAqIFB2RmlsZU1lbSBDbGFzcw0KICAgKiBUaGlzIGNsYXNzIG1vY2tzIHRoZSBmaWxlIHN5c3RlbSB1c2luZyBpbi1tZW1vcnkgc3RvcmFnZS4NCiAgICovCiAgdmFyIFB2RmlsZU1lbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B2RmlsZSkgewogICAgX2luaGVyaXRzKFB2RmlsZU1lbSwgX1B2RmlsZSk7CiAgICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFB2RmlsZU1lbSk7CiAgICBmdW5jdGlvbiBQdkZpbGVNZW0ocGF0aCwgbWV0YSwgZGIsIG1vZGUpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBQdkZpbGVNZW0pOwogICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpOwogICAgICBfdGhpcy5fcG9zID0gMDsKICAgICAgX3RoaXMuX3BhdGggPSBwYXRoOwogICAgICBfdGhpcy5fbWV0YSA9IG1ldGE7CiAgICAgIF90aGlzLl9tb2RlID0gbW9kZTsKICAgICAgcmV0dXJuIF90aGlzOwogICAgfQogICAgX2NyZWF0ZUNsYXNzJDEoUHZGaWxlTWVtLCBbewogICAgICBrZXk6ICJjbG9zZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZSgpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVhZCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZWFkKHNpemUsIGNvdW50KSB7CiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cygpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2lzRU9GKSB7CiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCJFT0YiKTsKICAgICAgICAgIGVyci5uYW1lID0gIkVuZE9mRmlsZSI7CiAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgfQogICAgICAgIHZhciB0b0NvcHkgPSBNYXRoLm1pbihzaXplICogY291bnQsIHRoaXMuX2ZpbGUubGVuZ3RoIC0gdGhpcy5fcG9zKTsKICAgICAgICB2YXIgdG90YWxFbGVtcyA9IHRvQ29weSAtIHRvQ29weSAlIHNpemU7CiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRvdGFsRWxlbXMpOwogICAgICAgIGJ1ZmZlci5zZXQodGhpcy5fZmlsZS5zbGljZSh0aGlzLl9wb3MsIHRoaXMuX3BvcyArIHRvdGFsRWxlbXMpLCAwKTsKICAgICAgICB0aGlzLl9wb3MgKz0gdG90YWxFbGVtczsKICAgICAgICByZXR1cm4gYnVmZmVyOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIndyaXRlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHdyaXRlKGNvbnRlbnQpIHsKICAgICAgICB2YXIgbmV3RmlsZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3BvcyArIGNvbnRlbnQubGVuZ3RoKTsKICAgICAgICBpZiAodGhpcy5fZmlsZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBuZXdGaWxlLnNldCh0aGlzLl9maWxlLnNsaWNlKDAsIHRoaXMuX3BvcykpOwogICAgICAgICAgbmV3RmlsZS5zZXQoY29udGVudCwgdGhpcy5fcG9zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3RmlsZS5zZXQoY29udGVudCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ZpbGUgPSBuZXdGaWxlOwogICAgICAgIHRoaXMuX3BvcyArPSBjb250ZW50Lmxlbmd0aDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJzZWVrIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNlZWsob2Zmc2V0LCB3aGVuY2UpIHsKICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkgJiYgdGhpcy5fbW9kZSA9PT0gInJlYWRvbmx5IikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCInIi5jb25jYXQodGhpcy5fcGF0aCwgIicgZG9lc24ndCBleGlzdC4iKSk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSkgewogICAgICAgICAgLy8gVGhpcyBpcyB2YWxpZCBpbiBJU08gQyBidXQgbm90IHN1cHBvcnRlZCBieSB0aGlzIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiJyIuY29uY2F0KHRoaXMuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgIH0KICAgICAgICBpZiAob2Zmc2V0IDwgMCkgewogICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRU9GIik7CiAgICAgICAgICBlcnIubmFtZSA9ICJFbmRPZkZpbGUiOwogICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgIH0KICAgICAgICB2YXIgbmV3T2Zmc2V0OwogICAgICAgIGlmICh3aGVuY2UgPT09IDApIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKG9mZnNldCwgdGhpcy5fZmlsZS5sZW5ndGgpOwogICAgICAgIH0gZWxzZSBpZiAod2hlbmNlID09PSAxKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbih0aGlzLl9wb3MgKyBvZmZzZXQsIHRoaXMuX2ZpbGUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKHdoZW5jZSA9PT0gMikgewogICAgICAgICAgbmV3T2Zmc2V0ID0gTWF0aC5taW4odGhpcy5fZmlsZS5sZW5ndGggKyBvZmZzZXQsIHRoaXMuX2ZpbGUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG9wZXJhdGlvbjogIi5jb25jYXQod2hlbmNlLCAiLiIpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcG9zID0gbmV3T2Zmc2V0OwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInRlbGwiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gdGVsbCgpIHsKICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkpIHsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3BvczsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKCkgewogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBpZiAodGhpcy5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVOT0VOVCIpOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIFB2RmlsZU1lbS5fbWVtRmlsZXNbImRlbGV0ZSJdKHRoaXMuX3BhdGgpOwogICAgICAgICAgICAgICAgdGhpcy5fcG9zID0gMDsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpOwogICAgICAgIH0pKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJleGlzdHMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhpc3RzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9maWxlICE9PSB1bmRlZmluZWQ7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2lzRU9GIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcyA+PSB0aGlzLl9maWxlLmxlbmd0aDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfZmlsZSIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBQdkZpbGVNZW0uX21lbUZpbGVzLmdldCh0aGlzLl9wYXRoKTsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoY29udGVudCkgewogICAgICAgIFB2RmlsZU1lbS5fbWVtRmlsZXMuc2V0KHRoaXMuX3BhdGgsIGNvbnRlbnQpOwogICAgICB9CiAgICB9XSwgW3sKICAgICAga2V5OiAib3BlbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHBhdGgsIG1vZGUpIHsKICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZU1lbS5fbWVtRmlsZXMuZ2V0KHBhdGgpOwogICAgICAgIHZhciBkYk1vZGUgPSBtb2RlLmluY2x1ZGVzKCdyJykgPyAicmVhZG9ubHkiIDogInJlYWR3cml0ZSI7CiAgICAgICAgaWYgKGZpbGUgPT09IHVuZGVmaW5lZCAmJiBkYk1vZGUgPT09ICJyZWFkb25seSIpIHsKICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigiJyIuY29uY2F0KHBhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgICAgZXJyb3IubmFtZSA9ICJGaWxlTm90RXhpc3RzIjsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgICB2YXIgZmlsZU1lbSA9IG5ldyBQdkZpbGVNZW0ocGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRiTW9kZSk7CiAgICAgICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2EnKSkgewogICAgICAgICAgZmlsZU1lbS5zZWVrKDAsIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmlsZU1lbTsKICAgICAgfQogICAgfV0pOwogICAgcmV0dXJuIFB2RmlsZU1lbTsKICB9KFB2RmlsZSk7CiAgUHZGaWxlTWVtLl9tZW1GaWxlcyA9IG5ldyBNYXAoKTsKICAvKioNCiAgICogQ2FzdCBhIHNpZ25lZCBhZGRyZXNzIHRvIHVuc2lnbmVkIGFkZHJlc3MuDQogICAqDQogICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGNhc3QgdG8gdW5zaWduZWQgYWRkcmVzcy4NCiAgICovCiAgZnVuY3Rpb24gdW5zaWduZWRBZGRyZXNzKGFkZHJlc3MpIHsKICAgIGlmIChhZGRyZXNzIDwgMCkgewogICAgICByZXR1cm4gYWRkcmVzcyA+Pj4gMDsKICAgIH0KICAgIHJldHVybiBhZGRyZXNzOwogIH0KCiAgdmFyIFB2WHB1QWN0aW9uOwogIChmdW5jdGlvbiAoUHZYcHVBY3Rpb24pIHsKICAgIFB2WHB1QWN0aW9uW1B2WHB1QWN0aW9uWyJJTklUIl0gPSAwXSA9ICJJTklUIjsKICAgIFB2WHB1QWN0aW9uW1B2WHB1QWN0aW9uWyJBTExPQyJdID0gMV0gPSAiQUxMT0MiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIkZSRUUiXSA9IDJdID0gIkZSRUUiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIkNPUFlfVE9fWFBVIl0gPSAzXSA9ICJDT1BZX1RPX1hQVSI7CiAgICBQdlhwdUFjdGlvbltQdlhwdUFjdGlvblsiQ09QWV9GUk9NX1hQVSJdID0gNF0gPSAiQ09QWV9GUk9NX1hQVSI7CiAgICBQdlhwdUFjdGlvbltQdlhwdUFjdGlvblsiTUVNU0VUIl0gPSA1XSA9ICJNRU1TRVQiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIlRJTUVSX1NUQVJUIl0gPSA2XSA9ICJUSU1FUl9TVEFSVCI7CiAgICBQdlhwdUFjdGlvbltQdlhwdUFjdGlvblsiVElNRVJfU1RPUCJdID0gN10gPSAiVElNRVJfU1RPUCI7CiAgICAvLyBvdGhlciB4cHUgYWN0aW9ucwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIk1BVFJJWF9WRUNUT1JfTVVMVElQTFkiXSA9IDhdID0gIk1BVFJJWF9WRUNUT1JfTVVMVElQTFkiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIlNZTkNfVkVDVE9SIl0gPSA5XSA9ICJTWU5DX1ZFQ1RPUiI7CiAgfSkoUHZYcHVBY3Rpb24gfHwgKFB2WHB1QWN0aW9uID0ge30pKTsKCiAgY29uc3Qgd2FzaV9zbmFwc2hvdF9wcmV2aWV3MV9lbXVsYXRvciA9IHsKICAgIGFyZ3NfZ2V0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgYXJnc19zaXplc19nZXQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBlbnZpcm9uX2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGVudmlyb25fc2l6ZXNfZ2V0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgY2xvY2tfcmVzX2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGNsb2NrX3RpbWVfZ2V0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWR2aXNlOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWxsb2NhdGU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9jbG9zZTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2RhdGFzeW5jOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmRzdGF0X2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Zkc3RhdF9zZXRfZmxhZ3M6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9mZHN0YXRfc2V0X3JpZ2h0czogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2ZpbGVzdGF0X2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2ZpbGVzdGF0X3NldF9zaXplOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmlsZXN0YXRfc2V0X3RpbWVzOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcHJlYWQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9wcmVzdGF0X2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3ByZXN0YXRfZGlyX25hbWU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9wd3JpdGU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9yZWFkOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcmVhZGRpcjogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3JlbnVtYmVyOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfc2VlazogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3N5bmM6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF90ZWxsOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfd3JpdGU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX2NyZWF0ZV9kaXJlY3Rvcnk6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX2ZpbGVzdGF0X2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfZmlsZXN0YXRfc2V0X3RpbWVzOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9saW5rOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9vcGVuOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9yZWFkbGluazogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfcmVtb3ZlX2RpcmVjdG9yeTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfcmVuYW1lOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9zeW1saW5rOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF91bmxpbmtfZmlsZTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBvbGxfb25lb2ZmOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19leGl0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19yYWlzZTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNjaGVkX3lpZWxkOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcmFuZG9tX2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNvY2tfcmVjdjogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNvY2tfc2VuZDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNvY2tfc2h1dGRvd246IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgfTsKCiAgdmFyIG1hdHJpeFZlY3Rvck11bHRpcGx5ID0gZnVuY3Rpb24gbWF0cml4VmVjdG9yTXVsdGlwbHkoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHMgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMubWVtQWxsb2MsCiAgICAgICAgbWVtb3J5ID0gX2RhdGEkZ2xvYmFscy5tZW1vcnk7CiAgICAgIHZhciBtYXRyaXhBZGRyZXNzID0gZGF0YS5tYXRyaXhBZGRyZXNzLAogICAgICAgIHZlY3RvckFkZHJlc3MgPSBkYXRhLnZlY3RvckFkZHJlc3MsCiAgICAgICAgbSA9IGRhdGEubSwKICAgICAgICBuID0gZGF0YS5uLAogICAgICAgIHJlc3VsdEFkZHJlc3MgPSBkYXRhLnJlc3VsdEFkZHJlc3M7CiAgICAgIHZhciBwdl9tYXRyaXhfdmVjdG9yX211bHRpcGx5ID0gZXhwb3J0cy5wdl9tYXRyaXhfdmVjdG9yX211bHRpcGx5OwogICAgICBpZiAoIW1lbUFsbG9jLmhhcyhtYXRyaXhBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKHZlY3RvckFkZHJlc3MpIHx8ICFtZW1BbGxvYy5oYXMocmVzdWx0QWRkcmVzcykpIHsKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIGNvbW1hbmQ6ICdvaycsCiAgICAgICAgICByZXN1bHQ6IG5ldyBGbG9hdDMyQXJyYXkoMCkKICAgICAgICB9KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIG1lbW9yeUJ1ZmZlckZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICB2YXIgX21lbUFsbG9jJGdldCA9IG1lbUFsbG9jLmdldChtYXRyaXhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJNYXRyaXhBZGRyZXNzID0gX21lbUFsbG9jJGdldC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDIgPSBtZW1BbGxvYy5nZXQodmVjdG9yQWRkcmVzcyksCiAgICAgICAgd29ya2VyVmVjdG9yQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldChyZXN1bHRBZGRyZXNzKSwKICAgICAgICB3b3JrZXJSZXN1bHRBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfbWF0cml4X3ZlY3Rvcl9tdWx0aXBseSh3b3JrZXJNYXRyaXhBZGRyZXNzLCB3b3JrZXJWZWN0b3JBZGRyZXNzLCBtLCBuLCB3b3JrZXJSZXN1bHRBZGRyZXNzKTsKICAgICAgdmFyIHJlc3VsdCA9IG1lbW9yeUJ1ZmZlckZsb2F0MzIuc2xpY2Uod29ya2VyUmVzdWx0QWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgd29ya2VyUmVzdWx0QWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCArIG0pOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snLAogICAgICAgIHJlc3VsdDogcmVzdWx0CiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBzeW5jVmVjdG9yID0gZnVuY3Rpb24gc3luY1ZlY3RvcihkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczIgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzMi5tZW1BbGxvYywKICAgICAgICBtZW1vcnkgPSBfZGF0YSRnbG9iYWxzMi5tZW1vcnk7CiAgICAgIHZhciB2ZWN0b3JBZGRyZXNzID0gZGF0YS52ZWN0b3JBZGRyZXNzLAogICAgICAgIGJ1ZmZlciA9IGRhdGEuYnVmZmVyOwogICAgICBpZiAobWVtQWxsb2MuaGFzKHZlY3RvckFkZHJlc3MpKSB7CiAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlckZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NCA9IG1lbUFsbG9jLmdldCh2ZWN0b3JBZGRyZXNzKSwKICAgICAgICAgIHdvcmtlck1lbUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NC53b3JrZXJNZW1BZGRyZXNzOwogICAgICAgIG1lbW9yeUJ1ZmZlckZsb2F0MzIuc2V0KGJ1ZmZlciwgd29ya2VyTWVtQWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgIH0KICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgcHZNdm1BY3Rpb25NYXAgPSBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBQdlhwdUFjdGlvbi5NQVRSSVhfVkVDVE9SX01VTFRJUExZLCBtYXRyaXhWZWN0b3JNdWx0aXBseSksIFB2WHB1QWN0aW9uLlNZTkNfVkVDVE9SLCBzeW5jVmVjdG9yKTsKCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCAqLwogIHZhciBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb247CiAgKGZ1bmN0aW9uIChQdlBpY29sbG1BdHRlbnRpb25BY3Rpb24pIHsKICAgIFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbltQdlBpY29sbG1BdHRlbnRpb25BY3Rpb25bIkFUVEVOVElPTl9QUkVDT01QVVRFX0VOQ09ESU5HIl0gPSAyMDBdID0gIkFUVEVOVElPTl9QUkVDT01QVVRFX0VOQ09ESU5HIjsKICAgIFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbltQdlBpY29sbG1BdHRlbnRpb25BY3Rpb25bIkFUVEVOVElPTl9FTkNPREUiXSA9IDIwMV0gPSAiQVRURU5USU9OX0VOQ09ERSI7CiAgICBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb25bUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uWyJBVFRFTlRJT05fQVRURU5EIl0gPSAyMDJdID0gIkFUVEVOVElPTl9BVFRFTkQiOwogICAgUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uW1B2UGljb2xsbUF0dGVudGlvbkFjdGlvblsiQVRURU5USU9OX1VQREFURV9LRVlTIl0gPSAyMDNdID0gIkFUVEVOVElPTl9VUERBVEVfS0VZUyI7CiAgICBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb25bUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uWyJBVFRFTlRJT05fVVBEQVRFX1ZBTFVFUyJdID0gMjA0XSA9ICJBVFRFTlRJT05fVVBEQVRFX1ZBTFVFUyI7CiAgICBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb25bUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uWyJBVFRFTlRJT05fVFJBTlNQT1NFX1FVRVJZIl0gPSAyMDVdID0gIkFUVEVOVElPTl9UUkFOU1BPU0VfUVVFUlkiOwogIH0pKFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbiB8fCAoUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uID0ge30pKTsKCiAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07CiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsKICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOwogICAgfQogIH0KICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7CiAgICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsKICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICB9CgogIGZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvWyJAQGl0ZXJhdG9yIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CiAgZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfQogIHZhciBQdlhwdSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBQdlhwdSgpIHsKICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFB2WHB1KTsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyhQdlhwdSwgbnVsbCwgW3sKICAgICAga2V5OiAiYWRkWHB1IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFhwdShvYmpBZGRyZXNzLCBkYXRhKSB7CiAgICAgICAgUHZYcHUueHB1T2JqZWN0cy5zZXQob2JqQWRkcmVzcywgZGF0YSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZ2V0WHB1IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFhwdShvYmpBZGRyZXNzKSB7CiAgICAgICAgcmV0dXJuIFB2WHB1LnhwdU9iamVjdHMuZ2V0KG9iakFkZHJlc3MpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImhhc1hwdSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNYcHUob2JqQWRkcmVzcykgewogICAgICAgIHJldHVybiBQdlhwdS54cHVPYmplY3RzLmhhcyhvYmpBZGRyZXNzKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmVYcHUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlWHB1KG9iakFkZHJlc3MpIHsKICAgICAgICBpZiAoUHZYcHUueHB1T2JqZWN0cy5oYXMob2JqQWRkcmVzcykpIHsKICAgICAgICAgIHZhciBfUHZYcHUkeHB1T2JqZWN0cyRnZXQgPSBQdlhwdS54cHVPYmplY3RzLmdldChvYmpBZGRyZXNzKSwKICAgICAgICAgICAgZGV2aWNlTWVtID0gX1B2WHB1JHhwdU9iamVjdHMkZ2V0LmRldmljZU1lbTsKICAgICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihkZXZpY2VNZW0pLAogICAgICAgICAgICBfc3RlcDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CiAgICAgICAgICAgICAgdmFyIG1lbUFkZHJlc3MgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgICAgICBQdlhwdS5tZW1vcnlPYmplY3RzWyJkZWxldGUiXShtZW1BZGRyZXNzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBfaXRlcmF0b3IuZigpOwogICAgICAgICAgfQogICAgICAgICAgUHZYcHUueHB1T2JqZWN0c1siZGVsZXRlIl0ob2JqQWRkcmVzcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImFkZE1lbW9yeSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRNZW1vcnkobWVtQWRkcmVzcywgZGF0YSkgewogICAgICAgIFB2WHB1Lm1lbW9yeU9iamVjdHMuc2V0KG1lbUFkZHJlc3MsIGRhdGEpOwogICAgICAgIFB2WHB1LnhwdU9iamVjdHMuZ2V0KGRhdGEub2JqQWRkcmVzcykuZGV2aWNlTWVtLmFkZChtZW1BZGRyZXNzKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRNZW1vcnkiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TWVtb3J5KG1lbUFkZHJlc3MpIHsKICAgICAgICByZXR1cm4gUHZYcHUubWVtb3J5T2JqZWN0cy5nZXQobWVtQWRkcmVzcyk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiaGFzTWVtb3J5IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhc01lbW9yeShtZW1BZGRyZXNzKSB7CiAgICAgICAgcmV0dXJuIFB2WHB1Lm1lbW9yeU9iamVjdHMuaGFzKG1lbUFkZHJlc3MpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInJlbW92ZU1lbW9yeSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVNZW1vcnkobWVtQWRkcmVzcykgewogICAgICAgIGlmIChQdlhwdS5oYXNNZW1vcnkobWVtQWRkcmVzcykpIHsKICAgICAgICAgIFB2WHB1LnhwdU9iamVjdHMuZ2V0KFB2WHB1LmdldE1lbW9yeShtZW1BZGRyZXNzKS5vYmpBZGRyZXNzKS5kZXZpY2VNZW1bImRlbGV0ZSJdKG1lbUFkZHJlc3MpOwogICAgICAgIH0KICAgICAgICBQdlhwdS5tZW1vcnlPYmplY3RzWyJkZWxldGUiXShtZW1BZGRyZXNzKTsKICAgICAgfQogICAgfV0pOwogICAgcmV0dXJuIFB2WHB1OwogIH0oKTsKICBfZGVmaW5lUHJvcGVydHkoUHZYcHUsICJ4cHVPYmplY3RzIiwgbmV3IE1hcCgpKTsKICBfZGVmaW5lUHJvcGVydHkoUHZYcHUsICJtZW1vcnlPYmplY3RzIiwgbmV3IE1hcCgpKTsKCiAgdmFyIGF0dGVudGlvblByZWNvbXB1dGVFbmNvZGluZyA9IGZ1bmN0aW9uIGF0dGVudGlvblByZWNvbXB1dGVFbmNvZGluZyhkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFscyA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFscy5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFscy5tZW1BbGxvYzsKICAgICAgdmFyIGVuY29kaW5nQWRkcmVzcyA9IGRhdGEuZW5jb2RpbmdBZGRyZXNzLAogICAgICAgIGRpbWVuc2lvbiA9IGRhdGEuZGltZW5zaW9uLAogICAgICAgIHN0ZXBzID0gZGF0YS5zdGVwcywKICAgICAgICB0aGV0YSA9IGRhdGEudGhldGE7CiAgICAgIHZhciBwdl9waWNvbGxtX2F0dGVudGlvbl9wcmVjb21wdXRlX2VuY29kaW5nID0gZXhwb3J0cy5wdl9waWNvbGxtX2F0dGVudGlvbl9wcmVjb21wdXRlX2VuY29kaW5nOwogICAgICB2YXIgX21lbUFsbG9jJGdldCA9IG1lbUFsbG9jLmdldChlbmNvZGluZ0FkZHJlc3MpLAogICAgICAgIHdvcmtlckVuY29kaW5nQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV9hdHRlbnRpb25fcHJlY29tcHV0ZV9lbmNvZGluZyh3b3JrZXJFbmNvZGluZ0FkZHJlc3MsIGRpbWVuc2lvbiwgc3RlcHMsIHRoZXRhKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgYXR0ZW50aW9uRW5jb2RlID0gZnVuY3Rpb24gYXR0ZW50aW9uRW5jb2RlKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzMiA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczIuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMyLm1lbUFsbG9jOwogICAgICB2YXIgeEFkZHJlc3MgPSBkYXRhLnhBZGRyZXNzLAogICAgICAgIG5ld0VuY29kaW5nQWRkcmVzcyA9IGRhdGEubmV3RW5jb2RpbmdBZGRyZXNzLAogICAgICAgIG4gPSBkYXRhLm4sCiAgICAgICAgbnVtSGVhZHMgPSBkYXRhLm51bUhlYWRzLAogICAgICAgIHJvcGVJbnRlcmxlYXZlZCA9IGRhdGEucm9wZUludGVybGVhdmVkLAogICAgICAgIGhlYWREaW1lbnNpb24gPSBkYXRhLmhlYWREaW1lbnNpb24sCiAgICAgICAgcm9wZURpbWVuc2lvbiA9IGRhdGEucm9wZURpbWVuc2lvbiwKICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb247CiAgICAgIHZhciBwdl9waWNvbGxtX2F0dGVudGlvbl9lbmNvZGUgPSBleHBvcnRzLnB2X3BpY29sbG1fYXR0ZW50aW9uX2VuY29kZTsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldChuZXdFbmNvZGluZ0FkZHJlc3MpLAogICAgICAgIHdvcmtlck5ld0VuY29kaW5nQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQzLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHB2X3BpY29sbG1fYXR0ZW50aW9uX2VuY29kZSh3b3JrZXJYQWRkcmVzcywgd29ya2VyTmV3RW5jb2RpbmdBZGRyZXNzLCBuLCBudW1IZWFkcywgcm9wZUludGVybGVhdmVkLCBoZWFkRGltZW5zaW9uLCByb3BlRGltZW5zaW9uLCBwb3NpdGlvbik7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIGF0dGVudGlvbkF0dGVuZCA9IGZ1bmN0aW9uIGF0dGVudGlvbkF0dGVuZChkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczMgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMzLmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzMy5tZW1BbGxvYzsKICAgICAgdmFyIG51bUhlYWRzID0gZGF0YS5udW1IZWFkcywKICAgICAgICBudW1LdkhlYWRzID0gZGF0YS5udW1LdkhlYWRzLAogICAgICAgIHdpbmRvd0xlbmd0aCA9IGRhdGEud2luZG93TGVuZ3RoLAogICAgICAgIGhlYWREaW1lbnNpb24gPSBkYXRhLmhlYWREaW1lbnNpb24sCiAgICAgICAga2V5c0FkZHJlc3MgPSBkYXRhLmtleXNBZGRyZXNzLAogICAgICAgIGtleUludGVyY2VwdHNBZGRyZXNzID0gZGF0YS5rZXlJbnRlcmNlcHRzQWRkcmVzcywKICAgICAgICBrZXlTbG9wZXNBZGRyZXNzID0gZGF0YS5rZXlTbG9wZXNBZGRyZXNzLAogICAgICAgIHZhbHVlc0FkZHJlc3MgPSBkYXRhLnZhbHVlc0FkZHJlc3MsCiAgICAgICAgdmFsdWVJbnRlcmNlcHRzQWRkcmVzcyA9IGRhdGEudmFsdWVJbnRlcmNlcHRzQWRkcmVzcywKICAgICAgICB2YWx1ZVNsb3Blc0FkZHJlc3MgPSBkYXRhLnZhbHVlU2xvcGVzQWRkcmVzcywKICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgcXVlcnlBZGRyZXNzID0gZGF0YS5xdWVyeUFkZHJlc3MsCiAgICAgICAgbiA9IGRhdGEubiwKICAgICAgICBvdXRwdXRBZGRyZXNzID0gZGF0YS5vdXRwdXRBZGRyZXNzOwogICAgICB2YXIgcHZfcGljb2xsbV9hdHRlbnRpb25fYXR0ZW5kID0gZXhwb3J0cy5wdl9waWNvbGxtX2F0dGVudGlvbl9hdHRlbmQ7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NCA9IG1lbUFsbG9jLmdldChrZXlzQWRkcmVzcyksCiAgICAgICAgd29ya2VyS2V5c0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDUgPSBtZW1BbGxvYy5nZXQoa2V5SW50ZXJjZXB0c0FkZHJlc3MpLAogICAgICAgIHdvcmtlcktleUludGVyY2VwdHNBZGRyZXNzID0gX21lbUFsbG9jJGdldDUud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ2ID0gbWVtQWxsb2MuZ2V0KGtleVNsb3Blc0FkZHJlc3MpLAogICAgICAgIHdvcmtlcktleVNsb3Blc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Ni53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDcgPSBtZW1BbGxvYy5nZXQodmFsdWVzQWRkcmVzcyksCiAgICAgICAgd29ya2VyVmFsdWVzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ3Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0OCA9IG1lbUFsbG9jLmdldCh2YWx1ZUludGVyY2VwdHNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJWYWx1ZUludGVyY2VwdHNBZGRyZXNzID0gX21lbUFsbG9jJGdldDgud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ5ID0gbWVtQWxsb2MuZ2V0KHZhbHVlU2xvcGVzQWRkcmVzcyksCiAgICAgICAgd29ya2VyVmFsdWVTbG9wZXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDkud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxMCA9IG1lbUFsbG9jLmdldChxdWVyeUFkZHJlc3MpLAogICAgICAgIHdvcmtlclF1ZXJ5QWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDExID0gbWVtQWxsb2MuZ2V0KG91dHB1dEFkZHJlc3MpLAogICAgICAgIHdvcmtlck91dHB1dEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTEud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV9hdHRlbnRpb25fYXR0ZW5kKG51bUhlYWRzLCBudW1LdkhlYWRzLCB3aW5kb3dMZW5ndGgsIGhlYWREaW1lbnNpb24sIHdvcmtlcktleXNBZGRyZXNzLCB3b3JrZXJLZXlJbnRlcmNlcHRzQWRkcmVzcywgd29ya2VyS2V5U2xvcGVzQWRkcmVzcywgd29ya2VyVmFsdWVzQWRkcmVzcywgd29ya2VyVmFsdWVJbnRlcmNlcHRzQWRkcmVzcywgd29ya2VyVmFsdWVTbG9wZXNBZGRyZXNzLCBwb3NpdGlvbiwgd29ya2VyUXVlcnlBZGRyZXNzLCBuLCB3b3JrZXJPdXRwdXRBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgYXR0ZW50aW9uVXBkYXRlS2V5cyA9IGZ1bmN0aW9uIGF0dGVudGlvblVwZGF0ZUtleXMoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHM0ID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzNC5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFsczQubWVtQWxsb2M7CiAgICAgIHZhciBudW1LdkhlYWRzID0gZGF0YS5udW1LdkhlYWRzLAogICAgICAgIHdpbmRvd0xlbmd0aCA9IGRhdGEud2luZG93TGVuZ3RoLAogICAgICAgIGhlYWREaW1lbnNpb24gPSBkYXRhLmhlYWREaW1lbnNpb24sCiAgICAgICAga2V5c0FkZHJlc3MgPSBkYXRhLmtleXNBZGRyZXNzLAogICAgICAgIGtleUludGVyY2VwdHNBZGRyZXNzID0gZGF0YS5rZXlJbnRlcmNlcHRzQWRkcmVzcywKICAgICAgICBrZXlTbG9wZXNBZGRyZXNzID0gZGF0YS5rZXlTbG9wZXNBZGRyZXNzLAogICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbiwKICAgICAgICBuID0gZGF0YS5uLAogICAgICAgIHRmQWRkcmVzcyA9IGRhdGEudGZBZGRyZXNzOwogICAgICB2YXIgcHZfcGljb2xsbV9hdHRlbnRpb25fdXBkYXRlX2tleXMgPSBleHBvcnRzLnB2X3BpY29sbG1fYXR0ZW50aW9uX3VwZGF0ZV9rZXlzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDEyID0gbWVtQWxsb2MuZ2V0KGtleXNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJLZXlzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMi53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDEzID0gbWVtQWxsb2MuZ2V0KGtleUludGVyY2VwdHNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJLZXlJbnRlcmNlcHRzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMy53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDE0ID0gbWVtQWxsb2MuZ2V0KGtleVNsb3Blc0FkZHJlc3MpLAogICAgICAgIHdvcmtlcktleVNsb3Blc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTQud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxNSA9IG1lbUFsbG9jLmdldCh0ZkFkZHJlc3MpLAogICAgICAgIHdvcmtlclRmQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxNS53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfa2V5cyhudW1LdkhlYWRzLCB3aW5kb3dMZW5ndGgsIGhlYWREaW1lbnNpb24sIHdvcmtlcktleXNBZGRyZXNzLCB3b3JrZXJLZXlJbnRlcmNlcHRzQWRkcmVzcywgd29ya2VyS2V5U2xvcGVzQWRkcmVzcywgcG9zaXRpb24sIG4sIHdvcmtlclRmQWRkcmVzcyk7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIGF0dGVudGlvblVwZGF0ZVZhbHVlcyA9IGZ1bmN0aW9uIGF0dGVudGlvblVwZGF0ZVZhbHVlcyhkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczUgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHM1LmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzNS5tZW1BbGxvYzsKICAgICAgdmFyIG51bUt2SGVhZHMgPSBkYXRhLm51bUt2SGVhZHMsCiAgICAgICAgd2luZG93TGVuZ3RoID0gZGF0YS53aW5kb3dMZW5ndGgsCiAgICAgICAgaGVhZERpbWVuc2lvbiA9IGRhdGEuaGVhZERpbWVuc2lvbiwKICAgICAgICB2YWx1ZXNBZGRyZXNzID0gZGF0YS52YWx1ZXNBZGRyZXNzLAogICAgICAgIHZhbHVlSW50ZXJjZXB0c0FkZHJlc3MgPSBkYXRhLnZhbHVlSW50ZXJjZXB0c0FkZHJlc3MsCiAgICAgICAgdmFsdWVTbG9wZXNBZGRyZXNzID0gZGF0YS52YWx1ZVNsb3Blc0FkZHJlc3MsCiAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgIG4gPSBkYXRhLm4sCiAgICAgICAgdGZBZGRyZXNzID0gZGF0YS50ZkFkZHJlc3M7CiAgICAgIHZhciBwdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfdmFsdWVzID0gZXhwb3J0cy5wdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfdmFsdWVzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDE2ID0gbWVtQWxsb2MuZ2V0KHZhbHVlc0FkZHJlc3MpLAogICAgICAgIHdvcmtlclZhbHVlc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTYud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxNyA9IG1lbUFsbG9jLmdldCh2YWx1ZUludGVyY2VwdHNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJWYWx1ZUludGVyY2VwdHNBZGRyZXNzID0gX21lbUFsbG9jJGdldDE3Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0MTggPSBtZW1BbGxvYy5nZXQodmFsdWVTbG9wZXNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJWYWx1ZVNsb3Blc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTgud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxOSA9IG1lbUFsbG9jLmdldCh0ZkFkZHJlc3MpLAogICAgICAgIHdvcmtlclRmQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxOS53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfdmFsdWVzKG51bUt2SGVhZHMsIHdpbmRvd0xlbmd0aCwgaGVhZERpbWVuc2lvbiwgd29ya2VyVmFsdWVzQWRkcmVzcywgd29ya2VyVmFsdWVJbnRlcmNlcHRzQWRkcmVzcywgd29ya2VyVmFsdWVTbG9wZXNBZGRyZXNzLCBwb3NpdGlvbiwgbiwgd29ya2VyVGZBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgYXR0ZW50aW9uVHJhbnNwb3NlUXVlcnkgPSBmdW5jdGlvbiBhdHRlbnRpb25UcmFuc3Bvc2VRdWVyeShkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczYgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHM2LmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzNi5tZW1BbGxvYzsKICAgICAgdmFyIG4gPSBkYXRhLm4sCiAgICAgICAgdGZBZGRyZXNzID0gZGF0YS50ZkFkZHJlc3MsCiAgICAgICAgaGZBZGRyZXNzID0gZGF0YS5oZkFkZHJlc3MsCiAgICAgICAgbnVtSGVhZHMgPSBkYXRhLm51bUhlYWRzLAogICAgICAgIGhlYWREaW1lbnNpb24gPSBkYXRhLmhlYWREaW1lbnNpb247CiAgICAgIHZhciBwdl9waWNvbGxtX2F0dGVudGlvbl90cmFuc3Bvc2VfcXVlcnkgPSBleHBvcnRzLnB2X3BpY29sbG1fYXR0ZW50aW9uX3RyYW5zcG9zZV9xdWVyeTsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQyMCA9IG1lbUFsbG9jLmdldCh0ZkFkZHJlc3MpLAogICAgICAgIHdvcmtlclRmQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyMC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDIxID0gbWVtQWxsb2MuZ2V0KGhmQWRkcmVzcyksCiAgICAgICAgd29ya2VySGZBZGRyZXNzID0gX21lbUFsbG9jJGdldDIxLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHB2X3BpY29sbG1fYXR0ZW50aW9uX3RyYW5zcG9zZV9xdWVyeShuLCB3b3JrZXJUZkFkZHJlc3MsIHdvcmtlckhmQWRkcmVzcywgbnVtSGVhZHMsIGhlYWREaW1lbnNpb24pOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBwdlBpY29sbG1BdHRlbnRpb25BY3Rpb25NYXAgPSBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uLkFUVEVOVElPTl9QUkVDT01QVVRFX0VOQ09ESU5HLCBhdHRlbnRpb25QcmVjb21wdXRlRW5jb2RpbmcpLCBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb24uQVRURU5USU9OX0VOQ09ERSwgYXR0ZW50aW9uRW5jb2RlKSwgUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uLkFUVEVOVElPTl9BVFRFTkQsIGF0dGVudGlvbkF0dGVuZCksIFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbi5BVFRFTlRJT05fVVBEQVRFX0tFWVMsIGF0dGVudGlvblVwZGF0ZUtleXMpLCBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb24uQVRURU5USU9OX1VQREFURV9WQUxVRVMsIGF0dGVudGlvblVwZGF0ZVZhbHVlcyksIFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbi5BVFRFTlRJT05fVFJBTlNQT1NFX1FVRVJZLCBhdHRlbnRpb25UcmFuc3Bvc2VRdWVyeSk7CgogIC8qIGVzbGludCBjYW1lbGNhc2U6IDAgKi8KICB2YXIgUHZQaWNvbGxtRmVlZEZvcndhcmRBY3Rpb247CiAgKGZ1bmN0aW9uIChQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvbikgewogICAgUHZQaWNvbGxtRmVlZEZvcndhcmRBY3Rpb25bUHZQaWNvbGxtRmVlZEZvcndhcmRBY3Rpb25bIkZFRURfRk9SV0FSRF9TSUxVIl0gPSAzMDBdID0gIkZFRURfRk9SV0FSRF9TSUxVIjsKICAgIFB2UGljb2xsbUZlZWRGb3J3YXJkQWN0aW9uW1B2UGljb2xsbUZlZWRGb3J3YXJkQWN0aW9uWyJGRUVEX0ZPUldBUkRfR0VMVSJdID0gMzAxXSA9ICJGRUVEX0ZPUldBUkRfR0VMVSI7CiAgICBQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvbltQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvblsiRkVFRF9GT1JXQVJEX0FMTU9TVF9HRUxVIl0gPSAzMDJdID0gIkZFRURfRk9SV0FSRF9BTE1PU1RfR0VMVSI7CiAgICBQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvbltQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvblsiRkVFRF9GT1JXQVJEX01VTFRJUExZX0JVRkZFUlMiXSA9IDMwM10gPSAiRkVFRF9GT1JXQVJEX01VTFRJUExZX0JVRkZFUlMiOwogIH0pKFB2UGljb2xsbUZlZWRGb3J3YXJkQWN0aW9uIHx8IChQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvbiA9IHt9KSk7CgogIHZhciBmZWVkRm9yd2FyZFNpbHUgPSBmdW5jdGlvbiBmZWVkRm9yd2FyZFNpbHUoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHMgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMubWVtQWxsb2M7CiAgICAgIHZhciBuID0gZGF0YS5uLAogICAgICAgIHhBZGRyZXNzID0gZGF0YS54QWRkcmVzczsKICAgICAgdmFyIHB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX3NpbHUgPSBleHBvcnRzLnB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX3NpbHU7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0ID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV9mZWVkX2ZvcndhcmRfc2lsdShuLCB3b3JrZXJYQWRkcmVzcyk7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIGZlZWRGb3J3YXJkR2VsdSA9IGZ1bmN0aW9uIGZlZWRGb3J3YXJkR2VsdShkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczIgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMyLmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzMi5tZW1BbGxvYzsKICAgICAgdmFyIG4gPSBkYXRhLm4sCiAgICAgICAgeEFkZHJlc3MgPSBkYXRhLnhBZGRyZXNzOwogICAgICB2YXIgcHZfcGljb2xsbV9mZWVkX2ZvcndhcmRfZ2VsdSA9IGV4cG9ydHMucHZfcGljb2xsbV9mZWVkX2ZvcndhcmRfZ2VsdTsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX2dlbHUobiwgd29ya2VyWEFkZHJlc3MpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBmZWVkRm9yd2FyZEFsbW9zdEdlbHUgPSBmdW5jdGlvbiBmZWVkRm9yd2FyZEFsbW9zdEdlbHUoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHMzID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzMy5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFsczMubWVtQWxsb2M7CiAgICAgIHZhciBuID0gZGF0YS5uLAogICAgICAgIHhBZGRyZXNzID0gZGF0YS54QWRkcmVzczsKICAgICAgdmFyIHB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX2FsbW9zdF9nZWx1ID0gZXhwb3J0cy5wdl9waWNvbGxtX2ZlZWRfZm9yd2FyZF9hbG1vc3RfZ2VsdTsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQzID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQzLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX2FsbW9zdF9nZWx1KG4sIHdvcmtlclhBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgZmVlZEZvcndhcmRNdWx0aXBseUJ1ZmZlcnMgPSBmdW5jdGlvbiBmZWVkRm9yd2FyZE11bHRpcGx5QnVmZmVycyhkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczQgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHM0LmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzNC5tZW1BbGxvYzsKICAgICAgdmFyIG4gPSBkYXRhLm4sCiAgICAgICAgeEFkZHJlc3MgPSBkYXRhLnhBZGRyZXNzLAogICAgICAgIHlBZGRyZXNzID0gZGF0YS55QWRkcmVzczsKICAgICAgdmFyIHB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX211bHRpcGx5X2J1ZmZlcnMgPSBleHBvcnRzLnB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX211bHRpcGx5X2J1ZmZlcnM7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NCA9IG1lbUFsbG9jLmdldCh4QWRkcmVzcyksCiAgICAgICAgd29ya2VyWEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDUgPSBtZW1BbGxvYy5nZXQoeUFkZHJlc3MpLAogICAgICAgIHdvcmtlcllBZGRyZXNzID0gX21lbUFsbG9jJGdldDUud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV9mZWVkX2ZvcndhcmRfbXVsdGlwbHlfYnVmZmVycyhuLCB3b3JrZXJYQWRkcmVzcywgd29ya2VyWUFkZHJlc3MpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBwdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvbk1hcCA9IF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtRmVlZEZvcndhcmRBY3Rpb24uRkVFRF9GT1JXQVJEX1NJTFUsIGZlZWRGb3J3YXJkU2lsdSksIFB2UGljb2xsbUZlZWRGb3J3YXJkQWN0aW9uLkZFRURfRk9SV0FSRF9HRUxVLCBmZWVkRm9yd2FyZEdlbHUpLCBQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvbi5GRUVEX0ZPUldBUkRfQUxNT1NUX0dFTFUsIGZlZWRGb3J3YXJkQWxtb3N0R2VsdSksIFB2UGljb2xsbUZlZWRGb3J3YXJkQWN0aW9uLkZFRURfRk9SV0FSRF9NVUxUSVBMWV9CVUZGRVJTLCBmZWVkRm9yd2FyZE11bHRpcGx5QnVmZmVycyk7CgogIC8qIGVzbGludCBjYW1lbGNhc2U6IDAgKi8KICB2YXIgUHZQaWNvbGxtR2F0ZUFjdGlvbjsKICAoZnVuY3Rpb24gKFB2UGljb2xsbUdhdGVBY3Rpb24pIHsKICAgIFB2UGljb2xsbUdhdGVBY3Rpb25bUHZQaWNvbGxtR2F0ZUFjdGlvblsiR0FURV9GT1JXQVJEIl0gPSA0MDBdID0gIkdBVEVfRk9SV0FSRCI7CiAgfSkoUHZQaWNvbGxtR2F0ZUFjdGlvbiB8fCAoUHZQaWNvbGxtR2F0ZUFjdGlvbiA9IHt9KSk7CgogIHZhciBnYXRlRm9yd2FyZCA9IGZ1bmN0aW9uIGdhdGVGb3J3YXJkKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzLmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzLm1lbUFsbG9jOwogICAgICB2YXIgbiA9IGRhdGEubiwKICAgICAgICBrID0gZGF0YS5rLAogICAgICAgIG51bUV4cGVydHMgPSBkYXRhLm51bUV4cGVydHMsCiAgICAgICAgaW5kaWNlc0FkZHJlc3MgPSBkYXRhLmluZGljZXNBZGRyZXNzLAogICAgICAgIHdlaWdodHNBZGRyZXNzID0gZGF0YS53ZWlnaHRzQWRkcmVzcywKICAgICAgICB5QWRkcmVzcyA9IGRhdGEueUFkZHJlc3M7CiAgICAgIHZhciBwdl9waWNvbGxtX2dhdGVfZm9yd2FyZCA9IGV4cG9ydHMucHZfcGljb2xsbV9nYXRlX2ZvcndhcmQ7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0ID0gbWVtQWxsb2MuZ2V0KGluZGljZXNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJJbmRpY2VzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KHdlaWdodHNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJXZWlnaHRzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldCh5QWRkcmVzcyksCiAgICAgICAgd29ya2VyWUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0My53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX2dhdGVfZm9yd2FyZChuLCBrLCBudW1FeHBlcnRzLCB3b3JrZXJJbmRpY2VzQWRkcmVzcywgd29ya2VyV2VpZ2h0c0FkZHJlc3MsIHdvcmtlcllBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgcHZQaWNvbGxtR2F0ZUFjdGlvbk1hcCA9IF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtR2F0ZUFjdGlvbi5HQVRFX0ZPUldBUkQsIGdhdGVGb3J3YXJkKTsKCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCAqLwogIHZhciBQdlBpY29sbG1Nb2VUcmFuc2Zvcm1lckFjdGlvbjsKICAoZnVuY3Rpb24gKFB2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uKSB7CiAgICBQdlBpY29sbG1Nb2VUcmFuc2Zvcm1lckFjdGlvbltQdlBpY29sbG1Nb2VUcmFuc2Zvcm1lckFjdGlvblsiQUREX1RPX0JVRkZFUiJdID0gNTAwXSA9ICJBRERfVE9fQlVGRkVSIjsKICAgIFB2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uW1B2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uWyJNVUxUSVBMWV9XRUlHSFRfQU5EX0FERF9UT19CVUZGRVIiXSA9IDUwMV0gPSAiTVVMVElQTFlfV0VJR0hUX0FORF9BRERfVE9fQlVGRkVSIjsKICAgIFB2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uW1B2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uWyJBRERfQlVGRkVSUyJdID0gNTAyXSA9ICJBRERfQlVGRkVSUyI7CiAgfSkoUHZQaWNvbGxtTW9lVHJhbnNmb3JtZXJBY3Rpb24gfHwgKFB2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uID0ge30pKTsKCiAgdmFyIG1vZVRyYW5zZm9ybWVyQWRkVG9CdWZmZXIgPSBmdW5jdGlvbiBtb2VUcmFuc2Zvcm1lckFkZFRvQnVmZmVyKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzLmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzLm1lbUFsbG9jOwogICAgICB2YXIgbiA9IGRhdGEubiwKICAgICAgICB4QWRkcmVzcyA9IGRhdGEueEFkZHJlc3MsCiAgICAgICAgYnVmZmVyQWRkcmVzcyA9IGRhdGEuYnVmZmVyQWRkcmVzczsKICAgICAgdmFyIHB2X3BpY29sbG1fbW9lX3RyYW5zZm9ybWVyX2FkZF90b19idWZmZXIgPSBleHBvcnRzLnB2X3BpY29sbG1fbW9lX3RyYW5zZm9ybWVyX2FkZF90b19idWZmZXI7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0ID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KGJ1ZmZlckFkZHJlc3MpLAogICAgICAgIHdvcmtlckJ1ZmZlckFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Mi53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX21vZV90cmFuc2Zvcm1lcl9hZGRfdG9fYnVmZmVyKG4sIHdvcmtlclhBZGRyZXNzLCB3b3JrZXJCdWZmZXJBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgbW9lVHJhbnNmb3JtZXJNdWx0aXBseVdlaWdodEFuZEFkZFRvQnVmZmVyID0gZnVuY3Rpb24gbW9lVHJhbnNmb3JtZXJNdWx0aXBseVdlaWdodEFuZEFkZFRvQnVmZmVyKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzMiA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczIuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMyLm1lbUFsbG9jOwogICAgICB2YXIgbiA9IGRhdGEubiwKICAgICAgICB3ZWlnaHRzSW5kZXggPSBkYXRhLndlaWdodHNJbmRleCwKICAgICAgICB5SW5kZXggPSBkYXRhLnlJbmRleCwKICAgICAgICB3ZWlnaHRzQWRkcmVzcyA9IGRhdGEud2VpZ2h0c0FkZHJlc3MsCiAgICAgICAgeEFkZHJlc3MgPSBkYXRhLnhBZGRyZXNzLAogICAgICAgIHlBZGRyZXNzID0gZGF0YS55QWRkcmVzczsKICAgICAgdmFyIHB2X3BpY29sbG1fbW9lX3RyYW5zZm9ybWVyX211bHRpcGx5X3dlaWdodF9hbmRfYWRkX3RvX2J1ZmZlciA9IGV4cG9ydHMucHZfcGljb2xsbV9tb2VfdHJhbnNmb3JtZXJfbXVsdGlwbHlfd2VpZ2h0X2FuZF9hZGRfdG9fYnVmZmVyOwogICAgICB2YXIgX21lbUFsbG9jJGdldDMgPSBtZW1BbGxvYy5nZXQod2VpZ2h0c0FkZHJlc3MpLAogICAgICAgIHdvcmtlcldlaWdodHNBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ0ID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ0Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NSA9IG1lbUFsbG9jLmdldCh5QWRkcmVzcyksCiAgICAgICAgd29ya2VyWUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NS53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX21vZV90cmFuc2Zvcm1lcl9tdWx0aXBseV93ZWlnaHRfYW5kX2FkZF90b19idWZmZXIobiwgd2VpZ2h0c0luZGV4LCB5SW5kZXgsIHdvcmtlcldlaWdodHNBZGRyZXNzLCB3b3JrZXJYQWRkcmVzcywgd29ya2VyWUFkZHJlc3MpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBtb2VUcmFuc2Zvcm1lckFkZEJ1ZmZlcnMgPSBmdW5jdGlvbiBtb2VUcmFuc2Zvcm1lckFkZEJ1ZmZlcnMoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHMzID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzMy5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFsczMubWVtQWxsb2M7CiAgICAgIHZhciBuID0gZGF0YS5uLAogICAgICAgIGJ1ZmZlcjFBZGRyZXNzID0gZGF0YS5idWZmZXIxQWRkcmVzcywKICAgICAgICBidWZmZXIyQWRkcmVzcyA9IGRhdGEuYnVmZmVyMkFkZHJlc3MsCiAgICAgICAgeUFkZHJlc3MgPSBkYXRhLnlBZGRyZXNzOwogICAgICB2YXIgcHZfcGljb2xsbV9tb2VfdHJhbnNmb3JtZXJfYWRkX2J1ZmZlcnMgPSBleHBvcnRzLnB2X3BpY29sbG1fbW9lX3RyYW5zZm9ybWVyX2FkZF9idWZmZXJzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDYgPSBtZW1BbGxvYy5nZXQoYnVmZmVyMUFkZHJlc3MpLAogICAgICAgIHdvcmtlckJ1ZmZlcjFBZGRyZXNzID0gX21lbUFsbG9jJGdldDYud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ3ID0gbWVtQWxsb2MuZ2V0KGJ1ZmZlcjJBZGRyZXNzKSwKICAgICAgICB3b3JrZXJCdWZmZXIyQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ3Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0OCA9IG1lbUFsbG9jLmdldCh5QWRkcmVzcyksCiAgICAgICAgd29ya2VyWUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0OC53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX21vZV90cmFuc2Zvcm1lcl9hZGRfYnVmZmVycyhuLCB3b3JrZXJCdWZmZXIxQWRkcmVzcywgd29ya2VyQnVmZmVyMkFkZHJlc3MsIHdvcmtlcllBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgcHZQaWNvbGxtTW9lVHJhbnNmb3JtZXJBY3Rpb25NYXAgPSBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtTW9lVHJhbnNmb3JtZXJBY3Rpb24uQUREX1RPX0JVRkZFUiwgbW9lVHJhbnNmb3JtZXJBZGRUb0J1ZmZlciksIFB2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uLk1VTFRJUExZX1dFSUdIVF9BTkRfQUREX1RPX0JVRkZFUiwgbW9lVHJhbnNmb3JtZXJNdWx0aXBseVdlaWdodEFuZEFkZFRvQnVmZmVyKSwgUHZQaWNvbGxtTW9lVHJhbnNmb3JtZXJBY3Rpb24uQUREX0JVRkZFUlMsIG1vZVRyYW5zZm9ybWVyQWRkQnVmZmVycyk7CgogIC8qIGVzbGludCBjYW1lbGNhc2U6IDAgKi8KICB2YXIgUHZQaWNvbGxtVHJhbnNmb3JtZXJBY3Rpb247CiAgKGZ1bmN0aW9uIChQdlBpY29sbG1UcmFuc2Zvcm1lckFjdGlvbikgewogICAgUHZQaWNvbGxtVHJhbnNmb3JtZXJBY3Rpb25bUHZQaWNvbGxtVHJhbnNmb3JtZXJBY3Rpb25bIkFERF9UT19CVUZGRVIiXSA9IDcwMF0gPSAiQUREX1RPX0JVRkZFUiI7CiAgICBQdlBpY29sbG1UcmFuc2Zvcm1lckFjdGlvbltQdlBpY29sbG1UcmFuc2Zvcm1lckFjdGlvblsiQUREX0JVRkZFUlMiXSA9IDcwMV0gPSAiQUREX0JVRkZFUlMiOwogIH0pKFB2UGljb2xsbVRyYW5zZm9ybWVyQWN0aW9uIHx8IChQdlBpY29sbG1UcmFuc2Zvcm1lckFjdGlvbiA9IHt9KSk7CgogIHZhciB0cmFuc2Zvcm1lckFkZFRvQnVmZmVyID0gZnVuY3Rpb24gdHJhbnNmb3JtZXJBZGRUb0J1ZmZlcihkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFscyA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFscy5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFscy5tZW1BbGxvYzsKICAgICAgdmFyIG4gPSBkYXRhLm4sCiAgICAgICAgeEFkZHJlc3MgPSBkYXRhLnhBZGRyZXNzLAogICAgICAgIGJ1ZmZlckFkZHJlc3MgPSBkYXRhLmJ1ZmZlckFkZHJlc3M7CiAgICAgIHZhciBwdl9waWNvbGxtX3RyYW5zZm9ybWVyX2FkZF90b19idWZmZXIgPSBleHBvcnRzLnB2X3BpY29sbG1fdHJhbnNmb3JtZXJfYWRkX3RvX2J1ZmZlcjsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQgPSBtZW1BbGxvYy5nZXQoeEFkZHJlc3MpLAogICAgICAgIHdvcmtlclhBZGRyZXNzID0gX21lbUFsbG9jJGdldC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDIgPSBtZW1BbGxvYy5nZXQoYnVmZmVyQWRkcmVzcyksCiAgICAgICAgd29ya2VyQnVmZmVyQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHB2X3BpY29sbG1fdHJhbnNmb3JtZXJfYWRkX3RvX2J1ZmZlcihuLCB3b3JrZXJYQWRkcmVzcywgd29ya2VyQnVmZmVyQWRkcmVzcyk7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIHRyYW5zZm9ybWVyQWRkQnVmZmVycyA9IGZ1bmN0aW9uIHRyYW5zZm9ybWVyQWRkQnVmZmVycyhkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczIgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMyLmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzMi5tZW1BbGxvYzsKICAgICAgdmFyIG4gPSBkYXRhLm4sCiAgICAgICAgYnVmZmVyMUFkZHJlc3MgPSBkYXRhLmJ1ZmZlcjFBZGRyZXNzLAogICAgICAgIGJ1ZmZlcjJBZGRyZXNzID0gZGF0YS5idWZmZXIyQWRkcmVzcywKICAgICAgICB5QWRkcmVzcyA9IGRhdGEueUFkZHJlc3M7CiAgICAgIHZhciBwdl9waWNvbGxtX3RyYW5zZm9ybWVyX2FkZF9idWZmZXJzID0gZXhwb3J0cy5wdl9waWNvbGxtX3RyYW5zZm9ybWVyX2FkZF9idWZmZXJzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDMgPSBtZW1BbGxvYy5nZXQoYnVmZmVyMUFkZHJlc3MpLAogICAgICAgIHdvcmtlckJ1ZmZlcjFBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ0ID0gbWVtQWxsb2MuZ2V0KGJ1ZmZlcjJBZGRyZXNzKSwKICAgICAgICB3b3JrZXJCdWZmZXIyQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ0Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NSA9IG1lbUFsbG9jLmdldCh5QWRkcmVzcyksCiAgICAgICAgd29ya2VyWUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NS53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX3RyYW5zZm9ybWVyX2FkZF9idWZmZXJzKG4sIHdvcmtlckJ1ZmZlcjFBZGRyZXNzLCB3b3JrZXJCdWZmZXIyQWRkcmVzcywgd29ya2VyWUFkZHJlc3MpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBwdlBpY29sbG1UcmFuc2Zvcm1lckFjdGlvbk1hcCA9IF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFB2UGljb2xsbVRyYW5zZm9ybWVyQWN0aW9uLkFERF9UT19CVUZGRVIsIHRyYW5zZm9ybWVyQWRkVG9CdWZmZXIpLCBQdlBpY29sbG1UcmFuc2Zvcm1lckFjdGlvbi5BRERfQlVGRkVSUywgdHJhbnNmb3JtZXJBZGRCdWZmZXJzKTsKCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCAqLwogIHZhciBQdlBpY29sbG1Ob3JtQWN0aW9uOwogIChmdW5jdGlvbiAoUHZQaWNvbGxtTm9ybUFjdGlvbikgewogICAgUHZQaWNvbGxtTm9ybUFjdGlvbltQdlBpY29sbG1Ob3JtQWN0aW9uWyJOT1JNX0ZPUldBUkQiXSA9IDYwMF0gPSAiTk9STV9GT1JXQVJEIjsKICB9KShQdlBpY29sbG1Ob3JtQWN0aW9uIHx8IChQdlBpY29sbG1Ob3JtQWN0aW9uID0ge30pKTsKCiAgdmFyIG5vcm1Gb3J3YXJkID0gZnVuY3Rpb24gbm9ybUZvcndhcmQoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHMgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMubWVtQWxsb2M7CiAgICAgIHZhciBkaW1lbnNpb24gPSBkYXRhLmRpbWVuc2lvbiwKICAgICAgICBlcHMgPSBkYXRhLmVwcywKICAgICAgICB3ZWlnaHRBZGRyZXNzID0gZGF0YS53ZWlnaHRBZGRyZXNzLAogICAgICAgIG4gPSBkYXRhLm4sCiAgICAgICAgeE9mZnNldCA9IGRhdGEueE9mZnNldCwKICAgICAgICB4QWRkcmVzcyA9IGRhdGEueEFkZHJlc3MsCiAgICAgICAgeU9mZnNldCA9IGRhdGEueU9mZnNldCwKICAgICAgICB5QWRkcmVzcyA9IGRhdGEueUFkZHJlc3M7CiAgICAgIHZhciBwdl9waWNvbGxtX25vcm1fZm9yd2FyZCA9IGV4cG9ydHMucHZfcGljb2xsbV9ub3JtX2ZvcndhcmQ7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0ID0gbWVtQWxsb2MuZ2V0KHdlaWdodEFkZHJlc3MpLAogICAgICAgIHdvcmtlcldlaWdodEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0MiA9IG1lbUFsbG9jLmdldCh4QWRkcmVzcyksCiAgICAgICAgd29ya2VyWEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Mi53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDMgPSBtZW1BbGxvYy5nZXQoeUFkZHJlc3MpLAogICAgICAgIHdvcmtlcllBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV9ub3JtX2ZvcndhcmQoZGltZW5zaW9uLCBlcHMsIHdvcmtlcldlaWdodEFkZHJlc3MsIG4sIHdvcmtlclhBZGRyZXNzICsgeE9mZnNldCwgd29ya2VyWUFkZHJlc3MgKyB5T2Zmc2V0KTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgcHZQaWNvbGxtTm9ybUFjdGlvbk1hcCA9IF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtTm9ybUFjdGlvbi5OT1JNX0ZPUldBUkQsIG5vcm1Gb3J3YXJkKTsKCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCAqLwogIHZhciBQdlBpY29sbG1Ob3JtTGF5ZXJBY3Rpb247CiAgKGZ1bmN0aW9uIChQdlBpY29sbG1Ob3JtTGF5ZXJBY3Rpb24pIHsKICAgIFB2UGljb2xsbU5vcm1MYXllckFjdGlvbltQdlBpY29sbG1Ob3JtTGF5ZXJBY3Rpb25bIk5PUk1fTEFZRVJfRk9SV0FSRCJdID0gODAwXSA9ICJOT1JNX0xBWUVSX0ZPUldBUkQiOwogIH0pKFB2UGljb2xsbU5vcm1MYXllckFjdGlvbiB8fCAoUHZQaWNvbGxtTm9ybUxheWVyQWN0aW9uID0ge30pKTsKCiAgdmFyIG5vcm1MYXllckZvcndhcmQgPSBmdW5jdGlvbiBub3JtTGF5ZXJGb3J3YXJkKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzLmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzLm1lbUFsbG9jOwogICAgICB2YXIgZGltZW5zaW9uID0gZGF0YS5kaW1lbnNpb24sCiAgICAgICAgZXBzID0gZGF0YS5lcHMsCiAgICAgICAgd2VpZ2h0QWRkcmVzcyA9IGRhdGEud2VpZ2h0QWRkcmVzcywKICAgICAgICBiaWFzQWRkcmVzcyA9IGRhdGEuYmlhc0FkZHJlc3MsCiAgICAgICAgbiA9IGRhdGEubiwKICAgICAgICB4T2Zmc2V0ID0gZGF0YS54T2Zmc2V0LAogICAgICAgIHhBZGRyZXNzID0gZGF0YS54QWRkcmVzcywKICAgICAgICB5T2Zmc2V0ID0gZGF0YS55T2Zmc2V0LAogICAgICAgIHlBZGRyZXNzID0gZGF0YS55QWRkcmVzczsKICAgICAgdmFyIHB2X3BpY29sbG1fbm9ybV9sYXllcl9mb3J3YXJkID0gZXhwb3J0cy5wdl9waWNvbGxtX25vcm1fbGF5ZXJfZm9yd2FyZDsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQgPSBtZW1BbGxvYy5nZXQod2VpZ2h0QWRkcmVzcyksCiAgICAgICAgd29ya2VyV2VpZ2h0QWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KGJpYXNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJCaWFzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldCh4QWRkcmVzcyksCiAgICAgICAgd29ya2VyWEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0My53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDQgPSBtZW1BbGxvYy5nZXQoeUFkZHJlc3MpLAogICAgICAgIHdvcmtlcllBZGRyZXNzID0gX21lbUFsbG9jJGdldDQud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV9ub3JtX2xheWVyX2ZvcndhcmQoZGltZW5zaW9uLCBlcHMsIHdvcmtlcldlaWdodEFkZHJlc3MsIHdvcmtlckJpYXNBZGRyZXNzLCBuLCB3b3JrZXJYQWRkcmVzcyArIHhPZmZzZXQsIHdvcmtlcllBZGRyZXNzICsgeU9mZnNldCk7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIHB2UGljb2xsbU5vcm1MYXllckFjdGlvbk1hcCA9IF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtTm9ybUxheWVyQWN0aW9uLk5PUk1fTEFZRVJfRk9SV0FSRCwgbm9ybUxheWVyRm9yd2FyZCk7CgogIC8qIGVzbGludCBjYW1lbGNhc2U6IDAgKi8KICB2YXIgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uOwogIChmdW5jdGlvbiAoUHZQaWNvbGxtV2VpZ2h0QWN0aW9uKSB7CiAgICBQdlBpY29sbG1XZWlnaHRBY3Rpb25bUHZQaWNvbGxtV2VpZ2h0QWN0aW9uWyJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9QUkVQUk9DRVNTX0JMT0NLUyJdID0gMTAwXSA9ICJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9QUkVQUk9DRVNTX0JMT0NLUyI7CiAgICBQdlBpY29sbG1XZWlnaHRBY3Rpb25bUHZQaWNvbGxtV2VpZ2h0QWN0aW9uWyJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9GT1JXQVJEX1NJTkdMRSJdID0gMTAxXSA9ICJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9GT1JXQVJEX1NJTkdMRSI7CiAgICBQdlBpY29sbG1XZWlnaHRBY3Rpb25bUHZQaWNvbGxtV2VpZ2h0QWN0aW9uWyJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9GT1JXQVJEX01VTFRJUExFIl0gPSAxMDJdID0gIldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X0ZPUldBUkRfTVVMVElQTEUiOwogICAgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uW1B2UGljb2xsbVdlaWdodEFjdGlvblsiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfQUREX0JJQVMiXSA9IDEwM10gPSAiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfQUREX0JJQVMiOwogICAgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uW1B2UGljb2xsbVdlaWdodEFjdGlvblsiV0VJR0hUX0ZMT0FUX0ZPUldBUkQiXSA9IDEwNF0gPSAiV0VJR0hUX0ZMT0FUX0ZPUldBUkQiOwogIH0pKFB2UGljb2xsbVdlaWdodEFjdGlvbiB8fCAoUHZQaWNvbGxtV2VpZ2h0QWN0aW9uID0ge30pKTsKCiAgdmFyIHdlaWdodEJsb2NrTWl4ZWQxNng4UHJlcHJvY2Vzc0Jsb2NrcyA9IGZ1bmN0aW9uIHdlaWdodEJsb2NrTWl4ZWQxNng4UHJlcHJvY2Vzc0Jsb2NrcyhkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFscyA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFscy5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFscy5tZW1BbGxvYywKICAgICAgICBtZW1vcnkgPSBfZGF0YSRnbG9iYWxzLm1lbW9yeTsKICAgICAgdmFyIHNoYXBlID0gZGF0YS5zaGFwZSwKICAgICAgICBiaXREZXB0aHMgPSBkYXRhLmJpdERlcHRocywKICAgICAgICBiaXREZXB0aFN0YXJ0cyA9IGRhdGEuYml0RGVwdGhTdGFydHMsCiAgICAgICAgYmxvY2tzQWRkcmVzcyA9IGRhdGEuYmxvY2tzQWRkcmVzczsKICAgICAgdmFyIGFsaWduZWRfYWxsb2MgPSBleHBvcnRzLmFsaWduZWRfYWxsb2MsCiAgICAgICAgZnJlZSA9IGV4cG9ydHMuZnJlZSwKICAgICAgICBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X3ByZXByb2Nlc3NfYmxvY2tzID0gZXhwb3J0cy5wdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X3ByZXByb2Nlc3NfYmxvY2tzOwogICAgICBpZiAoIW1lbUFsbG9jLmhhcyhibG9ja3NBZGRyZXNzKSkgewogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgY29tbWFuZDogJ29rJwogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgX21lbUFsbG9jJGdldCA9IG1lbUFsbG9jLmdldChibG9ja3NBZGRyZXNzKSwKICAgICAgICB3b3JrZXJCbG9ja3NBZGRyZXNzID0gX21lbUFsbG9jJGdldC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgc2hhcGVBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogc2hhcGUubGVuZ3RoKTsKICAgICAgdmFyIGJpdERlcHRoc0FkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBiaXREZXB0aHMubGVuZ3RoKTsKICAgICAgdmFyIGJpdERlcHRoc1N0YXJ0QWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIGJpdERlcHRoU3RhcnRzLmxlbmd0aCk7CiAgICAgIHZhciBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoc2hhcGUsIHNoYXBlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoYml0RGVwdGhzLCBiaXREZXB0aHNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChiaXREZXB0aFN0YXJ0cywgYml0RGVwdGhzU3RhcnRBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfcHJlcHJvY2Vzc19ibG9ja3Moc2hhcGVBZGRyZXNzLCBiaXREZXB0aHMubGVuZ3RoLCBiaXREZXB0aHNBZGRyZXNzLCBiaXREZXB0aHNTdGFydEFkZHJlc3MsIHdvcmtlckJsb2Nrc0FkZHJlc3MpOwogICAgICBmcmVlKHNoYXBlQWRkcmVzcyk7CiAgICAgIGZyZWUoYml0RGVwdGhzQWRkcmVzcyk7CiAgICAgIGZyZWUoYml0RGVwdGhzU3RhcnRBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgd2VpZ2h0QmxvY2tNaXhlZDE2eDhGb3J3YXJkU2luZ2xlID0gZnVuY3Rpb24gd2VpZ2h0QmxvY2tNaXhlZDE2eDhGb3J3YXJkU2luZ2xlKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzMiA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczIuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMyLm1lbUFsbG9jLAogICAgICAgIG1lbW9yeSA9IF9kYXRhJGdsb2JhbHMyLm1lbW9yeTsKICAgICAgdmFyIHNoYXBlID0gZGF0YS5zaGFwZSwKICAgICAgICBpbmRpY2VzQWRkcmVzcyA9IGRhdGEuaW5kaWNlc0FkZHJlc3MsCiAgICAgICAgYml0RGVwdGhTdGFydHMgPSBkYXRhLmJpdERlcHRoU3RhcnRzLAogICAgICAgIGJpdERlcHRocyA9IGRhdGEuYml0RGVwdGhzLAogICAgICAgIG1ldGFzQWRkcmVzcyA9IGRhdGEubWV0YXNBZGRyZXNzLAogICAgICAgIGJsb2Nrc0FkZHJlc3MgPSBkYXRhLmJsb2Nrc0FkZHJlc3MsCiAgICAgICAgeE9mZnNldCA9IGRhdGEueE9mZnNldCwKICAgICAgICB4QWRkcmVzcyA9IGRhdGEueEFkZHJlc3MsCiAgICAgICAgeUFkZHJlc3MgPSBkYXRhLnlBZGRyZXNzOwogICAgICB2YXIgYWxpZ25lZF9hbGxvYyA9IGV4cG9ydHMuYWxpZ25lZF9hbGxvYywKICAgICAgICBmcmVlID0gZXhwb3J0cy5mcmVlLAogICAgICAgIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfZm9yd2FyZF9zaW5nbGUgPSBleHBvcnRzLnB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfZm9yd2FyZF9zaW5nbGU7CiAgICAgIGlmICghbWVtQWxsb2MuaGFzKG1ldGFzQWRkcmVzcykgfHwgIW1lbUFsbG9jLmhhcyhibG9ja3NBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKHhBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKHlBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKGluZGljZXNBZGRyZXNzKSkgewogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgY29tbWFuZDogJ29rJwogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgX21lbUFsbG9jJGdldDIgPSBtZW1BbGxvYy5nZXQoaW5kaWNlc0FkZHJlc3MpLAogICAgICAgIHdvcmtlckluZGljZXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDIud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQzID0gbWVtQWxsb2MuZ2V0KG1ldGFzQWRkcmVzcyksCiAgICAgICAgd29ya2VyTWV0YXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ0ID0gbWVtQWxsb2MuZ2V0KGJsb2Nrc0FkZHJlc3MpLAogICAgICAgIHdvcmtlckJsb2Nrc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDUgPSBtZW1BbGxvYy5nZXQoeEFkZHJlc3MpLAogICAgICAgIHdvcmtlclhBZGRyZXNzID0gX21lbUFsbG9jJGdldDUud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ2ID0gbWVtQWxsb2MuZ2V0KHlBZGRyZXNzKSwKICAgICAgICB3b3JrZXJZQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ2Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBzaGFwZUFkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBzaGFwZS5sZW5ndGgpOwogICAgICB2YXIgYml0RGVwdGhzU3RhcnRBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogYml0RGVwdGhTdGFydHMubGVuZ3RoKTsKICAgICAgdmFyIGJpdERlcHRoc0FkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBiaXREZXB0aHMubGVuZ3RoKTsKICAgICAgdmFyIG1lbW9yeUJ1ZmZlckludDMyID0gbmV3IEludDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChzaGFwZSwgc2hhcGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChiaXREZXB0aFN0YXJ0cywgYml0RGVwdGhzU3RhcnRBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChiaXREZXB0aHMsIGJpdERlcHRoc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9mb3J3YXJkX3NpbmdsZShzaGFwZUFkZHJlc3MsIHdvcmtlckluZGljZXNBZGRyZXNzLCBiaXREZXB0aHMubGVuZ3RoLCBiaXREZXB0aHNTdGFydEFkZHJlc3MsIGJpdERlcHRoc0FkZHJlc3MsIHdvcmtlck1ldGFzQWRkcmVzcywgd29ya2VyQmxvY2tzQWRkcmVzcywgd29ya2VyWEFkZHJlc3MgKyB4T2Zmc2V0LCB3b3JrZXJZQWRkcmVzcyk7CiAgICAgIGZyZWUoc2hhcGVBZGRyZXNzKTsKICAgICAgZnJlZShiaXREZXB0aHNTdGFydEFkZHJlc3MpOwogICAgICBmcmVlKGJpdERlcHRoc0FkZHJlc3MpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciB3ZWlnaHRCbG9ja01peGVkMTZ4OEZvcndhcmRNdWx0aXBsZSA9IGZ1bmN0aW9uIHdlaWdodEJsb2NrTWl4ZWQxNng4Rm9yd2FyZE11bHRpcGxlKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzMyA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczMuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMzLm1lbUFsbG9jLAogICAgICAgIG1lbW9yeSA9IF9kYXRhJGdsb2JhbHMzLm1lbW9yeTsKICAgICAgdmFyIHNoYXBlID0gZGF0YS5zaGFwZSwKICAgICAgICBpbmRpY2VzQWRkcmVzcyA9IGRhdGEuaW5kaWNlc0FkZHJlc3MsCiAgICAgICAgYml0RGVwdGhTdGFydHMgPSBkYXRhLmJpdERlcHRoU3RhcnRzLAogICAgICAgIGJpdERlcHRocyA9IGRhdGEuYml0RGVwdGhzLAogICAgICAgIG1ldGFzQWRkcmVzcyA9IGRhdGEubWV0YXNBZGRyZXNzLAogICAgICAgIGJsb2Nrc0FkZHJlc3MgPSBkYXRhLmJsb2Nrc0FkZHJlc3MsCiAgICAgICAgbiA9IGRhdGEubiwKICAgICAgICB4T2Zmc2V0ID0gZGF0YS54T2Zmc2V0LAogICAgICAgIHhBZGRyZXNzID0gZGF0YS54QWRkcmVzcywKICAgICAgICB5QWRkcmVzcyA9IGRhdGEueUFkZHJlc3M7CiAgICAgIHZhciBhbGlnbmVkX2FsbG9jID0gZXhwb3J0cy5hbGlnbmVkX2FsbG9jLAogICAgICAgIGZyZWUgPSBleHBvcnRzLmZyZWUsCiAgICAgICAgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9mb3J3YXJkX211bHRpcGxlID0gZXhwb3J0cy5wdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2ZvcndhcmRfbXVsdGlwbGU7CiAgICAgIGlmICghbWVtQWxsb2MuaGFzKG1ldGFzQWRkcmVzcykgfHwgIW1lbUFsbG9jLmhhcyhibG9ja3NBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKHhBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKHlBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKGluZGljZXNBZGRyZXNzKSkgewogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgY29tbWFuZDogJ29rJwogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgX21lbUFsbG9jJGdldDcgPSBtZW1BbGxvYy5nZXQoaW5kaWNlc0FkZHJlc3MpLAogICAgICAgIHdvcmtlckluZGljZXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDcud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ4ID0gbWVtQWxsb2MuZ2V0KG1ldGFzQWRkcmVzcyksCiAgICAgICAgd29ya2VyTWV0YXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDgud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ5ID0gbWVtQWxsb2MuZ2V0KGJsb2Nrc0FkZHJlc3MpLAogICAgICAgIHdvcmtlckJsb2Nrc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0OS53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDEwID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDExID0gbWVtQWxsb2MuZ2V0KHlBZGRyZXNzKSwKICAgICAgICB3b3JrZXJZQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMS53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgc2hhcGVBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogc2hhcGUubGVuZ3RoKTsKICAgICAgdmFyIGJpdERlcHRoc1N0YXJ0QWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIGJpdERlcHRoU3RhcnRzLmxlbmd0aCk7CiAgICAgIHZhciBiaXREZXB0aHNBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogYml0RGVwdGhzLmxlbmd0aCk7CiAgICAgIHZhciBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoc2hhcGUsIHNoYXBlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoYml0RGVwdGhTdGFydHMsIGJpdERlcHRoc1N0YXJ0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoYml0RGVwdGhzLCBiaXREZXB0aHNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfZm9yd2FyZF9tdWx0aXBsZShzaGFwZUFkZHJlc3MsIHdvcmtlckluZGljZXNBZGRyZXNzLCBiaXREZXB0aHMubGVuZ3RoLCBiaXREZXB0aHNTdGFydEFkZHJlc3MsIGJpdERlcHRoc0FkZHJlc3MsIHdvcmtlck1ldGFzQWRkcmVzcywgd29ya2VyQmxvY2tzQWRkcmVzcywgbiwgd29ya2VyWEFkZHJlc3MgKyB4T2Zmc2V0LCB3b3JrZXJZQWRkcmVzcyk7CiAgICAgIGZyZWUoc2hhcGVBZGRyZXNzKTsKICAgICAgZnJlZShiaXREZXB0aHNTdGFydEFkZHJlc3MpOwogICAgICBmcmVlKGJpdERlcHRoc0FkZHJlc3MpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciB3ZWlnaHRCbG9ja01peGVkMTZ4OEFkZEJpYXMgPSBmdW5jdGlvbiB3ZWlnaHRCbG9ja01peGVkMTZ4OEFkZEJpYXMoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHM0ID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzNC5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFsczQubWVtQWxsb2M7CiAgICAgIHZhciBuID0gZGF0YS5uLAogICAgICAgIGRpbWVuc2lvbiA9IGRhdGEuZGltZW5zaW9uLAogICAgICAgIHlBZGRyZXNzID0gZGF0YS55QWRkcmVzcywKICAgICAgICBiaWFzQWRkcmVzcyA9IGRhdGEuYmlhc0FkZHJlc3M7CiAgICAgIHZhciBmcmVlID0gZXhwb3J0cy5mcmVlLAogICAgICAgIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfYWRkX2JpYXMgPSBleHBvcnRzLnB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfYWRkX2JpYXM7CiAgICAgIGlmICghbWVtQWxsb2MuaGFzKHlBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKGJpYXNBZGRyZXNzKSkgewogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgY29tbWFuZDogJ29rJwogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgX21lbUFsbG9jJGdldDEyID0gbWVtQWxsb2MuZ2V0KHlBZGRyZXNzKSwKICAgICAgICB3b3JrZXJZQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMi53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDEzID0gbWVtQWxsb2MuZ2V0KGJpYXNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJCaWFzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMy53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2FkZF9iaWFzKG4sIGRpbWVuc2lvbiwgd29ya2VyWUFkZHJlc3MsIHdvcmtlckJpYXNBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgd2VpZ2h0RmxvYXRGb3J3YXJkID0gZnVuY3Rpb24gd2VpZ2h0RmxvYXRGb3J3YXJkKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzNSA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczUuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHM1Lm1lbUFsbG9jOwogICAgICB2YXIgbiA9IGRhdGEubiwKICAgICAgICBuYyA9IGRhdGEubmMsCiAgICAgICAgbnIgPSBkYXRhLm5yLAogICAgICAgIHdBZGRyZXNzID0gZGF0YS53QWRkcmVzcywKICAgICAgICB4T2Zmc2V0ID0gZGF0YS54T2Zmc2V0LAogICAgICAgIHhBZGRyZXNzID0gZGF0YS54QWRkcmVzcywKICAgICAgICB5QWRkcmVzcyA9IGRhdGEueUFkZHJlc3M7CiAgICAgIHZhciBwdl9waWNvbGxtX3dlaWdodF9mbG9hdF9mb3J3YXJkID0gZXhwb3J0cy5wdl9waWNvbGxtX3dlaWdodF9mbG9hdF9mb3J3YXJkOwogICAgICBpZiAoIW1lbUFsbG9jLmhhcyh3QWRkcmVzcykgfHwgIW1lbUFsbG9jLmhhcyh4QWRkcmVzcykgfHwgIW1lbUFsbG9jLmhhcyh5QWRkcmVzcykpIHsKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgICB9KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxNCA9IG1lbUFsbG9jLmdldCh3QWRkcmVzcyksCiAgICAgICAgd29ya2VyV0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTQud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxNSA9IG1lbUFsbG9jLmdldCh4QWRkcmVzcyksCiAgICAgICAgd29ya2VyWEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTUud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxNiA9IG1lbUFsbG9jLmdldCh5QWRkcmVzcyksCiAgICAgICAgd29ya2VyWUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTYud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV93ZWlnaHRfZmxvYXRfZm9yd2FyZChuLCBuYywgbnIsIHdvcmtlcldBZGRyZXNzLCB3b3JrZXJYQWRkcmVzcyArIHhPZmZzZXQsIHdvcmtlcllBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgcHZQaWNvbGxtV2VpZ2h0QWN0aW9uTWFwID0gX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uLldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X1BSRVBST0NFU1NfQkxPQ0tTLCB3ZWlnaHRCbG9ja01peGVkMTZ4OFByZXByb2Nlc3NCbG9ja3MpLCBQdlBpY29sbG1XZWlnaHRBY3Rpb24uV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfRk9SV0FSRF9TSU5HTEUsIHdlaWdodEJsb2NrTWl4ZWQxNng4Rm9yd2FyZFNpbmdsZSksIFB2UGljb2xsbVdlaWdodEFjdGlvbi5XRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9GT1JXQVJEX01VTFRJUExFLCB3ZWlnaHRCbG9ja01peGVkMTZ4OEZvcndhcmRNdWx0aXBsZSksIFB2UGljb2xsbVdlaWdodEFjdGlvbi5XRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9BRERfQklBUywgd2VpZ2h0QmxvY2tNaXhlZDE2eDhBZGRCaWFzKSwgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uLldFSUdIVF9GTE9BVF9GT1JXQVJELCB3ZWlnaHRGbG9hdEZvcndhcmQpOwoKICBmdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH0KICBmdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9CiAgdmFyIGV4cG9ydHMkMTsKICB2YXIgbWVtb3J5OwogIHZhciBtZW1BbGxvYyA9IG5ldyBNYXAoKTsKICBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChhcnJheUJ1ZmZlciwgaW5kZXhTdGFydCkgewogICAgdmFyIGluZGV4RW5kID0gaW5kZXhTdGFydDsKICAgIHdoaWxlIChhcnJheUJ1ZmZlcltpbmRleEVuZF0gIT09IDApIHsKICAgICAgaW5kZXhFbmQrKzsKICAgIH0KICAgIHZhciB1dGY4ZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKTsKICAgIHJldHVybiB1dGY4ZGVjb2Rlci5kZWNvZGUoYXJyYXlCdWZmZXIuc3ViYXJyYXkoaW5kZXhTdGFydCwgaW5kZXhFbmQpKTsKICB9CiAgdmFyIGdldFdhc20gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUod2FzbSkgewogICAgICB2YXIgcHZDb25zb2xlTG9nV2FzbSwgcHZBc3NlcnRXYXNtLCBwdlRpbWVXYXNtLCBwdkZpbGVPcGVuV2FzbSwgcHZGaWxlQ2xvc2VXYXNtLCBwdkZpbGVSZWFkV2FzbSwgcHZGaWxlV3JpdGVXYXNtLCBwdkZpbGVTZWVrV2FzbSwgcHZGaWxlVGVsbFdhc20sIHB2RmlsZVJlbW92ZVdhc20sIGluc3RhbmNlLCBhbGlnbmVkX2FsbG9jLCBhbGlnbmVkQWxsb2M7CiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHB2Q29uc29sZUxvZ1dhc20gPSBmdW5jdGlvbiBwdkNvbnNvbGVMb2dXYXNtKGluZGV4KSB7CiAgICAgICAgICAgICAgaW5kZXggPSB1bnNpZ25lZEFkZHJlc3MoaW5kZXgpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlCiAgICAgICAgICAgICAgY29uc29sZS5sb2coYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGluZGV4KSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2QXNzZXJ0V2FzbSA9IGZ1bmN0aW9uIHB2QXNzZXJ0V2FzbShleHByLCBsaW5lLCBmaWxlTmFtZUFkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlTmFtZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoZmlsZU5hbWVBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICBpZiAoZXhwciA9PT0gMCkgewogICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGZpbGVOYW1lQWRkcmVzcyk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImFzc2VydGlvbiBmYWlsZWQgYXQgbGluZSAiLmNvbmNhdChsaW5lLCAiIGluIFwiIikuY29uY2F0KGZpbGVOYW1lLCAiXCIiKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdlRpbWVXYXNtID0gZnVuY3Rpb24gcHZUaW1lV2FzbSgpIHsKICAgICAgICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCkgLyAxMDAwOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVPcGVuV2FzbSA9IGZ1bmN0aW9uIHB2RmlsZU9wZW5XYXNtKGZpbGVBZGRyZXNzLCBwYXRoQWRkcmVzcywgbW9kZUFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgcGF0aEFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MocGF0aEFkZHJlc3MpOwogICAgICAgICAgICAgIG1vZGVBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKG1vZGVBZGRyZXNzKTsKICAgICAgICAgICAgICBzdGF0dXNBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKHN0YXR1c0FkZHJlc3MpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIHZhciBwYXRoID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbW9kZSA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBtb2RlQWRkcmVzcyk7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gUHZGaWxlTWVtLm9wZW4ocGF0aCwgbW9kZSk7CiAgICAgICAgICAgICAgICBQdkZpbGVNZW0uc2V0UHRyKGZpbGVBZGRyZXNzLCBmaWxlKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVDbG9zZVdhc20gPSBmdW5jdGlvbiBwdkZpbGVDbG9zZVdhc20oZmlsZUFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgc3RhdHVzQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhzdGF0dXNBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVSZWFkV2FzbSA9IGZ1bmN0aW9uIHB2RmlsZVJlYWRXYXNtKGZpbGVBZGRyZXNzLCBjb250ZW50QWRkcmVzcywgc2l6ZSwgY291bnQsIG51bVJlYWRBZGRyZXNzKSB7CiAgICAgICAgICAgICAgZmlsZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgIGNvbnRlbnRBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKGNvbnRlbnRBZGRyZXNzKTsKICAgICAgICAgICAgICBudW1SZWFkQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhudW1SZWFkQWRkcmVzcyk7CiAgICAgICAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlckludDMyID0gbmV3IEludDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gUHZGaWxlTWVtLmdldFB0cihmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IGZpbGUucmVhZChzaXplLCBjb3VudCk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQoY29udGVudCwgY29udGVudEFkZHJlc3MpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtUmVhZEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGNvbnRlbnQubGVuZ3RoIC8gc2l6ZTsKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltudW1SZWFkQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVXcml0ZVdhc20gPSBmdW5jdGlvbiBwdkZpbGVXcml0ZVdhc20oZmlsZUFkZHJlc3MsIGNvbnRlbnRBZGRyZXNzLCBzaXplLCBjb3VudCwgbnVtV3JpdGVBZGRyZXNzKSB7CiAgICAgICAgICAgICAgZmlsZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgIGNvbnRlbnRBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKGNvbnRlbnRBZGRyZXNzKTsKICAgICAgICAgICAgICBudW1Xcml0ZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MobnVtV3JpdGVBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSAqIGNvdW50KTsKICAgICAgICAgICAgICAgIGNvbnRlbnQuc2V0KG1lbW9yeUJ1ZmZlclVpbnQ4LnNsaWNlKGNvbnRlbnRBZGRyZXNzLCBjb250ZW50QWRkcmVzcyArIHNpemUgKiBjb3VudCksIDApOwogICAgICAgICAgICAgICAgZmlsZS53cml0ZShjb250ZW50KTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW251bVdyaXRlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gY29udGVudC5sZW5ndGggLyBzaXplOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW251bVdyaXRlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2RmlsZVNlZWtXYXNtID0gZnVuY3Rpb24gcHZGaWxlU2Vla1dhc20oZmlsZUFkZHJlc3MsIG9mZnNldCwgd2hlbmNlLCBzdGF0dXNBZGRyZXNzKSB7CiAgICAgICAgICAgICAgZmlsZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgIHN0YXR1c0FkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3Moc3RhdHVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlckludDMyID0gbmV3IEludDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gUHZGaWxlTWVtLmdldFB0cihmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICBmaWxlLnNlZWsob2Zmc2V0LCB3aGVuY2UpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gMDsKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAtMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2RmlsZVRlbGxXYXNtID0gZnVuY3Rpb24gcHZGaWxlVGVsbFdhc20oZmlsZUFkZHJlc3MsIG9mZnNldEFkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgb2Zmc2V0QWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhvZmZzZXRBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW29mZnNldEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGZpbGUudGVsbCgpOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW29mZnNldEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZGaWxlUmVtb3ZlV2FzbSA9IGZ1bmN0aW9uIHB2RmlsZVJlbW92ZVdhc20ocGF0aEFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICBwYXRoQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhwYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgc3RhdHVzQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhzdGF0dXNBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB2YXIgcGF0aCA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBwYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gUHZGaWxlTWVtLm9wZW4ocGF0aCwgInciKTsKICAgICAgICAgICAgICAgIGZpbGUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyOwogICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUod2FzbSwgewogICAgICAgICAgICAgIHdhc2lfc25hcHNob3RfcHJldmlldzE6IHdhc2lfc25hcHNob3RfcHJldmlldzFfZW11bGF0b3IsCiAgICAgICAgICAgICAgZW52OiB7CiAgICAgICAgICAgICAgICBtZW1vcnk6IG1lbW9yeSwKICAgICAgICAgICAgICAgIHB2X2NvbnNvbGVfbG9nX3dhc206IHB2Q29uc29sZUxvZ1dhc20sCiAgICAgICAgICAgICAgICBwdl9hc3NlcnRfd2FzbTogcHZBc3NlcnRXYXNtLAogICAgICAgICAgICAgICAgcHZfdGltZV93YXNtOiBwdlRpbWVXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV9vcGVuX3dhc206IHB2RmlsZU9wZW5XYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV9jbG9zZV93YXNtOiBwdkZpbGVDbG9zZVdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3JlYWRfd2FzbTogcHZGaWxlUmVhZFdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3dyaXRlX3dhc206IHB2RmlsZVdyaXRlV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfc2Vla193YXNtOiBwdkZpbGVTZWVrV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfdGVsbF93YXNtOiBwdkZpbGVUZWxsV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfcmVtb3ZlX3dhc206IHB2RmlsZVJlbW92ZVdhc20KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgaW5zdGFuY2UgPSBfY29udGV4dC5zZW50Lmluc3RhbmNlOwogICAgICAgICAgICBhbGlnbmVkX2FsbG9jID0gaW5zdGFuY2UuZXhwb3J0cy5hbGlnbmVkX2FsbG9jOwogICAgICAgICAgICBhbGlnbmVkQWxsb2MgPSBmdW5jdGlvbiBhbGlnbmVkQWxsb2MoYWxpZ25tZW50LCBzaXplKSB7CiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lCiAgICAgICAgICAgICAgdmFyIHBvaW50ZXIgPSBhbGlnbmVkX2FsbG9jKGFsaWdubWVudCwgc2l6ZSk7CiAgICAgICAgICAgICAgaWYgKHBvaW50ZXIgPCAwKSB7CiAgICAgICAgICAgICAgICBwb2ludGVyID0gcG9pbnRlciA+Pj4gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHBvaW50ZXI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaW5zdGFuY2UuZXhwb3J0cyksIHt9LCB7CiAgICAgICAgICAgICAgYWxpZ25lZF9hbGxvYzogYWxpZ25lZEFsbG9jCiAgICAgICAgICAgIH0pKTsKICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZSk7CiAgICB9KSk7CiAgICByZXR1cm4gZnVuY3Rpb24gZ2V0V2FzbShfeCkgewogICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7CiAgdmFyIGluaXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMihkYXRhKSB7CiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDA7CiAgICAgICAgICAgIG1lbW9yeSA9IG5ldyBXZWJBc3NlbWJseS5NZW1vcnkoewogICAgICAgICAgICAgIGluaXRpYWw6IDQwOTYsCiAgICAgICAgICAgICAgbWF4aW11bTogNjU1MzYKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDsKICAgICAgICAgICAgcmV0dXJuIGdldFdhc20oZGF0YS53YXNtKTsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgZXhwb3J0cyQxID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDg7CiAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9jb250ZXh0MlsiY2F0Y2giXSgwKTsKICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICAgICAgICBtZXNzYWdlOiBfY29udGV4dDIudDAubWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUyLCBudWxsLCBbWzAsIDhdXSk7CiAgICB9KSk7CiAgICByZXR1cm4gZnVuY3Rpb24gaW5pdChfeDIpIHsKICAgICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKICB2YXIgYWxsb2NNZW0gPSBmdW5jdGlvbiBhbGxvY01lbShkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgc2l6ZSA9IGRhdGEuc2l6ZSwKICAgICAgICBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzOwogICAgICB2YXIgX2V4cG9ydHMgPSBleHBvcnRzJDEsCiAgICAgICAgX2FsaWduZWRfYWxsb2MgPSBfZXhwb3J0cy5hbGlnbmVkX2FsbG9jOwogICAgICBpZiAoc2l6ZSA+IDApIHsKICAgICAgICB2YXIgd29ya2VyTWVtQWRkcmVzcyA9IF9hbGlnbmVkX2FsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHNpemUgKiBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICBtZW1BbGxvYy5zZXQobWVtQWRkcmVzcywgewogICAgICAgICAgYWxsb2NTaXplOiBzaXplLAogICAgICAgICAgd29ya2VyTWVtQWRkcmVzczogd29ya2VyTWVtQWRkcmVzcwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIGZyZWVNZW0gPSBmdW5jdGlvbiBmcmVlTWVtKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzOwogICAgICB2YXIgX2V4cG9ydHMyID0gZXhwb3J0cyQxLAogICAgICAgIGZyZWUgPSBfZXhwb3J0czIuZnJlZTsKICAgICAgaWYgKG1lbUFsbG9jLmhhcyhtZW1BZGRyZXNzKSkgewogICAgICAgIHZhciBfbWVtQWxsb2MkZ2V0ID0gbWVtQWxsb2MuZ2V0KG1lbUFkZHJlc3MpLAogICAgICAgICAgd29ya2VyTWVtQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQud29ya2VyTWVtQWRkcmVzczsKICAgICAgICBmcmVlKHdvcmtlck1lbUFkZHJlc3MpOwogICAgICAgIG1lbUFsbG9jWyJkZWxldGUiXShtZW1BZGRyZXNzKTsKICAgICAgfQogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBjb3B5VG9YcHUgPSBmdW5jdGlvbiBjb3B5VG9YcHUoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIG1lbUFkZHJlc3MgPSBkYXRhLm1lbUFkZHJlc3MsCiAgICAgICAgb2Zmc2V0ID0gZGF0YS5vZmZzZXQsCiAgICAgICAgYnVmZmVyID0gZGF0YS5idWZmZXI7CiAgICAgIGlmIChtZW1BbGxvYy5oYXMobWVtQWRkcmVzcykpIHsKICAgICAgICB2YXIgX21lbUFsbG9jJGdldDIgPSBtZW1BbGxvYy5nZXQobWVtQWRkcmVzcyksCiAgICAgICAgICB3b3JrZXJNZW1BZGRyZXNzID0gX21lbUFsbG9jJGdldDIud29ya2VyTWVtQWRkcmVzczsKICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQoYnVmZmVyLCB3b3JrZXJNZW1BZGRyZXNzICsgb2Zmc2V0KTsKICAgICAgfQogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBjb3B5RnJvbVhwdSA9IGZ1bmN0aW9uIGNvcHlGcm9tWHB1KGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzLAogICAgICAgIG9mZnNldCA9IGRhdGEub2Zmc2V0LAogICAgICAgIHNpemUgPSBkYXRhLnNpemU7CiAgICAgIGlmIChtZW1BbGxvYy5oYXMobWVtQWRkcmVzcykpIHsKICAgICAgICB2YXIgX21lbUFsbG9jJGdldDMgPSBtZW1BbGxvYy5nZXQobWVtQWRkcmVzcyksCiAgICAgICAgICB3b3JrZXJNZW1BZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIGNvbW1hbmQ6ICdvaycsCiAgICAgICAgICByZXN1bHQ6IG1lbW9yeUJ1ZmZlclVpbnQ4LnNsaWNlKHdvcmtlck1lbUFkZHJlc3MgKyBvZmZzZXQsIHdvcmtlck1lbUFkZHJlc3MgKyBvZmZzZXQgKyBzaXplKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgY29tbWFuZDogJ29rJywKICAgICAgICAgIHJlc3VsdDogbmV3IFVpbnQ4QXJyYXkoMCkKICAgICAgICB9KTsKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBtZW1zZXQgPSBmdW5jdGlvbiBtZW1zZXQoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIG1lbUFkZHJlc3MgPSBkYXRhLm1lbUFkZHJlc3MsCiAgICAgICAgZmlsbEJ5dGUgPSBkYXRhLmZpbGxCeXRlLAogICAgICAgIHNpemUgPSBkYXRhLnNpemU7CiAgICAgIGlmIChtZW1BbGxvYy5oYXMobWVtQWRkcmVzcykpIHsKICAgICAgICB2YXIgX21lbUFsbG9jJGdldDQgPSBtZW1BbGxvYy5nZXQobWVtQWRkcmVzcyksCiAgICAgICAgICB3b3JrZXJNZW1BZGRyZXNzID0gX21lbUFsbG9jJGdldDQud29ya2VyTWVtQWRkcmVzczsKICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5maWxsKGZpbGxCeXRlLCB3b3JrZXJNZW1BZGRyZXNzLCB3b3JrZXJNZW1BZGRyZXNzICsgc2l6ZSk7CiAgICAgIH0KICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgdGltZXJTdGFydCA9IGZ1bmN0aW9uIHRpbWVyU3RhcnQoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIHdvcmtlckluZGV4ID0gZGF0YS53b3JrZXJJbmRleDsKICAgICAgdmFyIF9leHBvcnRzMyA9IGV4cG9ydHMkMSwKICAgICAgICBwdl9waWNvbGxtX3RpbWVyX3N0YXJ0X3dhc20gPSBfZXhwb3J0czMucHZfcGljb2xsbV90aW1lcl9zdGFydF93YXNtOwogICAgICBpZiAocHZfcGljb2xsbV90aW1lcl9zdGFydF93YXNtKSB7CiAgICAgICAgcHZfcGljb2xsbV90aW1lcl9zdGFydF93YXNtKHdvcmtlckluZGV4KTsKICAgICAgfQogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciB0aW1lclN0b3AgPSBmdW5jdGlvbiB0aW1lclN0b3AoKSB7CiAgICB0cnkgewogICAgICB2YXIgX2V4cG9ydHM0ID0gZXhwb3J0cyQxLAogICAgICAgIHB2X3BpY29sbG1fdGltZXJfc3RvcF93YXNtID0gX2V4cG9ydHM0LnB2X3BpY29sbG1fdGltZXJfc3RvcF93YXNtOwogICAgICBpZiAocHZfcGljb2xsbV90aW1lcl9zdG9wX3dhc20pIHsKICAgICAgICBwdl9waWNvbGxtX3RpbWVyX3N0b3Bfd2FzbSgpOwogICAgICB9CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIHhwdUFjdGlvbk1hcCA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFB2WHB1QWN0aW9uLklOSVQsIGluaXQpLCBQdlhwdUFjdGlvbi5BTExPQywgYWxsb2NNZW0pLCBQdlhwdUFjdGlvbi5GUkVFLCBmcmVlTWVtKSwgUHZYcHVBY3Rpb24uQ09QWV9UT19YUFUsIGNvcHlUb1hwdSksIFB2WHB1QWN0aW9uLkNPUFlfRlJPTV9YUFUsIGNvcHlGcm9tWHB1KSwgUHZYcHVBY3Rpb24uTUVNU0VULCBtZW1zZXQpLCBQdlhwdUFjdGlvbi5USU1FUl9TVEFSVCwgdGltZXJTdGFydCksIFB2WHB1QWN0aW9uLlRJTUVSX1NUT1AsIHRpbWVyU3RvcCksIHB2TXZtQWN0aW9uTWFwKSwgcHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uTWFwKSwgcHZQaWNvbGxtRmVlZEZvcndhcmRBY3Rpb25NYXApLCBwdlBpY29sbG1HYXRlQWN0aW9uTWFwKSwgcHZQaWNvbGxtTW9lVHJhbnNmb3JtZXJBY3Rpb25NYXApLCBwdlBpY29sbG1Ob3JtQWN0aW9uTWFwKSwgcHZQaWNvbGxtTm9ybUxheWVyQWN0aW9uTWFwKSwgcHZQaWNvbGxtVHJhbnNmb3JtZXJBY3Rpb25NYXApLCBwdlBpY29sbG1XZWlnaHRBY3Rpb25NYXApOwogIHNlbGYub25tZXNzYWdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmMyA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoZXZlbnQpIHsKICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGlmICghKGV2ZW50LmRhdGEuYWN0aW9uIGluIHhwdUFjdGlvbk1hcCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDY7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXZlbnQuZGF0YS5nbG9iYWxzID0gewogICAgICAgICAgICAgIGV4cG9ydHM6IGV4cG9ydHMkMSwKICAgICAgICAgICAgICBtZW1vcnk6IG1lbW9yeSwKICAgICAgICAgICAgICBtZW1BbGxvYzogbWVtQWxsb2MKICAgICAgICAgICAgfTsKICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA0OwogICAgICAgICAgICByZXR1cm4geHB1QWN0aW9uTWFwW2V2ZW50LmRhdGEuYWN0aW9uXShldmVudC5kYXRhKTsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA3OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2ZhaWxlZCcsCiAgICAgICAgICAgICAgbWVzc2FnZTogIlVucmVjb2duaXplZCBjb21tYW5kOiAiLmNvbmNhdChldmVudC5kYXRhLmFjdGlvbikKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUzKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiAoX3gzKSB7CiAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7Cgp9KSgpOwoK', null, false); +/* eslint-enable */ + +var PvXpuAction; +(function (PvXpuAction) { + PvXpuAction[PvXpuAction["INIT"] = 0] = "INIT"; + PvXpuAction[PvXpuAction["ALLOC"] = 1] = "ALLOC"; + PvXpuAction[PvXpuAction["FREE"] = 2] = "FREE"; + PvXpuAction[PvXpuAction["COPY_TO_XPU"] = 3] = "COPY_TO_XPU"; + PvXpuAction[PvXpuAction["COPY_FROM_XPU"] = 4] = "COPY_FROM_XPU"; + PvXpuAction[PvXpuAction["MEMSET"] = 5] = "MEMSET"; + PvXpuAction[PvXpuAction["TIMER_START"] = 6] = "TIMER_START"; + PvXpuAction[PvXpuAction["TIMER_STOP"] = 7] = "TIMER_STOP"; + // other xpu actions + PvXpuAction[PvXpuAction["MATRIX_VECTOR_MULTIPLY"] = 8] = "MATRIX_VECTOR_MULTIPLY"; + PvXpuAction[PvXpuAction["SYNC_VECTOR"] = 9] = "SYNC_VECTOR"; +})(PvXpuAction || (PvXpuAction = {})); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor); + } +} +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; +} + +function _createForOfIteratorHelper$1(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } +function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } +function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +var PvXpu = /*#__PURE__*/function () { + function PvXpu() { + _classCallCheck(this, PvXpu); + } + _createClass(PvXpu, null, [{ + key: "addXpu", + value: function addXpu(objAddress, data) { + PvXpu.xpuObjects.set(objAddress, data); + } + }, { + key: "getXpu", + value: function getXpu(objAddress) { + return PvXpu.xpuObjects.get(objAddress); + } + }, { + key: "hasXpu", + value: function hasXpu(objAddress) { + return PvXpu.xpuObjects.has(objAddress); + } + }, { + key: "removeXpu", + value: function removeXpu(objAddress) { + if (PvXpu.xpuObjects.has(objAddress)) { + var _PvXpu$xpuObjects$get = PvXpu.xpuObjects.get(objAddress), + deviceMem = _PvXpu$xpuObjects$get.deviceMem; + var _iterator = _createForOfIteratorHelper$1(deviceMem), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var memAddress = _step.value; + PvXpu.memoryObjects["delete"](memAddress); + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + PvXpu.xpuObjects["delete"](objAddress); + } + } + }, { + key: "addMemory", + value: function addMemory(memAddress, data) { + PvXpu.memoryObjects.set(memAddress, data); + PvXpu.xpuObjects.get(data.objAddress).deviceMem.add(memAddress); + } + }, { + key: "getMemory", + value: function getMemory(memAddress) { + return PvXpu.memoryObjects.get(memAddress); + } + }, { + key: "hasMemory", + value: function hasMemory(memAddress) { + return PvXpu.memoryObjects.has(memAddress); + } + }, { + key: "removeMemory", + value: function removeMemory(memAddress) { + if (PvXpu.hasMemory(memAddress)) { + PvXpu.xpuObjects.get(PvXpu.getMemory(memAddress).objAddress).deviceMem["delete"](memAddress); + } + PvXpu.memoryObjects["delete"](memAddress); + } + }]); + return PvXpu; +}(); +_defineProperty(PvXpu, "xpuObjects", new Map()); +_defineProperty(PvXpu, "memoryObjects", new Map()); +var waitForWorker = function waitForWorker(worker, command, options) { + worker.postMessage(command, options); + return new Promise(function (resolve, reject) { + worker.onmessage = function (e) { + switch (e.data.command) { + case "ok": + resolve(e.data.result); + break; + case "failed": + case "error": + reject(e.data.message); + break; + default: + reject("Unrecognized command: ".concat(e.data.command)); + } + }; + }); +}; + +var getMvmWasmFunctions = function getMvmWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvXpuMatrixVectorMultiply = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, matrixAddress, vectorAddress, m, n, resultAddress, statusAddress) { + var obj, matrixMem, numWorkers, chunkSize, remaining, workerResults, i, resultBuffer, results, _i, _i2; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 4; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 4: + matrixMem = PvXpu.getMemory(matrixAddress); + if (matrixMem) { + _context.next = 8; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 8: + numWorkers = obj.numWorkers; + chunkSize = matrixMem.chunkSize / (n / 2); + remaining = m; + workerResults = []; + i = 0; + case 13: + if (!(i < numWorkers)) { + _context.next = 21; + break; + } + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.MATRIX_VECTOR_MULTIPLY, + matrixAddress: matrixAddress, + vectorAddress: vectorAddress, + m: Math.min(remaining, chunkSize), + n: n, + resultAddress: resultAddress + })); + remaining -= chunkSize; + if (!(remaining <= 0)) { + _context.next = 18; + break; + } + return _context.abrupt("break", 21); + case 18: + i++; + _context.next = 13; + break; + case 21: + resultBuffer = new Float32Array(n); + _context.next = 24; + return Promise.all(workerResults); + case 24: + results = _context.sent; + for (_i = 0; _i < results.length; _i++) { + if (results[_i].length > 0) { + resultBuffer.set(results[_i], _i * chunkSize); + } + } + workerResults = []; + for (_i2 = 0; _i2 < numWorkers; _i2++) { + workerResults.push(waitForWorker(obj.workers[_i2], { + action: PvXpuAction.SYNC_VECTOR, + vectorAddress: resultAddress, + buffer: resultBuffer + })); + } + _context.next = 30; + return Promise.all(workerResults); + case 30: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvXpuMatrixVectorMultiply(_x, _x2, _x3, _x4, _x5, _x6, _x7) { + return _ref.apply(this, arguments); + }; + }(); + return { + pv_matrix_vector_multiply_web_worker_wasm: pvXpuMatrixVectorMultiply + }; +}; + +/* eslint camelcase: 0 */ +var PvPicollmAttentionAction; +(function (PvPicollmAttentionAction) { + PvPicollmAttentionAction[PvPicollmAttentionAction["ATTENTION_PRECOMPUTE_ENCODING"] = 200] = "ATTENTION_PRECOMPUTE_ENCODING"; + PvPicollmAttentionAction[PvPicollmAttentionAction["ATTENTION_ENCODE"] = 201] = "ATTENTION_ENCODE"; + PvPicollmAttentionAction[PvPicollmAttentionAction["ATTENTION_ATTEND"] = 202] = "ATTENTION_ATTEND"; + PvPicollmAttentionAction[PvPicollmAttentionAction["ATTENTION_UPDATE_KEYS"] = 203] = "ATTENTION_UPDATE_KEYS"; + PvPicollmAttentionAction[PvPicollmAttentionAction["ATTENTION_UPDATE_VALUES"] = 204] = "ATTENTION_UPDATE_VALUES"; + PvPicollmAttentionAction[PvPicollmAttentionAction["ATTENTION_TRANSPOSE_QUERY"] = 205] = "ATTENTION_TRANSPOSE_QUERY"; +})(PvPicollmAttentionAction || (PvPicollmAttentionAction = {})); + +var getPicollmAttentionWasmFunctions = function getPicollmAttentionWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmAttentionPrecomputeEncoding = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, encodingAddress, dimension, steps, theta, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + encodingAddress = unsignedAddress(encodingAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 7; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 7: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmAttentionAction.ATTENTION_PRECOMPUTE_ENCODING, + encodingAddress: encodingAddress, + dimension: dimension, + steps: steps, + theta: theta + })); + } + _context.next = 11; + return Promise.all(workerResults); + case 11: + setStatus(statusAddress, 0); + case 12: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmAttentionPrecomputeEncoding(_x, _x2, _x3, _x4, _x5, _x6) { + return _ref.apply(this, arguments); + }; + }(); + var pvPicollmAttentionEncode = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(objAddress, xAddress, newEncodingAddress, n, numHeads, ropeInterleaved, headDimension, ropeDimension, position, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + newEncodingAddress = unsignedAddress(newEncodingAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context2.next = 8; + break; + } + setStatus(statusAddress, -1); + return _context2.abrupt("return"); + case 8: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmAttentionAction.ATTENTION_ENCODE, + xAddress: xAddress, + newEncodingAddress: newEncodingAddress, + n: n, + numHeads: numHeads, + ropeInterleaved: ropeInterleaved, + headDimension: headDimension, + ropeDimension: ropeDimension, + position: position + })); + } + _context2.next = 12; + return Promise.all(workerResults); + case 12: + setStatus(statusAddress, 0); + case 13: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function pvPicollmAttentionEncode(_x7, _x8, _x9, _x10, _x11, _x12, _x13, _x14, _x15, _x16) { + return _ref2.apply(this, arguments); + }; + }(); + var pvPicollmAttentionAttend = /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(objAddress, numHeads, numKvHeads, windowLength, headDimension, keysAddress, keyInterceptsAddress, keySlopesAddress, valuesAddress, valueInterceptsAddress, valueSlopesAddress, position, queryAddress, n, outputAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + objAddress = unsignedAddress(objAddress); + keysAddress = unsignedAddress(keysAddress); + keyInterceptsAddress = unsignedAddress(keyInterceptsAddress); + keySlopesAddress = unsignedAddress(keySlopesAddress); + valuesAddress = unsignedAddress(valuesAddress); + valueInterceptsAddress = unsignedAddress(valueInterceptsAddress); + valueSlopesAddress = unsignedAddress(valueSlopesAddress); + queryAddress = unsignedAddress(queryAddress); + outputAddress = unsignedAddress(outputAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context3.next = 14; + break; + } + setStatus(statusAddress, -1); + return _context3.abrupt("return"); + case 14: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmAttentionAction.ATTENTION_ATTEND, + numHeads: numHeads, + numKvHeads: numKvHeads, + windowLength: windowLength, + headDimension: headDimension, + keysAddress: keysAddress, + keyInterceptsAddress: keyInterceptsAddress, + keySlopesAddress: keySlopesAddress, + valuesAddress: valuesAddress, + valueInterceptsAddress: valueInterceptsAddress, + valueSlopesAddress: valueSlopesAddress, + position: position, + queryAddress: queryAddress, + n: n, + outputAddress: outputAddress + })); + } + _context3.next = 18; + return Promise.all(workerResults); + case 18: + setStatus(statusAddress, 0); + case 19: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return function pvPicollmAttentionAttend(_x17, _x18, _x19, _x20, _x21, _x22, _x23, _x24, _x25, _x26, _x27, _x28, _x29, _x30, _x31, _x32) { + return _ref3.apply(this, arguments); + }; + }(); + var pvPicollmAttentionUpdateKeys = /*#__PURE__*/function () { + var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(objAddress, numKvHeads, windowLength, headDimension, keysAddress, keyInterceptsAddress, keySlopesAddress, position, n, tfAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + objAddress = unsignedAddress(objAddress); + keysAddress = unsignedAddress(keysAddress); + keyInterceptsAddress = unsignedAddress(keyInterceptsAddress); + keySlopesAddress = unsignedAddress(keySlopesAddress); + tfAddress = unsignedAddress(tfAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context4.next = 10; + break; + } + setStatus(statusAddress, -1); + return _context4.abrupt("return"); + case 10: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmAttentionAction.ATTENTION_UPDATE_KEYS, + numKvHeads: numKvHeads, + windowLength: windowLength, + headDimension: headDimension, + keysAddress: keysAddress, + keyInterceptsAddress: keyInterceptsAddress, + keySlopesAddress: keySlopesAddress, + position: position, + n: n, + tfAddress: tfAddress + })); + } + _context4.next = 14; + return Promise.all(workerResults); + case 14: + setStatus(statusAddress, 0); + case 15: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + return function pvPicollmAttentionUpdateKeys(_x33, _x34, _x35, _x36, _x37, _x38, _x39, _x40, _x41, _x42, _x43) { + return _ref4.apply(this, arguments); + }; + }(); + var pvPicollmAttentionUpdateValues = /*#__PURE__*/function () { + var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(objAddress, numKvHeads, windowLength, headDimension, valuesAddress, valueInterceptsAddress, valueSlopesAddress, position, n, tfAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) switch (_context5.prev = _context5.next) { + case 0: + objAddress = unsignedAddress(objAddress); + valuesAddress = unsignedAddress(valuesAddress); + valueInterceptsAddress = unsignedAddress(valueInterceptsAddress); + valueSlopesAddress = unsignedAddress(valueSlopesAddress); + tfAddress = unsignedAddress(tfAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context5.next = 10; + break; + } + setStatus(statusAddress, -1); + return _context5.abrupt("return"); + case 10: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmAttentionAction.ATTENTION_UPDATE_VALUES, + numKvHeads: numKvHeads, + windowLength: windowLength, + headDimension: headDimension, + valuesAddress: valuesAddress, + valueInterceptsAddress: valueInterceptsAddress, + valueSlopesAddress: valueSlopesAddress, + position: position, + n: n, + tfAddress: tfAddress + })); + } + _context5.next = 14; + return Promise.all(workerResults); + case 14: + setStatus(statusAddress, 0); + case 15: + case "end": + return _context5.stop(); + } + }, _callee5); + })); + return function pvPicollmAttentionUpdateValues(_x44, _x45, _x46, _x47, _x48, _x49, _x50, _x51, _x52, _x53, _x54) { + return _ref5.apply(this, arguments); + }; + }(); + var pvPicollmAttentionTransposeQuery = /*#__PURE__*/function () { + var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6(objAddress, n, tfAddress, hfAddress, numHeads, headDimension, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee6$(_context6) { + while (1) switch (_context6.prev = _context6.next) { + case 0: + objAddress = unsignedAddress(objAddress); + tfAddress = unsignedAddress(tfAddress); + hfAddress = unsignedAddress(hfAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context6.next = 7; + break; + } + return _context6.abrupt("return"); + case 7: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmAttentionAction.ATTENTION_TRANSPOSE_QUERY, + n: n, + tfAddress: tfAddress, + hfAddress: hfAddress, + numHeads: numHeads, + headDimension: headDimension + })); + } + _context6.next = 11; + return Promise.all(workerResults); + case 11: + setStatus(statusAddress, 0); + case 12: + case "end": + return _context6.stop(); + } + }, _callee6); + })); + return function pvPicollmAttentionTransposeQuery(_x55, _x56, _x57, _x58, _x59, _x60, _x61) { + return _ref6.apply(this, arguments); + }; + }(); + return { + pv_picollm_attention_precompute_encoding_web_worker_wasm: pvPicollmAttentionPrecomputeEncoding, + pv_picollm_attention_encode_web_worker_wasm: pvPicollmAttentionEncode, + pv_picollm_attention_attend_web_worker_wasm: pvPicollmAttentionAttend, + pv_picollm_attention_update_keys_web_worker_wasm: pvPicollmAttentionUpdateKeys, + pv_picollm_attention_update_values_web_worker_wasm: pvPicollmAttentionUpdateValues, + pv_picollm_attention_transpose_query_web_worker_wasm: pvPicollmAttentionTransposeQuery + }; +}; + +var attentionPrecomputeEncoding = function attentionPrecomputeEncoding(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var encodingAddress = data.encodingAddress, + dimension = data.dimension, + steps = data.steps, + theta = data.theta; + var pv_picollm_attention_precompute_encoding = exports.pv_picollm_attention_precompute_encoding; + var _memAlloc$get = memAlloc.get(encodingAddress), + workerEncodingAddress = _memAlloc$get.workerMemAddress; + pv_picollm_attention_precompute_encoding(workerEncodingAddress, dimension, steps, theta); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var attentionEncode = function attentionEncode(data) { + try { + var _data$globals2 = data.globals, + exports = _data$globals2.exports, + memAlloc = _data$globals2.memAlloc; + var xAddress = data.xAddress, + newEncodingAddress = data.newEncodingAddress, + n = data.n, + numHeads = data.numHeads, + ropeInterleaved = data.ropeInterleaved, + headDimension = data.headDimension, + ropeDimension = data.ropeDimension, + position = data.position; + var pv_picollm_attention_encode = exports.pv_picollm_attention_encode; + var _memAlloc$get2 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get2.workerMemAddress; + var _memAlloc$get3 = memAlloc.get(newEncodingAddress), + workerNewEncodingAddress = _memAlloc$get3.workerMemAddress; + pv_picollm_attention_encode(workerXAddress, workerNewEncodingAddress, n, numHeads, ropeInterleaved, headDimension, ropeDimension, position); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var attentionAttend = function attentionAttend(data) { + try { + var _data$globals3 = data.globals, + exports = _data$globals3.exports, + memAlloc = _data$globals3.memAlloc; + var numHeads = data.numHeads, + numKvHeads = data.numKvHeads, + windowLength = data.windowLength, + headDimension = data.headDimension, + keysAddress = data.keysAddress, + keyInterceptsAddress = data.keyInterceptsAddress, + keySlopesAddress = data.keySlopesAddress, + valuesAddress = data.valuesAddress, + valueInterceptsAddress = data.valueInterceptsAddress, + valueSlopesAddress = data.valueSlopesAddress, + position = data.position, + queryAddress = data.queryAddress, + n = data.n, + outputAddress = data.outputAddress; + var pv_picollm_attention_attend = exports.pv_picollm_attention_attend; + var _memAlloc$get4 = memAlloc.get(keysAddress), + workerKeysAddress = _memAlloc$get4.workerMemAddress; + var _memAlloc$get5 = memAlloc.get(keyInterceptsAddress), + workerKeyInterceptsAddress = _memAlloc$get5.workerMemAddress; + var _memAlloc$get6 = memAlloc.get(keySlopesAddress), + workerKeySlopesAddress = _memAlloc$get6.workerMemAddress; + var _memAlloc$get7 = memAlloc.get(valuesAddress), + workerValuesAddress = _memAlloc$get7.workerMemAddress; + var _memAlloc$get8 = memAlloc.get(valueInterceptsAddress), + workerValueInterceptsAddress = _memAlloc$get8.workerMemAddress; + var _memAlloc$get9 = memAlloc.get(valueSlopesAddress), + workerValueSlopesAddress = _memAlloc$get9.workerMemAddress; + var _memAlloc$get10 = memAlloc.get(queryAddress), + workerQueryAddress = _memAlloc$get10.workerMemAddress; + var _memAlloc$get11 = memAlloc.get(outputAddress), + workerOutputAddress = _memAlloc$get11.workerMemAddress; + pv_picollm_attention_attend(numHeads, numKvHeads, windowLength, headDimension, workerKeysAddress, workerKeyInterceptsAddress, workerKeySlopesAddress, workerValuesAddress, workerValueInterceptsAddress, workerValueSlopesAddress, position, workerQueryAddress, n, workerOutputAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var attentionUpdateKeys = function attentionUpdateKeys(data) { + try { + var _data$globals4 = data.globals, + exports = _data$globals4.exports, + memAlloc = _data$globals4.memAlloc; + var numKvHeads = data.numKvHeads, + windowLength = data.windowLength, + headDimension = data.headDimension, + keysAddress = data.keysAddress, + keyInterceptsAddress = data.keyInterceptsAddress, + keySlopesAddress = data.keySlopesAddress, + position = data.position, + n = data.n, + tfAddress = data.tfAddress; + var pv_picollm_attention_update_keys = exports.pv_picollm_attention_update_keys; + var _memAlloc$get12 = memAlloc.get(keysAddress), + workerKeysAddress = _memAlloc$get12.workerMemAddress; + var _memAlloc$get13 = memAlloc.get(keyInterceptsAddress), + workerKeyInterceptsAddress = _memAlloc$get13.workerMemAddress; + var _memAlloc$get14 = memAlloc.get(keySlopesAddress), + workerKeySlopesAddress = _memAlloc$get14.workerMemAddress; + var _memAlloc$get15 = memAlloc.get(tfAddress), + workerTfAddress = _memAlloc$get15.workerMemAddress; + pv_picollm_attention_update_keys(numKvHeads, windowLength, headDimension, workerKeysAddress, workerKeyInterceptsAddress, workerKeySlopesAddress, position, n, workerTfAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var attentionUpdateValues = function attentionUpdateValues(data) { + try { + var _data$globals5 = data.globals, + exports = _data$globals5.exports, + memAlloc = _data$globals5.memAlloc; + var numKvHeads = data.numKvHeads, + windowLength = data.windowLength, + headDimension = data.headDimension, + valuesAddress = data.valuesAddress, + valueInterceptsAddress = data.valueInterceptsAddress, + valueSlopesAddress = data.valueSlopesAddress, + position = data.position, + n = data.n, + tfAddress = data.tfAddress; + var pv_picollm_attention_update_values = exports.pv_picollm_attention_update_values; + var _memAlloc$get16 = memAlloc.get(valuesAddress), + workerValuesAddress = _memAlloc$get16.workerMemAddress; + var _memAlloc$get17 = memAlloc.get(valueInterceptsAddress), + workerValueInterceptsAddress = _memAlloc$get17.workerMemAddress; + var _memAlloc$get18 = memAlloc.get(valueSlopesAddress), + workerValueSlopesAddress = _memAlloc$get18.workerMemAddress; + var _memAlloc$get19 = memAlloc.get(tfAddress), + workerTfAddress = _memAlloc$get19.workerMemAddress; + pv_picollm_attention_update_values(numKvHeads, windowLength, headDimension, workerValuesAddress, workerValueInterceptsAddress, workerValueSlopesAddress, position, n, workerTfAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var attentionTransposeQuery = function attentionTransposeQuery(data) { + try { + var _data$globals6 = data.globals, + exports = _data$globals6.exports, + memAlloc = _data$globals6.memAlloc; + var n = data.n, + tfAddress = data.tfAddress, + hfAddress = data.hfAddress, + numHeads = data.numHeads, + headDimension = data.headDimension; + var pv_picollm_attention_transpose_query = exports.pv_picollm_attention_transpose_query; + var _memAlloc$get20 = memAlloc.get(tfAddress), + workerTfAddress = _memAlloc$get20.workerMemAddress; + var _memAlloc$get21 = memAlloc.get(hfAddress), + workerHfAddress = _memAlloc$get21.workerMemAddress; + pv_picollm_attention_transpose_query(n, workerTfAddress, workerHfAddress, numHeads, headDimension); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, PvPicollmAttentionAction.ATTENTION_PRECOMPUTE_ENCODING, attentionPrecomputeEncoding), PvPicollmAttentionAction.ATTENTION_ENCODE, attentionEncode), PvPicollmAttentionAction.ATTENTION_ATTEND, attentionAttend), PvPicollmAttentionAction.ATTENTION_UPDATE_KEYS, attentionUpdateKeys), PvPicollmAttentionAction.ATTENTION_UPDATE_VALUES, attentionUpdateValues), PvPicollmAttentionAction.ATTENTION_TRANSPOSE_QUERY, attentionTransposeQuery); + +/* eslint camelcase: 0 */ +var PvPicollmFeedForwardAction; +(function (PvPicollmFeedForwardAction) { + PvPicollmFeedForwardAction[PvPicollmFeedForwardAction["FEED_FORWARD_SILU"] = 300] = "FEED_FORWARD_SILU"; + PvPicollmFeedForwardAction[PvPicollmFeedForwardAction["FEED_FORWARD_GELU"] = 301] = "FEED_FORWARD_GELU"; + PvPicollmFeedForwardAction[PvPicollmFeedForwardAction["FEED_FORWARD_ALMOST_GELU"] = 302] = "FEED_FORWARD_ALMOST_GELU"; + PvPicollmFeedForwardAction[PvPicollmFeedForwardAction["FEED_FORWARD_MULTIPLY_BUFFERS"] = 303] = "FEED_FORWARD_MULTIPLY_BUFFERS"; +})(PvPicollmFeedForwardAction || (PvPicollmFeedForwardAction = {})); + +var getPicollmFeedForwardWasmFunctions = function getPicollmFeedForwardWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmFeedForwardSilu = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, n, xAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 7; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 7: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmFeedForwardAction.FEED_FORWARD_SILU, + n: n, + xAddress: xAddress + })); + } + _context.next = 11; + return Promise.all(workerResults); + case 11: + setStatus(statusAddress, 0); + case 12: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmFeedForwardSilu(_x, _x2, _x3, _x4) { + return _ref.apply(this, arguments); + }; + }(); + var pvPicollmFeedForwardGelu = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(objAddress, n, xAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context2.next = 7; + break; + } + setStatus(statusAddress, -1); + return _context2.abrupt("return"); + case 7: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmFeedForwardAction.FEED_FORWARD_GELU, + n: n, + xAddress: xAddress + })); + } + _context2.next = 11; + return Promise.all(workerResults); + case 11: + setStatus(statusAddress, 0); + case 12: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function pvPicollmFeedForwardGelu(_x5, _x6, _x7, _x8) { + return _ref2.apply(this, arguments); + }; + }(); + var pvPicollmFeedForwardAlmostGelu = /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(objAddress, n, xAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context3.next = 6; + break; + } + return _context3.abrupt("return"); + case 6: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmFeedForwardAction.FEED_FORWARD_ALMOST_GELU, + n: n, + xAddress: xAddress + })); + } + _context3.next = 10; + return Promise.all(workerResults); + case 10: + setStatus(statusAddress, 0); + case 11: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return function pvPicollmFeedForwardAlmostGelu(_x9, _x10, _x11, _x12) { + return _ref3.apply(this, arguments); + }; + }(); + var pvPicollmFeedForwardMultiplyBuffers = /*#__PURE__*/function () { + var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(objAddress, n, xAddress, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context4.next = 8; + break; + } + setStatus(statusAddress, -1); + return _context4.abrupt("return"); + case 8: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmFeedForwardAction.FEED_FORWARD_MULTIPLY_BUFFERS, + n: n, + xAddress: xAddress, + yAddress: yAddress + })); + } + _context4.next = 12; + return Promise.all(workerResults); + case 12: + setStatus(statusAddress, 0); + case 13: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + return function pvPicollmFeedForwardMultiplyBuffers(_x13, _x14, _x15, _x16, _x17) { + return _ref4.apply(this, arguments); + }; + }(); + return { + pv_picollm_feed_forward_silu_web_worker_wasm: pvPicollmFeedForwardSilu, + pv_picollm_feed_forward_gelu_web_worker_wasm: pvPicollmFeedForwardGelu, + pv_picollm_feed_forward_almost_gelu_web_worker_wasm: pvPicollmFeedForwardAlmostGelu, + pv_picollm_feed_forward_multiply_buffers_web_worker_wasm: pvPicollmFeedForwardMultiplyBuffers + }; +}; + +var feedForwardSilu = function feedForwardSilu(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var n = data.n, + xAddress = data.xAddress; + var pv_picollm_feed_forward_silu = exports.pv_picollm_feed_forward_silu; + var _memAlloc$get = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get.workerMemAddress; + pv_picollm_feed_forward_silu(n, workerXAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var feedForwardGelu = function feedForwardGelu(data) { + try { + var _data$globals2 = data.globals, + exports = _data$globals2.exports, + memAlloc = _data$globals2.memAlloc; + var n = data.n, + xAddress = data.xAddress; + var pv_picollm_feed_forward_gelu = exports.pv_picollm_feed_forward_gelu; + var _memAlloc$get2 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get2.workerMemAddress; + pv_picollm_feed_forward_gelu(n, workerXAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var feedForwardAlmostGelu = function feedForwardAlmostGelu(data) { + try { + var _data$globals3 = data.globals, + exports = _data$globals3.exports, + memAlloc = _data$globals3.memAlloc; + var n = data.n, + xAddress = data.xAddress; + var pv_picollm_feed_forward_almost_gelu = exports.pv_picollm_feed_forward_almost_gelu; + var _memAlloc$get3 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get3.workerMemAddress; + pv_picollm_feed_forward_almost_gelu(n, workerXAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var feedForwardMultiplyBuffers = function feedForwardMultiplyBuffers(data) { + try { + var _data$globals4 = data.globals, + exports = _data$globals4.exports, + memAlloc = _data$globals4.memAlloc; + var n = data.n, + xAddress = data.xAddress, + yAddress = data.yAddress; + var pv_picollm_feed_forward_multiply_buffers = exports.pv_picollm_feed_forward_multiply_buffers; + var _memAlloc$get4 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get4.workerMemAddress; + var _memAlloc$get5 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get5.workerMemAddress; + pv_picollm_feed_forward_multiply_buffers(n, workerXAddress, workerYAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, PvPicollmFeedForwardAction.FEED_FORWARD_SILU, feedForwardSilu), PvPicollmFeedForwardAction.FEED_FORWARD_GELU, feedForwardGelu), PvPicollmFeedForwardAction.FEED_FORWARD_ALMOST_GELU, feedForwardAlmostGelu), PvPicollmFeedForwardAction.FEED_FORWARD_MULTIPLY_BUFFERS, feedForwardMultiplyBuffers); + +/* eslint camelcase: 0 */ +var PvPicollmGateAction; +(function (PvPicollmGateAction) { + PvPicollmGateAction[PvPicollmGateAction["GATE_FORWARD"] = 400] = "GATE_FORWARD"; +})(PvPicollmGateAction || (PvPicollmGateAction = {})); + +var getPicollmGateWasmFunctions = function getPicollmGateWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmGateForward = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, n, k, numExperts, indicesAddress, weightsAddress, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + indicesAddress = unsignedAddress(indicesAddress); + weightsAddress = unsignedAddress(weightsAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 9; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 9: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmGateAction.GATE_FORWARD, + n: n, + k: k, + numExperts: numExperts, + indicesAddress: indicesAddress, + weightsAddress: weightsAddress, + yAddress: yAddress + })); + } + _context.next = 13; + return Promise.all(workerResults); + case 13: + setStatus(statusAddress, 0); + case 14: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmGateForward(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8) { + return _ref.apply(this, arguments); + }; + }(); + return { + pv_picollm_gate_forward_web_worker_wasm: pvPicollmGateForward + }; +}; + +var gateForward = function gateForward(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var n = data.n, + k = data.k, + numExperts = data.numExperts, + indicesAddress = data.indicesAddress, + weightsAddress = data.weightsAddress, + yAddress = data.yAddress; + var pv_picollm_gate_forward = exports.pv_picollm_gate_forward; + var _memAlloc$get = memAlloc.get(indicesAddress), + workerIndicesAddress = _memAlloc$get.workerMemAddress; + var _memAlloc$get2 = memAlloc.get(weightsAddress), + workerWeightsAddress = _memAlloc$get2.workerMemAddress; + var _memAlloc$get3 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get3.workerMemAddress; + pv_picollm_gate_forward(n, k, numExperts, workerIndicesAddress, workerWeightsAddress, workerYAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +_defineProperty({}, PvPicollmGateAction.GATE_FORWARD, gateForward); + +/* eslint camelcase: 0 */ +var PvPicollmMoeTransformerAction; +(function (PvPicollmMoeTransformerAction) { + PvPicollmMoeTransformerAction[PvPicollmMoeTransformerAction["ADD_TO_BUFFER"] = 500] = "ADD_TO_BUFFER"; + PvPicollmMoeTransformerAction[PvPicollmMoeTransformerAction["MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER"] = 501] = "MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER"; + PvPicollmMoeTransformerAction[PvPicollmMoeTransformerAction["ADD_BUFFERS"] = 502] = "ADD_BUFFERS"; +})(PvPicollmMoeTransformerAction || (PvPicollmMoeTransformerAction = {})); + +var getPicollmMoeTransformerWasmFunctions = function getPicollmMoeTransformerWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmMoeTransformerAddToBuffer = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, n, xAddress, bufferAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + bufferAddress = unsignedAddress(bufferAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 8; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 8: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmMoeTransformerAction.ADD_TO_BUFFER, + n: n, + xAddress: xAddress, + bufferAddress: bufferAddress + })); + } + _context.next = 12; + return Promise.all(workerResults); + case 12: + setStatus(statusAddress, 0); + case 13: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmMoeTransformerAddToBuffer(_x, _x2, _x3, _x4, _x5) { + return _ref.apply(this, arguments); + }; + }(); + var pvPicollmMoeTransformerMultipleWeightAndAddToBuffer = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(objAddress, n, weightsIndex, yIndex, weightsAddress, xAddress, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + objAddress = unsignedAddress(objAddress); + weightsAddress = unsignedAddress(weightsAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context2.next = 9; + break; + } + setStatus(statusAddress, -1); + return _context2.abrupt("return"); + case 9: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmMoeTransformerAction.MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER, + n: n, + weightsIndex: weightsIndex, + yIndex: yIndex, + weightsAddress: weightsAddress, + xAddress: xAddress, + yAddress: yAddress + })); + } + _context2.next = 13; + return Promise.all(workerResults); + case 13: + setStatus(statusAddress, 0); + case 14: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function pvPicollmMoeTransformerMultipleWeightAndAddToBuffer(_x6, _x7, _x8, _x9, _x10, _x11, _x12, _x13) { + return _ref2.apply(this, arguments); + }; + }(); + var pvPicollmMoeTransformerAddBuffers = /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(objAddress, n, buffer1Address, buffer2Address, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + objAddress = unsignedAddress(objAddress); + buffer1Address = unsignedAddress(buffer1Address); + buffer2Address = unsignedAddress(buffer2Address); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context3.next = 9; + break; + } + setStatus(statusAddress, -1); + return _context3.abrupt("return"); + case 9: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmMoeTransformerAction.ADD_BUFFERS, + n: n, + buffer1Address: buffer1Address, + buffer2Address: buffer2Address, + yAddress: yAddress + })); + } + _context3.next = 13; + return Promise.all(workerResults); + case 13: + setStatus(statusAddress, 0); + case 14: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return function pvPicollmMoeTransformerAddBuffers(_x14, _x15, _x16, _x17, _x18, _x19) { + return _ref3.apply(this, arguments); + }; + }(); + return { + pv_picollm_moe_transformer_add_to_buffer_web_worker_wasm: pvPicollmMoeTransformerAddToBuffer, + pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer_web_worker_wasm: pvPicollmMoeTransformerMultipleWeightAndAddToBuffer, + pv_picollm_moe_transformer_add_buffers_web_worker_wasm: pvPicollmMoeTransformerAddBuffers + }; +}; + +var moeTransformerAddToBuffer = function moeTransformerAddToBuffer(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var n = data.n, + xAddress = data.xAddress, + bufferAddress = data.bufferAddress; + var pv_picollm_moe_transformer_add_to_buffer = exports.pv_picollm_moe_transformer_add_to_buffer; + var _memAlloc$get = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get.workerMemAddress; + var _memAlloc$get2 = memAlloc.get(bufferAddress), + workerBufferAddress = _memAlloc$get2.workerMemAddress; + pv_picollm_moe_transformer_add_to_buffer(n, workerXAddress, workerBufferAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var moeTransformerMultiplyWeightAndAddToBuffer = function moeTransformerMultiplyWeightAndAddToBuffer(data) { + try { + var _data$globals2 = data.globals, + exports = _data$globals2.exports, + memAlloc = _data$globals2.memAlloc; + var n = data.n, + weightsIndex = data.weightsIndex, + yIndex = data.yIndex, + weightsAddress = data.weightsAddress, + xAddress = data.xAddress, + yAddress = data.yAddress; + var pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer = exports.pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer; + var _memAlloc$get3 = memAlloc.get(weightsAddress), + workerWeightsAddress = _memAlloc$get3.workerMemAddress; + var _memAlloc$get4 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get4.workerMemAddress; + var _memAlloc$get5 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get5.workerMemAddress; + pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer(n, weightsIndex, yIndex, workerWeightsAddress, workerXAddress, workerYAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var moeTransformerAddBuffers = function moeTransformerAddBuffers(data) { + try { + var _data$globals3 = data.globals, + exports = _data$globals3.exports, + memAlloc = _data$globals3.memAlloc; + var n = data.n, + buffer1Address = data.buffer1Address, + buffer2Address = data.buffer2Address, + yAddress = data.yAddress; + var pv_picollm_moe_transformer_add_buffers = exports.pv_picollm_moe_transformer_add_buffers; + var _memAlloc$get6 = memAlloc.get(buffer1Address), + workerBuffer1Address = _memAlloc$get6.workerMemAddress; + var _memAlloc$get7 = memAlloc.get(buffer2Address), + workerBuffer2Address = _memAlloc$get7.workerMemAddress; + var _memAlloc$get8 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get8.workerMemAddress; + pv_picollm_moe_transformer_add_buffers(n, workerBuffer1Address, workerBuffer2Address, workerYAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +_defineProperty(_defineProperty(_defineProperty({}, PvPicollmMoeTransformerAction.ADD_TO_BUFFER, moeTransformerAddToBuffer), PvPicollmMoeTransformerAction.MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER, moeTransformerMultiplyWeightAndAddToBuffer), PvPicollmMoeTransformerAction.ADD_BUFFERS, moeTransformerAddBuffers); + +/* eslint camelcase: 0 */ +var PvPicollmNormAction; +(function (PvPicollmNormAction) { + PvPicollmNormAction[PvPicollmNormAction["NORM_FORWARD"] = 600] = "NORM_FORWARD"; +})(PvPicollmNormAction || (PvPicollmNormAction = {})); + +var getPicollmNormWasmFunctions = function getPicollmNormWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmNormForward = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, dimension, eps, weightAddress, n, xOffset, xAddress, yOffset, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + weightAddress = unsignedAddress(weightAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 9; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 9: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmNormAction.NORM_FORWARD, + dimension: dimension, + eps: eps, + weightAddress: weightAddress, + n: n, + xOffset: xOffset, + xAddress: xAddress, + yOffset: yOffset, + yAddress: yAddress + })); + } + _context.next = 13; + return Promise.all(workerResults); + case 13: + setStatus(statusAddress, 0); + case 14: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmNormForward(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9, _x10) { + return _ref.apply(this, arguments); + }; + }(); + return { + pv_picollm_norm_forward_web_worker_wasm: pvPicollmNormForward + }; +}; + +var normForward = function normForward(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var dimension = data.dimension, + eps = data.eps, + weightAddress = data.weightAddress, + n = data.n, + xOffset = data.xOffset, + xAddress = data.xAddress, + yOffset = data.yOffset, + yAddress = data.yAddress; + var pv_picollm_norm_forward = exports.pv_picollm_norm_forward; + var _memAlloc$get = memAlloc.get(weightAddress), + workerWeightAddress = _memAlloc$get.workerMemAddress; + var _memAlloc$get2 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get2.workerMemAddress; + var _memAlloc$get3 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get3.workerMemAddress; + pv_picollm_norm_forward(dimension, eps, workerWeightAddress, n, workerXAddress + xOffset, workerYAddress + yOffset); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +_defineProperty({}, PvPicollmNormAction.NORM_FORWARD, normForward); + +/* eslint camelcase: 0 */ +var PvPicollmNormLayerAction; +(function (PvPicollmNormLayerAction) { + PvPicollmNormLayerAction[PvPicollmNormLayerAction["NORM_LAYER_FORWARD"] = 800] = "NORM_LAYER_FORWARD"; +})(PvPicollmNormLayerAction || (PvPicollmNormLayerAction = {})); + +var getPicollmNormLayerWasmFunctions = function getPicollmNormLayerWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmNormLayerForward = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, dimension, eps, weightAddress, biasAddress, n, xOffset, xAddress, yOffset, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + weightAddress = unsignedAddress(weightAddress); + biasAddress = unsignedAddress(biasAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 10; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 10: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmNormLayerAction.NORM_LAYER_FORWARD, + dimension: dimension, + eps: eps, + weightAddress: weightAddress, + biasAddress: biasAddress, + n: n, + xOffset: xOffset, + xAddress: xAddress, + yOffset: yOffset, + yAddress: yAddress + })); + } + _context.next = 14; + return Promise.all(workerResults); + case 14: + setStatus(statusAddress, 0); + case 15: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmNormLayerForward(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9, _x10, _x11) { + return _ref.apply(this, arguments); + }; + }(); + return { + pv_picollm_norm_layer_forward_web_worker_wasm: pvPicollmNormLayerForward + }; +}; + +var normLayerForward = function normLayerForward(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var dimension = data.dimension, + eps = data.eps, + weightAddress = data.weightAddress, + biasAddress = data.biasAddress, + n = data.n, + xOffset = data.xOffset, + xAddress = data.xAddress, + yOffset = data.yOffset, + yAddress = data.yAddress; + var pv_picollm_norm_layer_forward = exports.pv_picollm_norm_layer_forward; + var _memAlloc$get = memAlloc.get(weightAddress), + workerWeightAddress = _memAlloc$get.workerMemAddress; + var _memAlloc$get2 = memAlloc.get(biasAddress), + workerBiasAddress = _memAlloc$get2.workerMemAddress; + var _memAlloc$get3 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get3.workerMemAddress; + var _memAlloc$get4 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get4.workerMemAddress; + pv_picollm_norm_layer_forward(dimension, eps, workerWeightAddress, workerBiasAddress, n, workerXAddress + xOffset, workerYAddress + yOffset); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +_defineProperty({}, PvPicollmNormLayerAction.NORM_LAYER_FORWARD, normLayerForward); + +/* eslint camelcase: 0 */ +var PvPicollmTransformerAction; +(function (PvPicollmTransformerAction) { + PvPicollmTransformerAction[PvPicollmTransformerAction["ADD_TO_BUFFER"] = 700] = "ADD_TO_BUFFER"; + PvPicollmTransformerAction[PvPicollmTransformerAction["ADD_BUFFERS"] = 701] = "ADD_BUFFERS"; +})(PvPicollmTransformerAction || (PvPicollmTransformerAction = {})); + +var getPicollmTransformerWasmFunctions = function getPicollmTransformerWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmTransformerAddToBuffer = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, n, xAddress, bufferAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + bufferAddress = unsignedAddress(bufferAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 8; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 8: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmTransformerAction.ADD_TO_BUFFER, + n: n, + xAddress: xAddress, + bufferAddress: bufferAddress + })); + } + _context.next = 12; + return Promise.all(workerResults); + case 12: + setStatus(statusAddress, 0); + case 13: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmTransformerAddToBuffer(_x, _x2, _x3, _x4, _x5) { + return _ref.apply(this, arguments); + }; + }(); + var pvPicollmTransformerAddBuffers = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(objAddress, n, buffer1Address, buffer2Address, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + objAddress = unsignedAddress(objAddress); + buffer1Address = unsignedAddress(buffer1Address); + buffer2Address = unsignedAddress(buffer2Address); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context2.next = 9; + break; + } + setStatus(statusAddress, -1); + return _context2.abrupt("return"); + case 9: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmTransformerAction.ADD_BUFFERS, + n: n, + buffer1Address: buffer1Address, + buffer2Address: buffer2Address, + yAddress: yAddress + })); + } + _context2.next = 13; + return Promise.all(workerResults); + case 13: + setStatus(statusAddress, 0); + case 14: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function pvPicollmTransformerAddBuffers(_x6, _x7, _x8, _x9, _x10, _x11) { + return _ref2.apply(this, arguments); + }; + }(); + return { + pv_picollm_transformer_add_to_buffer_web_worker_wasm: pvPicollmTransformerAddToBuffer, + pv_picollm_transformer_add_buffers_web_worker_wasm: pvPicollmTransformerAddBuffers + }; +}; + +var transformerAddToBuffer = function transformerAddToBuffer(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var n = data.n, + xAddress = data.xAddress, + bufferAddress = data.bufferAddress; + var pv_picollm_transformer_add_to_buffer = exports.pv_picollm_transformer_add_to_buffer; + var _memAlloc$get = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get.workerMemAddress; + var _memAlloc$get2 = memAlloc.get(bufferAddress), + workerBufferAddress = _memAlloc$get2.workerMemAddress; + pv_picollm_transformer_add_to_buffer(n, workerXAddress, workerBufferAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var transformerAddBuffers = function transformerAddBuffers(data) { + try { + var _data$globals2 = data.globals, + exports = _data$globals2.exports, + memAlloc = _data$globals2.memAlloc; + var n = data.n, + buffer1Address = data.buffer1Address, + buffer2Address = data.buffer2Address, + yAddress = data.yAddress; + var pv_picollm_transformer_add_buffers = exports.pv_picollm_transformer_add_buffers; + var _memAlloc$get3 = memAlloc.get(buffer1Address), + workerBuffer1Address = _memAlloc$get3.workerMemAddress; + var _memAlloc$get4 = memAlloc.get(buffer2Address), + workerBuffer2Address = _memAlloc$get4.workerMemAddress; + var _memAlloc$get5 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get5.workerMemAddress; + pv_picollm_transformer_add_buffers(n, workerBuffer1Address, workerBuffer2Address, workerYAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +_defineProperty(_defineProperty({}, PvPicollmTransformerAction.ADD_TO_BUFFER, transformerAddToBuffer), PvPicollmTransformerAction.ADD_BUFFERS, transformerAddBuffers); + +/* eslint camelcase: 0 */ +var PvPicollmWeightAction; +(function (PvPicollmWeightAction) { + PvPicollmWeightAction[PvPicollmWeightAction["WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS"] = 100] = "WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS"; + PvPicollmWeightAction[PvPicollmWeightAction["WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE"] = 101] = "WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE"; + PvPicollmWeightAction[PvPicollmWeightAction["WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE"] = 102] = "WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE"; + PvPicollmWeightAction[PvPicollmWeightAction["WEIGHT_BLOCK_MIXED_16X8_ADD_BIAS"] = 103] = "WEIGHT_BLOCK_MIXED_16X8_ADD_BIAS"; + PvPicollmWeightAction[PvPicollmWeightAction["WEIGHT_FLOAT_FORWARD"] = 104] = "WEIGHT_FLOAT_FORWARD"; +})(PvPicollmWeightAction || (PvPicollmWeightAction = {})); + +var getPicollmWeightWasmFunctions = function getPicollmWeightWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmWeightBlockMixed16x8PreprocessBlocks = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, shapeAddress, numBitDepths, bitDepthsAddress, bitDepthsStartAddress, numBlockBytes, blocksAddress, statusAddress) { + var obj, memoryBufferInt32, shape, bitDepths, bitDepthStarts, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + shapeAddress = unsignedAddress(shapeAddress); + bitDepthsAddress = unsignedAddress(bitDepthsAddress); + bitDepthsStartAddress = unsignedAddress(bitDepthsStartAddress); + blocksAddress = unsignedAddress(blocksAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 10; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 10: + memoryBufferInt32 = new Int32Array(memory.buffer); + shape = memoryBufferInt32.slice(shapeAddress / Int32Array.BYTES_PER_ELEMENT, shapeAddress / Int32Array.BYTES_PER_ELEMENT + 2); + bitDepths = memoryBufferInt32.slice(bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT, bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT + numBitDepths); + bitDepthStarts = memoryBufferInt32.slice(bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT, bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT + numBitDepths); + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS, + shape: shape, + bitDepths: bitDepths, + bitDepthStarts: bitDepthStarts, + numBlockBytes: numBlockBytes, + blocksAddress: blocksAddress + })); + } + _context.next = 18; + return Promise.all(workerResults); + case 18: + setStatus(statusAddress, 0); + case 19: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmWeightBlockMixed16x8PreprocessBlocks(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8) { + return _ref.apply(this, arguments); + }; + }(); + var pvPicollmWeightBlockMixed16x8ForwardSingle = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(objAddress, shapeAddress, indicesAddress, numBitDepths, bitDepthsStartAddress, bitDepthsAddress, numMetas, metasAddress, numBlockBytes, blocksAddress, xOffset, xAddress, yAddress, statusAddress) { + var obj, memoryBufferInt32, shape, bitDepthStarts, bitDepths, workerResults, i; + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + objAddress = unsignedAddress(objAddress); + shapeAddress = unsignedAddress(shapeAddress); + indicesAddress = unsignedAddress(indicesAddress); + bitDepthsStartAddress = unsignedAddress(bitDepthsStartAddress); + bitDepthsAddress = unsignedAddress(bitDepthsAddress); + metasAddress = unsignedAddress(metasAddress); + blocksAddress = unsignedAddress(blocksAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context2.next = 14; + break; + } + setStatus(statusAddress, -1); + return _context2.abrupt("return"); + case 14: + memoryBufferInt32 = new Int32Array(memory.buffer); + shape = memoryBufferInt32.slice(shapeAddress / Int32Array.BYTES_PER_ELEMENT, shapeAddress / Int32Array.BYTES_PER_ELEMENT + 2); + bitDepthStarts = memoryBufferInt32.slice(bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT, bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT + numBitDepths); + bitDepths = memoryBufferInt32.slice(bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT, bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT + numBitDepths); + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE, + shape: shape, + indicesAddress: indicesAddress, + bitDepthStarts: bitDepthStarts, + bitDepths: bitDepths, + numMetas: numMetas, + metasAddress: metasAddress, + numBlockBytes: numBlockBytes, + blocksAddress: blocksAddress, + xOffset: xOffset, + xAddress: xAddress, + yAddress: yAddress + })); + } + _context2.next = 22; + return Promise.all(workerResults); + case 22: + setStatus(statusAddress, 0); + case 23: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function pvPicollmWeightBlockMixed16x8ForwardSingle(_x9, _x10, _x11, _x12, _x13, _x14, _x15, _x16, _x17, _x18, _x19, _x20, _x21, _x22) { + return _ref2.apply(this, arguments); + }; + }(); + var pvPicollmWeightBlockMixed16x8ForwardMultiple = /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(objAddress, shapeAddress, indicesAddress, numBitDepths, bitDepthsStartAddress, bitDepthsAddress, numMetas, metasAddress, numBlockBytes, blocksAddress, n, xOffset, xAddress, yAddress, statusAddress) { + var obj, memoryBufferInt32, shape, bitDepthStarts, bitDepths, workerResults, i; + return _regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + objAddress = unsignedAddress(objAddress); + shapeAddress = unsignedAddress(shapeAddress); + indicesAddress = unsignedAddress(indicesAddress); + bitDepthsStartAddress = unsignedAddress(bitDepthsStartAddress); + bitDepthsAddress = unsignedAddress(bitDepthsAddress); + metasAddress = unsignedAddress(metasAddress); + blocksAddress = unsignedAddress(blocksAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context3.next = 14; + break; + } + setStatus(statusAddress, -1); + return _context3.abrupt("return"); + case 14: + memoryBufferInt32 = new Int32Array(memory.buffer); + shape = memoryBufferInt32.slice(shapeAddress / Int32Array.BYTES_PER_ELEMENT, shapeAddress / Int32Array.BYTES_PER_ELEMENT + 2); + bitDepthStarts = memoryBufferInt32.slice(bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT, bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT + numBitDepths); + bitDepths = memoryBufferInt32.slice(bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT, bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT + numBitDepths); + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE, + shape: shape, + indicesAddress: indicesAddress, + bitDepthStarts: bitDepthStarts, + bitDepths: bitDepths, + numMetas: numMetas, + metasAddress: metasAddress, + numBlockBytes: numBlockBytes, + blocksAddress: blocksAddress, + n: n, + xOffset: xOffset, + xAddress: xAddress, + yAddress: yAddress + })); + } + _context3.next = 22; + return Promise.all(workerResults); + case 22: + setStatus(statusAddress, 0); + case 23: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return function pvPicollmWeightBlockMixed16x8ForwardMultiple(_x23, _x24, _x25, _x26, _x27, _x28, _x29, _x30, _x31, _x32, _x33, _x34, _x35, _x36, _x37) { + return _ref3.apply(this, arguments); + }; + }(); + var pvPicollmWeightBlockMixed16x8AddBias = /*#__PURE__*/function () { + var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(objAddress, n, dimension, yAddress, biasAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + objAddress = unsignedAddress(objAddress); + yAddress = unsignedAddress(yAddress); + biasAddress = unsignedAddress(biasAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context4.next = 8; + break; + } + setStatus(statusAddress, -1); + return _context4.abrupt("return"); + case 8: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_ADD_BIAS, + n: n, + dimension: dimension, + yAddress: yAddress, + biasAddress: biasAddress + })); + } + _context4.next = 12; + return Promise.all(workerResults); + case 12: + setStatus(statusAddress, 0); + case 13: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + return function pvPicollmWeightBlockMixed16x8AddBias(_x38, _x39, _x40, _x41, _x42, _x43) { + return _ref4.apply(this, arguments); + }; + }(); + var pvPicollmWeightFloatForward = /*#__PURE__*/function () { + var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(objAddress, n, nc, nr, wAddress, xOffset, xAddress, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) switch (_context5.prev = _context5.next) { + case 0: + objAddress = unsignedAddress(objAddress); + wAddress = unsignedAddress(wAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context5.next = 9; + break; + } + setStatus(statusAddress, -1); + return _context5.abrupt("return"); + case 9: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmWeightAction.WEIGHT_FLOAT_FORWARD, + n: n, + nc: nc, + nr: nr, + wAddress: wAddress, + xOffset: xOffset, + xAddress: xAddress, + yAddress: yAddress + })); + } + _context5.next = 13; + return Promise.all(workerResults); + case 13: + setStatus(statusAddress, 0); + case 14: + case "end": + return _context5.stop(); + } + }, _callee5); + })); + return function pvPicollmWeightFloatForward(_x44, _x45, _x46, _x47, _x48, _x49, _x50, _x51, _x52) { + return _ref5.apply(this, arguments); + }; + }(); + return { + pv_picollm_weight_block_mixed_16x8_preprocess_blocks_web_worker_wasm: pvPicollmWeightBlockMixed16x8PreprocessBlocks, + pv_picollm_weight_block_mixed_16x8_forward_single_web_worker_wasm: pvPicollmWeightBlockMixed16x8ForwardSingle, + pv_picollm_weight_block_mixed_16x8_forward_multiple_web_worker_wasm: pvPicollmWeightBlockMixed16x8ForwardMultiple, + pv_picollm_weight_block_mixed_16x8_add_bias_web_worker_wasm: pvPicollmWeightBlockMixed16x8AddBias, + pv_picollm_weight_float_forward_web_worker_wasm: pvPicollmWeightFloatForward + }; +}; + +var weightBlockMixed16x8PreprocessBlocks = function weightBlockMixed16x8PreprocessBlocks(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc, + memory = _data$globals.memory; + var shape = data.shape, + bitDepths = data.bitDepths, + bitDepthStarts = data.bitDepthStarts, + blocksAddress = data.blocksAddress; + var aligned_alloc = exports.aligned_alloc, + free = exports.free, + pv_picollm_weight_block_mixed_16x8_preprocess_blocks = exports.pv_picollm_weight_block_mixed_16x8_preprocess_blocks; + if (!memAlloc.has(blocksAddress)) { + self.postMessage({ + command: 'ok' + }); + return; + } + var _memAlloc$get = memAlloc.get(blocksAddress), + workerBlocksAddress = _memAlloc$get.workerMemAddress; + var shapeAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * shape.length); + var bitDepthsAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * bitDepths.length); + var bitDepthsStartAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * bitDepthStarts.length); + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32.set(shape, shapeAddress / Int32Array.BYTES_PER_ELEMENT); + memoryBufferInt32.set(bitDepths, bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT); + memoryBufferInt32.set(bitDepthStarts, bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT); + pv_picollm_weight_block_mixed_16x8_preprocess_blocks(shapeAddress, bitDepths.length, bitDepthsAddress, bitDepthsStartAddress, workerBlocksAddress); + free(shapeAddress); + free(bitDepthsAddress); + free(bitDepthsStartAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var weightBlockMixed16x8ForwardSingle = function weightBlockMixed16x8ForwardSingle(data) { + try { + var _data$globals2 = data.globals, + exports = _data$globals2.exports, + memAlloc = _data$globals2.memAlloc, + memory = _data$globals2.memory; + var shape = data.shape, + indicesAddress = data.indicesAddress, + bitDepthStarts = data.bitDepthStarts, + bitDepths = data.bitDepths, + metasAddress = data.metasAddress, + blocksAddress = data.blocksAddress, + xOffset = data.xOffset, + xAddress = data.xAddress, + yAddress = data.yAddress; + var aligned_alloc = exports.aligned_alloc, + free = exports.free, + pv_picollm_weight_block_mixed_16x8_forward_single = exports.pv_picollm_weight_block_mixed_16x8_forward_single; + if (!memAlloc.has(metasAddress) || !memAlloc.has(blocksAddress) || !memAlloc.has(xAddress) || !memAlloc.has(yAddress) || !memAlloc.has(indicesAddress)) { + self.postMessage({ + command: 'ok' + }); + return; + } + var _memAlloc$get2 = memAlloc.get(indicesAddress), + workerIndicesAddress = _memAlloc$get2.workerMemAddress; + var _memAlloc$get3 = memAlloc.get(metasAddress), + workerMetasAddress = _memAlloc$get3.workerMemAddress; + var _memAlloc$get4 = memAlloc.get(blocksAddress), + workerBlocksAddress = _memAlloc$get4.workerMemAddress; + var _memAlloc$get5 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get5.workerMemAddress; + var _memAlloc$get6 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get6.workerMemAddress; + var shapeAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * shape.length); + var bitDepthsStartAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * bitDepthStarts.length); + var bitDepthsAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * bitDepths.length); + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32.set(shape, shapeAddress / Int32Array.BYTES_PER_ELEMENT); + memoryBufferInt32.set(bitDepthStarts, bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT); + memoryBufferInt32.set(bitDepths, bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT); + pv_picollm_weight_block_mixed_16x8_forward_single(shapeAddress, workerIndicesAddress, bitDepths.length, bitDepthsStartAddress, bitDepthsAddress, workerMetasAddress, workerBlocksAddress, workerXAddress + xOffset, workerYAddress); + free(shapeAddress); + free(bitDepthsStartAddress); + free(bitDepthsAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var weightBlockMixed16x8ForwardMultiple = function weightBlockMixed16x8ForwardMultiple(data) { + try { + var _data$globals3 = data.globals, + exports = _data$globals3.exports, + memAlloc = _data$globals3.memAlloc, + memory = _data$globals3.memory; + var shape = data.shape, + indicesAddress = data.indicesAddress, + bitDepthStarts = data.bitDepthStarts, + bitDepths = data.bitDepths, + metasAddress = data.metasAddress, + blocksAddress = data.blocksAddress, + n = data.n, + xOffset = data.xOffset, + xAddress = data.xAddress, + yAddress = data.yAddress; + var aligned_alloc = exports.aligned_alloc, + free = exports.free, + pv_picollm_weight_block_mixed_16x8_forward_multiple = exports.pv_picollm_weight_block_mixed_16x8_forward_multiple; + if (!memAlloc.has(metasAddress) || !memAlloc.has(blocksAddress) || !memAlloc.has(xAddress) || !memAlloc.has(yAddress) || !memAlloc.has(indicesAddress)) { + self.postMessage({ + command: 'ok' + }); + return; + } + var _memAlloc$get7 = memAlloc.get(indicesAddress), + workerIndicesAddress = _memAlloc$get7.workerMemAddress; + var _memAlloc$get8 = memAlloc.get(metasAddress), + workerMetasAddress = _memAlloc$get8.workerMemAddress; + var _memAlloc$get9 = memAlloc.get(blocksAddress), + workerBlocksAddress = _memAlloc$get9.workerMemAddress; + var _memAlloc$get10 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get10.workerMemAddress; + var _memAlloc$get11 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get11.workerMemAddress; + var shapeAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * shape.length); + var bitDepthsStartAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * bitDepthStarts.length); + var bitDepthsAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * bitDepths.length); + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32.set(shape, shapeAddress / Int32Array.BYTES_PER_ELEMENT); + memoryBufferInt32.set(bitDepthStarts, bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT); + memoryBufferInt32.set(bitDepths, bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT); + pv_picollm_weight_block_mixed_16x8_forward_multiple(shapeAddress, workerIndicesAddress, bitDepths.length, bitDepthsStartAddress, bitDepthsAddress, workerMetasAddress, workerBlocksAddress, n, workerXAddress + xOffset, workerYAddress); + free(shapeAddress); + free(bitDepthsStartAddress); + free(bitDepthsAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var weightBlockMixed16x8AddBias = function weightBlockMixed16x8AddBias(data) { + try { + var _data$globals4 = data.globals, + exports = _data$globals4.exports, + memAlloc = _data$globals4.memAlloc; + var n = data.n, + dimension = data.dimension, + yAddress = data.yAddress, + biasAddress = data.biasAddress; + var free = exports.free, + pv_picollm_weight_block_mixed_16x8_add_bias = exports.pv_picollm_weight_block_mixed_16x8_add_bias; + if (!memAlloc.has(yAddress) || !memAlloc.has(biasAddress)) { + self.postMessage({ + command: 'ok' + }); + return; + } + var _memAlloc$get12 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get12.workerMemAddress; + var _memAlloc$get13 = memAlloc.get(biasAddress), + workerBiasAddress = _memAlloc$get13.workerMemAddress; + pv_picollm_weight_block_mixed_16x8_add_bias(n, dimension, workerYAddress, workerBiasAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +var weightFloatForward = function weightFloatForward(data) { + try { + var _data$globals5 = data.globals, + exports = _data$globals5.exports, + memAlloc = _data$globals5.memAlloc; + var n = data.n, + nc = data.nc, + nr = data.nr, + wAddress = data.wAddress, + xOffset = data.xOffset, + xAddress = data.xAddress, + yAddress = data.yAddress; + var pv_picollm_weight_float_forward = exports.pv_picollm_weight_float_forward; + if (!memAlloc.has(wAddress) || !memAlloc.has(xAddress) || !memAlloc.has(yAddress)) { + self.postMessage({ + command: 'ok' + }); + return; + } + var _memAlloc$get14 = memAlloc.get(wAddress), + workerWAddress = _memAlloc$get14.workerMemAddress; + var _memAlloc$get15 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get15.workerMemAddress; + var _memAlloc$get16 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get16.workerMemAddress; + pv_picollm_weight_float_forward(n, nc, nr, workerWAddress, workerXAddress + xOffset, workerYAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } +}; +_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS, weightBlockMixed16x8PreprocessBlocks), PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE, weightBlockMixed16x8ForwardSingle), PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE, weightBlockMixed16x8ForwardMultiple), PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_ADD_BIAS, weightBlockMixed16x8AddBias), PvPicollmWeightAction.WEIGHT_FLOAT_FORWARD, weightFloatForward); + +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +var initXpu = function initXpu(memory, xpuHelperWasm) { + var setInt = function setInt(address, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[address / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvXpuDeviceInfo = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(browserNameAddressAddress, browserVersionAddressAddress, osNameAddressAddress, numCoresAddress, statusAddress) { + var aligned_alloc, uaParser, memoryBufferUint8, browserName, browserNameAddress, i, browserVersion, browserVersionAddress, _i, osName, osNameAddress, _i2, numCores; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + browserNameAddressAddress = unsignedAddress(browserNameAddressAddress); + browserVersionAddressAddress = unsignedAddress(browserVersionAddressAddress); + osNameAddressAddress = unsignedAddress(osNameAddressAddress); + numCoresAddress = unsignedAddress(numCoresAddress); + statusAddress = unsignedAddress(statusAddress); + aligned_alloc = imports.aligned_alloc; + uaParser = Bowser.getParser(navigator.userAgent); + memoryBufferUint8 = new Uint8Array(memory.buffer); + browserName = uaParser.getBrowserName(); + _context.next = 11; + return aligned_alloc(Uint8Array.BYTES_PER_ELEMENT, (browserName.length + 1) * Uint8Array.BYTES_PER_ELEMENT); + case 11: + browserNameAddress = _context.sent; + if (!(browserNameAddress === 0)) { + _context.next = 15; + break; + } + setInt(statusAddress, -1); + return _context.abrupt("return"); + case 15: + setInt(browserNameAddressAddress, browserNameAddress); + for (i = 0; i < browserName.length; i++) { + memoryBufferUint8[browserNameAddress + i] = browserName.charCodeAt(i); + } + memoryBufferUint8[browserNameAddress + browserName.length] = 0; + browserVersion = uaParser.getBrowserVersion(); + _context.next = 21; + return aligned_alloc(Uint8Array.BYTES_PER_ELEMENT, (browserVersion.length + 1) * Uint8Array.BYTES_PER_ELEMENT); + case 21: + browserVersionAddress = _context.sent; + if (!(browserVersionAddress === 0)) { + _context.next = 25; + break; + } + setInt(statusAddress, -1); + return _context.abrupt("return"); + case 25: + setInt(browserVersionAddressAddress, browserVersionAddress); + for (_i = 0; _i < browserVersion.length; _i++) { + memoryBufferUint8[browserVersionAddress + _i] = browserVersion.charCodeAt(_i); + } + memoryBufferUint8[browserVersionAddress + browserVersion.length] = 0; + osName = uaParser.getOSName(); + _context.next = 31; + return aligned_alloc(Uint8Array.BYTES_PER_ELEMENT, (osName.length + 1) * Uint8Array.BYTES_PER_ELEMENT); + case 31: + osNameAddress = _context.sent; + if (!(osNameAddress === 0)) { + _context.next = 35; + break; + } + setInt(statusAddress, -1); + return _context.abrupt("return"); + case 35: + setInt(osNameAddressAddress, osNameAddress); + for (_i2 = 0; _i2 < osName.length; _i2++) { + memoryBufferUint8[osNameAddress + _i2] = osName.charCodeAt(_i2); + } + memoryBufferUint8[osNameAddress + osName.length] = 0; + numCores = window.navigator.hardwareConcurrency; + setInt(numCoresAddress, numCores ? numCores : 1); + setInt(statusAddress, 0); + case 41: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvXpuDeviceInfo(_x, _x2, _x3, _x4, _x5) { + return _ref.apply(this, arguments); + }; + }(); + var pvXpuDeviceInit = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(objAddress, numWorkers, statusAddress) { + var osWorkers, workerSize, workers, i, worker; + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + objAddress = unsignedAddress(objAddress); + statusAddress = unsignedAddress(statusAddress); + if (xpuHelperWasm) { + _context2.next = 5; + break; + } + setInt(statusAddress, -1); + return _context2.abrupt("return"); + case 5: + osWorkers = window.navigator.hardwareConcurrency; + workerSize = osWorkers && osWorkers < numWorkers ? osWorkers : numWorkers; + workers = []; + i = 0; + case 9: + if (!(i < workerSize)) { + _context2.next = 17; + break; + } + worker = new WorkerFactory(); + workers.push(worker); + _context2.next = 14; + return waitForWorker(worker, { + action: PvXpuAction.INIT, + wasm: xpuHelperWasm + }); + case 14: + i++; + _context2.next = 9; + break; + case 17: + PvXpu.addXpu(objAddress, { + deviceMem: new Set(), + numWorkers: workerSize, + workers: workers + }); + setInt(statusAddress, 0); + case 19: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function pvXpuDeviceInit(_x6, _x7, _x8) { + return _ref2.apply(this, arguments); + }; + }(); + var pvXpuDeviceCleanup = function pvXpuDeviceCleanup(objAddress) { + objAddress = unsignedAddress(objAddress); + var obj = PvXpu.getXpu(objAddress); + if (!obj) { + return; + } + var _iterator = _createForOfIteratorHelper(obj.workers), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var worker = _step.value; + worker.terminate(); + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + PvXpu.removeXpu(objAddress); + }; + var pvXpuDeviceMemAlloc = /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(objAddress, memAddress, sizeBytes, batchSize, isShared, statusAddress) { + var obj, batch, shared, chunkSize, remaining, workerResults, i; + return _regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + objAddress = unsignedAddress(objAddress); + memAddress = unsignedAddress(memAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context3.next = 7; + break; + } + setInt(statusAddress, -1); + return _context3.abrupt("return"); + case 7: + batch = batchSize === 0 ? obj.numWorkers : batchSize; + shared = isShared === 1; + if (!(!shared && sizeBytes % batch !== 0)) { + _context3.next = 13; + break; + } + setInt(statusAddress, -1); + console.error("Failed to allocate memory: alloc size ".concat(sizeBytes, " must be divisible by batch ").concat(batch, ".")); + return _context3.abrupt("return"); + case 13: + chunkSize = Math.ceil(sizeBytes / batch / obj.numWorkers) * batch; + remaining = sizeBytes; + workerResults = []; + i = 0; + case 17: + if (!(i < obj.numWorkers)) { + _context3.next = 29; + break; + } + if (!shared) { + _context3.next = 22; + break; + } + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.ALLOC, + size: sizeBytes, + memAddress: memAddress + })); + _context3.next = 26; + break; + case 22: + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.ALLOC, + size: Math.min(remaining, chunkSize), + memAddress: memAddress + })); + remaining -= chunkSize; + if (!(remaining <= 0)) { + _context3.next = 26; + break; + } + return _context3.abrupt("break", 29); + case 26: + i++; + _context3.next = 17; + break; + case 29: + _context3.next = 31; + return Promise.all(workerResults); + case 31: + PvXpu.addMemory(memAddress, { + objAddress: objAddress, + isShared: shared, + allocSize: sizeBytes, + chunkSize: chunkSize + }); + setInt(statusAddress, 0); + case 33: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return function pvXpuDeviceMemAlloc(_x9, _x10, _x11, _x12, _x13, _x14) { + return _ref3.apply(this, arguments); + }; + }(); + var pvXpuDeviceMemFree = /*#__PURE__*/function () { + var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(memAddress) { + var _PvXpu$getMemory, objAddress, obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + memAddress = unsignedAddress(memAddress); + if (!PvXpu.hasMemory(memAddress)) { + _context4.next = 9; + break; + } + _PvXpu$getMemory = PvXpu.getMemory(memAddress), objAddress = _PvXpu$getMemory.objAddress; + obj = PvXpu.getXpu(objAddress); + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.FREE, + memAddress: memAddress + })); + } + _context4.next = 8; + return Promise.all(workerResults); + case 8: + PvXpu.removeMemory(memAddress); + case 9: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + return function pvXpuDeviceMemFree(_x15) { + return _ref4.apply(this, arguments); + }; + }(); + var pvXpuDeviceMemCopyToXpu = /*#__PURE__*/function () { + var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(memAddress, hostAddress, offset, sizeBytes) { + var mem, objAddress, isShared, chunkSize, obj, buffer, workerResults, remaining, i, chunkStart, chunkEnd, inChunkOffset, inChunkSize, inChunkBufferStart; + return _regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) switch (_context5.prev = _context5.next) { + case 0: + memAddress = unsignedAddress(memAddress); + hostAddress = unsignedAddress(hostAddress); + mem = PvXpu.getMemory(memAddress); + if (mem) { + _context5.next = 5; + break; + } + return _context5.abrupt("return"); + case 5: + objAddress = mem.objAddress, isShared = mem.isShared, chunkSize = mem.chunkSize; + obj = PvXpu.getXpu(objAddress); + buffer = new Uint8Array(memory.buffer).slice(hostAddress, hostAddress + sizeBytes); + workerResults = []; + remaining = sizeBytes; + i = 0; + case 11: + if (!(i < obj.numWorkers)) { + _context5.next = 24; + break; + } + if (!isShared) { + _context5.next = 16; + break; + } + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.COPY_TO_XPU, + memAddress: memAddress, + offset: offset, + buffer: buffer + })); + _context5.next = 21; + break; + case 16: + chunkStart = i * chunkSize; + chunkEnd = (i + 1) * chunkSize; + if (offset < chunkEnd) { + inChunkOffset = offset > chunkStart ? offset - chunkStart : 0; + inChunkSize = chunkSize - inChunkOffset; + inChunkBufferStart = sizeBytes - remaining; + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.COPY_TO_XPU, + memAddress: memAddress, + offset: inChunkOffset, + buffer: buffer.slice(inChunkBufferStart, inChunkBufferStart + inChunkSize) + })); + remaining -= inChunkSize; + } + if (!(remaining <= 0)) { + _context5.next = 21; + break; + } + return _context5.abrupt("break", 24); + case 21: + i++; + _context5.next = 11; + break; + case 24: + _context5.next = 26; + return Promise.all(workerResults); + case 26: + case "end": + return _context5.stop(); + } + }, _callee5); + })); + return function pvXpuDeviceMemCopyToXpu(_x16, _x17, _x18, _x19) { + return _ref5.apply(this, arguments); + }; + }(); + var pvXpuDeviceMemCopyFromXpu = /*#__PURE__*/function () { + var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6(memAddress, hostAddress, offset, sizeBytes) { + var mem, objAddress, allocSize, isShared, chunkSize, obj, memoryBufferUint8, workerResults, remaining, i, chunkStart, chunkEnd, inChunkOffset, inChunkSize, results, copied, _i3, result; + return _regeneratorRuntime.wrap(function _callee6$(_context6) { + while (1) switch (_context6.prev = _context6.next) { + case 0: + memAddress = unsignedAddress(memAddress); + hostAddress = unsignedAddress(hostAddress); + mem = PvXpu.getMemory(memAddress); + if (mem) { + _context6.next = 5; + break; + } + return _context6.abrupt("return"); + case 5: + objAddress = mem.objAddress, allocSize = mem.allocSize, isShared = mem.isShared, chunkSize = mem.chunkSize; + obj = PvXpu.getXpu(objAddress); + memoryBufferUint8 = new Uint8Array(memory.buffer); + workerResults = []; + if (!isShared) { + _context6.next = 13; + break; + } + workerResults.push(waitForWorker(obj.workers[0], { + action: PvXpuAction.COPY_FROM_XPU, + memAddress: memAddress, + offset: offset, + size: allocSize + })); + _context6.next = 24; + break; + case 13: + remaining = allocSize; + i = 0; + case 15: + if (!(i < obj.numWorkers)) { + _context6.next = 24; + break; + } + chunkStart = i * chunkSize; + chunkEnd = (i + 1) * chunkSize; + if (offset < chunkEnd) { + inChunkOffset = offset > chunkStart ? offset - chunkStart : 0; + inChunkSize = Math.min(remaining, chunkSize - inChunkOffset); + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.COPY_FROM_XPU, + memAddress: memAddress, + offset: inChunkOffset, + size: inChunkSize + })); + remaining -= inChunkSize; + } + if (!(remaining === 0)) { + _context6.next = 21; + break; + } + return _context6.abrupt("break", 24); + case 21: + i++; + _context6.next = 15; + break; + case 24: + _context6.next = 26; + return Promise.all(workerResults); + case 26: + results = _context6.sent; + copied = 0; + _i3 = 0; + case 29: + if (!(_i3 < results.length)) { + _context6.next = 41; + break; + } + result = results[_i3]; + if (!(copied + result.length > sizeBytes)) { + _context6.next = 36; + break; + } + memoryBufferUint8.set(result.slice(0, sizeBytes - copied), hostAddress + copied); + return _context6.abrupt("break", 41); + case 36: + memoryBufferUint8.set(result, hostAddress + copied); + copied += result.length; + case 38: + _i3++; + _context6.next = 29; + break; + case 41: + case "end": + return _context6.stop(); + } + }, _callee6); + })); + return function pvXpuDeviceMemCopyFromXpu(_x20, _x21, _x22, _x23) { + return _ref6.apply(this, arguments); + }; + }(); + var pvXpuDeviceMemMemset = /*#__PURE__*/function () { + var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7(memAddress, fillByte, sizeBytes) { + var mem, objAddress, allocSize, isShared, chunkSize, obj, workerResults, remaining, i; + return _regeneratorRuntime.wrap(function _callee7$(_context7) { + while (1) switch (_context7.prev = _context7.next) { + case 0: + memAddress = unsignedAddress(memAddress); + mem = PvXpu.getMemory(memAddress); + if (mem) { + _context7.next = 4; + break; + } + return _context7.abrupt("return"); + case 4: + objAddress = mem.objAddress, allocSize = mem.allocSize, isShared = mem.isShared, chunkSize = mem.chunkSize; + obj = PvXpu.getXpu(objAddress); + workerResults = []; + remaining = sizeBytes; + i = 0; + case 9: + if (!(i < obj.numWorkers)) { + _context7.next = 21; + break; + } + if (!isShared) { + _context7.next = 14; + break; + } + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.MEMSET, + memAddress: memAddress, + fillByte: fillByte, + size: allocSize + })); + _context7.next = 18; + break; + case 14: + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.MEMSET, + memAddress: memAddress, + fillByte: fillByte, + size: Math.min(remaining, chunkSize) + })); + remaining -= chunkSize; + if (!(remaining <= 0)) { + _context7.next = 18; + break; + } + return _context7.abrupt("break", 21); + case 18: + i++; + _context7.next = 9; + break; + case 21: + _context7.next = 23; + return Promise.all(workerResults); + case 23: + case "end": + return _context7.stop(); + } + }, _callee7); + })); + return function pvXpuDeviceMemMemset(_x24, _x25, _x26) { + return _ref7.apply(this, arguments); + }; + }(); + var pvXpuGetMaxWorkersWasm = /*#__PURE__*/function () { + var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee8(maxWorkersAddress) { + var maxWorkers; + return _regeneratorRuntime.wrap(function _callee8$(_context8) { + while (1) switch (_context8.prev = _context8.next) { + case 0: + maxWorkersAddress = unsignedAddress(maxWorkersAddress); + maxWorkers = window.navigator.hardwareConcurrency; + setInt(maxWorkersAddress, maxWorkers ? maxWorkers : 1); + case 3: + case "end": + return _context8.stop(); + } + }, _callee8); + })); + return function pvXpuGetMaxWorkersWasm(_x27) { + return _ref8.apply(this, arguments); + }; + }(); + var pvXpuTimerStart = /*#__PURE__*/function () { + var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee9(objAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee9$(_context9) { + while (1) switch (_context9.prev = _context9.next) { + case 0: + objAddress = unsignedAddress(objAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context9.next = 4; + break; + } + return _context9.abrupt("return"); + case 4: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.TIMER_START, + workerIndex: i + })); + } + _context9.next = 8; + return Promise.all(workerResults); + case 8: + case "end": + return _context9.stop(); + } + }, _callee9); + })); + return function pvXpuTimerStart(_x28) { + return _ref9.apply(this, arguments); + }; + }(); + var pvXpuTimerStop = /*#__PURE__*/function () { + var _ref10 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee10(objAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee10$(_context10) { + while (1) switch (_context10.prev = _context10.next) { + case 0: + objAddress = unsignedAddress(objAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context10.next = 4; + break; + } + return _context10.abrupt("return"); + case 4: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.TIMER_STOP + })); + } + _context10.next = 8; + return Promise.all(workerResults); + case 8: + case "end": + return _context10.stop(); + } + }, _callee10); + })); + return function pvXpuTimerStop(_x29) { + return _ref10.apply(this, arguments); + }; + }(); + var imports = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({ + aligned_alloc: function aligned_alloc(alignment, size) { + throw new Error("aligned_alloc was not passed in from parent module"); + }, + pv_xpu_web_worker_device_info_wasm: pvXpuDeviceInfo, + pv_xpu_web_worker_device_init_wasm: pvXpuDeviceInit, + pv_xpu_web_worker_device_cleanup_wasm: pvXpuDeviceCleanup, + pv_xpu_web_worker_device_mem_alloc_wasm: pvXpuDeviceMemAlloc, + pv_xpu_web_worker_device_mem_free_wasm: pvXpuDeviceMemFree, + pv_xpu_web_worker_device_mem_copy_to_xpu_wasm: pvXpuDeviceMemCopyToXpu, + pv_xpu_web_worker_device_mem_copy_from_xpu_wasm: pvXpuDeviceMemCopyFromXpu, + pv_xpu_web_worker_device_mem_memset_wasm: pvXpuDeviceMemMemset, + pv_xpu_web_worker_get_max_workers_wasm: pvXpuGetMaxWorkersWasm, + pv_xpu_web_worker_timer_start_wasm: pvXpuTimerStart, + pv_xpu_web_worker_timer_stop_wasm: pvXpuTimerStop + }, getMvmWasmFunctions(memory)), getPicollmAttentionWasmFunctions(memory)), getPicollmFeedForwardWasmFunctions(memory)), getPicollmGateWasmFunctions(memory)), getPicollmMoeTransformerWasmFunctions(memory)), getPicollmNormWasmFunctions(memory)), getPicollmNormLayerWasmFunctions(memory)), getPicollmTransformerWasmFunctions(memory)), getPicollmWeightWasmFunctions(memory)); + return imports; +}; + +export { initXpu as default }; diff --git a/lib/wasm/dist/xpu_web_worker/esm/index.min.js b/lib/wasm/dist/xpu_web_worker/esm/index.min.js new file mode 100644 index 00000000..d1ee1d30 --- /dev/null +++ b/lib/wasm/dist/xpu_web_worker/esm/index.min.js @@ -0,0 +1,7 @@ +function I(g){return I="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},I(g)}function g(g){var C=function(g,C){if("object"!=I(g)||!g)return g;var A=g[Symbol.toPrimitive];if(void 0!==A){var e=A.call(g,C||"default");if("object"!=I(e))return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===C?String:Number)(g)}(g,"string");return"symbol"==I(C)?C:String(C)}function C(I,C,A){return(C=g(C))in I?Object.defineProperty(I,C,{value:A,enumerable:!0,configurable:!0,writable:!0}):I[C]=A,I}function A(I,g,C,A,e,c,l){try{var t=I[c](l),s=t.value}catch(I){return void C(I)}t.done?g(s):Promise.resolve(s).then(A,e)}function e(I){return function(){var g=this,C=arguments;return new Promise((function(e,c){var l=I.apply(g,C);function t(I){A(l,e,c,t,s,"next",I)}function s(I){A(l,e,c,t,s,"throw",I)}t(void 0)}))}}function c(I){return I&&I.__esModule&&Object.prototype.hasOwnProperty.call(I,"default")?I.default:I}var l={exports:{}},t={exports:{}};!function(I){function g(C){return I.exports=g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},I.exports.__esModule=!0,I.exports.default=I.exports,g(C)}I.exports=g,I.exports.__esModule=!0,I.exports.default=I.exports}(t);var s=t.exports;!function(I){var g=s.default;function C(){I.exports=C=function(){return e},I.exports.__esModule=!0,I.exports.default=I.exports;var A,e={},c=Object.prototype,l=c.hasOwnProperty,t=Object.defineProperty||function(I,g,C){I[g]=C.value},s="function"==typeof Symbol?Symbol:{},Z=s.iterator||"@@iterator",d=s.asyncIterator||"@@asyncIterator",b=s.toStringTag||"@@toStringTag";function i(I,g,C){return Object.defineProperty(I,g,{value:C,enumerable:!0,configurable:!0,writable:!0}),I[g]}try{i({},"")}catch(A){i=function(I,g,C){return I[g]=C}}function r(I,g,C,A){var e=g&&g.prototype instanceof y?g:y,c=Object.create(e.prototype),l=new Y(A||[]);return t(c,"_invoke",{value:p(I,C,l)}),c}function o(I,g,C){try{return{type:"normal",arg:I.call(g,C)}}catch(I){return{type:"throw",arg:I}}}e.wrap=r;var n="suspendedStart",m="suspendedYield",G="executing",a="completed",B={};function y(){}function V(){}function W(){}var u={};i(u,Z,(function(){return this}));var R=Object.getPrototypeOf,X=R&&R(R(w([])));X&&X!==c&&l.call(X,Z)&&(u=X);var h=W.prototype=y.prototype=Object.create(u);function H(I){["next","throw","return"].forEach((function(g){i(I,g,(function(I){return this._invoke(g,I)}))}))}function k(I,C){function A(e,c,t,s){var Z=o(I[e],I,c);if("throw"!==Z.type){var d=Z.arg,b=d.value;return b&&"object"==g(b)&&l.call(b,"__await")?C.resolve(b.__await).then((function(I){A("next",I,t,s)}),(function(I){A("throw",I,t,s)})):C.resolve(b).then((function(I){d.value=I,t(d)}),(function(I){return A("throw",I,t,s)}))}s(Z.arg)}var e;t(this,"_invoke",{value:function(I,g){function c(){return new C((function(C,e){A(I,g,C,e)}))}return e=e?e.then(c,c):c()}})}function p(I,g,C){var e=n;return function(c,l){if(e===G)throw new Error("Generator is already running");if(e===a){if("throw"===c)throw l;return{value:A,done:!0}}for(C.method=c,C.arg=l;;){var t=C.delegate;if(t){var s=J(t,C);if(s){if(s===B)continue;return s}}if("next"===C.method)C.sent=C._sent=C.arg;else if("throw"===C.method){if(e===n)throw e=a,C.arg;C.dispatchException(C.arg)}else"return"===C.method&&C.abrupt("return",C.arg);e=G;var Z=o(I,g,C);if("normal"===Z.type){if(e=C.done?a:m,Z.arg===B)continue;return{value:Z.arg,done:C.done}}"throw"===Z.type&&(e=a,C.method="throw",C.arg=Z.arg)}}}function J(I,g){var C=g.method,e=I.iterator[C];if(e===A)return g.delegate=null,"throw"===C&&I.iterator.return&&(g.method="return",g.arg=A,J(I,g),"throw"===g.method)||"return"!==C&&(g.method="throw",g.arg=new TypeError("The iterator does not provide a '"+C+"' method")),B;var c=o(e,I.iterator,g.arg);if("throw"===c.type)return g.method="throw",g.arg=c.arg,g.delegate=null,B;var l=c.arg;return l?l.done?(g[I.resultName]=l.value,g.next=I.nextLoc,"return"!==g.method&&(g.method="next",g.arg=A),g.delegate=null,B):l:(g.method="throw",g.arg=new TypeError("iterator result is not an object"),g.delegate=null,B)}function F(I){var g={tryLoc:I[0]};1 in I&&(g.catchLoc=I[1]),2 in I&&(g.finallyLoc=I[2],g.afterLoc=I[3]),this.tryEntries.push(g)}function S(I){var g=I.completion||{};g.type="normal",delete g.arg,I.completion=g}function Y(I){this.tryEntries=[{tryLoc:"root"}],I.forEach(F,this),this.reset(!0)}function w(I){if(I||""===I){var C=I[Z];if(C)return C.call(I);if("function"==typeof I.next)return I;if(!isNaN(I.length)){var e=-1,c=function g(){for(;++e=0;--e){var c=this.tryEntries[e],t=c.completion;if("root"===c.tryLoc)return C("end");if(c.tryLoc<=this.prev){var s=l.call(c,"catchLoc"),Z=l.call(c,"finallyLoc");if(s&&Z){if(this.prev=0;--C){var A=this.tryEntries[C];if(A.tryLoc<=this.prev&&l.call(A,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),S(C),B}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var A=C.completion;if("throw"===A.type){var e=A.arg;S(C)}return e}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:w(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=A),B}},e}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(l);var Z=(0,l.exports)(),d=Z;try{regeneratorRuntime=Z}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=Z:Function("r","regeneratorRuntime = r")(Z)}var b=c(d);const i={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},r={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},o={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},n={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},m={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class G{static getFirstMatch(I,g){const C=g.match(I);return C&&C.length>0&&C[1]||""}static getSecondMatch(I,g){const C=g.match(I);return C&&C.length>1&&C[2]||""}static matchAndReturnConst(I,g,C){if(I.test(g))return C}static getWindowsVersionName(I){switch(I){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}static getMacOSVersionName(I){const g=I.split(".").splice(0,2).map((I=>parseInt(I,10)||0));if(g.push(0),10===g[0])switch(g[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}}static getAndroidVersionName(I){const g=I.split(".").splice(0,2).map((I=>parseInt(I,10)||0));if(g.push(0),!(1===g[0]&&g[1]<5))return 1===g[0]&&g[1]<6?"Cupcake":1===g[0]&&g[1]>=6?"Donut":2===g[0]&&g[1]<2?"Eclair":2===g[0]&&2===g[1]?"Froyo":2===g[0]&&g[1]>2?"Gingerbread":3===g[0]?"Honeycomb":4===g[0]&&g[1]<1?"Ice Cream Sandwich":4===g[0]&&g[1]<4?"Jelly Bean":4===g[0]&&g[1]>=4?"KitKat":5===g[0]?"Lollipop":6===g[0]?"Marshmallow":7===g[0]?"Nougat":8===g[0]?"Oreo":9===g[0]?"Pie":void 0}static getVersionPrecision(I){return I.split(".").length}static compareVersions(I,g,C=!1){const A=G.getVersionPrecision(I),e=G.getVersionPrecision(g);let c=Math.max(A,e),l=0;const t=G.map([I,g],(I=>{const g=c-G.getVersionPrecision(I),C=I+new Array(g+1).join(".0");return G.map(C.split("."),(I=>new Array(20-I.length).join("0")+I)).reverse()}));for(C&&(l=c-Math.min(A,e)),c-=1;c>=l;){if(t[0][c]>t[1][c])return 1;if(t[0][c]===t[1][c]){if(c===l)return 0;c-=1}else if(t[0][c]{C[g]=I[g]}))}}return I}static getBrowserAlias(I){return i[I]}static getBrowserTypeByAlias(I){return r[I]||""}}const a=/version\/(\d+(\.?_?\d+)+)/i,B=[{test:[/googlebot/i],describe(I){const g={name:"Googlebot"},C=G.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/opera/i],describe(I){const g={name:"Opera"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/opr\/|opios/i],describe(I){const g={name:"Opera"},C=G.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/SamsungBrowser/i],describe(I){const g={name:"Samsung Internet for Android"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/Whale/i],describe(I){const g={name:"NAVER Whale Browser"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/MZBrowser/i],describe(I){const g={name:"MZ Browser"},C=G.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/focus/i],describe(I){const g={name:"Focus"},C=G.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/swing/i],describe(I){const g={name:"Swing"},C=G.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/coast/i],describe(I){const g={name:"Opera Coast"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(I){const g={name:"Opera Touch"},C=G.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/yabrowser/i],describe(I){const g={name:"Yandex Browser"},C=G.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/ucbrowser/i],describe(I){const g={name:"UC Browser"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/Maxthon|mxios/i],describe(I){const g={name:"Maxthon"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/epiphany/i],describe(I){const g={name:"Epiphany"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/puffin/i],describe(I){const g={name:"Puffin"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/sleipnir/i],describe(I){const g={name:"Sleipnir"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/k-meleon/i],describe(I){const g={name:"K-Meleon"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/micromessenger/i],describe(I){const g={name:"WeChat"},C=G.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/qqbrowser/i],describe(I){const g={name:/qqbrowserlite/i.test(I)?"QQ Browser Lite":"QQ Browser"},C=G.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/msie|trident/i],describe(I){const g={name:"Internet Explorer"},C=G.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/\sedg\//i],describe(I){const g={name:"Microsoft Edge"},C=G.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/edg([ea]|ios)/i],describe(I){const g={name:"Microsoft Edge"},C=G.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/vivaldi/i],describe(I){const g={name:"Vivaldi"},C=G.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/seamonkey/i],describe(I){const g={name:"SeaMonkey"},C=G.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/sailfish/i],describe(I){const g={name:"Sailfish"},C=G.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,I);return C&&(g.version=C),g}},{test:[/silk/i],describe(I){const g={name:"Amazon Silk"},C=G.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/phantom/i],describe(I){const g={name:"PhantomJS"},C=G.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/slimerjs/i],describe(I){const g={name:"SlimerJS"},C=G.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(I){const g={name:"BlackBerry"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/(web|hpw)[o0]s/i],describe(I){const g={name:"WebOS Browser"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/bada/i],describe(I){const g={name:"Bada"},C=G.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/tizen/i],describe(I){const g={name:"Tizen"},C=G.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/qupzilla/i],describe(I){const g={name:"QupZilla"},C=G.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/firefox|iceweasel|fxios/i],describe(I){const g={name:"Firefox"},C=G.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/electron/i],describe(I){const g={name:"Electron"},C=G.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/MiuiBrowser/i],describe(I){const g={name:"Miui"},C=G.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/chromium/i],describe(I){const g={name:"Chromium"},C=G.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/chrome|crios|crmo/i],describe(I){const g={name:"Chrome"},C=G.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/GSA/i],describe(I){const g={name:"Google Search"},C=G.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test(I){const g=!I.test(/like android/i),C=I.test(/android/i);return g&&C},describe(I){const g={name:"Android Browser"},C=G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/playstation 4/i],describe(I){const g={name:"PlayStation 4"},C=G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/safari|applewebkit/i],describe(I){const g={name:"Safari"},C=G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/.*/i],describe(I){const g=-1!==I.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:G.getFirstMatch(g,I),version:G.getSecondMatch(g,I)}}}];var y=[{test:[/Roku\/DVP/],describe(I){const g=G.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,I);return{name:n.Roku,version:g}}},{test:[/windows phone/i],describe(I){const g=G.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,I);return{name:n.WindowsPhone,version:g}}},{test:[/windows /i],describe(I){const g=G.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,I),C=G.getWindowsVersionName(g);return{name:n.Windows,version:g,versionName:C}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(I){const g={name:n.iOS},C=G.getSecondMatch(/(Version\/)(\d[\d.]+)/,I);return C&&(g.version=C),g}},{test:[/macintosh/i],describe(I){const g=G.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,I).replace(/[_\s]/g,"."),C=G.getMacOSVersionName(g),A={name:n.MacOS,version:g};return C&&(A.versionName=C),A}},{test:[/(ipod|iphone|ipad)/i],describe(I){const g=G.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,I).replace(/[_\s]/g,".");return{name:n.iOS,version:g}}},{test(I){const g=!I.test(/like android/i),C=I.test(/android/i);return g&&C},describe(I){const g=G.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,I),C=G.getAndroidVersionName(g),A={name:n.Android,version:g};return C&&(A.versionName=C),A}},{test:[/(web|hpw)[o0]s/i],describe(I){const g=G.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,I),C={name:n.WebOS};return g&&g.length&&(C.version=g),C}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(I){const g=G.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,I)||G.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,I)||G.getFirstMatch(/\bbb(\d+)/i,I);return{name:n.BlackBerry,version:g}}},{test:[/bada/i],describe(I){const g=G.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,I);return{name:n.Bada,version:g}}},{test:[/tizen/i],describe(I){const g=G.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,I);return{name:n.Tizen,version:g}}},{test:[/linux/i],describe:()=>({name:n.Linux})},{test:[/CrOS/],describe:()=>({name:n.ChromeOS})},{test:[/PlayStation 4/],describe(I){const g=G.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,I);return{name:n.PlayStation4,version:g}}}],V=[{test:[/googlebot/i],describe:()=>({type:"bot",vendor:"Google"})},{test:[/huawei/i],describe(I){const g=G.getFirstMatch(/(can-l01)/i,I)&&"Nova",C={type:o.mobile,vendor:"Huawei"};return g&&(C.model=g),C}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:()=>({type:o.tablet,vendor:"Nexus"})},{test:[/ipad/i],describe:()=>({type:o.tablet,vendor:"Apple",model:"iPad"})},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:()=>({type:o.tablet,vendor:"Apple",model:"iPad"})},{test:[/kftt build/i],describe:()=>({type:o.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"})},{test:[/silk/i],describe:()=>({type:o.tablet,vendor:"Amazon"})},{test:[/tablet(?! pc)/i],describe:()=>({type:o.tablet})},{test(I){const g=I.test(/ipod|iphone/i),C=I.test(/like (ipod|iphone)/i);return g&&!C},describe(I){const g=G.getFirstMatch(/(ipod|iphone)/i,I);return{type:o.mobile,vendor:"Apple",model:g}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:()=>({type:o.mobile,vendor:"Nexus"})},{test:[/[^-]mobi/i],describe:()=>({type:o.mobile})},{test:I=>"blackberry"===I.getBrowserName(!0),describe:()=>({type:o.mobile,vendor:"BlackBerry"})},{test:I=>"bada"===I.getBrowserName(!0),describe:()=>({type:o.mobile})},{test:I=>"windows phone"===I.getBrowserName(),describe:()=>({type:o.mobile,vendor:"Microsoft"})},{test(I){const g=Number(String(I.getOSVersion()).split(".")[0]);return"android"===I.getOSName(!0)&&g>=3},describe:()=>({type:o.tablet})},{test:I=>"android"===I.getOSName(!0),describe:()=>({type:o.mobile})},{test:I=>"macos"===I.getOSName(!0),describe:()=>({type:o.desktop,vendor:"Apple"})},{test:I=>"windows"===I.getOSName(!0),describe:()=>({type:o.desktop})},{test:I=>"linux"===I.getOSName(!0),describe:()=>({type:o.desktop})},{test:I=>"playstation 4"===I.getOSName(!0),describe:()=>({type:o.tv})},{test:I=>"roku"===I.getOSName(!0),describe:()=>({type:o.tv})}],W=[{test:I=>"microsoft edge"===I.getBrowserName(!0),describe(I){if(/\sedg\//i.test(I))return{name:m.Blink};const g=G.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,I);return{name:m.EdgeHTML,version:g}}},{test:[/trident/i],describe(I){const g={name:m.Trident},C=G.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:I=>I.test(/presto/i),describe(I){const g={name:m.Presto},C=G.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test(I){const g=I.test(/gecko/i),C=I.test(/like gecko/i);return g&&!C},describe(I){const g={name:m.Gecko},C=G.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/(apple)?webkit\/537\.36/i],describe:()=>({name:m.Blink})},{test:[/(apple)?webkit/i],describe(I){const g={name:m.WebKit},C=G.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}}];class u{constructor(I,g=!1){if(null==I||""===I)throw new Error("UserAgent parameter can't be empty");this._ua=I,this.parsedResult={},!0!==g&&this.parse()}getUA(){return this._ua}test(I){return I.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const I=G.find(B,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.browser=I.describe(this.getUA())),this.parsedResult.browser}getBrowser(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}getBrowserName(I){return I?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}parseOS(){this.parsedResult.os={};const I=G.find(y,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.os=I.describe(this.getUA())),this.parsedResult.os}getOSName(I){const{name:g}=this.getOS();return I?String(g).toLowerCase()||"":g||""}getOSVersion(){return this.getOS().version}getPlatform(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}getPlatformType(I=!1){const{type:g}=this.getPlatform();return I?String(g).toLowerCase()||"":g||""}parsePlatform(){this.parsedResult.platform={};const I=G.find(V,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.platform=I.describe(this.getUA())),this.parsedResult.platform}getEngine(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}getEngineName(I){return I?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const I=G.find(W,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.engine=I.describe(this.getUA())),this.parsedResult.engine}parse(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}getResult(){return G.assign({},this.parsedResult)}satisfies(I){const g={};let C=0;const A={};let e=0;if(Object.keys(I).forEach((c=>{const l=I[c];"string"==typeof l?(A[c]=l,e+=1):"object"==typeof l&&(g[c]=l,C+=1)})),C>0){const I=Object.keys(g),C=G.find(I,(I=>this.isOS(I)));if(C){const I=this.satisfies(g[C]);if(void 0!==I)return I}const A=G.find(I,(I=>this.isPlatform(I)));if(A){const I=this.satisfies(g[A]);if(void 0!==I)return I}}if(e>0){const I=Object.keys(A),g=G.find(I,(I=>this.isBrowser(I,!0)));if(void 0!==g)return this.compareVersion(A[g])}}isBrowser(I,g=!1){const C=this.getBrowserName().toLowerCase();let A=I.toLowerCase();const e=G.getBrowserTypeByAlias(A);return g&&e&&(A=e.toLowerCase()),A===C}compareVersion(I){let g=[0],C=I,A=!1;const e=this.getBrowserVersion();if("string"==typeof e)return">"===I[0]||"<"===I[0]?(C=I.substr(1),"="===I[1]?(A=!0,C=I.substr(2)):g=[],">"===I[0]?g.push(1):g.push(-1)):"="===I[0]?C=I.substr(1):"~"===I[0]&&(A=!0,C=I.substr(1)),g.indexOf(G.compareVersions(e,C,A))>-1}isOS(I){return this.getOSName(!0)===String(I).toLowerCase()}isPlatform(I){return this.getPlatformType(!0)===String(I).toLowerCase()}isEngine(I){return this.getEngineName(!0)===String(I).toLowerCase()}is(I,g=!1){return this.isBrowser(I,g)||this.isOS(I)||this.isPlatform(I)}some(I=[]){return I.some((I=>this.is(I)))}} +/*! + * Bowser - a browser detector + * https://github.com/lancedikson/bowser + * MIT License | (c) Dustin Diaz 2012-2015 + * MIT License | (c) Denis Demchenko 2015-2019 + */class R{static getParser(I,g=!1){if("string"!=typeof I)throw new Error("UserAgent should be a string");return new u(I,g)}static parse(I){return new u(I).getResult()}static get BROWSER_MAP(){return r}static get ENGINE_MAP(){return m}static get OS_MAP(){return n}static get PLATFORMS_MAP(){return o}}var X={exports:{}},h={exports:{}};!function(I){function g(C){return I.exports=g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},I.exports.__esModule=!0,I.exports.default=I.exports,g(C)}I.exports=g,I.exports.__esModule=!0,I.exports.default=I.exports}(h);var H=h.exports;!function(I){var g=H.default;function C(){I.exports=C=function(){return e},I.exports.__esModule=!0,I.exports.default=I.exports;var A,e={},c=Object.prototype,l=c.hasOwnProperty,t=Object.defineProperty||function(I,g,C){I[g]=C.value},s="function"==typeof Symbol?Symbol:{},Z=s.iterator||"@@iterator",d=s.asyncIterator||"@@asyncIterator",b=s.toStringTag||"@@toStringTag";function i(I,g,C){return Object.defineProperty(I,g,{value:C,enumerable:!0,configurable:!0,writable:!0}),I[g]}try{i({},"")}catch(A){i=function(I,g,C){return I[g]=C}}function r(I,g,C,A){var e=g&&g.prototype instanceof y?g:y,c=Object.create(e.prototype),l=new Y(A||[]);return t(c,"_invoke",{value:p(I,C,l)}),c}function o(I,g,C){try{return{type:"normal",arg:I.call(g,C)}}catch(I){return{type:"throw",arg:I}}}e.wrap=r;var n="suspendedStart",m="suspendedYield",G="executing",a="completed",B={};function y(){}function V(){}function W(){}var u={};i(u,Z,(function(){return this}));var R=Object.getPrototypeOf,X=R&&R(R(w([])));X&&X!==c&&l.call(X,Z)&&(u=X);var h=W.prototype=y.prototype=Object.create(u);function H(I){["next","throw","return"].forEach((function(g){i(I,g,(function(I){return this._invoke(g,I)}))}))}function k(I,C){function A(e,c,t,s){var Z=o(I[e],I,c);if("throw"!==Z.type){var d=Z.arg,b=d.value;return b&&"object"==g(b)&&l.call(b,"__await")?C.resolve(b.__await).then((function(I){A("next",I,t,s)}),(function(I){A("throw",I,t,s)})):C.resolve(b).then((function(I){d.value=I,t(d)}),(function(I){return A("throw",I,t,s)}))}s(Z.arg)}var e;t(this,"_invoke",{value:function(I,g){function c(){return new C((function(C,e){A(I,g,C,e)}))}return e=e?e.then(c,c):c()}})}function p(I,g,C){var e=n;return function(c,l){if(e===G)throw new Error("Generator is already running");if(e===a){if("throw"===c)throw l;return{value:A,done:!0}}for(C.method=c,C.arg=l;;){var t=C.delegate;if(t){var s=J(t,C);if(s){if(s===B)continue;return s}}if("next"===C.method)C.sent=C._sent=C.arg;else if("throw"===C.method){if(e===n)throw e=a,C.arg;C.dispatchException(C.arg)}else"return"===C.method&&C.abrupt("return",C.arg);e=G;var Z=o(I,g,C);if("normal"===Z.type){if(e=C.done?a:m,Z.arg===B)continue;return{value:Z.arg,done:C.done}}"throw"===Z.type&&(e=a,C.method="throw",C.arg=Z.arg)}}}function J(I,g){var C=g.method,e=I.iterator[C];if(e===A)return g.delegate=null,"throw"===C&&I.iterator.return&&(g.method="return",g.arg=A,J(I,g),"throw"===g.method)||"return"!==C&&(g.method="throw",g.arg=new TypeError("The iterator does not provide a '"+C+"' method")),B;var c=o(e,I.iterator,g.arg);if("throw"===c.type)return g.method="throw",g.arg=c.arg,g.delegate=null,B;var l=c.arg;return l?l.done?(g[I.resultName]=l.value,g.next=I.nextLoc,"return"!==g.method&&(g.method="next",g.arg=A),g.delegate=null,B):l:(g.method="throw",g.arg=new TypeError("iterator result is not an object"),g.delegate=null,B)}function F(I){var g={tryLoc:I[0]};1 in I&&(g.catchLoc=I[1]),2 in I&&(g.finallyLoc=I[2],g.afterLoc=I[3]),this.tryEntries.push(g)}function S(I){var g=I.completion||{};g.type="normal",delete g.arg,I.completion=g}function Y(I){this.tryEntries=[{tryLoc:"root"}],I.forEach(F,this),this.reset(!0)}function w(I){if(I||""===I){var C=I[Z];if(C)return C.call(I);if("function"==typeof I.next)return I;if(!isNaN(I.length)){var e=-1,c=function g(){for(;++e=0;--e){var c=this.tryEntries[e],t=c.completion;if("root"===c.tryLoc)return C("end");if(c.tryLoc<=this.prev){var s=l.call(c,"catchLoc"),Z=l.call(c,"finallyLoc");if(s&&Z){if(this.prev=0;--C){var A=this.tryEntries[C];if(A.tryLoc<=this.prev&&l.call(A,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),S(C),B}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var A=C.completion;if("throw"===A.type){var e=A.arg;S(C)}return e}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:w(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=A),B}},e}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(X);var k=(0,X.exports)();try{regeneratorRuntime=k}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=k:Function("r","regeneratorRuntime = r")(k)}function p(I){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},p(I)}function J(I){var g=function(I,g){if("object"!==p(I)||null===I)return I;var C=I[Symbol.toPrimitive];if(void 0!==C){var A=C.call(I,g||"default");if("object"!==p(A))return A;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===g?String:Number)(I)}(I,"string");return"symbol"===p(g)?g:String(g)}function F(I,g){for(var C=0;C>>0:I}function Y(I,g,C){var A=void 0===g?null:g,e=function(I,g){var C=atob(I);if(g){for(var A=new Uint8Array(C.length),e=0,c=C.length;e=I.length?{done:!0}:{done:!1,value:I[A++]}},e:function(I){throw I},f:e}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var c,l=!0,t=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return l=I.done,I},e:function(I){t=!0,c=I},f:function(){try{l||null==C.return||C.return()}finally{if(t)throw c}}}}function M(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,A=new Array(g);C=I.length?{done:!0}:{done:!1,value:I[A++]}},e:function(I){throw I},f:e}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var c,l=!0,t=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return l=I.done,I},e:function(I){t=!0,c=I},f:function(){try{l||null==C.return||C.return()}finally{if(t)throw c}}}}function CI(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,A=new Array(g);Cm?e-m:0),B=c-o,r.push(L(d.workers[n],{action:N.COPY_TO_XPU,memAddress:C,offset:G,buffer:i.slice(B,B+a)})),o-=a),!(o<=0)){g.next=21;break}return g.abrupt("break",24);case 21:n++,g.next=11;break;case 24:return g.next=26,Promise.all(r);case 26:case"end":return g.stop()}}),g)})));return function(I,C,A,e){return g.apply(this,arguments)}}(),Z=function(){var g=e(b.mark((function g(C,A,e,c){var l,t,s,Z,d,i,r,o,n,m,G,a,B,y,V,W,u;return b.wrap((function(g){for(;;)switch(g.prev=g.next){case 0:if(C=S(C),A=S(A),l=E.getMemory(C)){g.next=5;break}return g.abrupt("return");case 5:if(t=l.objAddress,s=l.allocSize,Z=l.isShared,d=l.chunkSize,i=E.getXpu(t),r=new Uint8Array(I.buffer),o=[],!Z){g.next=13;break}o.push(L(i.workers[0],{action:N.COPY_FROM_XPU,memAddress:C,offset:e,size:s})),g.next=24;break;case 13:n=s,m=0;case 15:if(!(mG?e-G:0,B=Math.min(n,d-a),o.push(L(i.workers[m],{action:N.COPY_FROM_XPU,memAddress:C,offset:a,size:B})),n-=B),0!==n){g.next=21;break}return g.abrupt("break",24);case 21:m++,g.next=15;break;case 24:return g.next=26,Promise.all(o);case 26:y=g.sent,V=0,W=0;case 29:if(!(Wc)){g.next=36;break}return r.set(u.slice(0,c-V),A+V),g.abrupt("break",41);case 36:r.set(u,A+V),V+=u.length;case 38:W++,g.next=29;break;case 41:case"end":return g.stop()}}),g)})));return function(I,C,A,e){return g.apply(this,arguments)}}(),d=function(){var I=e(b.mark((function I(g,C,A){var e,c,l,t,s,Z,d,i,r;return b.wrap((function(I){for(;;)switch(I.prev=I.next){case 0:if(g=S(g),e=E.getMemory(g)){I.next=4;break}return I.abrupt("return");case 4:c=e.objAddress,l=e.allocSize,t=e.isShared,s=e.chunkSize,Z=E.getXpu(c),d=[],i=A,r=0;case 9:if(!(r0&&G.set(a[B],B*r);for(n=[],y=0;y= 0; --o) { + var i = this.tryEntries[o], + a = i.completion; + if ("root" === i.tryLoc) return handle("end"); + if (i.tryLoc <= this.prev) { + var c = n.call(i, "catchLoc"), + u = n.call(i, "finallyLoc"); + if (c && u) { + if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); + if (this.prev < i.finallyLoc) return handle(i.finallyLoc); + } else if (c) { + if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); + } else { + if (!u) throw new Error("try statement without catch or finally"); + if (this.prev < i.finallyLoc) return handle(i.finallyLoc); + } + } + } + }, + abrupt: function abrupt(t, e) { + for (var r = this.tryEntries.length - 1; r >= 0; --r) { + var o = this.tryEntries[r]; + if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { + var i = o; + break; + } + } + i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); + var a = i ? i.completion : {}; + return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); + }, + complete: function complete(t, e) { + if ("throw" === t.type) throw t.arg; + return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; + }, + finish: function finish(t) { + for (var e = this.tryEntries.length - 1; e >= 0; --e) { + var r = this.tryEntries[e]; + if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; + } + }, + "catch": function _catch(t) { + for (var e = this.tryEntries.length - 1; e >= 0; --e) { + var r = this.tryEntries[e]; + if (r.tryLoc === t) { + var n = r.completion; + if ("throw" === n.type) { + var o = n.arg; + resetTryEntry(r); + } + return o; + } + } + throw new Error("illegal catch attempt"); + }, + delegateYield: function delegateYield(e, r, n) { + return this.delegate = { + iterator: values(e), + resultName: r, + nextLoc: n + }, "next" === this.method && (this.arg = t), y; + } + }, e; + } + module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports; + } (regeneratorRuntime$2)); + + var regeneratorRuntimeExports$1 = regeneratorRuntime$2.exports; + + // TODO(Babel 8): Remove this file. + + var runtime$1 = regeneratorRuntimeExports$1(); + var regenerator = runtime$1; + + // Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736= + try { + regeneratorRuntime = runtime$1; + } catch (accidentalStrictMode) { + if (typeof globalThis === "object") { + globalThis.regeneratorRuntime = runtime$1; + } else { + Function("r", "regeneratorRuntime = r")(runtime$1); + } + } + + var _regeneratorRuntime = /*@__PURE__*/getDefaultExportFromCjs(regenerator); + + // NOTE: this list must be up-to-date with browsers listed in + // test/acceptance/useragentstrings.yml + const BROWSER_ALIASES_MAP = { + 'Amazon Silk': 'amazon_silk', + 'Android Browser': 'android', + Bada: 'bada', + BlackBerry: 'blackberry', + Chrome: 'chrome', + Chromium: 'chromium', + Electron: 'electron', + Epiphany: 'epiphany', + Firefox: 'firefox', + Focus: 'focus', + Generic: 'generic', + 'Google Search': 'google_search', + Googlebot: 'googlebot', + 'Internet Explorer': 'ie', + 'K-Meleon': 'k_meleon', + Maxthon: 'maxthon', + 'Microsoft Edge': 'edge', + 'MZ Browser': 'mz', + 'NAVER Whale Browser': 'naver', + Opera: 'opera', + 'Opera Coast': 'opera_coast', + PhantomJS: 'phantomjs', + Puffin: 'puffin', + QupZilla: 'qupzilla', + QQ: 'qq', + QQLite: 'qqlite', + Safari: 'safari', + Sailfish: 'sailfish', + 'Samsung Internet for Android': 'samsung_internet', + SeaMonkey: 'seamonkey', + Sleipnir: 'sleipnir', + Swing: 'swing', + Tizen: 'tizen', + 'UC Browser': 'uc', + Vivaldi: 'vivaldi', + 'WebOS Browser': 'webos', + WeChat: 'wechat', + 'Yandex Browser': 'yandex', + Roku: 'roku', + }; + + const BROWSER_MAP = { + amazon_silk: 'Amazon Silk', + android: 'Android Browser', + bada: 'Bada', + blackberry: 'BlackBerry', + chrome: 'Chrome', + chromium: 'Chromium', + electron: 'Electron', + epiphany: 'Epiphany', + firefox: 'Firefox', + focus: 'Focus', + generic: 'Generic', + googlebot: 'Googlebot', + google_search: 'Google Search', + ie: 'Internet Explorer', + k_meleon: 'K-Meleon', + maxthon: 'Maxthon', + edge: 'Microsoft Edge', + mz: 'MZ Browser', + naver: 'NAVER Whale Browser', + opera: 'Opera', + opera_coast: 'Opera Coast', + phantomjs: 'PhantomJS', + puffin: 'Puffin', + qupzilla: 'QupZilla', + qq: 'QQ Browser', + qqlite: 'QQ Browser Lite', + safari: 'Safari', + sailfish: 'Sailfish', + samsung_internet: 'Samsung Internet for Android', + seamonkey: 'SeaMonkey', + sleipnir: 'Sleipnir', + swing: 'Swing', + tizen: 'Tizen', + uc: 'UC Browser', + vivaldi: 'Vivaldi', + webos: 'WebOS Browser', + wechat: 'WeChat', + yandex: 'Yandex Browser', + }; + + const PLATFORMS_MAP = { + tablet: 'tablet', + mobile: 'mobile', + desktop: 'desktop', + tv: 'tv', + }; + + const OS_MAP = { + WindowsPhone: 'Windows Phone', + Windows: 'Windows', + MacOS: 'macOS', + iOS: 'iOS', + Android: 'Android', + WebOS: 'WebOS', + BlackBerry: 'BlackBerry', + Bada: 'Bada', + Tizen: 'Tizen', + Linux: 'Linux', + ChromeOS: 'Chrome OS', + PlayStation4: 'PlayStation 4', + Roku: 'Roku', + }; + + const ENGINE_MAP = { + EdgeHTML: 'EdgeHTML', + Blink: 'Blink', + Trident: 'Trident', + Presto: 'Presto', + Gecko: 'Gecko', + WebKit: 'WebKit', + }; + + class Utils { + /** + * Get first matched item for a string + * @param {RegExp} regexp + * @param {String} ua + * @return {Array|{index: number, input: string}|*|boolean|string} + */ + static getFirstMatch(regexp, ua) { + const match = ua.match(regexp); + return (match && match.length > 0 && match[1]) || ''; + } + + /** + * Get second matched item for a string + * @param regexp + * @param {String} ua + * @return {Array|{index: number, input: string}|*|boolean|string} + */ + static getSecondMatch(regexp, ua) { + const match = ua.match(regexp); + return (match && match.length > 1 && match[2]) || ''; + } + + /** + * Match a regexp and return a constant or undefined + * @param {RegExp} regexp + * @param {String} ua + * @param {*} _const Any const that will be returned if regexp matches the string + * @return {*} + */ + static matchAndReturnConst(regexp, ua, _const) { + if (regexp.test(ua)) { + return _const; + } + return void (0); + } + + static getWindowsVersionName(version) { + switch (version) { + case 'NT': return 'NT'; + case 'XP': return 'XP'; + case 'NT 5.0': return '2000'; + case 'NT 5.1': return 'XP'; + case 'NT 5.2': return '2003'; + case 'NT 6.0': return 'Vista'; + case 'NT 6.1': return '7'; + case 'NT 6.2': return '8'; + case 'NT 6.3': return '8.1'; + case 'NT 10.0': return '10'; + default: return undefined; + } + } + + /** + * Get macOS version name + * 10.5 - Leopard + * 10.6 - Snow Leopard + * 10.7 - Lion + * 10.8 - Mountain Lion + * 10.9 - Mavericks + * 10.10 - Yosemite + * 10.11 - El Capitan + * 10.12 - Sierra + * 10.13 - High Sierra + * 10.14 - Mojave + * 10.15 - Catalina + * + * @example + * getMacOSVersionName("10.14") // 'Mojave' + * + * @param {string} version + * @return {string} versionName + */ + static getMacOSVersionName(version) { + const v = version.split('.').splice(0, 2).map(s => parseInt(s, 10) || 0); + v.push(0); + if (v[0] !== 10) return undefined; + switch (v[1]) { + case 5: return 'Leopard'; + case 6: return 'Snow Leopard'; + case 7: return 'Lion'; + case 8: return 'Mountain Lion'; + case 9: return 'Mavericks'; + case 10: return 'Yosemite'; + case 11: return 'El Capitan'; + case 12: return 'Sierra'; + case 13: return 'High Sierra'; + case 14: return 'Mojave'; + case 15: return 'Catalina'; + default: return undefined; + } + } + + /** + * Get Android version name + * 1.5 - Cupcake + * 1.6 - Donut + * 2.0 - Eclair + * 2.1 - Eclair + * 2.2 - Froyo + * 2.x - Gingerbread + * 3.x - Honeycomb + * 4.0 - Ice Cream Sandwich + * 4.1 - Jelly Bean + * 4.4 - KitKat + * 5.x - Lollipop + * 6.x - Marshmallow + * 7.x - Nougat + * 8.x - Oreo + * 9.x - Pie + * + * @example + * getAndroidVersionName("7.0") // 'Nougat' + * + * @param {string} version + * @return {string} versionName + */ + static getAndroidVersionName(version) { + const v = version.split('.').splice(0, 2).map(s => parseInt(s, 10) || 0); + v.push(0); + if (v[0] === 1 && v[1] < 5) return undefined; + if (v[0] === 1 && v[1] < 6) return 'Cupcake'; + if (v[0] === 1 && v[1] >= 6) return 'Donut'; + if (v[0] === 2 && v[1] < 2) return 'Eclair'; + if (v[0] === 2 && v[1] === 2) return 'Froyo'; + if (v[0] === 2 && v[1] > 2) return 'Gingerbread'; + if (v[0] === 3) return 'Honeycomb'; + if (v[0] === 4 && v[1] < 1) return 'Ice Cream Sandwich'; + if (v[0] === 4 && v[1] < 4) return 'Jelly Bean'; + if (v[0] === 4 && v[1] >= 4) return 'KitKat'; + if (v[0] === 5) return 'Lollipop'; + if (v[0] === 6) return 'Marshmallow'; + if (v[0] === 7) return 'Nougat'; + if (v[0] === 8) return 'Oreo'; + if (v[0] === 9) return 'Pie'; + return undefined; + } + + /** + * Get version precisions count + * + * @example + * getVersionPrecision("1.10.3") // 3 + * + * @param {string} version + * @return {number} + */ + static getVersionPrecision(version) { + return version.split('.').length; + } + + /** + * Calculate browser version weight + * + * @example + * compareVersions('1.10.2.1', '1.8.2.1.90') // 1 + * compareVersions('1.010.2.1', '1.09.2.1.90'); // 1 + * compareVersions('1.10.2.1', '1.10.2.1'); // 0 + * compareVersions('1.10.2.1', '1.0800.2'); // -1 + * compareVersions('1.10.2.1', '1.10', true); // 0 + * + * @param {String} versionA versions versions to compare + * @param {String} versionB versions versions to compare + * @param {boolean} [isLoose] enable loose comparison + * @return {Number} comparison result: -1 when versionA is lower, + * 1 when versionA is bigger, 0 when both equal + */ + /* eslint consistent-return: 1 */ + static compareVersions(versionA, versionB, isLoose = false) { + // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2 + const versionAPrecision = Utils.getVersionPrecision(versionA); + const versionBPrecision = Utils.getVersionPrecision(versionB); + + let precision = Math.max(versionAPrecision, versionBPrecision); + let lastPrecision = 0; + + const chunks = Utils.map([versionA, versionB], (version) => { + const delta = precision - Utils.getVersionPrecision(version); + + // 2) "9" -> "9.0" (for precision = 2) + const _version = version + new Array(delta + 1).join('.0'); + + // 3) "9.0" -> ["000000000"", "000000009"] + return Utils.map(_version.split('.'), chunk => new Array(20 - chunk.length).join('0') + chunk).reverse(); + }); + + // adjust precision for loose comparison + if (isLoose) { + lastPrecision = precision - Math.min(versionAPrecision, versionBPrecision); + } + + // iterate in reverse order by reversed chunks array + precision -= 1; + while (precision >= lastPrecision) { + // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true) + if (chunks[0][precision] > chunks[1][precision]) { + return 1; + } + + if (chunks[0][precision] === chunks[1][precision]) { + if (precision === lastPrecision) { + // all version chunks are same + return 0; + } + + precision -= 1; + } else if (chunks[0][precision] < chunks[1][precision]) { + return -1; + } + } + + return undefined; + } + + /** + * Array::map polyfill + * + * @param {Array} arr + * @param {Function} iterator + * @return {Array} + */ + static map(arr, iterator) { + const result = []; + let i; + if (Array.prototype.map) { + return Array.prototype.map.call(arr, iterator); + } + for (i = 0; i < arr.length; i += 1) { + result.push(iterator(arr[i])); + } + return result; + } + + /** + * Array::find polyfill + * + * @param {Array} arr + * @param {Function} predicate + * @return {Array} + */ + static find(arr, predicate) { + let i; + let l; + if (Array.prototype.find) { + return Array.prototype.find.call(arr, predicate); + } + for (i = 0, l = arr.length; i < l; i += 1) { + const value = arr[i]; + if (predicate(value, i)) { + return value; + } + } + return undefined; + } + + /** + * Object::assign polyfill + * + * @param {Object} obj + * @param {Object} ...objs + * @return {Object} + */ + static assign(obj, ...assigners) { + const result = obj; + let i; + let l; + if (Object.assign) { + return Object.assign(obj, ...assigners); + } + for (i = 0, l = assigners.length; i < l; i += 1) { + const assigner = assigners[i]; + if (typeof assigner === 'object' && assigner !== null) { + const keys = Object.keys(assigner); + keys.forEach((key) => { + result[key] = assigner[key]; + }); + } + } + return obj; + } + + /** + * Get short version/alias for a browser name + * + * @example + * getBrowserAlias('Microsoft Edge') // edge + * + * @param {string} browserName + * @return {string} + */ + static getBrowserAlias(browserName) { + return BROWSER_ALIASES_MAP[browserName]; + } + + /** + * Get short version/alias for a browser name + * + * @example + * getBrowserAlias('edge') // Microsoft Edge + * + * @param {string} browserAlias + * @return {string} + */ + static getBrowserTypeByAlias(browserAlias) { + return BROWSER_MAP[browserAlias] || ''; + } + } + + /** + * Browsers' descriptors + * + * The idea of descriptors is simple. You should know about them two simple things: + * 1. Every descriptor has a method or property called `test` and a `describe` method. + * 2. Order of descriptors is important. + * + * More details: + * 1. Method or property `test` serves as a way to detect whether the UA string + * matches some certain browser or not. The `describe` method helps to make a result + * object with params that show some browser-specific things: name, version, etc. + * 2. Order of descriptors is important because a Parser goes through them one by one + * in course. For example, if you insert Chrome's descriptor as the first one, + * more then a half of browsers will be described as Chrome, because they will pass + * the Chrome descriptor's test. + * + * Descriptor's `test` could be a property with an array of RegExps, where every RegExp + * will be applied to a UA string to test it whether it matches or not. + * If a descriptor has two or more regexps in the `test` array it tests them one by one + * with a logical sum operation. Parser stops if it has found any RegExp that matches the UA. + * + * Or `test` could be a method. In that case it gets a Parser instance and should + * return true/false to get the Parser know if this browser descriptor matches the UA or not. + */ + + const commonVersionIdentifier = /version\/(\d+(\.?_?\d+)+)/i; + + const browsersList = [ + /* Googlebot */ + { + test: [/googlebot/i], + describe(ua) { + const browser = { + name: 'Googlebot', + }; + const version = Utils.getFirstMatch(/googlebot\/(\d+(\.\d+))/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Opera < 13.0 */ + { + test: [/opera/i], + describe(ua) { + const browser = { + name: 'Opera', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Opera > 13.0 */ + { + test: [/opr\/|opios/i], + describe(ua) { + const browser = { + name: 'Opera', + }; + const version = Utils.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/SamsungBrowser/i], + describe(ua) { + const browser = { + name: 'Samsung Internet for Android', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/Whale/i], + describe(ua) { + const browser = { + name: 'NAVER Whale Browser', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/MZBrowser/i], + describe(ua) { + const browser = { + name: 'MZ Browser', + }; + const version = Utils.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/focus/i], + describe(ua) { + const browser = { + name: 'Focus', + }; + const version = Utils.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/swing/i], + describe(ua) { + const browser = { + name: 'Swing', + }; + const version = Utils.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/coast/i], + describe(ua) { + const browser = { + name: 'Opera Coast', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/opt\/\d+(?:.?_?\d+)+/i], + describe(ua) { + const browser = { + name: 'Opera Touch', + }; + const version = Utils.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/yabrowser/i], + describe(ua) { + const browser = { + name: 'Yandex Browser', + }; + const version = Utils.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/ucbrowser/i], + describe(ua) { + const browser = { + name: 'UC Browser', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/Maxthon|mxios/i], + describe(ua) { + const browser = { + name: 'Maxthon', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/epiphany/i], + describe(ua) { + const browser = { + name: 'Epiphany', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/puffin/i], + describe(ua) { + const browser = { + name: 'Puffin', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/sleipnir/i], + describe(ua) { + const browser = { + name: 'Sleipnir', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/k-meleon/i], + describe(ua) { + const browser = { + name: 'K-Meleon', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/micromessenger/i], + describe(ua) { + const browser = { + name: 'WeChat', + }; + const version = Utils.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/qqbrowser/i], + describe(ua) { + const browser = { + name: (/qqbrowserlite/i).test(ua) ? 'QQ Browser Lite' : 'QQ Browser', + }; + const version = Utils.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/msie|trident/i], + describe(ua) { + const browser = { + name: 'Internet Explorer', + }; + const version = Utils.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/\sedg\//i], + describe(ua) { + const browser = { + name: 'Microsoft Edge', + }; + + const version = Utils.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/edg([ea]|ios)/i], + describe(ua) { + const browser = { + name: 'Microsoft Edge', + }; + + const version = Utils.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/vivaldi/i], + describe(ua) { + const browser = { + name: 'Vivaldi', + }; + const version = Utils.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/seamonkey/i], + describe(ua) { + const browser = { + name: 'SeaMonkey', + }; + const version = Utils.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/sailfish/i], + describe(ua) { + const browser = { + name: 'Sailfish', + }; + + const version = Utils.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/silk/i], + describe(ua) { + const browser = { + name: 'Amazon Silk', + }; + const version = Utils.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/phantom/i], + describe(ua) { + const browser = { + name: 'PhantomJS', + }; + const version = Utils.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/slimerjs/i], + describe(ua) { + const browser = { + name: 'SlimerJS', + }; + const version = Utils.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/blackberry|\bbb\d+/i, /rim\stablet/i], + describe(ua) { + const browser = { + name: 'BlackBerry', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/(web|hpw)[o0]s/i], + describe(ua) { + const browser = { + name: 'WebOS Browser', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua) || Utils.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/bada/i], + describe(ua) { + const browser = { + name: 'Bada', + }; + const version = Utils.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/tizen/i], + describe(ua) { + const browser = { + name: 'Tizen', + }; + const version = Utils.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/qupzilla/i], + describe(ua) { + const browser = { + name: 'QupZilla', + }; + const version = Utils.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/firefox|iceweasel|fxios/i], + describe(ua) { + const browser = { + name: 'Firefox', + }; + const version = Utils.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/electron/i], + describe(ua) { + const browser = { + name: 'Electron', + }; + const version = Utils.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/MiuiBrowser/i], + describe(ua) { + const browser = { + name: 'Miui', + }; + const version = Utils.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/chromium/i], + describe(ua) { + const browser = { + name: 'Chromium', + }; + const version = Utils.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i, ua) || Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/chrome|crios|crmo/i], + describe(ua) { + const browser = { + name: 'Chrome', + }; + const version = Utils.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + { + test: [/GSA/i], + describe(ua) { + const browser = { + name: 'Google Search', + }; + const version = Utils.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Android Browser */ + { + test(parser) { + const notLikeAndroid = !parser.test(/like android/i); + const butAndroid = parser.test(/android/i); + return notLikeAndroid && butAndroid; + }, + describe(ua) { + const browser = { + name: 'Android Browser', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* PlayStation 4 */ + { + test: [/playstation 4/i], + describe(ua) { + const browser = { + name: 'PlayStation 4', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Safari */ + { + test: [/safari|applewebkit/i], + describe(ua) { + const browser = { + name: 'Safari', + }; + const version = Utils.getFirstMatch(commonVersionIdentifier, ua); + + if (version) { + browser.version = version; + } + + return browser; + }, + }, + + /* Something else */ + { + test: [/.*/i], + describe(ua) { + /* Here we try to make sure that there are explicit details about the device + * in order to decide what regexp exactly we want to apply + * (as there is a specific decision based on that conclusion) + */ + const regexpWithoutDeviceSpec = /^(.*)\/(.*) /; + const regexpWithDeviceSpec = /^(.*)\/(.*)[ \t]\((.*)/; + const hasDeviceSpec = ua.search('\\(') !== -1; + const regexp = hasDeviceSpec ? regexpWithDeviceSpec : regexpWithoutDeviceSpec; + return { + name: Utils.getFirstMatch(regexp, ua), + version: Utils.getSecondMatch(regexp, ua), + }; + }, + }, + ]; + + var osParsersList = [ + /* Roku */ + { + test: [/Roku\/DVP/], + describe(ua) { + const version = Utils.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i, ua); + return { + name: OS_MAP.Roku, + version, + }; + }, + }, + + /* Windows Phone */ + { + test: [/windows phone/i], + describe(ua) { + const version = Utils.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i, ua); + return { + name: OS_MAP.WindowsPhone, + version, + }; + }, + }, + + /* Windows */ + { + test: [/windows /i], + describe(ua) { + const version = Utils.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i, ua); + const versionName = Utils.getWindowsVersionName(version); + + return { + name: OS_MAP.Windows, + version, + versionName, + }; + }, + }, + + /* Firefox on iPad */ + { + test: [/Macintosh(.*?) FxiOS(.*?)\//], + describe(ua) { + const result = { + name: OS_MAP.iOS, + }; + const version = Utils.getSecondMatch(/(Version\/)(\d[\d.]+)/, ua); + if (version) { + result.version = version; + } + return result; + }, + }, + + /* macOS */ + { + test: [/macintosh/i], + describe(ua) { + const version = Utils.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i, ua).replace(/[_\s]/g, '.'); + const versionName = Utils.getMacOSVersionName(version); + + const os = { + name: OS_MAP.MacOS, + version, + }; + if (versionName) { + os.versionName = versionName; + } + return os; + }, + }, + + /* iOS */ + { + test: [/(ipod|iphone|ipad)/i], + describe(ua) { + const version = Utils.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i, ua).replace(/[_\s]/g, '.'); + + return { + name: OS_MAP.iOS, + version, + }; + }, + }, + + /* Android */ + { + test(parser) { + const notLikeAndroid = !parser.test(/like android/i); + const butAndroid = parser.test(/android/i); + return notLikeAndroid && butAndroid; + }, + describe(ua) { + const version = Utils.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i, ua); + const versionName = Utils.getAndroidVersionName(version); + const os = { + name: OS_MAP.Android, + version, + }; + if (versionName) { + os.versionName = versionName; + } + return os; + }, + }, + + /* WebOS */ + { + test: [/(web|hpw)[o0]s/i], + describe(ua) { + const version = Utils.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i, ua); + const os = { + name: OS_MAP.WebOS, + }; + + if (version && version.length) { + os.version = version; + } + return os; + }, + }, + + /* BlackBerry */ + { + test: [/blackberry|\bbb\d+/i, /rim\stablet/i], + describe(ua) { + const version = Utils.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i, ua) + || Utils.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i, ua) + || Utils.getFirstMatch(/\bbb(\d+)/i, ua); + + return { + name: OS_MAP.BlackBerry, + version, + }; + }, + }, + + /* Bada */ + { + test: [/bada/i], + describe(ua) { + const version = Utils.getFirstMatch(/bada\/(\d+(\.\d+)*)/i, ua); + + return { + name: OS_MAP.Bada, + version, + }; + }, + }, + + /* Tizen */ + { + test: [/tizen/i], + describe(ua) { + const version = Utils.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i, ua); + + return { + name: OS_MAP.Tizen, + version, + }; + }, + }, + + /* Linux */ + { + test: [/linux/i], + describe() { + return { + name: OS_MAP.Linux, + }; + }, + }, + + /* Chrome OS */ + { + test: [/CrOS/], + describe() { + return { + name: OS_MAP.ChromeOS, + }; + }, + }, + + /* Playstation 4 */ + { + test: [/PlayStation 4/], + describe(ua) { + const version = Utils.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i, ua); + return { + name: OS_MAP.PlayStation4, + version, + }; + }, + }, + ]; + + /* + * Tablets go first since usually they have more specific + * signs to detect. + */ + + var platformParsersList = [ + /* Googlebot */ + { + test: [/googlebot/i], + describe() { + return { + type: 'bot', + vendor: 'Google', + }; + }, + }, + + /* Huawei */ + { + test: [/huawei/i], + describe(ua) { + const model = Utils.getFirstMatch(/(can-l01)/i, ua) && 'Nova'; + const platform = { + type: PLATFORMS_MAP.mobile, + vendor: 'Huawei', + }; + if (model) { + platform.model = model; + } + return platform; + }, + }, + + /* Nexus Tablet */ + { + test: [/nexus\s*(?:7|8|9|10).*/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Nexus', + }; + }, + }, + + /* iPad */ + { + test: [/ipad/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Apple', + model: 'iPad', + }; + }, + }, + + /* Firefox on iPad */ + { + test: [/Macintosh(.*?) FxiOS(.*?)\//], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Apple', + model: 'iPad', + }; + }, + }, + + /* Amazon Kindle Fire */ + { + test: [/kftt build/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Amazon', + model: 'Kindle Fire HD 7', + }; + }, + }, + + /* Another Amazon Tablet with Silk */ + { + test: [/silk/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + vendor: 'Amazon', + }; + }, + }, + + /* Tablet */ + { + test: [/tablet(?! pc)/i], + describe() { + return { + type: PLATFORMS_MAP.tablet, + }; + }, + }, + + /* iPod/iPhone */ + { + test(parser) { + const iDevice = parser.test(/ipod|iphone/i); + const likeIDevice = parser.test(/like (ipod|iphone)/i); + return iDevice && !likeIDevice; + }, + describe(ua) { + const model = Utils.getFirstMatch(/(ipod|iphone)/i, ua); + return { + type: PLATFORMS_MAP.mobile, + vendor: 'Apple', + model, + }; + }, + }, + + /* Nexus Mobile */ + { + test: [/nexus\s*[0-6].*/i, /galaxy nexus/i], + describe() { + return { + type: PLATFORMS_MAP.mobile, + vendor: 'Nexus', + }; + }, + }, + + /* Mobile */ + { + test: [/[^-]mobi/i], + describe() { + return { + type: PLATFORMS_MAP.mobile, + }; + }, + }, + + /* BlackBerry */ + { + test(parser) { + return parser.getBrowserName(true) === 'blackberry'; + }, + describe() { + return { + type: PLATFORMS_MAP.mobile, + vendor: 'BlackBerry', + }; + }, + }, + + /* Bada */ + { + test(parser) { + return parser.getBrowserName(true) === 'bada'; + }, + describe() { + return { + type: PLATFORMS_MAP.mobile, + }; + }, + }, + + /* Windows Phone */ + { + test(parser) { + return parser.getBrowserName() === 'windows phone'; + }, + describe() { + return { + type: PLATFORMS_MAP.mobile, + vendor: 'Microsoft', + }; + }, + }, + + /* Android Tablet */ + { + test(parser) { + const osMajorVersion = Number(String(parser.getOSVersion()).split('.')[0]); + return parser.getOSName(true) === 'android' && (osMajorVersion >= 3); + }, + describe() { + return { + type: PLATFORMS_MAP.tablet, + }; + }, + }, + + /* Android Mobile */ + { + test(parser) { + return parser.getOSName(true) === 'android'; + }, + describe() { + return { + type: PLATFORMS_MAP.mobile, + }; + }, + }, + + /* desktop */ + { + test(parser) { + return parser.getOSName(true) === 'macos'; + }, + describe() { + return { + type: PLATFORMS_MAP.desktop, + vendor: 'Apple', + }; + }, + }, + + /* Windows */ + { + test(parser) { + return parser.getOSName(true) === 'windows'; + }, + describe() { + return { + type: PLATFORMS_MAP.desktop, + }; + }, + }, + + /* Linux */ + { + test(parser) { + return parser.getOSName(true) === 'linux'; + }, + describe() { + return { + type: PLATFORMS_MAP.desktop, + }; + }, + }, + + /* PlayStation 4 */ + { + test(parser) { + return parser.getOSName(true) === 'playstation 4'; + }, + describe() { + return { + type: PLATFORMS_MAP.tv, + }; + }, + }, + + /* Roku */ + { + test(parser) { + return parser.getOSName(true) === 'roku'; + }, + describe() { + return { + type: PLATFORMS_MAP.tv, + }; + }, + }, + ]; + + /* + * More specific goes first + */ + var enginesParsersList = [ + /* EdgeHTML */ + { + test(parser) { + return parser.getBrowserName(true) === 'microsoft edge'; + }, + describe(ua) { + const isBlinkBased = /\sedg\//i.test(ua); + + // return blink if it's blink-based one + if (isBlinkBased) { + return { + name: ENGINE_MAP.Blink, + }; + } + + // otherwise match the version and return EdgeHTML + const version = Utils.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i, ua); + + return { + name: ENGINE_MAP.EdgeHTML, + version, + }; + }, + }, + + /* Trident */ + { + test: [/trident/i], + describe(ua) { + const engine = { + name: ENGINE_MAP.Trident, + }; + + const version = Utils.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + engine.version = version; + } + + return engine; + }, + }, + + /* Presto */ + { + test(parser) { + return parser.test(/presto/i); + }, + describe(ua) { + const engine = { + name: ENGINE_MAP.Presto, + }; + + const version = Utils.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + engine.version = version; + } + + return engine; + }, + }, + + /* Gecko */ + { + test(parser) { + const isGecko = parser.test(/gecko/i); + const likeGecko = parser.test(/like gecko/i); + return isGecko && !likeGecko; + }, + describe(ua) { + const engine = { + name: ENGINE_MAP.Gecko, + }; + + const version = Utils.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + engine.version = version; + } + + return engine; + }, + }, + + /* Blink */ + { + test: [/(apple)?webkit\/537\.36/i], + describe() { + return { + name: ENGINE_MAP.Blink, + }; + }, + }, + + /* WebKit */ + { + test: [/(apple)?webkit/i], + describe(ua) { + const engine = { + name: ENGINE_MAP.WebKit, + }; + + const version = Utils.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i, ua); + + if (version) { + engine.version = version; + } + + return engine; + }, + }, + ]; + + /** + * The main class that arranges the whole parsing process. + */ + class Parser { + /** + * Create instance of Parser + * + * @param {String} UA User-Agent string + * @param {Boolean} [skipParsing=false] parser can skip parsing in purpose of performance + * improvements if you need to make a more particular parsing + * like {@link Parser#parseBrowser} or {@link Parser#parsePlatform} + * + * @throw {Error} in case of empty UA String + * + * @constructor + */ + constructor(UA, skipParsing = false) { + if (UA === void (0) || UA === null || UA === '') { + throw new Error("UserAgent parameter can't be empty"); + } + + this._ua = UA; + + /** + * @typedef ParsedResult + * @property {Object} browser + * @property {String|undefined} [browser.name] + * Browser name, like `"Chrome"` or `"Internet Explorer"` + * @property {String|undefined} [browser.version] Browser version as a String `"12.01.45334.10"` + * @property {Object} os + * @property {String|undefined} [os.name] OS name, like `"Windows"` or `"macOS"` + * @property {String|undefined} [os.version] OS version, like `"NT 5.1"` or `"10.11.1"` + * @property {String|undefined} [os.versionName] OS name, like `"XP"` or `"High Sierra"` + * @property {Object} platform + * @property {String|undefined} [platform.type] + * platform type, can be either `"desktop"`, `"tablet"` or `"mobile"` + * @property {String|undefined} [platform.vendor] Vendor of the device, + * like `"Apple"` or `"Samsung"` + * @property {String|undefined} [platform.model] Device model, + * like `"iPhone"` or `"Kindle Fire HD 7"` + * @property {Object} engine + * @property {String|undefined} [engine.name] + * Can be any of this: `WebKit`, `Blink`, `Gecko`, `Trident`, `Presto`, `EdgeHTML` + * @property {String|undefined} [engine.version] String version of the engine + */ + this.parsedResult = {}; + + if (skipParsing !== true) { + this.parse(); + } + } + + /** + * Get UserAgent string of current Parser instance + * @return {String} User-Agent String of the current object + * + * @public + */ + getUA() { + return this._ua; + } + + /** + * Test a UA string for a regexp + * @param {RegExp} regex + * @return {Boolean} + */ + test(regex) { + return regex.test(this._ua); + } + + /** + * Get parsed browser object + * @return {Object} + */ + parseBrowser() { + this.parsedResult.browser = {}; + + const browserDescriptor = Utils.find(browsersList, (_browser) => { + if (typeof _browser.test === 'function') { + return _browser.test(this); + } + + if (_browser.test instanceof Array) { + return _browser.test.some(condition => this.test(condition)); + } + + throw new Error("Browser's test function is not valid"); + }); + + if (browserDescriptor) { + this.parsedResult.browser = browserDescriptor.describe(this.getUA()); + } + + return this.parsedResult.browser; + } + + /** + * Get parsed browser object + * @return {Object} + * + * @public + */ + getBrowser() { + if (this.parsedResult.browser) { + return this.parsedResult.browser; + } + + return this.parseBrowser(); + } + + /** + * Get browser's name + * @return {String} Browser's name or an empty string + * + * @public + */ + getBrowserName(toLowerCase) { + if (toLowerCase) { + return String(this.getBrowser().name).toLowerCase() || ''; + } + return this.getBrowser().name || ''; + } + + + /** + * Get browser's version + * @return {String} version of browser + * + * @public + */ + getBrowserVersion() { + return this.getBrowser().version; + } + + /** + * Get OS + * @return {Object} + * + * @example + * this.getOS(); + * { + * name: 'macOS', + * version: '10.11.12' + * } + */ + getOS() { + if (this.parsedResult.os) { + return this.parsedResult.os; + } + + return this.parseOS(); + } + + /** + * Parse OS and save it to this.parsedResult.os + * @return {*|{}} + */ + parseOS() { + this.parsedResult.os = {}; + + const os = Utils.find(osParsersList, (_os) => { + if (typeof _os.test === 'function') { + return _os.test(this); + } + + if (_os.test instanceof Array) { + return _os.test.some(condition => this.test(condition)); + } + + throw new Error("Browser's test function is not valid"); + }); + + if (os) { + this.parsedResult.os = os.describe(this.getUA()); + } + + return this.parsedResult.os; + } + + /** + * Get OS name + * @param {Boolean} [toLowerCase] return lower-cased value + * @return {String} name of the OS — macOS, Windows, Linux, etc. + */ + getOSName(toLowerCase) { + const { name } = this.getOS(); + + if (toLowerCase) { + return String(name).toLowerCase() || ''; + } + + return name || ''; + } + + /** + * Get OS version + * @return {String} full version with dots ('10.11.12', '5.6', etc) + */ + getOSVersion() { + return this.getOS().version; + } + + /** + * Get parsed platform + * @return {{}} + */ + getPlatform() { + if (this.parsedResult.platform) { + return this.parsedResult.platform; + } + + return this.parsePlatform(); + } + + /** + * Get platform name + * @param {Boolean} [toLowerCase=false] + * @return {*} + */ + getPlatformType(toLowerCase = false) { + const { type } = this.getPlatform(); + + if (toLowerCase) { + return String(type).toLowerCase() || ''; + } + + return type || ''; + } + + /** + * Get parsed platform + * @return {{}} + */ + parsePlatform() { + this.parsedResult.platform = {}; + + const platform = Utils.find(platformParsersList, (_platform) => { + if (typeof _platform.test === 'function') { + return _platform.test(this); + } + + if (_platform.test instanceof Array) { + return _platform.test.some(condition => this.test(condition)); + } + + throw new Error("Browser's test function is not valid"); + }); + + if (platform) { + this.parsedResult.platform = platform.describe(this.getUA()); + } + + return this.parsedResult.platform; + } + + /** + * Get parsed engine + * @return {{}} + */ + getEngine() { + if (this.parsedResult.engine) { + return this.parsedResult.engine; + } + + return this.parseEngine(); + } + + /** + * Get engines's name + * @return {String} Engines's name or an empty string + * + * @public + */ + getEngineName(toLowerCase) { + if (toLowerCase) { + return String(this.getEngine().name).toLowerCase() || ''; + } + return this.getEngine().name || ''; + } + + /** + * Get parsed platform + * @return {{}} + */ + parseEngine() { + this.parsedResult.engine = {}; + + const engine = Utils.find(enginesParsersList, (_engine) => { + if (typeof _engine.test === 'function') { + return _engine.test(this); + } + + if (_engine.test instanceof Array) { + return _engine.test.some(condition => this.test(condition)); + } + + throw new Error("Browser's test function is not valid"); + }); + + if (engine) { + this.parsedResult.engine = engine.describe(this.getUA()); + } + + return this.parsedResult.engine; + } + + /** + * Parse full information about the browser + * @returns {Parser} + */ + parse() { + this.parseBrowser(); + this.parseOS(); + this.parsePlatform(); + this.parseEngine(); + + return this; + } + + /** + * Get parsed result + * @return {ParsedResult} + */ + getResult() { + return Utils.assign({}, this.parsedResult); + } + + /** + * Check if parsed browser matches certain conditions + * + * @param {Object} checkTree It's one or two layered object, + * which can include a platform or an OS on the first layer + * and should have browsers specs on the bottom-laying layer + * + * @returns {Boolean|undefined} Whether the browser satisfies the set conditions or not. + * Returns `undefined` when the browser is no described in the checkTree object. + * + * @example + * const browser = Bowser.getParser(window.navigator.userAgent); + * if (browser.satisfies({chrome: '>118.01.1322' })) + * // or with os + * if (browser.satisfies({windows: { chrome: '>118.01.1322' } })) + * // or with platforms + * if (browser.satisfies({desktop: { chrome: '>118.01.1322' } })) + */ + satisfies(checkTree) { + const platformsAndOSes = {}; + let platformsAndOSCounter = 0; + const browsers = {}; + let browsersCounter = 0; + + const allDefinitions = Object.keys(checkTree); + + allDefinitions.forEach((key) => { + const currentDefinition = checkTree[key]; + if (typeof currentDefinition === 'string') { + browsers[key] = currentDefinition; + browsersCounter += 1; + } else if (typeof currentDefinition === 'object') { + platformsAndOSes[key] = currentDefinition; + platformsAndOSCounter += 1; + } + }); + + if (platformsAndOSCounter > 0) { + const platformsAndOSNames = Object.keys(platformsAndOSes); + const OSMatchingDefinition = Utils.find(platformsAndOSNames, name => (this.isOS(name))); + + if (OSMatchingDefinition) { + const osResult = this.satisfies(platformsAndOSes[OSMatchingDefinition]); + + if (osResult !== void 0) { + return osResult; + } + } + + const platformMatchingDefinition = Utils.find( + platformsAndOSNames, + name => (this.isPlatform(name)), + ); + if (platformMatchingDefinition) { + const platformResult = this.satisfies(platformsAndOSes[platformMatchingDefinition]); + + if (platformResult !== void 0) { + return platformResult; + } + } + } + + if (browsersCounter > 0) { + const browserNames = Object.keys(browsers); + const matchingDefinition = Utils.find(browserNames, name => (this.isBrowser(name, true))); + + if (matchingDefinition !== void 0) { + return this.compareVersion(browsers[matchingDefinition]); + } + } + + return undefined; + } + + /** + * Check if the browser name equals the passed string + * @param browserName The string to compare with the browser name + * @param [includingAlias=false] The flag showing whether alias will be included into comparison + * @returns {boolean} + */ + isBrowser(browserName, includingAlias = false) { + const defaultBrowserName = this.getBrowserName().toLowerCase(); + let browserNameLower = browserName.toLowerCase(); + const alias = Utils.getBrowserTypeByAlias(browserNameLower); + + if (includingAlias && alias) { + browserNameLower = alias.toLowerCase(); + } + return browserNameLower === defaultBrowserName; + } + + compareVersion(version) { + let expectedResults = [0]; + let comparableVersion = version; + let isLoose = false; + + const currentBrowserVersion = this.getBrowserVersion(); + + if (typeof currentBrowserVersion !== 'string') { + return void 0; + } + + if (version[0] === '>' || version[0] === '<') { + comparableVersion = version.substr(1); + if (version[1] === '=') { + isLoose = true; + comparableVersion = version.substr(2); + } else { + expectedResults = []; + } + if (version[0] === '>') { + expectedResults.push(1); + } else { + expectedResults.push(-1); + } + } else if (version[0] === '=') { + comparableVersion = version.substr(1); + } else if (version[0] === '~') { + isLoose = true; + comparableVersion = version.substr(1); + } + + return expectedResults.indexOf( + Utils.compareVersions(currentBrowserVersion, comparableVersion, isLoose), + ) > -1; + } + + isOS(osName) { + return this.getOSName(true) === String(osName).toLowerCase(); + } + + isPlatform(platformType) { + return this.getPlatformType(true) === String(platformType).toLowerCase(); + } + + isEngine(engineName) { + return this.getEngineName(true) === String(engineName).toLowerCase(); + } + + /** + * Is anything? Check if the browser is called "anything", + * the OS called "anything" or the platform called "anything" + * @param {String} anything + * @param [includingAlias=false] The flag showing whether alias will be included into comparison + * @returns {Boolean} + */ + is(anything, includingAlias = false) { + return this.isBrowser(anything, includingAlias) || this.isOS(anything) + || this.isPlatform(anything); + } + + /** + * Check if any of the given values satisfies this.is(anything) + * @param {String[]} anythings + * @returns {Boolean} + */ + some(anythings = []) { + return anythings.some(anything => this.is(anything)); + } + } + + /*! + * Bowser - a browser detector + * https://github.com/lancedikson/bowser + * MIT License | (c) Dustin Diaz 2012-2015 + * MIT License | (c) Denis Demchenko 2015-2019 + */ + + /** + * Bowser class. + * Keep it simple as much as it can be. + * It's supposed to work with collections of {@link Parser} instances + * rather then solve one-instance problems. + * All the one-instance stuff is located in Parser class. + * + * @class + * @classdesc Bowser is a static object, that provides an API to the Parsers + * @hideconstructor + */ + class Bowser { + /** + * Creates a {@link Parser} instance + * + * @param {String} UA UserAgent string + * @param {Boolean} [skipParsing=false] Will make the Parser postpone parsing until you ask it + * explicitly. Same as `skipParsing` for {@link Parser}. + * @returns {Parser} + * @throws {Error} when UA is not a String + * + * @example + * const parser = Bowser.getParser(window.navigator.userAgent); + * const result = parser.getResult(); + */ + static getParser(UA, skipParsing = false) { + if (typeof UA !== 'string') { + throw new Error('UserAgent should be a string'); + } + return new Parser(UA, skipParsing); + } + + /** + * Creates a {@link Parser} instance and runs {@link Parser.getResult} immediately + * + * @param UA + * @return {ParsedResult} + * + * @example + * const result = Bowser.parse(window.navigator.userAgent); + */ + static parse(UA) { + return (new Parser(UA)).getResult(); + } + + static get BROWSER_MAP() { + return BROWSER_MAP; + } + + static get ENGINE_MAP() { + return ENGINE_MAP; + } + + static get OS_MAP() { + return OS_MAP; + } + + static get PLATFORMS_MAP() { + return PLATFORMS_MAP; + } + } + + var regeneratorRuntime$1 = {exports: {}}; + + var _typeof$1 = {exports: {}}; + + _typeof$1.exports; + + (function (module) { + function _typeof(o) { + "@babel/helpers - typeof"; + + return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { + return typeof o; + } : function (o) { + return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; + }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(o); + } + module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports; + } (_typeof$1)); + + var _typeofExports = _typeof$1.exports; + + regeneratorRuntime$1.exports; + + (function (module) { + var _typeof = _typeofExports["default"]; + function _regeneratorRuntime() { + module.exports = _regeneratorRuntime = function _regeneratorRuntime() { + return e; + }, module.exports.__esModule = true, module.exports["default"] = module.exports; + var t, + e = {}, + r = Object.prototype, + n = r.hasOwnProperty, + o = Object.defineProperty || function (t, e, r) { + t[e] = r.value; + }, + i = "function" == typeof Symbol ? Symbol : {}, + a = i.iterator || "@@iterator", + c = i.asyncIterator || "@@asyncIterator", + u = i.toStringTag || "@@toStringTag"; + function define(t, e, r) { + return Object.defineProperty(t, e, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }), t[e]; + } + try { + define({}, ""); + } catch (t) { + define = function define(t, e, r) { + return t[e] = r; + }; + } + function wrap(t, e, r, n) { + var i = e && e.prototype instanceof Generator ? e : Generator, + a = Object.create(i.prototype), + c = new Context(n || []); + return o(a, "_invoke", { + value: makeInvokeMethod(t, r, c) + }), a; + } + function tryCatch(t, e, r) { + try { + return { + type: "normal", + arg: t.call(e, r) + }; + } catch (t) { + return { + type: "throw", + arg: t + }; + } + } + e.wrap = wrap; + var h = "suspendedStart", + l = "suspendedYield", + f = "executing", + s = "completed", + y = {}; + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + var p = {}; + define(p, a, function () { + return this; + }); + var d = Object.getPrototypeOf, + v = d && d(d(values([]))); + v && v !== r && n.call(v, a) && (p = v); + var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); + function defineIteratorMethods(t) { + ["next", "throw", "return"].forEach(function (e) { + define(t, e, function (t) { + return this._invoke(e, t); + }); + }); + } + function AsyncIterator(t, e) { + function invoke(r, o, i, a) { + var c = tryCatch(t[r], t, o); + if ("throw" !== c.type) { + var u = c.arg, + h = u.value; + return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { + invoke("next", t, i, a); + }, function (t) { + invoke("throw", t, i, a); + }) : e.resolve(h).then(function (t) { + u.value = t, i(u); + }, function (t) { + return invoke("throw", t, i, a); + }); + } + a(c.arg); + } + var r; + o(this, "_invoke", { + value: function value(t, n) { + function callInvokeWithMethodAndArg() { + return new e(function (e, r) { + invoke(t, n, e, r); + }); + } + return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); + } + }); + } + function makeInvokeMethod(e, r, n) { + var o = h; + return function (i, a) { + if (o === f) throw new Error("Generator is already running"); + if (o === s) { + if ("throw" === i) throw a; + return { + value: t, + done: !0 + }; + } + for (n.method = i, n.arg = a;;) { + var c = n.delegate; + if (c) { + var u = maybeInvokeDelegate(c, n); + if (u) { + if (u === y) continue; + return u; + } + } + if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { + if (o === h) throw o = s, n.arg; + n.dispatchException(n.arg); + } else "return" === n.method && n.abrupt("return", n.arg); + o = f; + var p = tryCatch(e, r, n); + if ("normal" === p.type) { + if (o = n.done ? s : l, p.arg === y) continue; + return { + value: p.arg, + done: n.done + }; + } + "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); + } + }; + } + function maybeInvokeDelegate(e, r) { + var n = r.method, + o = e.iterator[n]; + if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; + var i = tryCatch(o, e.iterator, r.arg); + if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; + var a = i.arg; + return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); + } + function pushTryEntry(t) { + var e = { + tryLoc: t[0] + }; + 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); + } + function resetTryEntry(t) { + var e = t.completion || {}; + e.type = "normal", delete e.arg, t.completion = e; + } + function Context(t) { + this.tryEntries = [{ + tryLoc: "root" + }], t.forEach(pushTryEntry, this), this.reset(!0); + } + function values(e) { + if (e || "" === e) { + var r = e[a]; + if (r) return r.call(e); + if ("function" == typeof e.next) return e; + if (!isNaN(e.length)) { + var o = -1, + i = function next() { + for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; + return next.value = t, next.done = !0, next; + }; + return i.next = i; + } + } + throw new TypeError(_typeof(e) + " is not iterable"); + } + return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { + value: GeneratorFunctionPrototype, + configurable: !0 + }), o(GeneratorFunctionPrototype, "constructor", { + value: GeneratorFunction, + configurable: !0 + }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { + var e = "function" == typeof t && t.constructor; + return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); + }, e.mark = function (t) { + return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; + }, e.awrap = function (t) { + return { + __await: t + }; + }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { + return this; + }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { + void 0 === i && (i = Promise); + var a = new AsyncIterator(wrap(t, r, n, o), i); + return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { + return t.done ? t.value : a.next(); + }); + }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { + return this; + }), define(g, "toString", function () { + return "[object Generator]"; + }), e.keys = function (t) { + var e = Object(t), + r = []; + for (var n in e) r.push(n); + return r.reverse(), function next() { + for (; r.length;) { + var t = r.pop(); + if (t in e) return next.value = t, next.done = !1, next; + } + return next.done = !0, next; + }; + }, e.values = values, Context.prototype = { + constructor: Context, + reset: function reset(e) { + if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); + }, + stop: function stop() { + this.done = !0; + var t = this.tryEntries[0].completion; + if ("throw" === t.type) throw t.arg; + return this.rval; + }, + dispatchException: function dispatchException(e) { + if (this.done) throw e; + var r = this; + function handle(n, o) { + return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; + } + for (var o = this.tryEntries.length - 1; o >= 0; --o) { + var i = this.tryEntries[o], + a = i.completion; + if ("root" === i.tryLoc) return handle("end"); + if (i.tryLoc <= this.prev) { + var c = n.call(i, "catchLoc"), + u = n.call(i, "finallyLoc"); + if (c && u) { + if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); + if (this.prev < i.finallyLoc) return handle(i.finallyLoc); + } else if (c) { + if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); + } else { + if (!u) throw new Error("try statement without catch or finally"); + if (this.prev < i.finallyLoc) return handle(i.finallyLoc); + } + } + } + }, + abrupt: function abrupt(t, e) { + for (var r = this.tryEntries.length - 1; r >= 0; --r) { + var o = this.tryEntries[r]; + if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { + var i = o; + break; + } + } + i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); + var a = i ? i.completion : {}; + return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); + }, + complete: function complete(t, e) { + if ("throw" === t.type) throw t.arg; + return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; + }, + finish: function finish(t) { + for (var e = this.tryEntries.length - 1; e >= 0; --e) { + var r = this.tryEntries[e]; + if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; + } + }, + "catch": function _catch(t) { + for (var e = this.tryEntries.length - 1; e >= 0; --e) { + var r = this.tryEntries[e]; + if (r.tryLoc === t) { + var n = r.completion; + if ("throw" === n.type) { + var o = n.arg; + resetTryEntry(r); + } + return o; + } + } + throw new Error("illegal catch attempt"); + }, + delegateYield: function delegateYield(e, r, n) { + return this.delegate = { + iterator: values(e), + resultName: r, + nextLoc: n + }, "next" === this.method && (this.arg = t), y; + } + }, e; + } + module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports; + } (regeneratorRuntime$1)); + + var regeneratorRuntimeExports = regeneratorRuntime$1.exports; + + // TODO(Babel 8): Remove this file. + + var runtime = regeneratorRuntimeExports(); + + // Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736= + try { + regeneratorRuntime = runtime; + } catch (accidentalStrictMode) { + if (typeof globalThis === "object") { + globalThis.regeneratorRuntime = runtime; + } else { + Function("r", "regeneratorRuntime = r")(runtime); + } + } + + function _classCallCheck$1(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _typeof(o) { + "@babel/helpers - typeof"; + + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { + return typeof o; + } : function (o) { + return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; + }, _typeof(o); + } + + function _toPrimitive(input, hint) { + if (_typeof(input) !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (_typeof(res) !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); + } + + function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return _typeof(key) === "symbol" ? key : String(key); + } + + function _defineProperties$1(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); + } + } + function _createClass$1(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties$1(Constructor.prototype, protoProps); + if (staticProps) _defineProperties$1(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; + } + + /* + Copyright 2022-2023 Picovoice Inc. + + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" + file accompanying this source. + + 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. + */ + /** + * BasePvFile Class + * This class mocks the file system using in-memory storage. + */ + var PvFile = /*#__PURE__*/function () { + function PvFile() { + _classCallCheck$1(this, PvFile); + this._path = ''; + } + /** + * Getter for file's meta information. + */ + _createClass$1(PvFile, [{ + key: "meta", + get: function get() { + if (this._meta === undefined) { + return undefined; + } + return Object.assign({ + version: 0 + }, this._meta); + } + /** + * Get the file pointer from the _filePtrs map. + * @param ptr The pointer to BasePvFile instance to get from the map. + * @returns BasePvFile returns the current file instance related to ptr. + */ + }], [{ + key: "getPtr", + value: function getPtr(ptr) { + if (PvFile._filePtrs.has(ptr)) { + return PvFile._filePtrs.get(ptr); + } + throw new Error('File instance not found.'); + } + /** + * Saves the BasePvFile instance to the map with an associated ptr. + * @param ptr The file pointer to save as the key. + * @param instance The BasePvFile instance to save as the value. + */ + }, { + key: "setPtr", + value: function setPtr(ptr, instance) { + PvFile._filePtrs.set(ptr, instance); + } + /** + * Removes the ptr from the _filePtrs map. + * @param ptr The file pointer to remove. + */ + }, { + key: "removePtr", + value: function removePtr(ptr) { + PvFile._filePtrs["delete"](ptr); + } + }]); + return PvFile; + }(); + PvFile._filePtrs = new Map(); + /** + * Cast a signed address to unsigned address. + * + * @param address The address to cast to unsigned address. + */ + function unsignedAddress(address) { + if (address < 0) { + return address >>> 0; + } + return address; + } + + function decodeBase64(base64, enableUnicode) { + var binaryString = atob(base64); + if (enableUnicode) { + var binaryView = new Uint8Array(binaryString.length); + for (var i = 0, n = binaryString.length; i < n; ++i) { + binaryView[i] = binaryString.charCodeAt(i); + } + return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer)); + } + return binaryString; + } + + function createURL(base64, sourcemapArg, enableUnicodeArg) { + var sourcemap = sourcemapArg === undefined ? null : sourcemapArg; + var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg; + var source = decodeBase64(base64, enableUnicode); + var start = source.indexOf('\n', 10) + 1; + var body = source.substring(start) + (sourcemap ? '\/\/# sourceMappingURL=' + sourcemap : ''); + var blob = new Blob([body], { type: 'application/javascript' }); + return URL.createObjectURL(blob); + } + + function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) { + var url; + return function WorkerFactory(options) { + url = url || createURL(base64, sourcemapArg, enableUnicodeArg); + return new Worker(url, options); + }; + } + + var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gX3R5cGVvZiQzKG8pIHsKICAgICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7CgogICAgcmV0dXJuIF90eXBlb2YkMyA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsKICAgICAgcmV0dXJuIHR5cGVvZiBvOwogICAgfSA6IGZ1bmN0aW9uIChvKSB7CiAgICAgIHJldHVybiBvICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG87CiAgICB9LCBfdHlwZW9mJDMobyk7CiAgfQoKICBmdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7CiAgICBpZiAoIm9iamVjdCIgIT0gX3R5cGVvZiQzKHQpIHx8ICF0KSByZXR1cm4gdDsKICAgIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOwogICAgaWYgKHZvaWQgMCAhPT0gZSkgewogICAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8ICJkZWZhdWx0Iik7CiAgICAgIGlmICgib2JqZWN0IiAhPSBfdHlwZW9mJDMoaSkpIHJldHVybiBpOwogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwogICAgfQogICAgcmV0dXJuICgic3RyaW5nIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7CiAgfQoKICBmdW5jdGlvbiB0b1Byb3BlcnR5S2V5KHQpIHsKICAgIHZhciBpID0gdG9QcmltaXRpdmUodCwgInN0cmluZyIpOwogICAgcmV0dXJuICJzeW1ib2wiID09IF90eXBlb2YkMyhpKSA/IGkgOiBTdHJpbmcoaSk7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7CiAgICBrZXkgPSB0b1Byb3BlcnR5S2V5KGtleSk7CiAgICBpZiAoa2V5IGluIG9iaikgewogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CgogIGZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsKICAgIHRyeSB7CiAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsKICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIHJlamVjdChlcnJvcik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpbmZvLmRvbmUpIHsKICAgICAgcmVzb2x2ZSh2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgYXJncyA9IGFyZ3VtZW50czsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgIm5leHQiLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsKICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsKICAgICAgICB9CiAgICAgICAgX25leHQodW5kZWZpbmVkKTsKICAgICAgfSk7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMkMSAoeCkgewogIAlyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4OwogIH0KCiAgdmFyIHJlZ2VuZXJhdG9yUnVudGltZSQyID0ge2V4cG9ydHM6IHt9fTsKCiAgdmFyIF90eXBlb2YkMiA9IHtleHBvcnRzOiB7fX07CgogIF90eXBlb2YkMi5leHBvcnRzOwoKICAoZnVuY3Rpb24gKG1vZHVsZSkgewogIAlmdW5jdGlvbiBfdHlwZW9mKG8pIHsKICAJICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAJICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiAic3ltYm9sIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsKICAJICAgIHJldHVybiB0eXBlb2YgbzsKICAJICB9IDogZnVuY3Rpb24gKG8pIHsKICAJICAgIHJldHVybiBvICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICJzeW1ib2wiIDogdHlwZW9mIG87CiAgCSAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0cyksIF90eXBlb2Yobyk7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChfdHlwZW9mJDIpKTsKCiAgdmFyIF90eXBlb2ZFeHBvcnRzJDEgPSBfdHlwZW9mJDIuZXhwb3J0czsKCiAgcmVnZW5lcmF0b3JSdW50aW1lJDIuZXhwb3J0czsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJdmFyIF90eXBlb2YgPSBfdHlwZW9mRXhwb3J0cyQxWyJkZWZhdWx0Il07CiAgCWZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAJICAgIHJldHVybiBlOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7CiAgCSAgdmFyIHQsCiAgCSAgICBlID0ge30sCiAgCSAgICByID0gT2JqZWN0LnByb3RvdHlwZSwKICAJICAgIG4gPSByLmhhc093blByb3BlcnR5LAogIAkgICAgbyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAodCwgZSwgcikgewogIAkgICAgICB0W2VdID0gci52YWx1ZTsKICAJICAgIH0sCiAgCSAgICBpID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sID8gU3ltYm9sIDoge30sCiAgCSAgICBhID0gaS5pdGVyYXRvciB8fCAiQEBpdGVyYXRvciIsCiAgCSAgICBjID0gaS5hc3luY0l0ZXJhdG9yIHx8ICJAQGFzeW5jSXRlcmF0b3IiLAogIAkgICAgdSA9IGkudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogIAkgIGZ1bmN0aW9uIGRlZmluZSh0LCBlLCByKSB7CiAgCSAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGUsIHsKICAJICAgICAgdmFsdWU6IHIsCiAgCSAgICAgIGVudW1lcmFibGU6ICEwLAogIAkgICAgICBjb25maWd1cmFibGU6ICEwLAogIAkgICAgICB3cml0YWJsZTogITAKICAJICAgIH0pLCB0W2VdOwogIAkgIH0KICAJICB0cnkgewogIAkgICAgZGVmaW5lKHt9LCAiIik7CiAgCSAgfSBjYXRjaCAodCkgewogIAkgICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKHQsIGUsIHIpIHsKICAJICAgICAgcmV0dXJuIHRbZV0gPSByOwogIAkgICAgfTsKICAJICB9CiAgCSAgZnVuY3Rpb24gd3JhcCh0LCBlLCByLCBuKSB7CiAgCSAgICB2YXIgaSA9IGUgJiYgZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBlIDogR2VuZXJhdG9yLAogIAkgICAgICBhID0gT2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSksCiAgCSAgICAgIGMgPSBuZXcgQ29udGV4dChuIHx8IFtdKTsKICAJICAgIHJldHVybiBvKGEsICJfaW52b2tlIiwgewogIAkgICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZCh0LCByLCBjKQogIAkgICAgfSksIGE7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHRyeUNhdGNoKHQsIGUsIHIpIHsKICAJICAgIHRyeSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgCSAgICAgICAgYXJnOiB0LmNhbGwoZSwgcikKICAJICAgICAgfTsKICAJICAgIH0gY2F0Y2ggKHQpIHsKICAJICAgICAgcmV0dXJuIHsKICAJICAgICAgICB0eXBlOiAidGhyb3ciLAogIAkgICAgICAgIGFyZzogdAogIAkgICAgICB9OwogIAkgICAgfQogIAkgIH0KICAJICBlLndyYXAgPSB3cmFwOwogIAkgIHZhciBoID0gInN1c3BlbmRlZFN0YXJ0IiwKICAJICAgIGwgPSAic3VzcGVuZGVkWWllbGQiLAogIAkgICAgZiA9ICJleGVjdXRpbmciLAogIAkgICAgcyA9ICJjb21wbGV0ZWQiLAogIAkgICAgeSA9IHt9OwogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fQogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KICAJICB2YXIgcCA9IHt9OwogIAkgIGRlZmluZShwLCBhLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KTsKICAJICB2YXIgZCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAJICAgIHYgPSBkICYmIGQoZCh2YWx1ZXMoW10pKSk7CiAgCSAgdiAmJiB2ICE9PSByICYmIG4uY2FsbCh2LCBhKSAmJiAocCA9IHYpOwogIAkgIHZhciBnID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocCk7CiAgCSAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHQpIHsKICAJICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgCSAgICAgIGRlZmluZSh0LCBlLCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UoZSwgdCk7CiAgCSAgICAgIH0pOwogIAkgICAgfSk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IodCwgZSkgewogIAkgICAgZnVuY3Rpb24gaW52b2tlKHIsIG8sIGksIGEpIHsKICAJICAgICAgdmFyIGMgPSB0cnlDYXRjaCh0W3JdLCB0LCBvKTsKICAJICAgICAgaWYgKCJ0aHJvdyIgIT09IGMudHlwZSkgewogIAkgICAgICAgIHZhciB1ID0gYy5hcmcsCiAgCSAgICAgICAgICBoID0gdS52YWx1ZTsKICAJICAgICAgICByZXR1cm4gaCAmJiAib2JqZWN0IiA9PSBfdHlwZW9mKGgpICYmIG4uY2FsbChoLCAiX19hd2FpdCIpID8gZS5yZXNvbHZlKGguX19hd2FpdCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgaW52b2tlKCJuZXh0IiwgdCwgaSwgYSk7CiAgCSAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHsKICAJICAgICAgICAgIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KSA6IGUucmVzb2x2ZShoKS50aGVuKGZ1bmN0aW9uICh0KSB7CiAgCSAgICAgICAgICB1LnZhbHVlID0gdCwgaSh1KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KTsKICAJICAgICAgfQogIAkgICAgICBhKGMuYXJnKTsKICAJICAgIH0KICAJICAgIHZhciByOwogIAkgICAgbyh0aGlzLCAiX2ludm9rZSIsIHsKICAJICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHQsIG4pIHsKICAJICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAJICAgICAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSwgcikgewogIAkgICAgICAgICAgICBpbnZva2UodCwgbiwgZSwgcik7CiAgCSAgICAgICAgICB9KTsKICAJICAgICAgICB9CiAgCSAgICAgICAgcmV0dXJuIHIgPSByID8gci50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogIAkgICAgICB9CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChlLCByLCBuKSB7CiAgCSAgICB2YXIgbyA9IGg7CiAgCSAgICByZXR1cm4gZnVuY3Rpb24gKGksIGEpIHsKICAJICAgICAgaWYgKG8gPT09IGYpIHRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpOwogIAkgICAgICBpZiAobyA9PT0gcykgewogIAkgICAgICAgIGlmICgidGhyb3ciID09PSBpKSB0aHJvdyBhOwogIAkgICAgICAgIHJldHVybiB7CiAgCSAgICAgICAgICB2YWx1ZTogdCwKICAJICAgICAgICAgIGRvbmU6ICEwCiAgCSAgICAgICAgfTsKICAJICAgICAgfQogIAkgICAgICBmb3IgKG4ubWV0aG9kID0gaSwgbi5hcmcgPSBhOzspIHsKICAJICAgICAgICB2YXIgYyA9IG4uZGVsZWdhdGU7CiAgCSAgICAgICAgaWYgKGMpIHsKICAJICAgICAgICAgIHZhciB1ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShjLCBuKTsKICAJICAgICAgICAgIGlmICh1KSB7CiAgCSAgICAgICAgICAgIGlmICh1ID09PSB5KSBjb250aW51ZTsKICAJICAgICAgICAgICAgcmV0dXJuIHU7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICAgIGlmICgibmV4dCIgPT09IG4ubWV0aG9kKSBuLnNlbnQgPSBuLl9zZW50ID0gbi5hcmc7ZWxzZSBpZiAoInRocm93IiA9PT0gbi5tZXRob2QpIHsKICAJICAgICAgICAgIGlmIChvID09PSBoKSB0aHJvdyBvID0gcywgbi5hcmc7CiAgCSAgICAgICAgICBuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKTsKICAJICAgICAgICB9IGVsc2UgInJldHVybiIgPT09IG4ubWV0aG9kICYmIG4uYWJydXB0KCJyZXR1cm4iLCBuLmFyZyk7CiAgCSAgICAgICAgbyA9IGY7CiAgCSAgICAgICAgdmFyIHAgPSB0cnlDYXRjaChlLCByLCBuKTsKICAJICAgICAgICBpZiAoIm5vcm1hbCIgPT09IHAudHlwZSkgewogIAkgICAgICAgICAgaWYgKG8gPSBuLmRvbmUgPyBzIDogbCwgcC5hcmcgPT09IHkpIGNvbnRpbnVlOwogIAkgICAgICAgICAgcmV0dXJuIHsKICAJICAgICAgICAgICAgdmFsdWU6IHAuYXJnLAogIAkgICAgICAgICAgICBkb25lOiBuLmRvbmUKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgfQogIAkgICAgICAgICJ0aHJvdyIgPT09IHAudHlwZSAmJiAobyA9IHMsIG4ubWV0aG9kID0gInRocm93Iiwgbi5hcmcgPSBwLmFyZyk7CiAgCSAgICAgIH0KICAJICAgIH07CiAgCSAgfQogIAkgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgcikgewogIAkgICAgdmFyIG4gPSByLm1ldGhvZCwKICAJICAgICAgbyA9IGUuaXRlcmF0b3Jbbl07CiAgCSAgICBpZiAobyA9PT0gdCkgcmV0dXJuIHIuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBuICYmIGUuaXRlcmF0b3JbInJldHVybiJdICYmIChyLm1ldGhvZCA9ICJyZXR1cm4iLCByLmFyZyA9IHQsIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgciksICJ0aHJvdyIgPT09IHIubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbiAmJiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBuICsgIicgbWV0aG9kIikpLCB5OwogIAkgICAgdmFyIGkgPSB0cnlDYXRjaChvLCBlLml0ZXJhdG9yLCByLmFyZyk7CiAgCSAgICBpZiAoInRocm93IiA9PT0gaS50eXBlKSByZXR1cm4gci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IGkuYXJnLCByLmRlbGVnYXRlID0gbnVsbCwgeTsKICAJICAgIHZhciBhID0gaS5hcmc7CiAgCSAgICByZXR1cm4gYSA/IGEuZG9uZSA/IChyW2UucmVzdWx0TmFtZV0gPSBhLnZhbHVlLCByLm5leHQgPSBlLm5leHRMb2MsICJyZXR1cm4iICE9PSByLm1ldGhvZCAmJiAoci5tZXRob2QgPSAibmV4dCIsIHIuYXJnID0gdCksIHIuZGVsZWdhdGUgPSBudWxsLCB5KSA6IGEgOiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksIHIuZGVsZWdhdGUgPSBudWxsLCB5KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gewogIAkgICAgICB0cnlMb2M6IHRbMF0KICAJICAgIH07CiAgCSAgICAxIGluIHQgJiYgKGUuY2F0Y2hMb2MgPSB0WzFdKSwgMiBpbiB0ICYmIChlLmZpbmFsbHlMb2MgPSB0WzJdLCBlLmFmdGVyTG9jID0gdFszXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGUpOwogIAkgIH0KICAJICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gdC5jb21wbGV0aW9uIHx8IHt9OwogIAkgICAgZS50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSBlLmFyZywgdC5jb21wbGV0aW9uID0gZTsKICAJICB9CiAgCSAgZnVuY3Rpb24gQ29udGV4dCh0KSB7CiAgCSAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogIAkgICAgICB0cnlMb2M6ICJyb290IgogIAkgICAgfV0sIHQuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsKICAJICB9CiAgCSAgZnVuY3Rpb24gdmFsdWVzKGUpIHsKICAJICAgIGlmIChlIHx8ICIiID09PSBlKSB7CiAgCSAgICAgIHZhciByID0gZVthXTsKICAJICAgICAgaWYgKHIpIHJldHVybiByLmNhbGwoZSk7CiAgCSAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBlLm5leHQpIHJldHVybiBlOwogIAkgICAgICBpZiAoIWlzTmFOKGUubGVuZ3RoKSkgewogIAkgICAgICAgIHZhciBvID0gLTEsCiAgCSAgICAgICAgICBpID0gZnVuY3Rpb24gbmV4dCgpIHsKICAJICAgICAgICAgICAgZm9yICg7ICsrbyA8IGUubGVuZ3RoOykgaWYgKG4uY2FsbChlLCBvKSkgcmV0dXJuIG5leHQudmFsdWUgPSBlW29dLCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgICAgICAgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgcmV0dXJuIGkubmV4dCA9IGk7CiAgCSAgICAgIH0KICAJICAgIH0KICAJICAgIHRocm93IG5ldyBUeXBlRXJyb3IoX3R5cGVvZihlKSArICIgaXMgbm90IGl0ZXJhYmxlIik7CiAgCSAgfQogIAkgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgbyhnLCAiY29uc3RydWN0b3IiLCB7CiAgCSAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsCiAgCSAgICBjb25maWd1cmFibGU6ICEwCiAgCSAgfSksIG8oR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBlLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAodCkgewogIAkgICAgdmFyIGUgPSAiZnVuY3Rpb24iID09IHR5cGVvZiB0ICYmIHQuY29uc3RydWN0b3I7CiAgCSAgICByZXR1cm4gISFlICYmIChlID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAiR2VuZXJhdG9yRnVuY3Rpb24iID09PSAoZS5kaXNwbGF5TmFtZSB8fCBlLm5hbWUpKTsKICAJICB9LCBlLm1hcmsgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZih0LCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAodC5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKHQsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpKSwgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGcpLCB0OwogIAkgIH0sIGUuYXdyYXAgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIHsKICAJICAgICAgX19hd2FpdDogdAogIAkgICAgfTsKICAJICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGMsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pLCBlLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBlLmFzeW5jID0gZnVuY3Rpb24gKHQsIHIsIG4sIG8sIGkpIHsKICAJICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IFByb21pc2UpOwogIAkgICAgdmFyIGEgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKHQsIHIsIG4sIG8pLCBpKTsKICAJICAgIHJldHVybiBlLmlzR2VuZXJhdG9yRnVuY3Rpb24ocikgPyBhIDogYS5uZXh0KCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICByZXR1cm4gdC5kb25lID8gdC52YWx1ZSA6IGEubmV4dCgpOwogIAkgICAgfSk7CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKGcpLCBkZWZpbmUoZywgdSwgIkdlbmVyYXRvciIpLCBkZWZpbmUoZywgYSwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSksIGRlZmluZShnLCAidG9TdHJpbmciLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gIltvYmplY3QgR2VuZXJhdG9yXSI7CiAgCSAgfSksIGUua2V5cyA9IGZ1bmN0aW9uICh0KSB7CiAgCSAgICB2YXIgZSA9IE9iamVjdCh0KSwKICAJICAgICAgciA9IFtdOwogIAkgICAgZm9yICh2YXIgbiBpbiBlKSByLnB1c2gobik7CiAgCSAgICByZXR1cm4gci5yZXZlcnNlKCksIGZ1bmN0aW9uIG5leHQoKSB7CiAgCSAgICAgIGZvciAoOyByLmxlbmd0aDspIHsKICAJICAgICAgICB2YXIgdCA9IHIucG9wKCk7CiAgCSAgICAgICAgaWYgKHQgaW4gZSkgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgfQogIAkgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICB9OwogIAkgIH0sIGUudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAJICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogIAkgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KGUpIHsKICAJICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB0LCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gIm5leHQiLCB0aGlzLmFyZyA9IHQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhZSkgZm9yICh2YXIgciBpbiB0aGlzKSAidCIgPT09IHIuY2hhckF0KDApICYmIG4uY2FsbCh0aGlzLCByKSAmJiAhaXNOYU4oK3Iuc2xpY2UoMSkpICYmICh0aGlzW3JdID0gdCk7CiAgCSAgICB9LAogIAkgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKICAJICAgICAgdGhpcy5kb25lID0gITA7CiAgCSAgICAgIHZhciB0ID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gdGhpcy5ydmFsOwogIAkgICAgfSwKICAJICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihlKSB7CiAgCSAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGU7CiAgCSAgICAgIHZhciByID0gdGhpczsKICAJICAgICAgZnVuY3Rpb24gaGFuZGxlKG4sIG8pIHsKICAJICAgICAgICByZXR1cm4gYS50eXBlID0gInRocm93IiwgYS5hcmcgPSBlLCByLm5leHQgPSBuLCBvICYmIChyLm1ldGhvZCA9ICJuZXh0Iiwgci5hcmcgPSB0KSwgISFvOwogIAkgICAgICB9CiAgCSAgICAgIGZvciAodmFyIG8gPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgbyA+PSAwOyAtLW8pIHsKICAJICAgICAgICB2YXIgaSA9IHRoaXMudHJ5RW50cmllc1tvXSwKICAJICAgICAgICAgIGEgPSBpLmNvbXBsZXRpb247CiAgCSAgICAgICAgaWYgKCJyb290IiA9PT0gaS50cnlMb2MpIHJldHVybiBoYW5kbGUoImVuZCIpOwogIAkgICAgICAgIGlmIChpLnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAJICAgICAgICAgIHZhciBjID0gbi5jYWxsKGksICJjYXRjaExvYyIpLAogIAkgICAgICAgICAgICB1ID0gbi5jYWxsKGksICJmaW5hbGx5TG9jIik7CiAgCSAgICAgICAgICBpZiAoYyAmJiB1KSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShpLmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfSBlbHNlIGlmIChjKSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgIH0gZWxzZSB7CiAgCSAgICAgICAgICAgIGlmICghdSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgaS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGkuZmluYWxseUxvYyk7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICB9CiAgCSAgICB9LAogIAkgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodCwgZSkgewogIAkgICAgICBmb3IgKHZhciByID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHIgPj0gMDsgLS1yKSB7CiAgCSAgICAgICAgdmFyIG8gPSB0aGlzLnRyeUVudHJpZXNbcl07CiAgCSAgICAgICAgaWYgKG8udHJ5TG9jIDw9IHRoaXMucHJldiAmJiBuLmNhbGwobywgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBvLmZpbmFsbHlMb2MpIHsKICAJICAgICAgICAgIHZhciBpID0gbzsKICAJICAgICAgICAgIGJyZWFrOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICBpICYmICgiYnJlYWsiID09PSB0IHx8ICJjb250aW51ZSIgPT09IHQpICYmIGkudHJ5TG9jIDw9IGUgJiYgZSA8PSBpLmZpbmFsbHlMb2MgJiYgKGkgPSBudWxsKTsKICAJICAgICAgdmFyIGEgPSBpID8gaS5jb21wbGV0aW9uIDoge307CiAgCSAgICAgIHJldHVybiBhLnR5cGUgPSB0LCBhLmFyZyA9IGUsIGkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGkuZmluYWxseUxvYywgeSkgOiB0aGlzLmNvbXBsZXRlKGEpOwogIAkgICAgfSwKICAJICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSh0LCBlKSB7CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gImJyZWFrIiA9PT0gdC50eXBlIHx8ICJjb250aW51ZSIgPT09IHQudHlwZSA/IHRoaXMubmV4dCA9IHQuYXJnIDogInJldHVybiIgPT09IHQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gdC50eXBlICYmIGUgJiYgKHRoaXMubmV4dCA9IGUpLCB5OwogIAkgICAgfSwKICAJICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKHQpIHsKICAJICAgICAgZm9yICh2YXIgZSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBlID49IDA7IC0tZSkgewogIAkgICAgICAgIHZhciByID0gdGhpcy50cnlFbnRyaWVzW2VdOwogIAkgICAgICAgIGlmIChyLmZpbmFsbHlMb2MgPT09IHQpIHJldHVybiB0aGlzLmNvbXBsZXRlKHIuY29tcGxldGlvbiwgci5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkociksIHk7CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godCkgewogIAkgICAgICBmb3IgKHZhciBlID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGUgPj0gMDsgLS1lKSB7CiAgCSAgICAgICAgdmFyIHIgPSB0aGlzLnRyeUVudHJpZXNbZV07CiAgCSAgICAgICAgaWYgKHIudHJ5TG9jID09PSB0KSB7CiAgCSAgICAgICAgICB2YXIgbiA9IHIuY29tcGxldGlvbjsKICAJICAgICAgICAgIGlmICgidGhyb3ciID09PSBuLnR5cGUpIHsKICAJICAgICAgICAgICAgdmFyIG8gPSBuLmFyZzsKICAJICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShyKTsKICAJICAgICAgICAgIH0KICAJICAgICAgICAgIHJldHVybiBvOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogIAkgICAgfSwKICAJICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoZSwgciwgbikgewogIAkgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAJICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGUpLAogIAkgICAgICAgIHJlc3VsdE5hbWU6IHIsCiAgCSAgICAgICAgbmV4dExvYzogbgogIAkgICAgICB9LCAibmV4dCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHQpLCB5OwogIAkgICAgfQogIAkgIH0sIGU7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMikpOwoKICB2YXIgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyQxID0gcmVnZW5lcmF0b3JSdW50aW1lJDIuZXhwb3J0czsKCiAgLy8gVE9ETyhCYWJlbCA4KTogUmVtb3ZlIHRoaXMgZmlsZS4KCiAgdmFyIHJ1bnRpbWUkMSA9IHJlZ2VuZXJhdG9yUnVudGltZUV4cG9ydHMkMSgpOwogIHZhciByZWdlbmVyYXRvciQxID0gcnVudGltZSQxOwoKICAvLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUvcnVudGltZS5qcyNMNzM2PQogIHRyeSB7CiAgICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lJDE7CiAgICB9IGVsc2UgewogICAgICBGdW5jdGlvbigiciIsICJyZWdlbmVyYXRvclJ1bnRpbWUgPSByIikocnVudGltZSQxKTsKICAgIH0KICB9CgogIHZhciBfcmVnZW5lcmF0b3JSdW50aW1lJDEgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMkMShyZWdlbmVyYXRvciQxKTsKCiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHsKICAJcmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDsKICB9CgogIHZhciByZWdlbmVyYXRvclJ1bnRpbWUkMSA9IHtleHBvcnRzOiB7fX07CgogIHZhciBfdHlwZW9mJDEgPSB7ZXhwb3J0czoge319OwoKICBfdHlwZW9mJDEuZXhwb3J0czsKCiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKICAJZnVuY3Rpb24gX3R5cGVvZihvKSB7CiAgCSAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCiAgCSAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgInN5bWJvbCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7CiAgCSAgICByZXR1cm4gdHlwZW9mIG87CiAgCSAgfSA6IGZ1bmN0aW9uIChvKSB7CiAgCSAgICByZXR1cm4gbyAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHMpLCBfdHlwZW9mKG8pOwogIAl9CiAgCW1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsgCiAgfSAoX3R5cGVvZiQxKSk7CgogIHZhciBfdHlwZW9mRXhwb3J0cyA9IF90eXBlb2YkMS5leHBvcnRzOwoKICByZWdlbmVyYXRvclJ1bnRpbWUkMS5leHBvcnRzOwoKICAoZnVuY3Rpb24gKG1vZHVsZSkgewogIAl2YXIgX3R5cGVvZiA9IF90eXBlb2ZFeHBvcnRzWyJkZWZhdWx0Il07CiAgCWZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgCSAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHsKICAJICAgIHJldHVybiBlOwogIAkgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7CiAgCSAgdmFyIHQsCiAgCSAgICBlID0ge30sCiAgCSAgICByID0gT2JqZWN0LnByb3RvdHlwZSwKICAJICAgIG4gPSByLmhhc093blByb3BlcnR5LAogIAkgICAgbyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAodCwgZSwgcikgewogIAkgICAgICB0W2VdID0gci52YWx1ZTsKICAJICAgIH0sCiAgCSAgICBpID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sID8gU3ltYm9sIDoge30sCiAgCSAgICBhID0gaS5pdGVyYXRvciB8fCAiQEBpdGVyYXRvciIsCiAgCSAgICBjID0gaS5hc3luY0l0ZXJhdG9yIHx8ICJAQGFzeW5jSXRlcmF0b3IiLAogIAkgICAgdSA9IGkudG9TdHJpbmdUYWcgfHwgIkBAdG9TdHJpbmdUYWciOwogIAkgIGZ1bmN0aW9uIGRlZmluZSh0LCBlLCByKSB7CiAgCSAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGUsIHsKICAJICAgICAgdmFsdWU6IHIsCiAgCSAgICAgIGVudW1lcmFibGU6ICEwLAogIAkgICAgICBjb25maWd1cmFibGU6ICEwLAogIAkgICAgICB3cml0YWJsZTogITAKICAJICAgIH0pLCB0W2VdOwogIAkgIH0KICAJICB0cnkgewogIAkgICAgZGVmaW5lKHt9LCAiIik7CiAgCSAgfSBjYXRjaCAodCkgewogIAkgICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKHQsIGUsIHIpIHsKICAJICAgICAgcmV0dXJuIHRbZV0gPSByOwogIAkgICAgfTsKICAJICB9CiAgCSAgZnVuY3Rpb24gd3JhcCh0LCBlLCByLCBuKSB7CiAgCSAgICB2YXIgaSA9IGUgJiYgZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBlIDogR2VuZXJhdG9yLAogIAkgICAgICBhID0gT2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSksCiAgCSAgICAgIGMgPSBuZXcgQ29udGV4dChuIHx8IFtdKTsKICAJICAgIHJldHVybiBvKGEsICJfaW52b2tlIiwgewogIAkgICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZCh0LCByLCBjKQogIAkgICAgfSksIGE7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIHRyeUNhdGNoKHQsIGUsIHIpIHsKICAJICAgIHRyeSB7CiAgCSAgICAgIHJldHVybiB7CiAgCSAgICAgICAgdHlwZTogIm5vcm1hbCIsCiAgCSAgICAgICAgYXJnOiB0LmNhbGwoZSwgcikKICAJICAgICAgfTsKICAJICAgIH0gY2F0Y2ggKHQpIHsKICAJICAgICAgcmV0dXJuIHsKICAJICAgICAgICB0eXBlOiAidGhyb3ciLAogIAkgICAgICAgIGFyZzogdAogIAkgICAgICB9OwogIAkgICAgfQogIAkgIH0KICAJICBlLndyYXAgPSB3cmFwOwogIAkgIHZhciBoID0gInN1c3BlbmRlZFN0YXJ0IiwKICAJICAgIGwgPSAic3VzcGVuZGVkWWllbGQiLAogIAkgICAgZiA9ICJleGVjdXRpbmciLAogIAkgICAgcyA9ICJjb21wbGV0ZWQiLAogIAkgICAgeSA9IHt9OwogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9CiAgCSAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fQogIAkgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KICAJICB2YXIgcCA9IHt9OwogIAkgIGRlZmluZShwLCBhLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gdGhpczsKICAJICB9KTsKICAJICB2YXIgZCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAJICAgIHYgPSBkICYmIGQoZCh2YWx1ZXMoW10pKSk7CiAgCSAgdiAmJiB2ICE9PSByICYmIG4uY2FsbCh2LCBhKSAmJiAocCA9IHYpOwogIAkgIHZhciBnID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0gR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocCk7CiAgCSAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHQpIHsKICAJICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgCSAgICAgIGRlZmluZSh0LCBlLCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UoZSwgdCk7CiAgCSAgICAgIH0pOwogIAkgICAgfSk7CiAgCSAgfQogIAkgIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IodCwgZSkgewogIAkgICAgZnVuY3Rpb24gaW52b2tlKHIsIG8sIGksIGEpIHsKICAJICAgICAgdmFyIGMgPSB0cnlDYXRjaCh0W3JdLCB0LCBvKTsKICAJICAgICAgaWYgKCJ0aHJvdyIgIT09IGMudHlwZSkgewogIAkgICAgICAgIHZhciB1ID0gYy5hcmcsCiAgCSAgICAgICAgICBoID0gdS52YWx1ZTsKICAJICAgICAgICByZXR1cm4gaCAmJiAib2JqZWN0IiA9PSBfdHlwZW9mKGgpICYmIG4uY2FsbChoLCAiX19hd2FpdCIpID8gZS5yZXNvbHZlKGguX19hd2FpdCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgaW52b2tlKCJuZXh0IiwgdCwgaSwgYSk7CiAgCSAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHsKICAJICAgICAgICAgIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KSA6IGUucmVzb2x2ZShoKS50aGVuKGZ1bmN0aW9uICh0KSB7CiAgCSAgICAgICAgICB1LnZhbHVlID0gdCwgaSh1KTsKICAJICAgICAgICB9LCBmdW5jdGlvbiAodCkgewogIAkgICAgICAgICAgcmV0dXJuIGludm9rZSgidGhyb3ciLCB0LCBpLCBhKTsKICAJICAgICAgICB9KTsKICAJICAgICAgfQogIAkgICAgICBhKGMuYXJnKTsKICAJICAgIH0KICAJICAgIHZhciByOwogIAkgICAgbyh0aGlzLCAiX2ludm9rZSIsIHsKICAJICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHQsIG4pIHsKICAJICAgICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHsKICAJICAgICAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSwgcikgewogIAkgICAgICAgICAgICBpbnZva2UodCwgbiwgZSwgcik7CiAgCSAgICAgICAgICB9KTsKICAJICAgICAgICB9CiAgCSAgICAgICAgcmV0dXJuIHIgPSByID8gci50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpOwogIAkgICAgICB9CiAgCSAgICB9KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChlLCByLCBuKSB7CiAgCSAgICB2YXIgbyA9IGg7CiAgCSAgICByZXR1cm4gZnVuY3Rpb24gKGksIGEpIHsKICAJICAgICAgaWYgKG8gPT09IGYpIHRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpOwogIAkgICAgICBpZiAobyA9PT0gcykgewogIAkgICAgICAgIGlmICgidGhyb3ciID09PSBpKSB0aHJvdyBhOwogIAkgICAgICAgIHJldHVybiB7CiAgCSAgICAgICAgICB2YWx1ZTogdCwKICAJICAgICAgICAgIGRvbmU6ICEwCiAgCSAgICAgICAgfTsKICAJICAgICAgfQogIAkgICAgICBmb3IgKG4ubWV0aG9kID0gaSwgbi5hcmcgPSBhOzspIHsKICAJICAgICAgICB2YXIgYyA9IG4uZGVsZWdhdGU7CiAgCSAgICAgICAgaWYgKGMpIHsKICAJICAgICAgICAgIHZhciB1ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShjLCBuKTsKICAJICAgICAgICAgIGlmICh1KSB7CiAgCSAgICAgICAgICAgIGlmICh1ID09PSB5KSBjb250aW51ZTsKICAJICAgICAgICAgICAgcmV0dXJuIHU7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICAgIGlmICgibmV4dCIgPT09IG4ubWV0aG9kKSBuLnNlbnQgPSBuLl9zZW50ID0gbi5hcmc7ZWxzZSBpZiAoInRocm93IiA9PT0gbi5tZXRob2QpIHsKICAJICAgICAgICAgIGlmIChvID09PSBoKSB0aHJvdyBvID0gcywgbi5hcmc7CiAgCSAgICAgICAgICBuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKTsKICAJICAgICAgICB9IGVsc2UgInJldHVybiIgPT09IG4ubWV0aG9kICYmIG4uYWJydXB0KCJyZXR1cm4iLCBuLmFyZyk7CiAgCSAgICAgICAgbyA9IGY7CiAgCSAgICAgICAgdmFyIHAgPSB0cnlDYXRjaChlLCByLCBuKTsKICAJICAgICAgICBpZiAoIm5vcm1hbCIgPT09IHAudHlwZSkgewogIAkgICAgICAgICAgaWYgKG8gPSBuLmRvbmUgPyBzIDogbCwgcC5hcmcgPT09IHkpIGNvbnRpbnVlOwogIAkgICAgICAgICAgcmV0dXJuIHsKICAJICAgICAgICAgICAgdmFsdWU6IHAuYXJnLAogIAkgICAgICAgICAgICBkb25lOiBuLmRvbmUKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgfQogIAkgICAgICAgICJ0aHJvdyIgPT09IHAudHlwZSAmJiAobyA9IHMsIG4ubWV0aG9kID0gInRocm93Iiwgbi5hcmcgPSBwLmFyZyk7CiAgCSAgICAgIH0KICAJICAgIH07CiAgCSAgfQogIAkgIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgcikgewogIAkgICAgdmFyIG4gPSByLm1ldGhvZCwKICAJICAgICAgbyA9IGUuaXRlcmF0b3Jbbl07CiAgCSAgICBpZiAobyA9PT0gdCkgcmV0dXJuIHIuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBuICYmIGUuaXRlcmF0b3JbInJldHVybiJdICYmIChyLm1ldGhvZCA9ICJyZXR1cm4iLCByLmFyZyA9IHQsIG1heWJlSW52b2tlRGVsZWdhdGUoZSwgciksICJ0aHJvdyIgPT09IHIubWV0aG9kKSB8fCAicmV0dXJuIiAhPT0gbiAmJiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIgKyBuICsgIicgbWV0aG9kIikpLCB5OwogIAkgICAgdmFyIGkgPSB0cnlDYXRjaChvLCBlLml0ZXJhdG9yLCByLmFyZyk7CiAgCSAgICBpZiAoInRocm93IiA9PT0gaS50eXBlKSByZXR1cm4gci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IGkuYXJnLCByLmRlbGVnYXRlID0gbnVsbCwgeTsKICAJICAgIHZhciBhID0gaS5hcmc7CiAgCSAgICByZXR1cm4gYSA/IGEuZG9uZSA/IChyW2UucmVzdWx0TmFtZV0gPSBhLnZhbHVlLCByLm5leHQgPSBlLm5leHRMb2MsICJyZXR1cm4iICE9PSByLm1ldGhvZCAmJiAoci5tZXRob2QgPSAibmV4dCIsIHIuYXJnID0gdCksIHIuZGVsZWdhdGUgPSBudWxsLCB5KSA6IGEgOiAoci5tZXRob2QgPSAidGhyb3ciLCByLmFyZyA9IG5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksIHIuZGVsZWdhdGUgPSBudWxsLCB5KTsKICAJICB9CiAgCSAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gewogIAkgICAgICB0cnlMb2M6IHRbMF0KICAJICAgIH07CiAgCSAgICAxIGluIHQgJiYgKGUuY2F0Y2hMb2MgPSB0WzFdKSwgMiBpbiB0ICYmIChlLmZpbmFsbHlMb2MgPSB0WzJdLCBlLmFmdGVyTG9jID0gdFszXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGUpOwogIAkgIH0KICAJICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KHQpIHsKICAJICAgIHZhciBlID0gdC5jb21wbGV0aW9uIHx8IHt9OwogIAkgICAgZS50eXBlID0gIm5vcm1hbCIsIGRlbGV0ZSBlLmFyZywgdC5jb21wbGV0aW9uID0gZTsKICAJICB9CiAgCSAgZnVuY3Rpb24gQ29udGV4dCh0KSB7CiAgCSAgICB0aGlzLnRyeUVudHJpZXMgPSBbewogIAkgICAgICB0cnlMb2M6ICJyb290IgogIAkgICAgfV0sIHQuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsKICAJICB9CiAgCSAgZnVuY3Rpb24gdmFsdWVzKGUpIHsKICAJICAgIGlmIChlIHx8ICIiID09PSBlKSB7CiAgCSAgICAgIHZhciByID0gZVthXTsKICAJICAgICAgaWYgKHIpIHJldHVybiByLmNhbGwoZSk7CiAgCSAgICAgIGlmICgiZnVuY3Rpb24iID09IHR5cGVvZiBlLm5leHQpIHJldHVybiBlOwogIAkgICAgICBpZiAoIWlzTmFOKGUubGVuZ3RoKSkgewogIAkgICAgICAgIHZhciBvID0gLTEsCiAgCSAgICAgICAgICBpID0gZnVuY3Rpb24gbmV4dCgpIHsKICAJICAgICAgICAgICAgZm9yICg7ICsrbyA8IGUubGVuZ3RoOykgaWYgKG4uY2FsbChlLCBvKSkgcmV0dXJuIG5leHQudmFsdWUgPSBlW29dLCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgICAgICAgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMCwgbmV4dDsKICAJICAgICAgICAgIH07CiAgCSAgICAgICAgcmV0dXJuIGkubmV4dCA9IGk7CiAgCSAgICAgIH0KICAJICAgIH0KICAJICAgIHRocm93IG5ldyBUeXBlRXJyb3IoX3R5cGVvZihlKSArICIgaXMgbm90IGl0ZXJhYmxlIik7CiAgCSAgfQogIAkgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgbyhnLCAiY29uc3RydWN0b3IiLCB7CiAgCSAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsCiAgCSAgICBjb25maWd1cmFibGU6ICEwCiAgCSAgfSksIG8oR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAJICAgIHZhbHVlOiBHZW5lcmF0b3JGdW5jdGlvbiwKICAJICAgIGNvbmZpZ3VyYWJsZTogITAKICAJICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpLCBlLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAodCkgewogIAkgICAgdmFyIGUgPSAiZnVuY3Rpb24iID09IHR5cGVvZiB0ICYmIHQuY29uc3RydWN0b3I7CiAgCSAgICByZXR1cm4gISFlICYmIChlID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAiR2VuZXJhdG9yRnVuY3Rpb24iID09PSAoZS5kaXNwbGF5TmFtZSB8fCBlLm5hbWUpKTsKICAJICB9LCBlLm1hcmsgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZih0LCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAodC5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKHQsIHUsICJHZW5lcmF0b3JGdW5jdGlvbiIpKSwgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGcpLCB0OwogIAkgIH0sIGUuYXdyYXAgPSBmdW5jdGlvbiAodCkgewogIAkgICAgcmV0dXJuIHsKICAJICAgICAgX19hd2FpdDogdAogIAkgICAgfTsKICAJICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGMsIGZ1bmN0aW9uICgpIHsKICAJICAgIHJldHVybiB0aGlzOwogIAkgIH0pLCBlLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yLCBlLmFzeW5jID0gZnVuY3Rpb24gKHQsIHIsIG4sIG8sIGkpIHsKICAJICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IFByb21pc2UpOwogIAkgICAgdmFyIGEgPSBuZXcgQXN5bmNJdGVyYXRvcih3cmFwKHQsIHIsIG4sIG8pLCBpKTsKICAJICAgIHJldHVybiBlLmlzR2VuZXJhdG9yRnVuY3Rpb24ocikgPyBhIDogYS5uZXh0KCkudGhlbihmdW5jdGlvbiAodCkgewogIAkgICAgICByZXR1cm4gdC5kb25lID8gdC52YWx1ZSA6IGEubmV4dCgpOwogIAkgICAgfSk7CiAgCSAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKGcpLCBkZWZpbmUoZywgdSwgIkdlbmVyYXRvciIpLCBkZWZpbmUoZywgYSwgZnVuY3Rpb24gKCkgewogIAkgICAgcmV0dXJuIHRoaXM7CiAgCSAgfSksIGRlZmluZShnLCAidG9TdHJpbmciLCBmdW5jdGlvbiAoKSB7CiAgCSAgICByZXR1cm4gIltvYmplY3QgR2VuZXJhdG9yXSI7CiAgCSAgfSksIGUua2V5cyA9IGZ1bmN0aW9uICh0KSB7CiAgCSAgICB2YXIgZSA9IE9iamVjdCh0KSwKICAJICAgICAgciA9IFtdOwogIAkgICAgZm9yICh2YXIgbiBpbiBlKSByLnB1c2gobik7CiAgCSAgICByZXR1cm4gci5yZXZlcnNlKCksIGZ1bmN0aW9uIG5leHQoKSB7CiAgCSAgICAgIGZvciAoOyByLmxlbmd0aDspIHsKICAJICAgICAgICB2YXIgdCA9IHIucG9wKCk7CiAgCSAgICAgICAgaWYgKHQgaW4gZSkgcmV0dXJuIG5leHQudmFsdWUgPSB0LCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAJICAgICAgfQogIAkgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgCSAgICB9OwogIAkgIH0sIGUudmFsdWVzID0gdmFsdWVzLCBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAJICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogIAkgICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KGUpIHsKICAJICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB0LCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gIm5leHQiLCB0aGlzLmFyZyA9IHQsIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpLCAhZSkgZm9yICh2YXIgciBpbiB0aGlzKSAidCIgPT09IHIuY2hhckF0KDApICYmIG4uY2FsbCh0aGlzLCByKSAmJiAhaXNOYU4oK3Iuc2xpY2UoMSkpICYmICh0aGlzW3JdID0gdCk7CiAgCSAgICB9LAogIAkgICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHsKICAJICAgICAgdGhpcy5kb25lID0gITA7CiAgCSAgICAgIHZhciB0ID0gdGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gdGhpcy5ydmFsOwogIAkgICAgfSwKICAJICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiBkaXNwYXRjaEV4Y2VwdGlvbihlKSB7CiAgCSAgICAgIGlmICh0aGlzLmRvbmUpIHRocm93IGU7CiAgCSAgICAgIHZhciByID0gdGhpczsKICAJICAgICAgZnVuY3Rpb24gaGFuZGxlKG4sIG8pIHsKICAJICAgICAgICByZXR1cm4gYS50eXBlID0gInRocm93IiwgYS5hcmcgPSBlLCByLm5leHQgPSBuLCBvICYmIChyLm1ldGhvZCA9ICJuZXh0Iiwgci5hcmcgPSB0KSwgISFvOwogIAkgICAgICB9CiAgCSAgICAgIGZvciAodmFyIG8gPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgbyA+PSAwOyAtLW8pIHsKICAJICAgICAgICB2YXIgaSA9IHRoaXMudHJ5RW50cmllc1tvXSwKICAJICAgICAgICAgIGEgPSBpLmNvbXBsZXRpb247CiAgCSAgICAgICAgaWYgKCJyb290IiA9PT0gaS50cnlMb2MpIHJldHVybiBoYW5kbGUoImVuZCIpOwogIAkgICAgICAgIGlmIChpLnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAJICAgICAgICAgIHZhciBjID0gbi5jYWxsKGksICJjYXRjaExvYyIpLAogIAkgICAgICAgICAgICB1ID0gbi5jYWxsKGksICJmaW5hbGx5TG9jIik7CiAgCSAgICAgICAgICBpZiAoYyAmJiB1KSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShpLmZpbmFsbHlMb2MpOwogIAkgICAgICAgICAgfSBlbHNlIGlmIChjKSB7CiAgCSAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGkuY2F0Y2hMb2MsICEwKTsKICAJICAgICAgICAgIH0gZWxzZSB7CiAgCSAgICAgICAgICAgIGlmICghdSkgdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpOwogIAkgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgaS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGkuZmluYWxseUxvYyk7CiAgCSAgICAgICAgICB9CiAgCSAgICAgICAgfQogIAkgICAgICB9CiAgCSAgICB9LAogIAkgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodCwgZSkgewogIAkgICAgICBmb3IgKHZhciByID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHIgPj0gMDsgLS1yKSB7CiAgCSAgICAgICAgdmFyIG8gPSB0aGlzLnRyeUVudHJpZXNbcl07CiAgCSAgICAgICAgaWYgKG8udHJ5TG9jIDw9IHRoaXMucHJldiAmJiBuLmNhbGwobywgImZpbmFsbHlMb2MiKSAmJiB0aGlzLnByZXYgPCBvLmZpbmFsbHlMb2MpIHsKICAJICAgICAgICAgIHZhciBpID0gbzsKICAJICAgICAgICAgIGJyZWFrOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICBpICYmICgiYnJlYWsiID09PSB0IHx8ICJjb250aW51ZSIgPT09IHQpICYmIGkudHJ5TG9jIDw9IGUgJiYgZSA8PSBpLmZpbmFsbHlMb2MgJiYgKGkgPSBudWxsKTsKICAJICAgICAgdmFyIGEgPSBpID8gaS5jb21wbGV0aW9uIDoge307CiAgCSAgICAgIHJldHVybiBhLnR5cGUgPSB0LCBhLmFyZyA9IGUsIGkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGkuZmluYWxseUxvYywgeSkgOiB0aGlzLmNvbXBsZXRlKGEpOwogIAkgICAgfSwKICAJICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZSh0LCBlKSB7CiAgCSAgICAgIGlmICgidGhyb3ciID09PSB0LnR5cGUpIHRocm93IHQuYXJnOwogIAkgICAgICByZXR1cm4gImJyZWFrIiA9PT0gdC50eXBlIHx8ICJjb250aW51ZSIgPT09IHQudHlwZSA/IHRoaXMubmV4dCA9IHQuYXJnIDogInJldHVybiIgPT09IHQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHQuYXJnLCB0aGlzLm1ldGhvZCA9ICJyZXR1cm4iLCB0aGlzLm5leHQgPSAiZW5kIikgOiAibm9ybWFsIiA9PT0gdC50eXBlICYmIGUgJiYgKHRoaXMubmV4dCA9IGUpLCB5OwogIAkgICAgfSwKICAJICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKHQpIHsKICAJICAgICAgZm9yICh2YXIgZSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBlID49IDA7IC0tZSkgewogIAkgICAgICAgIHZhciByID0gdGhpcy50cnlFbnRyaWVzW2VdOwogIAkgICAgICAgIGlmIChyLmZpbmFsbHlMb2MgPT09IHQpIHJldHVybiB0aGlzLmNvbXBsZXRlKHIuY29tcGxldGlvbiwgci5hZnRlckxvYyksIHJlc2V0VHJ5RW50cnkociksIHk7CiAgCSAgICAgIH0KICAJICAgIH0sCiAgCSAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godCkgewogIAkgICAgICBmb3IgKHZhciBlID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGUgPj0gMDsgLS1lKSB7CiAgCSAgICAgICAgdmFyIHIgPSB0aGlzLnRyeUVudHJpZXNbZV07CiAgCSAgICAgICAgaWYgKHIudHJ5TG9jID09PSB0KSB7CiAgCSAgICAgICAgICB2YXIgbiA9IHIuY29tcGxldGlvbjsKICAJICAgICAgICAgIGlmICgidGhyb3ciID09PSBuLnR5cGUpIHsKICAJICAgICAgICAgICAgdmFyIG8gPSBuLmFyZzsKICAJICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShyKTsKICAJICAgICAgICAgIH0KICAJICAgICAgICAgIHJldHVybiBvOwogIAkgICAgICAgIH0KICAJICAgICAgfQogIAkgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogIAkgICAgfSwKICAJICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoZSwgciwgbikgewogIAkgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAJICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGUpLAogIAkgICAgICAgIHJlc3VsdE5hbWU6IHIsCiAgCSAgICAgICAgbmV4dExvYzogbgogIAkgICAgICB9LCAibmV4dCIgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHQpLCB5OwogIAkgICAgfQogIAkgIH0sIGU7CiAgCX0KICAJbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOyAKICB9IChyZWdlbmVyYXRvclJ1bnRpbWUkMSkpOwoKICB2YXIgcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cyA9IHJlZ2VuZXJhdG9yUnVudGltZSQxLmV4cG9ydHM7CgogIC8vIFRPRE8oQmFiZWwgOCk6IFJlbW92ZSB0aGlzIGZpbGUuCgogIHZhciBydW50aW1lID0gcmVnZW5lcmF0b3JSdW50aW1lRXhwb3J0cygpOwogIHZhciByZWdlbmVyYXRvciA9IHJ1bnRpbWU7CgogIC8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9ibG9iL21haW4vcGFja2FnZXMvcnVudGltZS9ydW50aW1lLmpzI0w3MzY9CiAgdHJ5IHsKICAgIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7CiAgfSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHsKICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOwogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOwogICAgfQogIH0KCiAgdmFyIF9yZWdlbmVyYXRvclJ1bnRpbWUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMocmVnZW5lcmF0b3IpOwoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQ0KICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZDQogIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SDQogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KICBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgew0KICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH0NCiAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICB9KTsNCiAgfQoKICBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2skMShpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gX3R5cGVvZihvKSB7CiAgICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAgIHJldHVybiBfdHlwZW9mID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmICJzeW1ib2wiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgewogICAgICByZXR1cm4gdHlwZW9mIG87CiAgICB9IDogZnVuY3Rpb24gKG8pIHsKICAgICAgcmV0dXJuIG8gJiYgImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2YgbzsKICAgIH0sIF90eXBlb2Yobyk7CiAgfQoKICBmdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsKICAgIGlmIChfdHlwZW9mKGlucHV0KSAhPT0gIm9iamVjdCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsKICAgIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsKICAgIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsKICAgICAgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCAiZGVmYXVsdCIpOwogICAgICBpZiAoX3R5cGVvZihyZXMpICE9PSAib2JqZWN0IikgcmV0dXJuIHJlczsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKTsKICAgIH0KICAgIHJldHVybiAoaGludCA9PT0gInN0cmluZyIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsKICB9CgogIGZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgewogICAgdmFyIGtleSA9IF90b1ByaW1pdGl2ZShhcmcsICJzdHJpbmciKTsKICAgIHJldHVybiBfdHlwZW9mKGtleSkgPT09ICJzeW1ib2wiID8ga2V5IDogU3RyaW5nKGtleSk7CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQxKHRhcmdldCwgcHJvcHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOwogICAgfQogIH0KICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MkMShDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQxKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICB9CgogIGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7CiAgICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsKICAgICAgby5fX3Byb3RvX18gPSBwOwogICAgICByZXR1cm4gbzsKICAgIH07CiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOwogIH0KCiAgZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7CiAgICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICJmdW5jdGlvbiIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOwogICAgfQogICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7CiAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9CiAgICB9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOwogIH0KCiAgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICB9CiAgICByZXR1cm4gc2VsZjsKICB9CgogIGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsKICAgIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsKICAgICAgcmV0dXJuIGNhbGw7CiAgICB9IGVsc2UgaWYgKGNhbGwgIT09IHZvaWQgMCkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpOwogICAgfQogICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7CiAgfQoKICBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgewogICAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7CiAgICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7CiAgICB9OwogICAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsKICB9CgogIC8qDQogICAgQ29weXJpZ2h0IDIwMjItMjAyMyBQaWNvdm9pY2UgSW5jLg0KCiAgICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIGxpY2Vuc2UuIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSAiTElDRU5TRSINCiAgICBmaWxlIGFjY29tcGFueWluZyB0aGlzIHNvdXJjZS4NCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbg0KICAgIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICovCiAgLyoqDQogICAqIEJhc2VQdkZpbGUgQ2xhc3MNCiAgICogVGhpcyBjbGFzcyBtb2NrcyB0aGUgZmlsZSBzeXN0ZW0gdXNpbmcgaW4tbWVtb3J5IHN0b3JhZ2UuDQogICAqLwogIHZhciBQdkZpbGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gUHZGaWxlKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBQdkZpbGUpOwogICAgICB0aGlzLl9wYXRoID0gJyc7CiAgICB9CiAgICAvKioNCiAgICAgKiBHZXR0ZXIgZm9yIGZpbGUncyBtZXRhIGluZm9ybWF0aW9uLg0KICAgICAqLwogICAgX2NyZWF0ZUNsYXNzJDEoUHZGaWxlLCBbewogICAgICBrZXk6ICJtZXRhIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgaWYgKHRoaXMuX21ldGEgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oewogICAgICAgICAgdmVyc2lvbjogMAogICAgICAgIH0sIHRoaXMuX21ldGEpOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogR2V0IHRoZSBmaWxlIHBvaW50ZXIgZnJvbSB0aGUgX2ZpbGVQdHJzIG1hcC4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIHBvaW50ZXIgdG8gQmFzZVB2RmlsZSBpbnN0YW5jZSB0byBnZXQgZnJvbSB0aGUgbWFwLg0KICAgICAgICogQHJldHVybnMgQmFzZVB2RmlsZSByZXR1cm5zIHRoZSBjdXJyZW50IGZpbGUgaW5zdGFuY2UgcmVsYXRlZCB0byBwdHIuDQogICAgICAgKi8KICAgIH1dLCBbewogICAgICBrZXk6ICJnZXRQdHIiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHRyKHB0cikgewogICAgICAgIGlmIChQdkZpbGUuX2ZpbGVQdHJzLmhhcyhwdHIpKSB7CiAgICAgICAgICByZXR1cm4gUHZGaWxlLl9maWxlUHRycy5nZXQocHRyKTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIGluc3RhbmNlIG5vdCBmb3VuZC4nKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFNhdmVzIHRoZSBCYXNlUHZGaWxlIGluc3RhbmNlIHRvIHRoZSBtYXAgd2l0aCBhbiBhc3NvY2lhdGVkIHB0ci4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byBzYXZlIGFzIHRoZSBrZXkuDQogICAgICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gc2F2ZSBhcyB0aGUgdmFsdWUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAic2V0UHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFB0cihwdHIsIGluc3RhbmNlKSB7CiAgICAgICAgUHZGaWxlLl9maWxlUHRycy5zZXQocHRyLCBpbnN0YW5jZSk7CiAgICAgIH0KICAgICAgLyoqDQogICAgICAgKiBSZW1vdmVzIHRoZSBwdHIgZnJvbSB0aGUgX2ZpbGVQdHJzIG1hcC4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIGZpbGUgcG9pbnRlciB0byByZW1vdmUuDQogICAgICAgKi8KICAgIH0sIHsKICAgICAga2V5OiAicmVtb3ZlUHRyIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVB0cihwdHIpIHsKICAgICAgICBQdkZpbGUuX2ZpbGVQdHJzWyJkZWxldGUiXShwdHIpOwogICAgICB9CiAgICB9XSk7CiAgICByZXR1cm4gUHZGaWxlOwogIH0oKTsKICBQdkZpbGUuX2ZpbGVQdHJzID0gbmV3IE1hcCgpOwoKICBmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQogIGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CiAgLyoqDQogICAqIFB2RmlsZU1lbSBDbGFzcw0KICAgKiBUaGlzIGNsYXNzIG1vY2tzIHRoZSBmaWxlIHN5c3RlbSB1c2luZyBpbi1tZW1vcnkgc3RvcmFnZS4NCiAgICovCiAgdmFyIFB2RmlsZU1lbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B2RmlsZSkgewogICAgX2luaGVyaXRzKFB2RmlsZU1lbSwgX1B2RmlsZSk7CiAgICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFB2RmlsZU1lbSk7CiAgICBmdW5jdGlvbiBQdkZpbGVNZW0ocGF0aCwgbWV0YSwgZGIsIG1vZGUpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBQdkZpbGVNZW0pOwogICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpOwogICAgICBfdGhpcy5fcG9zID0gMDsKICAgICAgX3RoaXMuX3BhdGggPSBwYXRoOwogICAgICBfdGhpcy5fbWV0YSA9IG1ldGE7CiAgICAgIF90aGlzLl9tb2RlID0gbW9kZTsKICAgICAgcmV0dXJuIF90aGlzOwogICAgfQogICAgX2NyZWF0ZUNsYXNzJDEoUHZGaWxlTWVtLCBbewogICAgICBrZXk6ICJjbG9zZSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZSgpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAicmVhZCIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZWFkKHNpemUsIGNvdW50KSB7CiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cygpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2lzRU9GKSB7CiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCJFT0YiKTsKICAgICAgICAgIGVyci5uYW1lID0gIkVuZE9mRmlsZSI7CiAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgfQogICAgICAgIHZhciB0b0NvcHkgPSBNYXRoLm1pbihzaXplICogY291bnQsIHRoaXMuX2ZpbGUubGVuZ3RoIC0gdGhpcy5fcG9zKTsKICAgICAgICB2YXIgdG90YWxFbGVtcyA9IHRvQ29weSAtIHRvQ29weSAlIHNpemU7CiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRvdGFsRWxlbXMpOwogICAgICAgIGJ1ZmZlci5zZXQodGhpcy5fZmlsZS5zbGljZSh0aGlzLl9wb3MsIHRoaXMuX3BvcyArIHRvdGFsRWxlbXMpLCAwKTsKICAgICAgICB0aGlzLl9wb3MgKz0gdG90YWxFbGVtczsKICAgICAgICByZXR1cm4gYnVmZmVyOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogIndyaXRlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHdyaXRlKGNvbnRlbnQpIHsKICAgICAgICB2YXIgbmV3RmlsZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3BvcyArIGNvbnRlbnQubGVuZ3RoKTsKICAgICAgICBpZiAodGhpcy5fZmlsZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBuZXdGaWxlLnNldCh0aGlzLl9maWxlLnNsaWNlKDAsIHRoaXMuX3BvcykpOwogICAgICAgICAgbmV3RmlsZS5zZXQoY29udGVudCwgdGhpcy5fcG9zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3RmlsZS5zZXQoY29udGVudCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2ZpbGUgPSBuZXdGaWxlOwogICAgICAgIHRoaXMuX3BvcyArPSBjb250ZW50Lmxlbmd0aDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJzZWVrIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNlZWsob2Zmc2V0LCB3aGVuY2UpIHsKICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkgJiYgdGhpcy5fbW9kZSA9PT0gInJlYWRvbmx5IikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCInIi5jb25jYXQodGhpcy5fcGF0aCwgIicgZG9lc24ndCBleGlzdC4iKSk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSkgewogICAgICAgICAgLy8gVGhpcyBpcyB2YWxpZCBpbiBJU08gQyBidXQgbm90IHN1cHBvcnRlZCBieSB0aGlzIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiJyIuY29uY2F0KHRoaXMuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgIH0KICAgICAgICBpZiAob2Zmc2V0IDwgMCkgewogICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigiRU9GIik7CiAgICAgICAgICBlcnIubmFtZSA9ICJFbmRPZkZpbGUiOwogICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgIH0KICAgICAgICB2YXIgbmV3T2Zmc2V0OwogICAgICAgIGlmICh3aGVuY2UgPT09IDApIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKG9mZnNldCwgdGhpcy5fZmlsZS5sZW5ndGgpOwogICAgICAgIH0gZWxzZSBpZiAod2hlbmNlID09PSAxKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbih0aGlzLl9wb3MgKyBvZmZzZXQsIHRoaXMuX2ZpbGUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKHdoZW5jZSA9PT0gMikgewogICAgICAgICAgbmV3T2Zmc2V0ID0gTWF0aC5taW4odGhpcy5fZmlsZS5sZW5ndGggKyBvZmZzZXQsIHRoaXMuX2ZpbGUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG9wZXJhdGlvbjogIi5jb25jYXQod2hlbmNlLCAiLiIpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcG9zID0gbmV3T2Zmc2V0OwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInRlbGwiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gdGVsbCgpIHsKICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkpIHsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3BvczsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKCkgewogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBpZiAodGhpcy5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVOT0VOVCIpOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIFB2RmlsZU1lbS5fbWVtRmlsZXNbImRlbGV0ZSJdKHRoaXMuX3BhdGgpOwogICAgICAgICAgICAgICAgdGhpcy5fcG9zID0gMDsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpOwogICAgICAgIH0pKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJleGlzdHMiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZXhpc3RzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9maWxlICE9PSB1bmRlZmluZWQ7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiX2lzRU9GIiwKICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcyA+PSB0aGlzLl9maWxlLmxlbmd0aDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJfZmlsZSIsCiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIHJldHVybiBQdkZpbGVNZW0uX21lbUZpbGVzLmdldCh0aGlzLl9wYXRoKTsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoY29udGVudCkgewogICAgICAgIFB2RmlsZU1lbS5fbWVtRmlsZXMuc2V0KHRoaXMuX3BhdGgsIGNvbnRlbnQpOwogICAgICB9CiAgICB9XSwgW3sKICAgICAga2V5OiAib3BlbiIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKHBhdGgsIG1vZGUpIHsKICAgICAgICB2YXIgZmlsZSA9IFB2RmlsZU1lbS5fbWVtRmlsZXMuZ2V0KHBhdGgpOwogICAgICAgIHZhciBkYk1vZGUgPSBtb2RlLmluY2x1ZGVzKCdyJykgPyAicmVhZG9ubHkiIDogInJlYWR3cml0ZSI7CiAgICAgICAgaWYgKGZpbGUgPT09IHVuZGVmaW5lZCAmJiBkYk1vZGUgPT09ICJyZWFkb25seSIpIHsKICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigiJyIuY29uY2F0KHBhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgICAgZXJyb3IubmFtZSA9ICJGaWxlTm90RXhpc3RzIjsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgICB2YXIgZmlsZU1lbSA9IG5ldyBQdkZpbGVNZW0ocGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRiTW9kZSk7CiAgICAgICAgaWYgKG1vZGUuaW5jbHVkZXMoJ2EnKSkgewogICAgICAgICAgZmlsZU1lbS5zZWVrKDAsIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmlsZU1lbTsKICAgICAgfQogICAgfV0pOwogICAgcmV0dXJuIFB2RmlsZU1lbTsKICB9KFB2RmlsZSk7CiAgUHZGaWxlTWVtLl9tZW1GaWxlcyA9IG5ldyBNYXAoKTsKICAvKioNCiAgICogQ2FzdCBhIHNpZ25lZCBhZGRyZXNzIHRvIHVuc2lnbmVkIGFkZHJlc3MuDQogICAqDQogICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGNhc3QgdG8gdW5zaWduZWQgYWRkcmVzcy4NCiAgICovCiAgZnVuY3Rpb24gdW5zaWduZWRBZGRyZXNzKGFkZHJlc3MpIHsKICAgIGlmIChhZGRyZXNzIDwgMCkgewogICAgICByZXR1cm4gYWRkcmVzcyA+Pj4gMDsKICAgIH0KICAgIHJldHVybiBhZGRyZXNzOwogIH0KCiAgdmFyIFB2WHB1QWN0aW9uOwogIChmdW5jdGlvbiAoUHZYcHVBY3Rpb24pIHsKICAgIFB2WHB1QWN0aW9uW1B2WHB1QWN0aW9uWyJJTklUIl0gPSAwXSA9ICJJTklUIjsKICAgIFB2WHB1QWN0aW9uW1B2WHB1QWN0aW9uWyJBTExPQyJdID0gMV0gPSAiQUxMT0MiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIkZSRUUiXSA9IDJdID0gIkZSRUUiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIkNPUFlfVE9fWFBVIl0gPSAzXSA9ICJDT1BZX1RPX1hQVSI7CiAgICBQdlhwdUFjdGlvbltQdlhwdUFjdGlvblsiQ09QWV9GUk9NX1hQVSJdID0gNF0gPSAiQ09QWV9GUk9NX1hQVSI7CiAgICBQdlhwdUFjdGlvbltQdlhwdUFjdGlvblsiTUVNU0VUIl0gPSA1XSA9ICJNRU1TRVQiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIlRJTUVSX1NUQVJUIl0gPSA2XSA9ICJUSU1FUl9TVEFSVCI7CiAgICBQdlhwdUFjdGlvbltQdlhwdUFjdGlvblsiVElNRVJfU1RPUCJdID0gN10gPSAiVElNRVJfU1RPUCI7CiAgICAvLyBvdGhlciB4cHUgYWN0aW9ucwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIk1BVFJJWF9WRUNUT1JfTVVMVElQTFkiXSA9IDhdID0gIk1BVFJJWF9WRUNUT1JfTVVMVElQTFkiOwogICAgUHZYcHVBY3Rpb25bUHZYcHVBY3Rpb25bIlNZTkNfVkVDVE9SIl0gPSA5XSA9ICJTWU5DX1ZFQ1RPUiI7CiAgfSkoUHZYcHVBY3Rpb24gfHwgKFB2WHB1QWN0aW9uID0ge30pKTsKCiAgY29uc3Qgd2FzaV9zbmFwc2hvdF9wcmV2aWV3MV9lbXVsYXRvciA9IHsKICAgIGFyZ3NfZ2V0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgYXJnc19zaXplc19nZXQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBlbnZpcm9uX2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGVudmlyb25fc2l6ZXNfZ2V0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgY2xvY2tfcmVzX2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGNsb2NrX3RpbWVfZ2V0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWR2aXNlOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfYWxsb2NhdGU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9jbG9zZTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2RhdGFzeW5jOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmRzdGF0X2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2Zkc3RhdF9zZXRfZmxhZ3M6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9mZHN0YXRfc2V0X3JpZ2h0czogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2ZpbGVzdGF0X2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX2ZpbGVzdGF0X3NldF9zaXplOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfZmlsZXN0YXRfc2V0X3RpbWVzOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcHJlYWQ6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9wcmVzdGF0X2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3ByZXN0YXRfZGlyX25hbWU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9wd3JpdGU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF9yZWFkOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfcmVhZGRpcjogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3JlbnVtYmVyOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfc2VlazogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGZkX3N5bmM6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBmZF90ZWxsOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgZmRfd3JpdGU6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX2NyZWF0ZV9kaXJlY3Rvcnk6IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICBwYXRoX2ZpbGVzdGF0X2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfZmlsZXN0YXRfc2V0X3RpbWVzOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9saW5rOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9vcGVuOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9yZWFkbGluazogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfcmVtb3ZlX2RpcmVjdG9yeTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBhdGhfcmVuYW1lOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF9zeW1saW5rOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcGF0aF91bmxpbmtfZmlsZTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHBvbGxfb25lb2ZmOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19leGl0OiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcHJvY19yYWlzZTogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNjaGVkX3lpZWxkOiAoaW5wdXQpID0+IHsKICAgICAgcmV0dXJuIDA7CiAgICB9LAogICAgcmFuZG9tX2dldDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNvY2tfcmVjdjogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNvY2tfc2VuZDogKGlucHV0KSA9PiB7CiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIHNvY2tfc2h1dGRvd246IChpbnB1dCkgPT4gewogICAgICByZXR1cm4gMDsKICAgIH0sCiAgfTsKCiAgdmFyIG1hdHJpeFZlY3Rvck11bHRpcGx5ID0gZnVuY3Rpb24gbWF0cml4VmVjdG9yTXVsdGlwbHkoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHMgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMubWVtQWxsb2MsCiAgICAgICAgbWVtb3J5ID0gX2RhdGEkZ2xvYmFscy5tZW1vcnk7CiAgICAgIHZhciBtYXRyaXhBZGRyZXNzID0gZGF0YS5tYXRyaXhBZGRyZXNzLAogICAgICAgIHZlY3RvckFkZHJlc3MgPSBkYXRhLnZlY3RvckFkZHJlc3MsCiAgICAgICAgbSA9IGRhdGEubSwKICAgICAgICBuID0gZGF0YS5uLAogICAgICAgIHJlc3VsdEFkZHJlc3MgPSBkYXRhLnJlc3VsdEFkZHJlc3M7CiAgICAgIHZhciBwdl9tYXRyaXhfdmVjdG9yX211bHRpcGx5ID0gZXhwb3J0cy5wdl9tYXRyaXhfdmVjdG9yX211bHRpcGx5OwogICAgICBpZiAoIW1lbUFsbG9jLmhhcyhtYXRyaXhBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKHZlY3RvckFkZHJlc3MpIHx8ICFtZW1BbGxvYy5oYXMocmVzdWx0QWRkcmVzcykpIHsKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIGNvbW1hbmQ6ICdvaycsCiAgICAgICAgICByZXN1bHQ6IG5ldyBGbG9hdDMyQXJyYXkoMCkKICAgICAgICB9KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIG1lbW9yeUJ1ZmZlckZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICB2YXIgX21lbUFsbG9jJGdldCA9IG1lbUFsbG9jLmdldChtYXRyaXhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJNYXRyaXhBZGRyZXNzID0gX21lbUFsbG9jJGdldC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDIgPSBtZW1BbGxvYy5nZXQodmVjdG9yQWRkcmVzcyksCiAgICAgICAgd29ya2VyVmVjdG9yQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldChyZXN1bHRBZGRyZXNzKSwKICAgICAgICB3b3JrZXJSZXN1bHRBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfbWF0cml4X3ZlY3Rvcl9tdWx0aXBseSh3b3JrZXJNYXRyaXhBZGRyZXNzLCB3b3JrZXJWZWN0b3JBZGRyZXNzLCBtLCBuLCB3b3JrZXJSZXN1bHRBZGRyZXNzKTsKICAgICAgdmFyIHJlc3VsdCA9IG1lbW9yeUJ1ZmZlckZsb2F0MzIuc2xpY2Uod29ya2VyUmVzdWx0QWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgd29ya2VyUmVzdWx0QWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCArIG0pOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snLAogICAgICAgIHJlc3VsdDogcmVzdWx0CiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBzeW5jVmVjdG9yID0gZnVuY3Rpb24gc3luY1ZlY3RvcihkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczIgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzMi5tZW1BbGxvYywKICAgICAgICBtZW1vcnkgPSBfZGF0YSRnbG9iYWxzMi5tZW1vcnk7CiAgICAgIHZhciB2ZWN0b3JBZGRyZXNzID0gZGF0YS52ZWN0b3JBZGRyZXNzLAogICAgICAgIGJ1ZmZlciA9IGRhdGEuYnVmZmVyOwogICAgICBpZiAobWVtQWxsb2MuaGFzKHZlY3RvckFkZHJlc3MpKSB7CiAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlckZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NCA9IG1lbUFsbG9jLmdldCh2ZWN0b3JBZGRyZXNzKSwKICAgICAgICAgIHdvcmtlck1lbUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NC53b3JrZXJNZW1BZGRyZXNzOwogICAgICAgIG1lbW9yeUJ1ZmZlckZsb2F0MzIuc2V0KGJ1ZmZlciwgd29ya2VyTWVtQWRkcmVzcyAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgIH0KICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgcHZNdm1BY3Rpb25NYXAgPSBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHt9LCBQdlhwdUFjdGlvbi5NQVRSSVhfVkVDVE9SX01VTFRJUExZLCBtYXRyaXhWZWN0b3JNdWx0aXBseSksIFB2WHB1QWN0aW9uLlNZTkNfVkVDVE9SLCBzeW5jVmVjdG9yKTsKCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCAqLwogIHZhciBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb247CiAgKGZ1bmN0aW9uIChQdlBpY29sbG1BdHRlbnRpb25BY3Rpb24pIHsKICAgIFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbltQdlBpY29sbG1BdHRlbnRpb25BY3Rpb25bIkFUVEVOVElPTl9QUkVDT01QVVRFX0VOQ09ESU5HIl0gPSAyMDBdID0gIkFUVEVOVElPTl9QUkVDT01QVVRFX0VOQ09ESU5HIjsKICAgIFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbltQdlBpY29sbG1BdHRlbnRpb25BY3Rpb25bIkFUVEVOVElPTl9FTkNPREUiXSA9IDIwMV0gPSAiQVRURU5USU9OX0VOQ09ERSI7CiAgICBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb25bUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uWyJBVFRFTlRJT05fQVRURU5EIl0gPSAyMDJdID0gIkFUVEVOVElPTl9BVFRFTkQiOwogICAgUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uW1B2UGljb2xsbUF0dGVudGlvbkFjdGlvblsiQVRURU5USU9OX1VQREFURV9LRVlTIl0gPSAyMDNdID0gIkFUVEVOVElPTl9VUERBVEVfS0VZUyI7CiAgICBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb25bUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uWyJBVFRFTlRJT05fVVBEQVRFX1ZBTFVFUyJdID0gMjA0XSA9ICJBVFRFTlRJT05fVVBEQVRFX1ZBTFVFUyI7CiAgICBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb25bUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uWyJBVFRFTlRJT05fVFJBTlNQT1NFX1FVRVJZIl0gPSAyMDVdID0gIkFUVEVOVElPTl9UUkFOU1BPU0VfUVVFUlkiOwogIH0pKFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbiB8fCAoUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uID0ge30pKTsKCiAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07CiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsKICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOwogICAgfQogIH0KICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7CiAgICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsKICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICB9KTsKICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICB9CgogIGZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSB8fCBvWyJAQGl0ZXJhdG9yIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gIm51bWJlciIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbInJldHVybiJdICE9IG51bGwpIGl0WyJyZXR1cm4iXSgpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9CiAgZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSAiQXJndW1lbnRzIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH0KICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfQogIHZhciBQdlhwdSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBQdlhwdSgpIHsKICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFB2WHB1KTsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyhQdlhwdSwgbnVsbCwgW3sKICAgICAga2V5OiAiYWRkWHB1IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFhwdShvYmpBZGRyZXNzLCBkYXRhKSB7CiAgICAgICAgUHZYcHUueHB1T2JqZWN0cy5zZXQob2JqQWRkcmVzcywgZGF0YSk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiZ2V0WHB1IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFhwdShvYmpBZGRyZXNzKSB7CiAgICAgICAgcmV0dXJuIFB2WHB1LnhwdU9iamVjdHMuZ2V0KG9iakFkZHJlc3MpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImhhc1hwdSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNYcHUob2JqQWRkcmVzcykgewogICAgICAgIHJldHVybiBQdlhwdS54cHVPYmplY3RzLmhhcyhvYmpBZGRyZXNzKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmVYcHUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlWHB1KG9iakFkZHJlc3MpIHsKICAgICAgICBpZiAoUHZYcHUueHB1T2JqZWN0cy5oYXMob2JqQWRkcmVzcykpIHsKICAgICAgICAgIHZhciBfUHZYcHUkeHB1T2JqZWN0cyRnZXQgPSBQdlhwdS54cHVPYmplY3RzLmdldChvYmpBZGRyZXNzKSwKICAgICAgICAgICAgZGV2aWNlTWVtID0gX1B2WHB1JHhwdU9iamVjdHMkZ2V0LmRldmljZU1lbTsKICAgICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihkZXZpY2VNZW0pLAogICAgICAgICAgICBfc3RlcDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7CiAgICAgICAgICAgICAgdmFyIG1lbUFkZHJlc3MgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgICAgICBQdlhwdS5tZW1vcnlPYmplY3RzWyJkZWxldGUiXShtZW1BZGRyZXNzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBfaXRlcmF0b3IuZigpOwogICAgICAgICAgfQogICAgICAgICAgUHZYcHUueHB1T2JqZWN0c1siZGVsZXRlIl0ob2JqQWRkcmVzcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogImFkZE1lbW9yeSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRNZW1vcnkobWVtQWRkcmVzcywgZGF0YSkgewogICAgICAgIFB2WHB1Lm1lbW9yeU9iamVjdHMuc2V0KG1lbUFkZHJlc3MsIGRhdGEpOwogICAgICAgIFB2WHB1LnhwdU9iamVjdHMuZ2V0KGRhdGEub2JqQWRkcmVzcykuZGV2aWNlTWVtLmFkZChtZW1BZGRyZXNzKTsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJnZXRNZW1vcnkiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TWVtb3J5KG1lbUFkZHJlc3MpIHsKICAgICAgICByZXR1cm4gUHZYcHUubWVtb3J5T2JqZWN0cy5nZXQobWVtQWRkcmVzcyk7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAiaGFzTWVtb3J5IiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhc01lbW9yeShtZW1BZGRyZXNzKSB7CiAgICAgICAgcmV0dXJuIFB2WHB1Lm1lbW9yeU9iamVjdHMuaGFzKG1lbUFkZHJlc3MpOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInJlbW92ZU1lbW9yeSIsCiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVNZW1vcnkobWVtQWRkcmVzcykgewogICAgICAgIGlmIChQdlhwdS5oYXNNZW1vcnkobWVtQWRkcmVzcykpIHsKICAgICAgICAgIFB2WHB1LnhwdU9iamVjdHMuZ2V0KFB2WHB1LmdldE1lbW9yeShtZW1BZGRyZXNzKS5vYmpBZGRyZXNzKS5kZXZpY2VNZW1bImRlbGV0ZSJdKG1lbUFkZHJlc3MpOwogICAgICAgIH0KICAgICAgICBQdlhwdS5tZW1vcnlPYmplY3RzWyJkZWxldGUiXShtZW1BZGRyZXNzKTsKICAgICAgfQogICAgfV0pOwogICAgcmV0dXJuIFB2WHB1OwogIH0oKTsKICBfZGVmaW5lUHJvcGVydHkoUHZYcHUsICJ4cHVPYmplY3RzIiwgbmV3IE1hcCgpKTsKICBfZGVmaW5lUHJvcGVydHkoUHZYcHUsICJtZW1vcnlPYmplY3RzIiwgbmV3IE1hcCgpKTsKCiAgdmFyIGF0dGVudGlvblByZWNvbXB1dGVFbmNvZGluZyA9IGZ1bmN0aW9uIGF0dGVudGlvblByZWNvbXB1dGVFbmNvZGluZyhkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFscyA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFscy5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFscy5tZW1BbGxvYzsKICAgICAgdmFyIGVuY29kaW5nQWRkcmVzcyA9IGRhdGEuZW5jb2RpbmdBZGRyZXNzLAogICAgICAgIGRpbWVuc2lvbiA9IGRhdGEuZGltZW5zaW9uLAogICAgICAgIHN0ZXBzID0gZGF0YS5zdGVwcywKICAgICAgICB0aGV0YSA9IGRhdGEudGhldGE7CiAgICAgIHZhciBwdl9waWNvbGxtX2F0dGVudGlvbl9wcmVjb21wdXRlX2VuY29kaW5nID0gZXhwb3J0cy5wdl9waWNvbGxtX2F0dGVudGlvbl9wcmVjb21wdXRlX2VuY29kaW5nOwogICAgICB2YXIgX21lbUFsbG9jJGdldCA9IG1lbUFsbG9jLmdldChlbmNvZGluZ0FkZHJlc3MpLAogICAgICAgIHdvcmtlckVuY29kaW5nQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV9hdHRlbnRpb25fcHJlY29tcHV0ZV9lbmNvZGluZyh3b3JrZXJFbmNvZGluZ0FkZHJlc3MsIGRpbWVuc2lvbiwgc3RlcHMsIHRoZXRhKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgYXR0ZW50aW9uRW5jb2RlID0gZnVuY3Rpb24gYXR0ZW50aW9uRW5jb2RlKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzMiA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczIuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMyLm1lbUFsbG9jOwogICAgICB2YXIgeEFkZHJlc3MgPSBkYXRhLnhBZGRyZXNzLAogICAgICAgIG5ld0VuY29kaW5nQWRkcmVzcyA9IGRhdGEubmV3RW5jb2RpbmdBZGRyZXNzLAogICAgICAgIG4gPSBkYXRhLm4sCiAgICAgICAgbnVtSGVhZHMgPSBkYXRhLm51bUhlYWRzLAogICAgICAgIHJvcGVJbnRlcmxlYXZlZCA9IGRhdGEucm9wZUludGVybGVhdmVkLAogICAgICAgIGhlYWREaW1lbnNpb24gPSBkYXRhLmhlYWREaW1lbnNpb24sCiAgICAgICAgcm9wZURpbWVuc2lvbiA9IGRhdGEucm9wZURpbWVuc2lvbiwKICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb247CiAgICAgIHZhciBwdl9waWNvbGxtX2F0dGVudGlvbl9lbmNvZGUgPSBleHBvcnRzLnB2X3BpY29sbG1fYXR0ZW50aW9uX2VuY29kZTsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldChuZXdFbmNvZGluZ0FkZHJlc3MpLAogICAgICAgIHdvcmtlck5ld0VuY29kaW5nQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQzLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHB2X3BpY29sbG1fYXR0ZW50aW9uX2VuY29kZSh3b3JrZXJYQWRkcmVzcywgd29ya2VyTmV3RW5jb2RpbmdBZGRyZXNzLCBuLCBudW1IZWFkcywgcm9wZUludGVybGVhdmVkLCBoZWFkRGltZW5zaW9uLCByb3BlRGltZW5zaW9uLCBwb3NpdGlvbik7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIGF0dGVudGlvbkF0dGVuZCA9IGZ1bmN0aW9uIGF0dGVudGlvbkF0dGVuZChkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczMgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMzLmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzMy5tZW1BbGxvYzsKICAgICAgdmFyIG51bUhlYWRzID0gZGF0YS5udW1IZWFkcywKICAgICAgICBudW1LdkhlYWRzID0gZGF0YS5udW1LdkhlYWRzLAogICAgICAgIHdpbmRvd0xlbmd0aCA9IGRhdGEud2luZG93TGVuZ3RoLAogICAgICAgIGhlYWREaW1lbnNpb24gPSBkYXRhLmhlYWREaW1lbnNpb24sCiAgICAgICAga2V5c0FkZHJlc3MgPSBkYXRhLmtleXNBZGRyZXNzLAogICAgICAgIGtleUludGVyY2VwdHNBZGRyZXNzID0gZGF0YS5rZXlJbnRlcmNlcHRzQWRkcmVzcywKICAgICAgICBrZXlTbG9wZXNBZGRyZXNzID0gZGF0YS5rZXlTbG9wZXNBZGRyZXNzLAogICAgICAgIHZhbHVlc0FkZHJlc3MgPSBkYXRhLnZhbHVlc0FkZHJlc3MsCiAgICAgICAgdmFsdWVJbnRlcmNlcHRzQWRkcmVzcyA9IGRhdGEudmFsdWVJbnRlcmNlcHRzQWRkcmVzcywKICAgICAgICB2YWx1ZVNsb3Blc0FkZHJlc3MgPSBkYXRhLnZhbHVlU2xvcGVzQWRkcmVzcywKICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgcXVlcnlBZGRyZXNzID0gZGF0YS5xdWVyeUFkZHJlc3MsCiAgICAgICAgbiA9IGRhdGEubiwKICAgICAgICBvdXRwdXRBZGRyZXNzID0gZGF0YS5vdXRwdXRBZGRyZXNzOwogICAgICB2YXIgcHZfcGljb2xsbV9hdHRlbnRpb25fYXR0ZW5kID0gZXhwb3J0cy5wdl9waWNvbGxtX2F0dGVudGlvbl9hdHRlbmQ7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NCA9IG1lbUFsbG9jLmdldChrZXlzQWRkcmVzcyksCiAgICAgICAgd29ya2VyS2V5c0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDUgPSBtZW1BbGxvYy5nZXQoa2V5SW50ZXJjZXB0c0FkZHJlc3MpLAogICAgICAgIHdvcmtlcktleUludGVyY2VwdHNBZGRyZXNzID0gX21lbUFsbG9jJGdldDUud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ2ID0gbWVtQWxsb2MuZ2V0KGtleVNsb3Blc0FkZHJlc3MpLAogICAgICAgIHdvcmtlcktleVNsb3Blc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Ni53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDcgPSBtZW1BbGxvYy5nZXQodmFsdWVzQWRkcmVzcyksCiAgICAgICAgd29ya2VyVmFsdWVzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ3Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0OCA9IG1lbUFsbG9jLmdldCh2YWx1ZUludGVyY2VwdHNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJWYWx1ZUludGVyY2VwdHNBZGRyZXNzID0gX21lbUFsbG9jJGdldDgud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ5ID0gbWVtQWxsb2MuZ2V0KHZhbHVlU2xvcGVzQWRkcmVzcyksCiAgICAgICAgd29ya2VyVmFsdWVTbG9wZXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDkud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxMCA9IG1lbUFsbG9jLmdldChxdWVyeUFkZHJlc3MpLAogICAgICAgIHdvcmtlclF1ZXJ5QWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDExID0gbWVtQWxsb2MuZ2V0KG91dHB1dEFkZHJlc3MpLAogICAgICAgIHdvcmtlck91dHB1dEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTEud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV9hdHRlbnRpb25fYXR0ZW5kKG51bUhlYWRzLCBudW1LdkhlYWRzLCB3aW5kb3dMZW5ndGgsIGhlYWREaW1lbnNpb24sIHdvcmtlcktleXNBZGRyZXNzLCB3b3JrZXJLZXlJbnRlcmNlcHRzQWRkcmVzcywgd29ya2VyS2V5U2xvcGVzQWRkcmVzcywgd29ya2VyVmFsdWVzQWRkcmVzcywgd29ya2VyVmFsdWVJbnRlcmNlcHRzQWRkcmVzcywgd29ya2VyVmFsdWVTbG9wZXNBZGRyZXNzLCBwb3NpdGlvbiwgd29ya2VyUXVlcnlBZGRyZXNzLCBuLCB3b3JrZXJPdXRwdXRBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgYXR0ZW50aW9uVXBkYXRlS2V5cyA9IGZ1bmN0aW9uIGF0dGVudGlvblVwZGF0ZUtleXMoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHM0ID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzNC5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFsczQubWVtQWxsb2M7CiAgICAgIHZhciBudW1LdkhlYWRzID0gZGF0YS5udW1LdkhlYWRzLAogICAgICAgIHdpbmRvd0xlbmd0aCA9IGRhdGEud2luZG93TGVuZ3RoLAogICAgICAgIGhlYWREaW1lbnNpb24gPSBkYXRhLmhlYWREaW1lbnNpb24sCiAgICAgICAga2V5c0FkZHJlc3MgPSBkYXRhLmtleXNBZGRyZXNzLAogICAgICAgIGtleUludGVyY2VwdHNBZGRyZXNzID0gZGF0YS5rZXlJbnRlcmNlcHRzQWRkcmVzcywKICAgICAgICBrZXlTbG9wZXNBZGRyZXNzID0gZGF0YS5rZXlTbG9wZXNBZGRyZXNzLAogICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbiwKICAgICAgICBuID0gZGF0YS5uLAogICAgICAgIHRmQWRkcmVzcyA9IGRhdGEudGZBZGRyZXNzOwogICAgICB2YXIgcHZfcGljb2xsbV9hdHRlbnRpb25fdXBkYXRlX2tleXMgPSBleHBvcnRzLnB2X3BpY29sbG1fYXR0ZW50aW9uX3VwZGF0ZV9rZXlzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDEyID0gbWVtQWxsb2MuZ2V0KGtleXNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJLZXlzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMi53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDEzID0gbWVtQWxsb2MuZ2V0KGtleUludGVyY2VwdHNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJLZXlJbnRlcmNlcHRzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMy53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDE0ID0gbWVtQWxsb2MuZ2V0KGtleVNsb3Blc0FkZHJlc3MpLAogICAgICAgIHdvcmtlcktleVNsb3Blc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTQud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxNSA9IG1lbUFsbG9jLmdldCh0ZkFkZHJlc3MpLAogICAgICAgIHdvcmtlclRmQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxNS53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfa2V5cyhudW1LdkhlYWRzLCB3aW5kb3dMZW5ndGgsIGhlYWREaW1lbnNpb24sIHdvcmtlcktleXNBZGRyZXNzLCB3b3JrZXJLZXlJbnRlcmNlcHRzQWRkcmVzcywgd29ya2VyS2V5U2xvcGVzQWRkcmVzcywgcG9zaXRpb24sIG4sIHdvcmtlclRmQWRkcmVzcyk7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIGF0dGVudGlvblVwZGF0ZVZhbHVlcyA9IGZ1bmN0aW9uIGF0dGVudGlvblVwZGF0ZVZhbHVlcyhkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczUgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHM1LmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzNS5tZW1BbGxvYzsKICAgICAgdmFyIG51bUt2SGVhZHMgPSBkYXRhLm51bUt2SGVhZHMsCiAgICAgICAgd2luZG93TGVuZ3RoID0gZGF0YS53aW5kb3dMZW5ndGgsCiAgICAgICAgaGVhZERpbWVuc2lvbiA9IGRhdGEuaGVhZERpbWVuc2lvbiwKICAgICAgICB2YWx1ZXNBZGRyZXNzID0gZGF0YS52YWx1ZXNBZGRyZXNzLAogICAgICAgIHZhbHVlSW50ZXJjZXB0c0FkZHJlc3MgPSBkYXRhLnZhbHVlSW50ZXJjZXB0c0FkZHJlc3MsCiAgICAgICAgdmFsdWVTbG9wZXNBZGRyZXNzID0gZGF0YS52YWx1ZVNsb3Blc0FkZHJlc3MsCiAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgIG4gPSBkYXRhLm4sCiAgICAgICAgdGZBZGRyZXNzID0gZGF0YS50ZkFkZHJlc3M7CiAgICAgIHZhciBwdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfdmFsdWVzID0gZXhwb3J0cy5wdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfdmFsdWVzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDE2ID0gbWVtQWxsb2MuZ2V0KHZhbHVlc0FkZHJlc3MpLAogICAgICAgIHdvcmtlclZhbHVlc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTYud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxNyA9IG1lbUFsbG9jLmdldCh2YWx1ZUludGVyY2VwdHNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJWYWx1ZUludGVyY2VwdHNBZGRyZXNzID0gX21lbUFsbG9jJGdldDE3Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0MTggPSBtZW1BbGxvYy5nZXQodmFsdWVTbG9wZXNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJWYWx1ZVNsb3Blc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTgud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxOSA9IG1lbUFsbG9jLmdldCh0ZkFkZHJlc3MpLAogICAgICAgIHdvcmtlclRmQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxOS53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX2F0dGVudGlvbl91cGRhdGVfdmFsdWVzKG51bUt2SGVhZHMsIHdpbmRvd0xlbmd0aCwgaGVhZERpbWVuc2lvbiwgd29ya2VyVmFsdWVzQWRkcmVzcywgd29ya2VyVmFsdWVJbnRlcmNlcHRzQWRkcmVzcywgd29ya2VyVmFsdWVTbG9wZXNBZGRyZXNzLCBwb3NpdGlvbiwgbiwgd29ya2VyVGZBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgYXR0ZW50aW9uVHJhbnNwb3NlUXVlcnkgPSBmdW5jdGlvbiBhdHRlbnRpb25UcmFuc3Bvc2VRdWVyeShkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczYgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHM2LmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzNi5tZW1BbGxvYzsKICAgICAgdmFyIG4gPSBkYXRhLm4sCiAgICAgICAgdGZBZGRyZXNzID0gZGF0YS50ZkFkZHJlc3MsCiAgICAgICAgaGZBZGRyZXNzID0gZGF0YS5oZkFkZHJlc3MsCiAgICAgICAgbnVtSGVhZHMgPSBkYXRhLm51bUhlYWRzLAogICAgICAgIGhlYWREaW1lbnNpb24gPSBkYXRhLmhlYWREaW1lbnNpb247CiAgICAgIHZhciBwdl9waWNvbGxtX2F0dGVudGlvbl90cmFuc3Bvc2VfcXVlcnkgPSBleHBvcnRzLnB2X3BpY29sbG1fYXR0ZW50aW9uX3RyYW5zcG9zZV9xdWVyeTsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQyMCA9IG1lbUFsbG9jLmdldCh0ZkFkZHJlc3MpLAogICAgICAgIHdvcmtlclRmQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyMC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDIxID0gbWVtQWxsb2MuZ2V0KGhmQWRkcmVzcyksCiAgICAgICAgd29ya2VySGZBZGRyZXNzID0gX21lbUFsbG9jJGdldDIxLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHB2X3BpY29sbG1fYXR0ZW50aW9uX3RyYW5zcG9zZV9xdWVyeShuLCB3b3JrZXJUZkFkZHJlc3MsIHdvcmtlckhmQWRkcmVzcywgbnVtSGVhZHMsIGhlYWREaW1lbnNpb24pOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBwdlBpY29sbG1BdHRlbnRpb25BY3Rpb25NYXAgPSBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uLkFUVEVOVElPTl9QUkVDT01QVVRFX0VOQ09ESU5HLCBhdHRlbnRpb25QcmVjb21wdXRlRW5jb2RpbmcpLCBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb24uQVRURU5USU9OX0VOQ09ERSwgYXR0ZW50aW9uRW5jb2RlKSwgUHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uLkFUVEVOVElPTl9BVFRFTkQsIGF0dGVudGlvbkF0dGVuZCksIFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbi5BVFRFTlRJT05fVVBEQVRFX0tFWVMsIGF0dGVudGlvblVwZGF0ZUtleXMpLCBQdlBpY29sbG1BdHRlbnRpb25BY3Rpb24uQVRURU5USU9OX1VQREFURV9WQUxVRVMsIGF0dGVudGlvblVwZGF0ZVZhbHVlcyksIFB2UGljb2xsbUF0dGVudGlvbkFjdGlvbi5BVFRFTlRJT05fVFJBTlNQT1NFX1FVRVJZLCBhdHRlbnRpb25UcmFuc3Bvc2VRdWVyeSk7CgogIC8qIGVzbGludCBjYW1lbGNhc2U6IDAgKi8KICB2YXIgUHZQaWNvbGxtRmVlZEZvcndhcmRBY3Rpb247CiAgKGZ1bmN0aW9uIChQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvbikgewogICAgUHZQaWNvbGxtRmVlZEZvcndhcmRBY3Rpb25bUHZQaWNvbGxtRmVlZEZvcndhcmRBY3Rpb25bIkZFRURfRk9SV0FSRF9TSUxVIl0gPSAzMDBdID0gIkZFRURfRk9SV0FSRF9TSUxVIjsKICAgIFB2UGljb2xsbUZlZWRGb3J3YXJkQWN0aW9uW1B2UGljb2xsbUZlZWRGb3J3YXJkQWN0aW9uWyJGRUVEX0ZPUldBUkRfR0VMVSJdID0gMzAxXSA9ICJGRUVEX0ZPUldBUkRfR0VMVSI7CiAgICBQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvbltQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvblsiRkVFRF9GT1JXQVJEX0FMTU9TVF9HRUxVIl0gPSAzMDJdID0gIkZFRURfRk9SV0FSRF9BTE1PU1RfR0VMVSI7CiAgICBQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvbltQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvblsiRkVFRF9GT1JXQVJEX01VTFRJUExZX0JVRkZFUlMiXSA9IDMwM10gPSAiRkVFRF9GT1JXQVJEX01VTFRJUExZX0JVRkZFUlMiOwogIH0pKFB2UGljb2xsbUZlZWRGb3J3YXJkQWN0aW9uIHx8IChQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvbiA9IHt9KSk7CgogIHZhciBmZWVkRm9yd2FyZFNpbHUgPSBmdW5jdGlvbiBmZWVkRm9yd2FyZFNpbHUoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHMgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMubWVtQWxsb2M7CiAgICAgIHZhciBuID0gZGF0YS5uLAogICAgICAgIHhBZGRyZXNzID0gZGF0YS54QWRkcmVzczsKICAgICAgdmFyIHB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX3NpbHUgPSBleHBvcnRzLnB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX3NpbHU7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0ID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV9mZWVkX2ZvcndhcmRfc2lsdShuLCB3b3JrZXJYQWRkcmVzcyk7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIGZlZWRGb3J3YXJkR2VsdSA9IGZ1bmN0aW9uIGZlZWRGb3J3YXJkR2VsdShkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczIgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMyLmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzMi5tZW1BbGxvYzsKICAgICAgdmFyIG4gPSBkYXRhLm4sCiAgICAgICAgeEFkZHJlc3MgPSBkYXRhLnhBZGRyZXNzOwogICAgICB2YXIgcHZfcGljb2xsbV9mZWVkX2ZvcndhcmRfZ2VsdSA9IGV4cG9ydHMucHZfcGljb2xsbV9mZWVkX2ZvcndhcmRfZ2VsdTsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX2dlbHUobiwgd29ya2VyWEFkZHJlc3MpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBmZWVkRm9yd2FyZEFsbW9zdEdlbHUgPSBmdW5jdGlvbiBmZWVkRm9yd2FyZEFsbW9zdEdlbHUoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHMzID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzMy5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFsczMubWVtQWxsb2M7CiAgICAgIHZhciBuID0gZGF0YS5uLAogICAgICAgIHhBZGRyZXNzID0gZGF0YS54QWRkcmVzczsKICAgICAgdmFyIHB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX2FsbW9zdF9nZWx1ID0gZXhwb3J0cy5wdl9waWNvbGxtX2ZlZWRfZm9yd2FyZF9hbG1vc3RfZ2VsdTsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQzID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQzLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX2FsbW9zdF9nZWx1KG4sIHdvcmtlclhBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgZmVlZEZvcndhcmRNdWx0aXBseUJ1ZmZlcnMgPSBmdW5jdGlvbiBmZWVkRm9yd2FyZE11bHRpcGx5QnVmZmVycyhkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczQgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHM0LmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzNC5tZW1BbGxvYzsKICAgICAgdmFyIG4gPSBkYXRhLm4sCiAgICAgICAgeEFkZHJlc3MgPSBkYXRhLnhBZGRyZXNzLAogICAgICAgIHlBZGRyZXNzID0gZGF0YS55QWRkcmVzczsKICAgICAgdmFyIHB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX211bHRpcGx5X2J1ZmZlcnMgPSBleHBvcnRzLnB2X3BpY29sbG1fZmVlZF9mb3J3YXJkX211bHRpcGx5X2J1ZmZlcnM7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NCA9IG1lbUFsbG9jLmdldCh4QWRkcmVzcyksCiAgICAgICAgd29ya2VyWEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDUgPSBtZW1BbGxvYy5nZXQoeUFkZHJlc3MpLAogICAgICAgIHdvcmtlcllBZGRyZXNzID0gX21lbUFsbG9jJGdldDUud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV9mZWVkX2ZvcndhcmRfbXVsdGlwbHlfYnVmZmVycyhuLCB3b3JrZXJYQWRkcmVzcywgd29ya2VyWUFkZHJlc3MpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBwdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvbk1hcCA9IF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtRmVlZEZvcndhcmRBY3Rpb24uRkVFRF9GT1JXQVJEX1NJTFUsIGZlZWRGb3J3YXJkU2lsdSksIFB2UGljb2xsbUZlZWRGb3J3YXJkQWN0aW9uLkZFRURfRk9SV0FSRF9HRUxVLCBmZWVkRm9yd2FyZEdlbHUpLCBQdlBpY29sbG1GZWVkRm9yd2FyZEFjdGlvbi5GRUVEX0ZPUldBUkRfQUxNT1NUX0dFTFUsIGZlZWRGb3J3YXJkQWxtb3N0R2VsdSksIFB2UGljb2xsbUZlZWRGb3J3YXJkQWN0aW9uLkZFRURfRk9SV0FSRF9NVUxUSVBMWV9CVUZGRVJTLCBmZWVkRm9yd2FyZE11bHRpcGx5QnVmZmVycyk7CgogIC8qIGVzbGludCBjYW1lbGNhc2U6IDAgKi8KICB2YXIgUHZQaWNvbGxtR2F0ZUFjdGlvbjsKICAoZnVuY3Rpb24gKFB2UGljb2xsbUdhdGVBY3Rpb24pIHsKICAgIFB2UGljb2xsbUdhdGVBY3Rpb25bUHZQaWNvbGxtR2F0ZUFjdGlvblsiR0FURV9GT1JXQVJEIl0gPSA0MDBdID0gIkdBVEVfRk9SV0FSRCI7CiAgfSkoUHZQaWNvbGxtR2F0ZUFjdGlvbiB8fCAoUHZQaWNvbGxtR2F0ZUFjdGlvbiA9IHt9KSk7CgogIHZhciBnYXRlRm9yd2FyZCA9IGZ1bmN0aW9uIGdhdGVGb3J3YXJkKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzLmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzLm1lbUFsbG9jOwogICAgICB2YXIgbiA9IGRhdGEubiwKICAgICAgICBrID0gZGF0YS5rLAogICAgICAgIG51bUV4cGVydHMgPSBkYXRhLm51bUV4cGVydHMsCiAgICAgICAgaW5kaWNlc0FkZHJlc3MgPSBkYXRhLmluZGljZXNBZGRyZXNzLAogICAgICAgIHdlaWdodHNBZGRyZXNzID0gZGF0YS53ZWlnaHRzQWRkcmVzcywKICAgICAgICB5QWRkcmVzcyA9IGRhdGEueUFkZHJlc3M7CiAgICAgIHZhciBwdl9waWNvbGxtX2dhdGVfZm9yd2FyZCA9IGV4cG9ydHMucHZfcGljb2xsbV9nYXRlX2ZvcndhcmQ7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0ID0gbWVtQWxsb2MuZ2V0KGluZGljZXNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJJbmRpY2VzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KHdlaWdodHNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJXZWlnaHRzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldCh5QWRkcmVzcyksCiAgICAgICAgd29ya2VyWUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0My53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX2dhdGVfZm9yd2FyZChuLCBrLCBudW1FeHBlcnRzLCB3b3JrZXJJbmRpY2VzQWRkcmVzcywgd29ya2VyV2VpZ2h0c0FkZHJlc3MsIHdvcmtlcllBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgcHZQaWNvbGxtR2F0ZUFjdGlvbk1hcCA9IF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtR2F0ZUFjdGlvbi5HQVRFX0ZPUldBUkQsIGdhdGVGb3J3YXJkKTsKCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCAqLwogIHZhciBQdlBpY29sbG1Nb2VUcmFuc2Zvcm1lckFjdGlvbjsKICAoZnVuY3Rpb24gKFB2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uKSB7CiAgICBQdlBpY29sbG1Nb2VUcmFuc2Zvcm1lckFjdGlvbltQdlBpY29sbG1Nb2VUcmFuc2Zvcm1lckFjdGlvblsiQUREX1RPX0JVRkZFUiJdID0gNTAwXSA9ICJBRERfVE9fQlVGRkVSIjsKICAgIFB2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uW1B2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uWyJNVUxUSVBMWV9XRUlHSFRfQU5EX0FERF9UT19CVUZGRVIiXSA9IDUwMV0gPSAiTVVMVElQTFlfV0VJR0hUX0FORF9BRERfVE9fQlVGRkVSIjsKICAgIFB2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uW1B2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uWyJBRERfQlVGRkVSUyJdID0gNTAyXSA9ICJBRERfQlVGRkVSUyI7CiAgfSkoUHZQaWNvbGxtTW9lVHJhbnNmb3JtZXJBY3Rpb24gfHwgKFB2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uID0ge30pKTsKCiAgdmFyIG1vZVRyYW5zZm9ybWVyQWRkVG9CdWZmZXIgPSBmdW5jdGlvbiBtb2VUcmFuc2Zvcm1lckFkZFRvQnVmZmVyKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzLmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzLm1lbUFsbG9jOwogICAgICB2YXIgbiA9IGRhdGEubiwKICAgICAgICB4QWRkcmVzcyA9IGRhdGEueEFkZHJlc3MsCiAgICAgICAgYnVmZmVyQWRkcmVzcyA9IGRhdGEuYnVmZmVyQWRkcmVzczsKICAgICAgdmFyIHB2X3BpY29sbG1fbW9lX3RyYW5zZm9ybWVyX2FkZF90b19idWZmZXIgPSBleHBvcnRzLnB2X3BpY29sbG1fbW9lX3RyYW5zZm9ybWVyX2FkZF90b19idWZmZXI7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0ID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KGJ1ZmZlckFkZHJlc3MpLAogICAgICAgIHdvcmtlckJ1ZmZlckFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Mi53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX21vZV90cmFuc2Zvcm1lcl9hZGRfdG9fYnVmZmVyKG4sIHdvcmtlclhBZGRyZXNzLCB3b3JrZXJCdWZmZXJBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgbW9lVHJhbnNmb3JtZXJNdWx0aXBseVdlaWdodEFuZEFkZFRvQnVmZmVyID0gZnVuY3Rpb24gbW9lVHJhbnNmb3JtZXJNdWx0aXBseVdlaWdodEFuZEFkZFRvQnVmZmVyKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzMiA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczIuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMyLm1lbUFsbG9jOwogICAgICB2YXIgbiA9IGRhdGEubiwKICAgICAgICB3ZWlnaHRzSW5kZXggPSBkYXRhLndlaWdodHNJbmRleCwKICAgICAgICB5SW5kZXggPSBkYXRhLnlJbmRleCwKICAgICAgICB3ZWlnaHRzQWRkcmVzcyA9IGRhdGEud2VpZ2h0c0FkZHJlc3MsCiAgICAgICAgeEFkZHJlc3MgPSBkYXRhLnhBZGRyZXNzLAogICAgICAgIHlBZGRyZXNzID0gZGF0YS55QWRkcmVzczsKICAgICAgdmFyIHB2X3BpY29sbG1fbW9lX3RyYW5zZm9ybWVyX211bHRpcGx5X3dlaWdodF9hbmRfYWRkX3RvX2J1ZmZlciA9IGV4cG9ydHMucHZfcGljb2xsbV9tb2VfdHJhbnNmb3JtZXJfbXVsdGlwbHlfd2VpZ2h0X2FuZF9hZGRfdG9fYnVmZmVyOwogICAgICB2YXIgX21lbUFsbG9jJGdldDMgPSBtZW1BbGxvYy5nZXQod2VpZ2h0c0FkZHJlc3MpLAogICAgICAgIHdvcmtlcldlaWdodHNBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ0ID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ0Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NSA9IG1lbUFsbG9jLmdldCh5QWRkcmVzcyksCiAgICAgICAgd29ya2VyWUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NS53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX21vZV90cmFuc2Zvcm1lcl9tdWx0aXBseV93ZWlnaHRfYW5kX2FkZF90b19idWZmZXIobiwgd2VpZ2h0c0luZGV4LCB5SW5kZXgsIHdvcmtlcldlaWdodHNBZGRyZXNzLCB3b3JrZXJYQWRkcmVzcywgd29ya2VyWUFkZHJlc3MpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBtb2VUcmFuc2Zvcm1lckFkZEJ1ZmZlcnMgPSBmdW5jdGlvbiBtb2VUcmFuc2Zvcm1lckFkZEJ1ZmZlcnMoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHMzID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzMy5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFsczMubWVtQWxsb2M7CiAgICAgIHZhciBuID0gZGF0YS5uLAogICAgICAgIGJ1ZmZlcjFBZGRyZXNzID0gZGF0YS5idWZmZXIxQWRkcmVzcywKICAgICAgICBidWZmZXIyQWRkcmVzcyA9IGRhdGEuYnVmZmVyMkFkZHJlc3MsCiAgICAgICAgeUFkZHJlc3MgPSBkYXRhLnlBZGRyZXNzOwogICAgICB2YXIgcHZfcGljb2xsbV9tb2VfdHJhbnNmb3JtZXJfYWRkX2J1ZmZlcnMgPSBleHBvcnRzLnB2X3BpY29sbG1fbW9lX3RyYW5zZm9ybWVyX2FkZF9idWZmZXJzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDYgPSBtZW1BbGxvYy5nZXQoYnVmZmVyMUFkZHJlc3MpLAogICAgICAgIHdvcmtlckJ1ZmZlcjFBZGRyZXNzID0gX21lbUFsbG9jJGdldDYud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ3ID0gbWVtQWxsb2MuZ2V0KGJ1ZmZlcjJBZGRyZXNzKSwKICAgICAgICB3b3JrZXJCdWZmZXIyQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ3Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0OCA9IG1lbUFsbG9jLmdldCh5QWRkcmVzcyksCiAgICAgICAgd29ya2VyWUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0OC53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX21vZV90cmFuc2Zvcm1lcl9hZGRfYnVmZmVycyhuLCB3b3JrZXJCdWZmZXIxQWRkcmVzcywgd29ya2VyQnVmZmVyMkFkZHJlc3MsIHdvcmtlcllBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgcHZQaWNvbGxtTW9lVHJhbnNmb3JtZXJBY3Rpb25NYXAgPSBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtTW9lVHJhbnNmb3JtZXJBY3Rpb24uQUREX1RPX0JVRkZFUiwgbW9lVHJhbnNmb3JtZXJBZGRUb0J1ZmZlciksIFB2UGljb2xsbU1vZVRyYW5zZm9ybWVyQWN0aW9uLk1VTFRJUExZX1dFSUdIVF9BTkRfQUREX1RPX0JVRkZFUiwgbW9lVHJhbnNmb3JtZXJNdWx0aXBseVdlaWdodEFuZEFkZFRvQnVmZmVyKSwgUHZQaWNvbGxtTW9lVHJhbnNmb3JtZXJBY3Rpb24uQUREX0JVRkZFUlMsIG1vZVRyYW5zZm9ybWVyQWRkQnVmZmVycyk7CgogIC8qIGVzbGludCBjYW1lbGNhc2U6IDAgKi8KICB2YXIgUHZQaWNvbGxtVHJhbnNmb3JtZXJBY3Rpb247CiAgKGZ1bmN0aW9uIChQdlBpY29sbG1UcmFuc2Zvcm1lckFjdGlvbikgewogICAgUHZQaWNvbGxtVHJhbnNmb3JtZXJBY3Rpb25bUHZQaWNvbGxtVHJhbnNmb3JtZXJBY3Rpb25bIkFERF9UT19CVUZGRVIiXSA9IDcwMF0gPSAiQUREX1RPX0JVRkZFUiI7CiAgICBQdlBpY29sbG1UcmFuc2Zvcm1lckFjdGlvbltQdlBpY29sbG1UcmFuc2Zvcm1lckFjdGlvblsiQUREX0JVRkZFUlMiXSA9IDcwMV0gPSAiQUREX0JVRkZFUlMiOwogIH0pKFB2UGljb2xsbVRyYW5zZm9ybWVyQWN0aW9uIHx8IChQdlBpY29sbG1UcmFuc2Zvcm1lckFjdGlvbiA9IHt9KSk7CgogIHZhciB0cmFuc2Zvcm1lckFkZFRvQnVmZmVyID0gZnVuY3Rpb24gdHJhbnNmb3JtZXJBZGRUb0J1ZmZlcihkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFscyA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFscy5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFscy5tZW1BbGxvYzsKICAgICAgdmFyIG4gPSBkYXRhLm4sCiAgICAgICAgeEFkZHJlc3MgPSBkYXRhLnhBZGRyZXNzLAogICAgICAgIGJ1ZmZlckFkZHJlc3MgPSBkYXRhLmJ1ZmZlckFkZHJlc3M7CiAgICAgIHZhciBwdl9waWNvbGxtX3RyYW5zZm9ybWVyX2FkZF90b19idWZmZXIgPSBleHBvcnRzLnB2X3BpY29sbG1fdHJhbnNmb3JtZXJfYWRkX3RvX2J1ZmZlcjsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQgPSBtZW1BbGxvYy5nZXQoeEFkZHJlc3MpLAogICAgICAgIHdvcmtlclhBZGRyZXNzID0gX21lbUFsbG9jJGdldC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDIgPSBtZW1BbGxvYy5nZXQoYnVmZmVyQWRkcmVzcyksCiAgICAgICAgd29ya2VyQnVmZmVyQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHB2X3BpY29sbG1fdHJhbnNmb3JtZXJfYWRkX3RvX2J1ZmZlcihuLCB3b3JrZXJYQWRkcmVzcywgd29ya2VyQnVmZmVyQWRkcmVzcyk7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIHRyYW5zZm9ybWVyQWRkQnVmZmVycyA9IGZ1bmN0aW9uIHRyYW5zZm9ybWVyQWRkQnVmZmVycyhkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFsczIgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMyLmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzMi5tZW1BbGxvYzsKICAgICAgdmFyIG4gPSBkYXRhLm4sCiAgICAgICAgYnVmZmVyMUFkZHJlc3MgPSBkYXRhLmJ1ZmZlcjFBZGRyZXNzLAogICAgICAgIGJ1ZmZlcjJBZGRyZXNzID0gZGF0YS5idWZmZXIyQWRkcmVzcywKICAgICAgICB5QWRkcmVzcyA9IGRhdGEueUFkZHJlc3M7CiAgICAgIHZhciBwdl9waWNvbGxtX3RyYW5zZm9ybWVyX2FkZF9idWZmZXJzID0gZXhwb3J0cy5wdl9waWNvbGxtX3RyYW5zZm9ybWVyX2FkZF9idWZmZXJzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDMgPSBtZW1BbGxvYy5nZXQoYnVmZmVyMUFkZHJlc3MpLAogICAgICAgIHdvcmtlckJ1ZmZlcjFBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ0ID0gbWVtQWxsb2MuZ2V0KGJ1ZmZlcjJBZGRyZXNzKSwKICAgICAgICB3b3JrZXJCdWZmZXIyQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ0Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0NSA9IG1lbUFsbG9jLmdldCh5QWRkcmVzcyksCiAgICAgICAgd29ya2VyWUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NS53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX3RyYW5zZm9ybWVyX2FkZF9idWZmZXJzKG4sIHdvcmtlckJ1ZmZlcjFBZGRyZXNzLCB3b3JrZXJCdWZmZXIyQWRkcmVzcywgd29ya2VyWUFkZHJlc3MpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBwdlBpY29sbG1UcmFuc2Zvcm1lckFjdGlvbk1hcCA9IF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFB2UGljb2xsbVRyYW5zZm9ybWVyQWN0aW9uLkFERF9UT19CVUZGRVIsIHRyYW5zZm9ybWVyQWRkVG9CdWZmZXIpLCBQdlBpY29sbG1UcmFuc2Zvcm1lckFjdGlvbi5BRERfQlVGRkVSUywgdHJhbnNmb3JtZXJBZGRCdWZmZXJzKTsKCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCAqLwogIHZhciBQdlBpY29sbG1Ob3JtQWN0aW9uOwogIChmdW5jdGlvbiAoUHZQaWNvbGxtTm9ybUFjdGlvbikgewogICAgUHZQaWNvbGxtTm9ybUFjdGlvbltQdlBpY29sbG1Ob3JtQWN0aW9uWyJOT1JNX0ZPUldBUkQiXSA9IDYwMF0gPSAiTk9STV9GT1JXQVJEIjsKICB9KShQdlBpY29sbG1Ob3JtQWN0aW9uIHx8IChQdlBpY29sbG1Ob3JtQWN0aW9uID0ge30pKTsKCiAgdmFyIG5vcm1Gb3J3YXJkID0gZnVuY3Rpb24gbm9ybUZvcndhcmQoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHMgPSBkYXRhLmdsb2JhbHMsCiAgICAgICAgZXhwb3J0cyA9IF9kYXRhJGdsb2JhbHMuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMubWVtQWxsb2M7CiAgICAgIHZhciBkaW1lbnNpb24gPSBkYXRhLmRpbWVuc2lvbiwKICAgICAgICBlcHMgPSBkYXRhLmVwcywKICAgICAgICB3ZWlnaHRBZGRyZXNzID0gZGF0YS53ZWlnaHRBZGRyZXNzLAogICAgICAgIG4gPSBkYXRhLm4sCiAgICAgICAgeE9mZnNldCA9IGRhdGEueE9mZnNldCwKICAgICAgICB4QWRkcmVzcyA9IGRhdGEueEFkZHJlc3MsCiAgICAgICAgeU9mZnNldCA9IGRhdGEueU9mZnNldCwKICAgICAgICB5QWRkcmVzcyA9IGRhdGEueUFkZHJlc3M7CiAgICAgIHZhciBwdl9waWNvbGxtX25vcm1fZm9yd2FyZCA9IGV4cG9ydHMucHZfcGljb2xsbV9ub3JtX2ZvcndhcmQ7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0ID0gbWVtQWxsb2MuZ2V0KHdlaWdodEFkZHJlc3MpLAogICAgICAgIHdvcmtlcldlaWdodEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0MiA9IG1lbUFsbG9jLmdldCh4QWRkcmVzcyksCiAgICAgICAgd29ya2VyWEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0Mi53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDMgPSBtZW1BbGxvYy5nZXQoeUFkZHJlc3MpLAogICAgICAgIHdvcmtlcllBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV9ub3JtX2ZvcndhcmQoZGltZW5zaW9uLCBlcHMsIHdvcmtlcldlaWdodEFkZHJlc3MsIG4sIHdvcmtlclhBZGRyZXNzICsgeE9mZnNldCwgd29ya2VyWUFkZHJlc3MgKyB5T2Zmc2V0KTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgcHZQaWNvbGxtTm9ybUFjdGlvbk1hcCA9IF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtTm9ybUFjdGlvbi5OT1JNX0ZPUldBUkQsIG5vcm1Gb3J3YXJkKTsKCiAgLyogZXNsaW50IGNhbWVsY2FzZTogMCAqLwogIHZhciBQdlBpY29sbG1Ob3JtTGF5ZXJBY3Rpb247CiAgKGZ1bmN0aW9uIChQdlBpY29sbG1Ob3JtTGF5ZXJBY3Rpb24pIHsKICAgIFB2UGljb2xsbU5vcm1MYXllckFjdGlvbltQdlBpY29sbG1Ob3JtTGF5ZXJBY3Rpb25bIk5PUk1fTEFZRVJfRk9SV0FSRCJdID0gODAwXSA9ICJOT1JNX0xBWUVSX0ZPUldBUkQiOwogIH0pKFB2UGljb2xsbU5vcm1MYXllckFjdGlvbiB8fCAoUHZQaWNvbGxtTm9ybUxheWVyQWN0aW9uID0ge30pKTsKCiAgdmFyIG5vcm1MYXllckZvcndhcmQgPSBmdW5jdGlvbiBub3JtTGF5ZXJGb3J3YXJkKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzLmV4cG9ydHMsCiAgICAgICAgbWVtQWxsb2MgPSBfZGF0YSRnbG9iYWxzLm1lbUFsbG9jOwogICAgICB2YXIgZGltZW5zaW9uID0gZGF0YS5kaW1lbnNpb24sCiAgICAgICAgZXBzID0gZGF0YS5lcHMsCiAgICAgICAgd2VpZ2h0QWRkcmVzcyA9IGRhdGEud2VpZ2h0QWRkcmVzcywKICAgICAgICBiaWFzQWRkcmVzcyA9IGRhdGEuYmlhc0FkZHJlc3MsCiAgICAgICAgbiA9IGRhdGEubiwKICAgICAgICB4T2Zmc2V0ID0gZGF0YS54T2Zmc2V0LAogICAgICAgIHhBZGRyZXNzID0gZGF0YS54QWRkcmVzcywKICAgICAgICB5T2Zmc2V0ID0gZGF0YS55T2Zmc2V0LAogICAgICAgIHlBZGRyZXNzID0gZGF0YS55QWRkcmVzczsKICAgICAgdmFyIHB2X3BpY29sbG1fbm9ybV9sYXllcl9mb3J3YXJkID0gZXhwb3J0cy5wdl9waWNvbGxtX25vcm1fbGF5ZXJfZm9yd2FyZDsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQgPSBtZW1BbGxvYy5nZXQod2VpZ2h0QWRkcmVzcyksCiAgICAgICAgd29ya2VyV2VpZ2h0QWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQyID0gbWVtQWxsb2MuZ2V0KGJpYXNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJCaWFzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQyLndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBfbWVtQWxsb2MkZ2V0MyA9IG1lbUFsbG9jLmdldCh4QWRkcmVzcyksCiAgICAgICAgd29ya2VyWEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0My53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDQgPSBtZW1BbGxvYy5nZXQoeUFkZHJlc3MpLAogICAgICAgIHdvcmtlcllBZGRyZXNzID0gX21lbUFsbG9jJGdldDQud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV9ub3JtX2xheWVyX2ZvcndhcmQoZGltZW5zaW9uLCBlcHMsIHdvcmtlcldlaWdodEFkZHJlc3MsIHdvcmtlckJpYXNBZGRyZXNzLCBuLCB3b3JrZXJYQWRkcmVzcyArIHhPZmZzZXQsIHdvcmtlcllBZGRyZXNzICsgeU9mZnNldCk7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIHB2UGljb2xsbU5vcm1MYXllckFjdGlvbk1hcCA9IF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtTm9ybUxheWVyQWN0aW9uLk5PUk1fTEFZRVJfRk9SV0FSRCwgbm9ybUxheWVyRm9yd2FyZCk7CgogIC8qIGVzbGludCBjYW1lbGNhc2U6IDAgKi8KICB2YXIgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uOwogIChmdW5jdGlvbiAoUHZQaWNvbGxtV2VpZ2h0QWN0aW9uKSB7CiAgICBQdlBpY29sbG1XZWlnaHRBY3Rpb25bUHZQaWNvbGxtV2VpZ2h0QWN0aW9uWyJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9QUkVQUk9DRVNTX0JMT0NLUyJdID0gMTAwXSA9ICJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9QUkVQUk9DRVNTX0JMT0NLUyI7CiAgICBQdlBpY29sbG1XZWlnaHRBY3Rpb25bUHZQaWNvbGxtV2VpZ2h0QWN0aW9uWyJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9GT1JXQVJEX1NJTkdMRSJdID0gMTAxXSA9ICJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9GT1JXQVJEX1NJTkdMRSI7CiAgICBQdlBpY29sbG1XZWlnaHRBY3Rpb25bUHZQaWNvbGxtV2VpZ2h0QWN0aW9uWyJXRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9GT1JXQVJEX01VTFRJUExFIl0gPSAxMDJdID0gIldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X0ZPUldBUkRfTVVMVElQTEUiOwogICAgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uW1B2UGljb2xsbVdlaWdodEFjdGlvblsiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfQUREX0JJQVMiXSA9IDEwM10gPSAiV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfQUREX0JJQVMiOwogICAgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uW1B2UGljb2xsbVdlaWdodEFjdGlvblsiV0VJR0hUX0ZMT0FUX0ZPUldBUkQiXSA9IDEwNF0gPSAiV0VJR0hUX0ZMT0FUX0ZPUldBUkQiOwogIH0pKFB2UGljb2xsbVdlaWdodEFjdGlvbiB8fCAoUHZQaWNvbGxtV2VpZ2h0QWN0aW9uID0ge30pKTsKCiAgdmFyIHdlaWdodEJsb2NrTWl4ZWQxNng4UHJlcHJvY2Vzc0Jsb2NrcyA9IGZ1bmN0aW9uIHdlaWdodEJsb2NrTWl4ZWQxNng4UHJlcHJvY2Vzc0Jsb2NrcyhkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgX2RhdGEkZ2xvYmFscyA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFscy5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFscy5tZW1BbGxvYywKICAgICAgICBtZW1vcnkgPSBfZGF0YSRnbG9iYWxzLm1lbW9yeTsKICAgICAgdmFyIHNoYXBlID0gZGF0YS5zaGFwZSwKICAgICAgICBiaXREZXB0aHMgPSBkYXRhLmJpdERlcHRocywKICAgICAgICBiaXREZXB0aFN0YXJ0cyA9IGRhdGEuYml0RGVwdGhTdGFydHMsCiAgICAgICAgYmxvY2tzQWRkcmVzcyA9IGRhdGEuYmxvY2tzQWRkcmVzczsKICAgICAgdmFyIGFsaWduZWRfYWxsb2MgPSBleHBvcnRzLmFsaWduZWRfYWxsb2MsCiAgICAgICAgZnJlZSA9IGV4cG9ydHMuZnJlZSwKICAgICAgICBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X3ByZXByb2Nlc3NfYmxvY2tzID0gZXhwb3J0cy5wdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X3ByZXByb2Nlc3NfYmxvY2tzOwogICAgICBpZiAoIW1lbUFsbG9jLmhhcyhibG9ja3NBZGRyZXNzKSkgewogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgY29tbWFuZDogJ29rJwogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgX21lbUFsbG9jJGdldCA9IG1lbUFsbG9jLmdldChibG9ja3NBZGRyZXNzKSwKICAgICAgICB3b3JrZXJCbG9ja3NBZGRyZXNzID0gX21lbUFsbG9jJGdldC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgc2hhcGVBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogc2hhcGUubGVuZ3RoKTsKICAgICAgdmFyIGJpdERlcHRoc0FkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBiaXREZXB0aHMubGVuZ3RoKTsKICAgICAgdmFyIGJpdERlcHRoc1N0YXJ0QWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIGJpdERlcHRoU3RhcnRzLmxlbmd0aCk7CiAgICAgIHZhciBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoc2hhcGUsIHNoYXBlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoYml0RGVwdGhzLCBiaXREZXB0aHNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChiaXREZXB0aFN0YXJ0cywgYml0RGVwdGhzU3RhcnRBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfcHJlcHJvY2Vzc19ibG9ja3Moc2hhcGVBZGRyZXNzLCBiaXREZXB0aHMubGVuZ3RoLCBiaXREZXB0aHNBZGRyZXNzLCBiaXREZXB0aHNTdGFydEFkZHJlc3MsIHdvcmtlckJsb2Nrc0FkZHJlc3MpOwogICAgICBmcmVlKHNoYXBlQWRkcmVzcyk7CiAgICAgIGZyZWUoYml0RGVwdGhzQWRkcmVzcyk7CiAgICAgIGZyZWUoYml0RGVwdGhzU3RhcnRBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgd2VpZ2h0QmxvY2tNaXhlZDE2eDhGb3J3YXJkU2luZ2xlID0gZnVuY3Rpb24gd2VpZ2h0QmxvY2tNaXhlZDE2eDhGb3J3YXJkU2luZ2xlKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzMiA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczIuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMyLm1lbUFsbG9jLAogICAgICAgIG1lbW9yeSA9IF9kYXRhJGdsb2JhbHMyLm1lbW9yeTsKICAgICAgdmFyIHNoYXBlID0gZGF0YS5zaGFwZSwKICAgICAgICBpbmRpY2VzQWRkcmVzcyA9IGRhdGEuaW5kaWNlc0FkZHJlc3MsCiAgICAgICAgYml0RGVwdGhTdGFydHMgPSBkYXRhLmJpdERlcHRoU3RhcnRzLAogICAgICAgIGJpdERlcHRocyA9IGRhdGEuYml0RGVwdGhzLAogICAgICAgIG1ldGFzQWRkcmVzcyA9IGRhdGEubWV0YXNBZGRyZXNzLAogICAgICAgIGJsb2Nrc0FkZHJlc3MgPSBkYXRhLmJsb2Nrc0FkZHJlc3MsCiAgICAgICAgeE9mZnNldCA9IGRhdGEueE9mZnNldCwKICAgICAgICB4QWRkcmVzcyA9IGRhdGEueEFkZHJlc3MsCiAgICAgICAgeUFkZHJlc3MgPSBkYXRhLnlBZGRyZXNzOwogICAgICB2YXIgYWxpZ25lZF9hbGxvYyA9IGV4cG9ydHMuYWxpZ25lZF9hbGxvYywKICAgICAgICBmcmVlID0gZXhwb3J0cy5mcmVlLAogICAgICAgIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfZm9yd2FyZF9zaW5nbGUgPSBleHBvcnRzLnB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfZm9yd2FyZF9zaW5nbGU7CiAgICAgIGlmICghbWVtQWxsb2MuaGFzKG1ldGFzQWRkcmVzcykgfHwgIW1lbUFsbG9jLmhhcyhibG9ja3NBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKHhBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKHlBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKGluZGljZXNBZGRyZXNzKSkgewogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgY29tbWFuZDogJ29rJwogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgX21lbUFsbG9jJGdldDIgPSBtZW1BbGxvYy5nZXQoaW5kaWNlc0FkZHJlc3MpLAogICAgICAgIHdvcmtlckluZGljZXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDIud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQzID0gbWVtQWxsb2MuZ2V0KG1ldGFzQWRkcmVzcyksCiAgICAgICAgd29ya2VyTWV0YXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ0ID0gbWVtQWxsb2MuZ2V0KGJsb2Nrc0FkZHJlc3MpLAogICAgICAgIHdvcmtlckJsb2Nrc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0NC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDUgPSBtZW1BbGxvYy5nZXQoeEFkZHJlc3MpLAogICAgICAgIHdvcmtlclhBZGRyZXNzID0gX21lbUFsbG9jJGdldDUud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ2ID0gbWVtQWxsb2MuZ2V0KHlBZGRyZXNzKSwKICAgICAgICB3b3JrZXJZQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQ2Lndvcmtlck1lbUFkZHJlc3M7CiAgICAgIHZhciBzaGFwZUFkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBzaGFwZS5sZW5ndGgpOwogICAgICB2YXIgYml0RGVwdGhzU3RhcnRBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogYml0RGVwdGhTdGFydHMubGVuZ3RoKTsKICAgICAgdmFyIGJpdERlcHRoc0FkZHJlc3MgPSBhbGlnbmVkX2FsbG9jKEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiBiaXREZXB0aHMubGVuZ3RoKTsKICAgICAgdmFyIG1lbW9yeUJ1ZmZlckludDMyID0gbmV3IEludDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChzaGFwZSwgc2hhcGVBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChiaXREZXB0aFN0YXJ0cywgYml0RGVwdGhzU3RhcnRBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgIG1lbW9yeUJ1ZmZlckludDMyLnNldChiaXREZXB0aHMsIGJpdERlcHRoc0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9mb3J3YXJkX3NpbmdsZShzaGFwZUFkZHJlc3MsIHdvcmtlckluZGljZXNBZGRyZXNzLCBiaXREZXB0aHMubGVuZ3RoLCBiaXREZXB0aHNTdGFydEFkZHJlc3MsIGJpdERlcHRoc0FkZHJlc3MsIHdvcmtlck1ldGFzQWRkcmVzcywgd29ya2VyQmxvY2tzQWRkcmVzcywgd29ya2VyWEFkZHJlc3MgKyB4T2Zmc2V0LCB3b3JrZXJZQWRkcmVzcyk7CiAgICAgIGZyZWUoc2hhcGVBZGRyZXNzKTsKICAgICAgZnJlZShiaXREZXB0aHNTdGFydEFkZHJlc3MpOwogICAgICBmcmVlKGJpdERlcHRoc0FkZHJlc3MpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciB3ZWlnaHRCbG9ja01peGVkMTZ4OEZvcndhcmRNdWx0aXBsZSA9IGZ1bmN0aW9uIHdlaWdodEJsb2NrTWl4ZWQxNng4Rm9yd2FyZE11bHRpcGxlKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzMyA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczMuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHMzLm1lbUFsbG9jLAogICAgICAgIG1lbW9yeSA9IF9kYXRhJGdsb2JhbHMzLm1lbW9yeTsKICAgICAgdmFyIHNoYXBlID0gZGF0YS5zaGFwZSwKICAgICAgICBpbmRpY2VzQWRkcmVzcyA9IGRhdGEuaW5kaWNlc0FkZHJlc3MsCiAgICAgICAgYml0RGVwdGhTdGFydHMgPSBkYXRhLmJpdERlcHRoU3RhcnRzLAogICAgICAgIGJpdERlcHRocyA9IGRhdGEuYml0RGVwdGhzLAogICAgICAgIG1ldGFzQWRkcmVzcyA9IGRhdGEubWV0YXNBZGRyZXNzLAogICAgICAgIGJsb2Nrc0FkZHJlc3MgPSBkYXRhLmJsb2Nrc0FkZHJlc3MsCiAgICAgICAgbiA9IGRhdGEubiwKICAgICAgICB4T2Zmc2V0ID0gZGF0YS54T2Zmc2V0LAogICAgICAgIHhBZGRyZXNzID0gZGF0YS54QWRkcmVzcywKICAgICAgICB5QWRkcmVzcyA9IGRhdGEueUFkZHJlc3M7CiAgICAgIHZhciBhbGlnbmVkX2FsbG9jID0gZXhwb3J0cy5hbGlnbmVkX2FsbG9jLAogICAgICAgIGZyZWUgPSBleHBvcnRzLmZyZWUsCiAgICAgICAgcHZfcGljb2xsbV93ZWlnaHRfYmxvY2tfbWl4ZWRfMTZ4OF9mb3J3YXJkX211bHRpcGxlID0gZXhwb3J0cy5wdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2ZvcndhcmRfbXVsdGlwbGU7CiAgICAgIGlmICghbWVtQWxsb2MuaGFzKG1ldGFzQWRkcmVzcykgfHwgIW1lbUFsbG9jLmhhcyhibG9ja3NBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKHhBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKHlBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKGluZGljZXNBZGRyZXNzKSkgewogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgY29tbWFuZDogJ29rJwogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgX21lbUFsbG9jJGdldDcgPSBtZW1BbGxvYy5nZXQoaW5kaWNlc0FkZHJlc3MpLAogICAgICAgIHdvcmtlckluZGljZXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDcud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ4ID0gbWVtQWxsb2MuZ2V0KG1ldGFzQWRkcmVzcyksCiAgICAgICAgd29ya2VyTWV0YXNBZGRyZXNzID0gX21lbUFsbG9jJGdldDgud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQ5ID0gbWVtQWxsb2MuZ2V0KGJsb2Nrc0FkZHJlc3MpLAogICAgICAgIHdvcmtlckJsb2Nrc0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0OS53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDEwID0gbWVtQWxsb2MuZ2V0KHhBZGRyZXNzKSwKICAgICAgICB3b3JrZXJYQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMC53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDExID0gbWVtQWxsb2MuZ2V0KHlBZGRyZXNzKSwKICAgICAgICB3b3JrZXJZQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMS53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgc2hhcGVBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogc2hhcGUubGVuZ3RoKTsKICAgICAgdmFyIGJpdERlcHRoc1N0YXJ0QWRkcmVzcyA9IGFsaWduZWRfYWxsb2MoSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCwgSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIGJpdERlcHRoU3RhcnRzLmxlbmd0aCk7CiAgICAgIHZhciBiaXREZXB0aHNBZGRyZXNzID0gYWxpZ25lZF9hbGxvYyhJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogYml0RGVwdGhzLmxlbmd0aCk7CiAgICAgIHZhciBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoc2hhcGUsIHNoYXBlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoYml0RGVwdGhTdGFydHMsIGJpdERlcHRoc1N0YXJ0QWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICBtZW1vcnlCdWZmZXJJbnQzMi5zZXQoYml0RGVwdGhzLCBiaXREZXB0aHNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfZm9yd2FyZF9tdWx0aXBsZShzaGFwZUFkZHJlc3MsIHdvcmtlckluZGljZXNBZGRyZXNzLCBiaXREZXB0aHMubGVuZ3RoLCBiaXREZXB0aHNTdGFydEFkZHJlc3MsIGJpdERlcHRoc0FkZHJlc3MsIHdvcmtlck1ldGFzQWRkcmVzcywgd29ya2VyQmxvY2tzQWRkcmVzcywgbiwgd29ya2VyWEFkZHJlc3MgKyB4T2Zmc2V0LCB3b3JrZXJZQWRkcmVzcyk7CiAgICAgIGZyZWUoc2hhcGVBZGRyZXNzKTsKICAgICAgZnJlZShiaXREZXB0aHNTdGFydEFkZHJlc3MpOwogICAgICBmcmVlKGJpdERlcHRoc0FkZHJlc3MpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciB3ZWlnaHRCbG9ja01peGVkMTZ4OEFkZEJpYXMgPSBmdW5jdGlvbiB3ZWlnaHRCbG9ja01peGVkMTZ4OEFkZEJpYXMoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIF9kYXRhJGdsb2JhbHM0ID0gZGF0YS5nbG9iYWxzLAogICAgICAgIGV4cG9ydHMgPSBfZGF0YSRnbG9iYWxzNC5leHBvcnRzLAogICAgICAgIG1lbUFsbG9jID0gX2RhdGEkZ2xvYmFsczQubWVtQWxsb2M7CiAgICAgIHZhciBuID0gZGF0YS5uLAogICAgICAgIGRpbWVuc2lvbiA9IGRhdGEuZGltZW5zaW9uLAogICAgICAgIHlBZGRyZXNzID0gZGF0YS55QWRkcmVzcywKICAgICAgICBiaWFzQWRkcmVzcyA9IGRhdGEuYmlhc0FkZHJlc3M7CiAgICAgIHZhciBmcmVlID0gZXhwb3J0cy5mcmVlLAogICAgICAgIHB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfYWRkX2JpYXMgPSBleHBvcnRzLnB2X3BpY29sbG1fd2VpZ2h0X2Jsb2NrX21peGVkXzE2eDhfYWRkX2JpYXM7CiAgICAgIGlmICghbWVtQWxsb2MuaGFzKHlBZGRyZXNzKSB8fCAhbWVtQWxsb2MuaGFzKGJpYXNBZGRyZXNzKSkgewogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgY29tbWFuZDogJ29rJwogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgX21lbUFsbG9jJGdldDEyID0gbWVtQWxsb2MuZ2V0KHlBZGRyZXNzKSwKICAgICAgICB3b3JrZXJZQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMi53b3JrZXJNZW1BZGRyZXNzOwogICAgICB2YXIgX21lbUFsbG9jJGdldDEzID0gbWVtQWxsb2MuZ2V0KGJpYXNBZGRyZXNzKSwKICAgICAgICB3b3JrZXJCaWFzQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQxMy53b3JrZXJNZW1BZGRyZXNzOwogICAgICBwdl9waWNvbGxtX3dlaWdodF9ibG9ja19taXhlZF8xNng4X2FkZF9iaWFzKG4sIGRpbWVuc2lvbiwgd29ya2VyWUFkZHJlc3MsIHdvcmtlckJpYXNBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgd2VpZ2h0RmxvYXRGb3J3YXJkID0gZnVuY3Rpb24gd2VpZ2h0RmxvYXRGb3J3YXJkKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBfZGF0YSRnbG9iYWxzNSA9IGRhdGEuZ2xvYmFscywKICAgICAgICBleHBvcnRzID0gX2RhdGEkZ2xvYmFsczUuZXhwb3J0cywKICAgICAgICBtZW1BbGxvYyA9IF9kYXRhJGdsb2JhbHM1Lm1lbUFsbG9jOwogICAgICB2YXIgbiA9IGRhdGEubiwKICAgICAgICBuYyA9IGRhdGEubmMsCiAgICAgICAgbnIgPSBkYXRhLm5yLAogICAgICAgIHdBZGRyZXNzID0gZGF0YS53QWRkcmVzcywKICAgICAgICB4T2Zmc2V0ID0gZGF0YS54T2Zmc2V0LAogICAgICAgIHhBZGRyZXNzID0gZGF0YS54QWRkcmVzcywKICAgICAgICB5QWRkcmVzcyA9IGRhdGEueUFkZHJlc3M7CiAgICAgIHZhciBwdl9waWNvbGxtX3dlaWdodF9mbG9hdF9mb3J3YXJkID0gZXhwb3J0cy5wdl9waWNvbGxtX3dlaWdodF9mbG9hdF9mb3J3YXJkOwogICAgICBpZiAoIW1lbUFsbG9jLmhhcyh3QWRkcmVzcykgfHwgIW1lbUFsbG9jLmhhcyh4QWRkcmVzcykgfHwgIW1lbUFsbG9jLmhhcyh5QWRkcmVzcykpIHsKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgICB9KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxNCA9IG1lbUFsbG9jLmdldCh3QWRkcmVzcyksCiAgICAgICAgd29ya2VyV0FkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTQud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxNSA9IG1lbUFsbG9jLmdldCh4QWRkcmVzcyksCiAgICAgICAgd29ya2VyWEFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTUud29ya2VyTWVtQWRkcmVzczsKICAgICAgdmFyIF9tZW1BbGxvYyRnZXQxNiA9IG1lbUFsbG9jLmdldCh5QWRkcmVzcyksCiAgICAgICAgd29ya2VyWUFkZHJlc3MgPSBfbWVtQWxsb2MkZ2V0MTYud29ya2VyTWVtQWRkcmVzczsKICAgICAgcHZfcGljb2xsbV93ZWlnaHRfZmxvYXRfZm9yd2FyZChuLCBuYywgbnIsIHdvcmtlcldBZGRyZXNzLCB3b3JrZXJYQWRkcmVzcyArIHhPZmZzZXQsIHdvcmtlcllBZGRyZXNzKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgcHZQaWNvbGxtV2VpZ2h0QWN0aW9uTWFwID0gX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7fSwgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uLldFSUdIVF9CTE9DS19NSVhFRF8xNlg4X1BSRVBST0NFU1NfQkxPQ0tTLCB3ZWlnaHRCbG9ja01peGVkMTZ4OFByZXByb2Nlc3NCbG9ja3MpLCBQdlBpY29sbG1XZWlnaHRBY3Rpb24uV0VJR0hUX0JMT0NLX01JWEVEXzE2WDhfRk9SV0FSRF9TSU5HTEUsIHdlaWdodEJsb2NrTWl4ZWQxNng4Rm9yd2FyZFNpbmdsZSksIFB2UGljb2xsbVdlaWdodEFjdGlvbi5XRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9GT1JXQVJEX01VTFRJUExFLCB3ZWlnaHRCbG9ja01peGVkMTZ4OEZvcndhcmRNdWx0aXBsZSksIFB2UGljb2xsbVdlaWdodEFjdGlvbi5XRUlHSFRfQkxPQ0tfTUlYRURfMTZYOF9BRERfQklBUywgd2VpZ2h0QmxvY2tNaXhlZDE2eDhBZGRCaWFzKSwgUHZQaWNvbGxtV2VpZ2h0QWN0aW9uLldFSUdIVF9GTE9BVF9GT1JXQVJELCB3ZWlnaHRGbG9hdEZvcndhcmQpOwoKICBmdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH0KICBmdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9CiAgdmFyIGV4cG9ydHMkMTsKICB2YXIgbWVtb3J5OwogIHZhciBtZW1BbGxvYyA9IG5ldyBNYXAoKTsKICBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvU3RyaW5nQXRJbmRleChhcnJheUJ1ZmZlciwgaW5kZXhTdGFydCkgewogICAgdmFyIGluZGV4RW5kID0gaW5kZXhTdGFydDsKICAgIHdoaWxlIChhcnJheUJ1ZmZlcltpbmRleEVuZF0gIT09IDApIHsKICAgICAgaW5kZXhFbmQrKzsKICAgIH0KICAgIHZhciB1dGY4ZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKTsKICAgIHJldHVybiB1dGY4ZGVjb2Rlci5kZWNvZGUoYXJyYXlCdWZmZXIuc3ViYXJyYXkoaW5kZXhTdGFydCwgaW5kZXhFbmQpKTsKICB9CiAgdmFyIGdldFdhc20gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUkMS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUod2FzbSkgewogICAgICB2YXIgcHZDb25zb2xlTG9nV2FzbSwgcHZBc3NlcnRXYXNtLCBwdlRpbWVXYXNtLCBwdkZpbGVPcGVuV2FzbSwgcHZGaWxlQ2xvc2VXYXNtLCBwdkZpbGVSZWFkV2FzbSwgcHZGaWxlV3JpdGVXYXNtLCBwdkZpbGVTZWVrV2FzbSwgcHZGaWxlVGVsbFdhc20sIHB2RmlsZVJlbW92ZVdhc20sIGluc3RhbmNlLCBhbGlnbmVkX2FsbG9jLCBhbGlnbmVkQWxsb2M7CiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgIHdoaWxlICgxKSBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHB2Q29uc29sZUxvZ1dhc20gPSBmdW5jdGlvbiBwdkNvbnNvbGVMb2dXYXNtKGluZGV4KSB7CiAgICAgICAgICAgICAgaW5kZXggPSB1bnNpZ25lZEFkZHJlc3MoaW5kZXgpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlCiAgICAgICAgICAgICAgY29uc29sZS5sb2coYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGluZGV4KSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2QXNzZXJ0V2FzbSA9IGZ1bmN0aW9uIHB2QXNzZXJ0V2FzbShleHByLCBsaW5lLCBmaWxlTmFtZUFkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlTmFtZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoZmlsZU5hbWVBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICBpZiAoZXhwciA9PT0gMCkgewogICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIGZpbGVOYW1lQWRkcmVzcyk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImFzc2VydGlvbiBmYWlsZWQgYXQgbGluZSAiLmNvbmNhdChsaW5lLCAiIGluIFwiIikuY29uY2F0KGZpbGVOYW1lLCAiXCIiKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdlRpbWVXYXNtID0gZnVuY3Rpb24gcHZUaW1lV2FzbSgpIHsKICAgICAgICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCkgLyAxMDAwOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVPcGVuV2FzbSA9IGZ1bmN0aW9uIHB2RmlsZU9wZW5XYXNtKGZpbGVBZGRyZXNzLCBwYXRoQWRkcmVzcywgbW9kZUFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgcGF0aEFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MocGF0aEFkZHJlc3MpOwogICAgICAgICAgICAgIG1vZGVBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKG1vZGVBZGRyZXNzKTsKICAgICAgICAgICAgICBzdGF0dXNBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKHN0YXR1c0FkZHJlc3MpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJVaW50OCA9IG5ldyBVaW50OEFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIHZhciBtZW1vcnlCdWZmZXJJbnQzMiA9IG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgIHZhciBwYXRoID0gYXJyYXlCdWZmZXJUb1N0cmluZ0F0SW5kZXgobWVtb3J5QnVmZmVyVWludDgsIHBhdGhBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbW9kZSA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBtb2RlQWRkcmVzcyk7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gUHZGaWxlTWVtLm9wZW4ocGF0aCwgbW9kZSk7CiAgICAgICAgICAgICAgICBQdkZpbGVNZW0uc2V0UHRyKGZpbGVBZGRyZXNzLCBmaWxlKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVDbG9zZVdhc20gPSBmdW5jdGlvbiBwdkZpbGVDbG9zZVdhc20oZmlsZUFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgc3RhdHVzQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhzdGF0dXNBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IDA7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVSZWFkV2FzbSA9IGZ1bmN0aW9uIHB2RmlsZVJlYWRXYXNtKGZpbGVBZGRyZXNzLCBjb250ZW50QWRkcmVzcywgc2l6ZSwgY291bnQsIG51bVJlYWRBZGRyZXNzKSB7CiAgICAgICAgICAgICAgZmlsZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgIGNvbnRlbnRBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKGNvbnRlbnRBZGRyZXNzKTsKICAgICAgICAgICAgICBudW1SZWFkQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhudW1SZWFkQWRkcmVzcyk7CiAgICAgICAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlclVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlckludDMyID0gbmV3IEludDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gUHZGaWxlTWVtLmdldFB0cihmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IGZpbGUucmVhZChzaXplLCBjb3VudCk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQoY29udGVudCwgY29udGVudEFkZHJlc3MpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbbnVtUmVhZEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGNvbnRlbnQubGVuZ3RoIC8gc2l6ZTsKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltudW1SZWFkQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBwdkZpbGVXcml0ZVdhc20gPSBmdW5jdGlvbiBwdkZpbGVXcml0ZVdhc20oZmlsZUFkZHJlc3MsIGNvbnRlbnRBZGRyZXNzLCBzaXplLCBjb3VudCwgbnVtV3JpdGVBZGRyZXNzKSB7CiAgICAgICAgICAgICAgZmlsZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgIGNvbnRlbnRBZGRyZXNzID0gdW5zaWduZWRBZGRyZXNzKGNvbnRlbnRBZGRyZXNzKTsKICAgICAgICAgICAgICBudW1Xcml0ZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MobnVtV3JpdGVBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSAqIGNvdW50KTsKICAgICAgICAgICAgICAgIGNvbnRlbnQuc2V0KG1lbW9yeUJ1ZmZlclVpbnQ4LnNsaWNlKGNvbnRlbnRBZGRyZXNzLCBjb250ZW50QWRkcmVzcyArIHNpemUgKiBjb3VudCksIDApOwogICAgICAgICAgICAgICAgZmlsZS53cml0ZShjb250ZW50KTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW251bVdyaXRlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gY29udGVudC5sZW5ndGggLyBzaXplOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW251bVdyaXRlQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2RmlsZVNlZWtXYXNtID0gZnVuY3Rpb24gcHZGaWxlU2Vla1dhc20oZmlsZUFkZHJlc3MsIG9mZnNldCwgd2hlbmNlLCBzdGF0dXNBZGRyZXNzKSB7CiAgICAgICAgICAgICAgZmlsZUFkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3MoZmlsZUFkZHJlc3MpOwogICAgICAgICAgICAgIHN0YXR1c0FkZHJlc3MgPSB1bnNpZ25lZEFkZHJlc3Moc3RhdHVzQWRkcmVzcyk7CiAgICAgICAgICAgICAgdmFyIG1lbW9yeUJ1ZmZlckludDMyID0gbmV3IEludDMyQXJyYXkobWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gUHZGaWxlTWVtLmdldFB0cihmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICBmaWxlLnNlZWsob2Zmc2V0LCB3aGVuY2UpOwogICAgICAgICAgICAgICAgbWVtb3J5QnVmZmVySW50MzJbc3RhdHVzQWRkcmVzcyAvIEludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlRdID0gMDsKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAtMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHB2RmlsZVRlbGxXYXNtID0gZnVuY3Rpb24gcHZGaWxlVGVsbFdhc20oZmlsZUFkZHJlc3MsIG9mZnNldEFkZHJlc3MpIHsKICAgICAgICAgICAgICBmaWxlQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhmaWxlQWRkcmVzcyk7CiAgICAgICAgICAgICAgb2Zmc2V0QWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhvZmZzZXRBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBQdkZpbGVNZW0uZ2V0UHRyKGZpbGVBZGRyZXNzKTsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW29mZnNldEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IGZpbGUudGVsbCgpOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW29mZnNldEFkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHZGaWxlUmVtb3ZlV2FzbSA9IGZ1bmN0aW9uIHB2RmlsZVJlbW92ZVdhc20ocGF0aEFkZHJlc3MsIHN0YXR1c0FkZHJlc3MpIHsKICAgICAgICAgICAgICBwYXRoQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhwYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgc3RhdHVzQWRkcmVzcyA9IHVuc2lnbmVkQWRkcmVzcyhzdGF0dXNBZGRyZXNzKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB2YXIgbWVtb3J5QnVmZmVySW50MzIgPSBuZXcgSW50MzJBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICB2YXIgcGF0aCA9IGFycmF5QnVmZmVyVG9TdHJpbmdBdEluZGV4KG1lbW9yeUJ1ZmZlclVpbnQ4LCBwYXRoQWRkcmVzcyk7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gUHZGaWxlTWVtLm9wZW4ocGF0aCwgInciKTsKICAgICAgICAgICAgICAgIGZpbGUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBtZW1vcnlCdWZmZXJJbnQzMltzdGF0dXNBZGRyZXNzIC8gSW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVF0gPSAwOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIG1lbW9yeUJ1ZmZlckludDMyW3N0YXR1c0FkZHJlc3MgLyBJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UXSA9IC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyOwogICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUod2FzbSwgewogICAgICAgICAgICAgIHdhc2lfc25hcHNob3RfcHJldmlldzE6IHdhc2lfc25hcHNob3RfcHJldmlldzFfZW11bGF0b3IsCiAgICAgICAgICAgICAgZW52OiB7CiAgICAgICAgICAgICAgICBtZW1vcnk6IG1lbW9yeSwKICAgICAgICAgICAgICAgIHB2X2NvbnNvbGVfbG9nX3dhc206IHB2Q29uc29sZUxvZ1dhc20sCiAgICAgICAgICAgICAgICBwdl9hc3NlcnRfd2FzbTogcHZBc3NlcnRXYXNtLAogICAgICAgICAgICAgICAgcHZfdGltZV93YXNtOiBwdlRpbWVXYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV9vcGVuX3dhc206IHB2RmlsZU9wZW5XYXNtLAogICAgICAgICAgICAgICAgcHZfZmlsZV9jbG9zZV93YXNtOiBwdkZpbGVDbG9zZVdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3JlYWRfd2FzbTogcHZGaWxlUmVhZFdhc20sCiAgICAgICAgICAgICAgICBwdl9maWxlX3dyaXRlX3dhc206IHB2RmlsZVdyaXRlV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfc2Vla193YXNtOiBwdkZpbGVTZWVrV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfdGVsbF93YXNtOiBwdkZpbGVUZWxsV2FzbSwKICAgICAgICAgICAgICAgIHB2X2ZpbGVfcmVtb3ZlX3dhc206IHB2RmlsZVJlbW92ZVdhc20KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgaW5zdGFuY2UgPSBfY29udGV4dC5zZW50Lmluc3RhbmNlOwogICAgICAgICAgICBhbGlnbmVkX2FsbG9jID0gaW5zdGFuY2UuZXhwb3J0cy5hbGlnbmVkX2FsbG9jOwogICAgICAgICAgICBhbGlnbmVkQWxsb2MgPSBmdW5jdGlvbiBhbGlnbmVkQWxsb2MoYWxpZ25tZW50LCBzaXplKSB7CiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lCiAgICAgICAgICAgICAgdmFyIHBvaW50ZXIgPSBhbGlnbmVkX2FsbG9jKGFsaWdubWVudCwgc2l6ZSk7CiAgICAgICAgICAgICAgaWYgKHBvaW50ZXIgPCAwKSB7CiAgICAgICAgICAgICAgICBwb2ludGVyID0gcG9pbnRlciA+Pj4gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHBvaW50ZXI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoInJldHVybiIsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaW5zdGFuY2UuZXhwb3J0cyksIHt9LCB7CiAgICAgICAgICAgICAgYWxpZ25lZF9hbGxvYzogYWxpZ25lZEFsbG9jCiAgICAgICAgICAgIH0pKTsKICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgIH0KICAgICAgfSwgX2NhbGxlZSk7CiAgICB9KSk7CiAgICByZXR1cm4gZnVuY3Rpb24gZ2V0V2FzbShfeCkgewogICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7CiAgdmFyIGluaXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgdmFyIF9yZWYyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lJDEubWFyayhmdW5jdGlvbiBfY2FsbGVlMihkYXRhKSB7CiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lJDEud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7CiAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDA7CiAgICAgICAgICAgIG1lbW9yeSA9IG5ldyBXZWJBc3NlbWJseS5NZW1vcnkoewogICAgICAgICAgICAgIGluaXRpYWw6IDQwOTYsCiAgICAgICAgICAgICAgbWF4aW11bTogNjU1MzYKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDsKICAgICAgICAgICAgcmV0dXJuIGdldFdhc20oZGF0YS53YXNtKTsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgZXhwb3J0cyQxID0gX2NvbnRleHQyLnNlbnQ7CiAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDg7CiAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9jb250ZXh0MlsiY2F0Y2giXSgwKTsKICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICAgICAgICBtZXNzYWdlOiBfY29udGV4dDIudDAubWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUyLCBudWxsLCBbWzAsIDhdXSk7CiAgICB9KSk7CiAgICByZXR1cm4gZnVuY3Rpb24gaW5pdChfeDIpIHsKICAgICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0oKTsKICB2YXIgYWxsb2NNZW0gPSBmdW5jdGlvbiBhbGxvY01lbShkYXRhKSB7CiAgICB0cnkgewogICAgICB2YXIgc2l6ZSA9IGRhdGEuc2l6ZSwKICAgICAgICBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzOwogICAgICB2YXIgX2V4cG9ydHMgPSBleHBvcnRzJDEsCiAgICAgICAgX2FsaWduZWRfYWxsb2MgPSBfZXhwb3J0cy5hbGlnbmVkX2FsbG9jOwogICAgICBpZiAoc2l6ZSA+IDApIHsKICAgICAgICB2YXIgd29ya2VyTWVtQWRkcmVzcyA9IF9hbGlnbmVkX2FsbG9jKFVpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHNpemUgKiBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTsKICAgICAgICBtZW1BbGxvYy5zZXQobWVtQWRkcmVzcywgewogICAgICAgICAgYWxsb2NTaXplOiBzaXplLAogICAgICAgICAgd29ya2VyTWVtQWRkcmVzczogd29ya2VyTWVtQWRkcmVzcwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIGZyZWVNZW0gPSBmdW5jdGlvbiBmcmVlTWVtKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzOwogICAgICB2YXIgX2V4cG9ydHMyID0gZXhwb3J0cyQxLAogICAgICAgIGZyZWUgPSBfZXhwb3J0czIuZnJlZTsKICAgICAgaWYgKG1lbUFsbG9jLmhhcyhtZW1BZGRyZXNzKSkgewogICAgICAgIHZhciBfbWVtQWxsb2MkZ2V0ID0gbWVtQWxsb2MuZ2V0KG1lbUFkZHJlc3MpLAogICAgICAgICAgd29ya2VyTWVtQWRkcmVzcyA9IF9tZW1BbGxvYyRnZXQud29ya2VyTWVtQWRkcmVzczsKICAgICAgICBmcmVlKHdvcmtlck1lbUFkZHJlc3MpOwogICAgICAgIG1lbUFsbG9jWyJkZWxldGUiXShtZW1BZGRyZXNzKTsKICAgICAgfQogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBjb3B5VG9YcHUgPSBmdW5jdGlvbiBjb3B5VG9YcHUoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIG1lbUFkZHJlc3MgPSBkYXRhLm1lbUFkZHJlc3MsCiAgICAgICAgb2Zmc2V0ID0gZGF0YS5vZmZzZXQsCiAgICAgICAgYnVmZmVyID0gZGF0YS5idWZmZXI7CiAgICAgIGlmIChtZW1BbGxvYy5oYXMobWVtQWRkcmVzcykpIHsKICAgICAgICB2YXIgX21lbUFsbG9jJGdldDIgPSBtZW1BbGxvYy5nZXQobWVtQWRkcmVzcyksCiAgICAgICAgICB3b3JrZXJNZW1BZGRyZXNzID0gX21lbUFsbG9jJGdldDIud29ya2VyTWVtQWRkcmVzczsKICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5zZXQoYnVmZmVyLCB3b3JrZXJNZW1BZGRyZXNzICsgb2Zmc2V0KTsKICAgICAgfQogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBjb3B5RnJvbVhwdSA9IGZ1bmN0aW9uIGNvcHlGcm9tWHB1KGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHZhciBtZW1BZGRyZXNzID0gZGF0YS5tZW1BZGRyZXNzLAogICAgICAgIG9mZnNldCA9IGRhdGEub2Zmc2V0LAogICAgICAgIHNpemUgPSBkYXRhLnNpemU7CiAgICAgIGlmIChtZW1BbGxvYy5oYXMobWVtQWRkcmVzcykpIHsKICAgICAgICB2YXIgX21lbUFsbG9jJGdldDMgPSBtZW1BbGxvYy5nZXQobWVtQWRkcmVzcyksCiAgICAgICAgICB3b3JrZXJNZW1BZGRyZXNzID0gX21lbUFsbG9jJGdldDMud29ya2VyTWVtQWRkcmVzczsKICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIGNvbW1hbmQ6ICdvaycsCiAgICAgICAgICByZXN1bHQ6IG1lbW9yeUJ1ZmZlclVpbnQ4LnNsaWNlKHdvcmtlck1lbUFkZHJlc3MgKyBvZmZzZXQsIHdvcmtlck1lbUFkZHJlc3MgKyBvZmZzZXQgKyBzaXplKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgICAgY29tbWFuZDogJ29rJywKICAgICAgICAgIHJlc3VsdDogbmV3IFVpbnQ4QXJyYXkoMCkKICAgICAgICB9KTsKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBtZW1zZXQgPSBmdW5jdGlvbiBtZW1zZXQoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIG1lbUFkZHJlc3MgPSBkYXRhLm1lbUFkZHJlc3MsCiAgICAgICAgZmlsbEJ5dGUgPSBkYXRhLmZpbGxCeXRlLAogICAgICAgIHNpemUgPSBkYXRhLnNpemU7CiAgICAgIGlmIChtZW1BbGxvYy5oYXMobWVtQWRkcmVzcykpIHsKICAgICAgICB2YXIgX21lbUFsbG9jJGdldDQgPSBtZW1BbGxvYy5nZXQobWVtQWRkcmVzcyksCiAgICAgICAgICB3b3JrZXJNZW1BZGRyZXNzID0gX21lbUFsbG9jJGdldDQud29ya2VyTWVtQWRkcmVzczsKICAgICAgICB2YXIgbWVtb3J5QnVmZmVyVWludDggPSBuZXcgVWludDhBcnJheShtZW1vcnkuYnVmZmVyKTsKICAgICAgICBtZW1vcnlCdWZmZXJVaW50OC5maWxsKGZpbGxCeXRlLCB3b3JrZXJNZW1BZGRyZXNzLCB3b3JrZXJNZW1BZGRyZXNzICsgc2l6ZSk7CiAgICAgIH0KICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ29rJwogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgY29tbWFuZDogJ2Vycm9yJywKICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UKICAgICAgfSk7CiAgICB9CiAgfTsKICB2YXIgdGltZXJTdGFydCA9IGZ1bmN0aW9uIHRpbWVyU3RhcnQoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdmFyIHdvcmtlckluZGV4ID0gZGF0YS53b3JrZXJJbmRleDsKICAgICAgdmFyIF9leHBvcnRzMyA9IGV4cG9ydHMkMSwKICAgICAgICBwdl9waWNvbGxtX3RpbWVyX3N0YXJ0X3dhc20gPSBfZXhwb3J0czMucHZfcGljb2xsbV90aW1lcl9zdGFydF93YXNtOwogICAgICBpZiAocHZfcGljb2xsbV90aW1lcl9zdGFydF93YXNtKSB7CiAgICAgICAgcHZfcGljb2xsbV90aW1lcl9zdGFydF93YXNtKHdvcmtlckluZGV4KTsKICAgICAgfQogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnb2snCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBjb21tYW5kOiAnZXJyb3InLAogICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZQogICAgICB9KTsKICAgIH0KICB9OwogIHZhciB0aW1lclN0b3AgPSBmdW5jdGlvbiB0aW1lclN0b3AoKSB7CiAgICB0cnkgewogICAgICB2YXIgX2V4cG9ydHM0ID0gZXhwb3J0cyQxLAogICAgICAgIHB2X3BpY29sbG1fdGltZXJfc3RvcF93YXNtID0gX2V4cG9ydHM0LnB2X3BpY29sbG1fdGltZXJfc3RvcF93YXNtOwogICAgICBpZiAocHZfcGljb2xsbV90aW1lcl9zdG9wX3dhc20pIHsKICAgICAgICBwdl9waWNvbGxtX3RpbWVyX3N0b3Bfd2FzbSgpOwogICAgICB9CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdvaycKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGNvbW1hbmQ6ICdlcnJvcicsCiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlCiAgICAgIH0pOwogICAgfQogIH07CiAgdmFyIHhwdUFjdGlvbk1hcCA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFB2WHB1QWN0aW9uLklOSVQsIGluaXQpLCBQdlhwdUFjdGlvbi5BTExPQywgYWxsb2NNZW0pLCBQdlhwdUFjdGlvbi5GUkVFLCBmcmVlTWVtKSwgUHZYcHVBY3Rpb24uQ09QWV9UT19YUFUsIGNvcHlUb1hwdSksIFB2WHB1QWN0aW9uLkNPUFlfRlJPTV9YUFUsIGNvcHlGcm9tWHB1KSwgUHZYcHVBY3Rpb24uTUVNU0VULCBtZW1zZXQpLCBQdlhwdUFjdGlvbi5USU1FUl9TVEFSVCwgdGltZXJTdGFydCksIFB2WHB1QWN0aW9uLlRJTUVSX1NUT1AsIHRpbWVyU3RvcCksIHB2TXZtQWN0aW9uTWFwKSwgcHZQaWNvbGxtQXR0ZW50aW9uQWN0aW9uTWFwKSwgcHZQaWNvbGxtRmVlZEZvcndhcmRBY3Rpb25NYXApLCBwdlBpY29sbG1HYXRlQWN0aW9uTWFwKSwgcHZQaWNvbGxtTW9lVHJhbnNmb3JtZXJBY3Rpb25NYXApLCBwdlBpY29sbG1Ob3JtQWN0aW9uTWFwKSwgcHZQaWNvbGxtTm9ybUxheWVyQWN0aW9uTWFwKSwgcHZQaWNvbGxtVHJhbnNmb3JtZXJBY3Rpb25NYXApLCBwdlBpY29sbG1XZWlnaHRBY3Rpb25NYXApOwogIHNlbGYub25tZXNzYWdlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgIHZhciBfcmVmMyA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSQxLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMoZXZlbnQpIHsKICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUkMS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGlmICghKGV2ZW50LmRhdGEuYWN0aW9uIGluIHhwdUFjdGlvbk1hcCkpIHsKICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDY7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXZlbnQuZGF0YS5nbG9iYWxzID0gewogICAgICAgICAgICAgIGV4cG9ydHM6IGV4cG9ydHMkMSwKICAgICAgICAgICAgICBtZW1vcnk6IG1lbW9yeSwKICAgICAgICAgICAgICBtZW1BbGxvYzogbWVtQWxsb2MKICAgICAgICAgICAgfTsKICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA0OwogICAgICAgICAgICByZXR1cm4geHB1QWN0aW9uTWFwW2V2ZW50LmRhdGEuYWN0aW9uXShldmVudC5kYXRhKTsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA3OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgY29tbWFuZDogJ2ZhaWxlZCcsCiAgICAgICAgICAgICAgbWVzc2FnZTogIlVucmVjb2duaXplZCBjb21tYW5kOiAiLmNvbmNhdChldmVudC5kYXRhLmFjdGlvbikKICAgICAgICAgICAgfSk7CiAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTsKICAgICAgICB9CiAgICAgIH0sIF9jYWxsZWUzKTsKICAgIH0pKTsKICAgIHJldHVybiBmdW5jdGlvbiAoX3gzKSB7CiAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9KCk7Cgp9KSgpOwoK', null, false); + /* eslint-enable */ + + var PvXpuAction; + (function (PvXpuAction) { + PvXpuAction[PvXpuAction["INIT"] = 0] = "INIT"; + PvXpuAction[PvXpuAction["ALLOC"] = 1] = "ALLOC"; + PvXpuAction[PvXpuAction["FREE"] = 2] = "FREE"; + PvXpuAction[PvXpuAction["COPY_TO_XPU"] = 3] = "COPY_TO_XPU"; + PvXpuAction[PvXpuAction["COPY_FROM_XPU"] = 4] = "COPY_FROM_XPU"; + PvXpuAction[PvXpuAction["MEMSET"] = 5] = "MEMSET"; + PvXpuAction[PvXpuAction["TIMER_START"] = 6] = "TIMER_START"; + PvXpuAction[PvXpuAction["TIMER_STOP"] = 7] = "TIMER_STOP"; + // other xpu actions + PvXpuAction[PvXpuAction["MATRIX_VECTOR_MULTIPLY"] = 8] = "MATRIX_VECTOR_MULTIPLY"; + PvXpuAction[PvXpuAction["SYNC_VECTOR"] = 9] = "SYNC_VECTOR"; + })(PvXpuAction || (PvXpuAction = {})); + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; + } + + function _createForOfIteratorHelper$1(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } + function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } + function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } + var PvXpu = /*#__PURE__*/function () { + function PvXpu() { + _classCallCheck(this, PvXpu); + } + _createClass(PvXpu, null, [{ + key: "addXpu", + value: function addXpu(objAddress, data) { + PvXpu.xpuObjects.set(objAddress, data); + } + }, { + key: "getXpu", + value: function getXpu(objAddress) { + return PvXpu.xpuObjects.get(objAddress); + } + }, { + key: "hasXpu", + value: function hasXpu(objAddress) { + return PvXpu.xpuObjects.has(objAddress); + } + }, { + key: "removeXpu", + value: function removeXpu(objAddress) { + if (PvXpu.xpuObjects.has(objAddress)) { + var _PvXpu$xpuObjects$get = PvXpu.xpuObjects.get(objAddress), + deviceMem = _PvXpu$xpuObjects$get.deviceMem; + var _iterator = _createForOfIteratorHelper$1(deviceMem), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var memAddress = _step.value; + PvXpu.memoryObjects["delete"](memAddress); + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + PvXpu.xpuObjects["delete"](objAddress); + } + } + }, { + key: "addMemory", + value: function addMemory(memAddress, data) { + PvXpu.memoryObjects.set(memAddress, data); + PvXpu.xpuObjects.get(data.objAddress).deviceMem.add(memAddress); + } + }, { + key: "getMemory", + value: function getMemory(memAddress) { + return PvXpu.memoryObjects.get(memAddress); + } + }, { + key: "hasMemory", + value: function hasMemory(memAddress) { + return PvXpu.memoryObjects.has(memAddress); + } + }, { + key: "removeMemory", + value: function removeMemory(memAddress) { + if (PvXpu.hasMemory(memAddress)) { + PvXpu.xpuObjects.get(PvXpu.getMemory(memAddress).objAddress).deviceMem["delete"](memAddress); + } + PvXpu.memoryObjects["delete"](memAddress); + } + }]); + return PvXpu; + }(); + _defineProperty(PvXpu, "xpuObjects", new Map()); + _defineProperty(PvXpu, "memoryObjects", new Map()); + var waitForWorker = function waitForWorker(worker, command, options) { + worker.postMessage(command, options); + return new Promise(function (resolve, reject) { + worker.onmessage = function (e) { + switch (e.data.command) { + case "ok": + resolve(e.data.result); + break; + case "failed": + case "error": + reject(e.data.message); + break; + default: + reject("Unrecognized command: ".concat(e.data.command)); + } + }; + }); + }; + + var getMvmWasmFunctions = function getMvmWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvXpuMatrixVectorMultiply = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, matrixAddress, vectorAddress, m, n, resultAddress, statusAddress) { + var obj, matrixMem, numWorkers, chunkSize, remaining, workerResults, i, resultBuffer, results, _i, _i2; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 4; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 4: + matrixMem = PvXpu.getMemory(matrixAddress); + if (matrixMem) { + _context.next = 8; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 8: + numWorkers = obj.numWorkers; + chunkSize = matrixMem.chunkSize / (n / 2); + remaining = m; + workerResults = []; + i = 0; + case 13: + if (!(i < numWorkers)) { + _context.next = 21; + break; + } + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.MATRIX_VECTOR_MULTIPLY, + matrixAddress: matrixAddress, + vectorAddress: vectorAddress, + m: Math.min(remaining, chunkSize), + n: n, + resultAddress: resultAddress + })); + remaining -= chunkSize; + if (!(remaining <= 0)) { + _context.next = 18; + break; + } + return _context.abrupt("break", 21); + case 18: + i++; + _context.next = 13; + break; + case 21: + resultBuffer = new Float32Array(n); + _context.next = 24; + return Promise.all(workerResults); + case 24: + results = _context.sent; + for (_i = 0; _i < results.length; _i++) { + if (results[_i].length > 0) { + resultBuffer.set(results[_i], _i * chunkSize); + } + } + workerResults = []; + for (_i2 = 0; _i2 < numWorkers; _i2++) { + workerResults.push(waitForWorker(obj.workers[_i2], { + action: PvXpuAction.SYNC_VECTOR, + vectorAddress: resultAddress, + buffer: resultBuffer + })); + } + _context.next = 30; + return Promise.all(workerResults); + case 30: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvXpuMatrixVectorMultiply(_x, _x2, _x3, _x4, _x5, _x6, _x7) { + return _ref.apply(this, arguments); + }; + }(); + return { + pv_matrix_vector_multiply_web_worker_wasm: pvXpuMatrixVectorMultiply + }; + }; + + /* eslint camelcase: 0 */ + var PvPicollmAttentionAction; + (function (PvPicollmAttentionAction) { + PvPicollmAttentionAction[PvPicollmAttentionAction["ATTENTION_PRECOMPUTE_ENCODING"] = 200] = "ATTENTION_PRECOMPUTE_ENCODING"; + PvPicollmAttentionAction[PvPicollmAttentionAction["ATTENTION_ENCODE"] = 201] = "ATTENTION_ENCODE"; + PvPicollmAttentionAction[PvPicollmAttentionAction["ATTENTION_ATTEND"] = 202] = "ATTENTION_ATTEND"; + PvPicollmAttentionAction[PvPicollmAttentionAction["ATTENTION_UPDATE_KEYS"] = 203] = "ATTENTION_UPDATE_KEYS"; + PvPicollmAttentionAction[PvPicollmAttentionAction["ATTENTION_UPDATE_VALUES"] = 204] = "ATTENTION_UPDATE_VALUES"; + PvPicollmAttentionAction[PvPicollmAttentionAction["ATTENTION_TRANSPOSE_QUERY"] = 205] = "ATTENTION_TRANSPOSE_QUERY"; + })(PvPicollmAttentionAction || (PvPicollmAttentionAction = {})); + + var getPicollmAttentionWasmFunctions = function getPicollmAttentionWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmAttentionPrecomputeEncoding = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, encodingAddress, dimension, steps, theta, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + encodingAddress = unsignedAddress(encodingAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 7; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 7: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmAttentionAction.ATTENTION_PRECOMPUTE_ENCODING, + encodingAddress: encodingAddress, + dimension: dimension, + steps: steps, + theta: theta + })); + } + _context.next = 11; + return Promise.all(workerResults); + case 11: + setStatus(statusAddress, 0); + case 12: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmAttentionPrecomputeEncoding(_x, _x2, _x3, _x4, _x5, _x6) { + return _ref.apply(this, arguments); + }; + }(); + var pvPicollmAttentionEncode = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(objAddress, xAddress, newEncodingAddress, n, numHeads, ropeInterleaved, headDimension, ropeDimension, position, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + newEncodingAddress = unsignedAddress(newEncodingAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context2.next = 8; + break; + } + setStatus(statusAddress, -1); + return _context2.abrupt("return"); + case 8: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmAttentionAction.ATTENTION_ENCODE, + xAddress: xAddress, + newEncodingAddress: newEncodingAddress, + n: n, + numHeads: numHeads, + ropeInterleaved: ropeInterleaved, + headDimension: headDimension, + ropeDimension: ropeDimension, + position: position + })); + } + _context2.next = 12; + return Promise.all(workerResults); + case 12: + setStatus(statusAddress, 0); + case 13: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function pvPicollmAttentionEncode(_x7, _x8, _x9, _x10, _x11, _x12, _x13, _x14, _x15, _x16) { + return _ref2.apply(this, arguments); + }; + }(); + var pvPicollmAttentionAttend = /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(objAddress, numHeads, numKvHeads, windowLength, headDimension, keysAddress, keyInterceptsAddress, keySlopesAddress, valuesAddress, valueInterceptsAddress, valueSlopesAddress, position, queryAddress, n, outputAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + objAddress = unsignedAddress(objAddress); + keysAddress = unsignedAddress(keysAddress); + keyInterceptsAddress = unsignedAddress(keyInterceptsAddress); + keySlopesAddress = unsignedAddress(keySlopesAddress); + valuesAddress = unsignedAddress(valuesAddress); + valueInterceptsAddress = unsignedAddress(valueInterceptsAddress); + valueSlopesAddress = unsignedAddress(valueSlopesAddress); + queryAddress = unsignedAddress(queryAddress); + outputAddress = unsignedAddress(outputAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context3.next = 14; + break; + } + setStatus(statusAddress, -1); + return _context3.abrupt("return"); + case 14: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmAttentionAction.ATTENTION_ATTEND, + numHeads: numHeads, + numKvHeads: numKvHeads, + windowLength: windowLength, + headDimension: headDimension, + keysAddress: keysAddress, + keyInterceptsAddress: keyInterceptsAddress, + keySlopesAddress: keySlopesAddress, + valuesAddress: valuesAddress, + valueInterceptsAddress: valueInterceptsAddress, + valueSlopesAddress: valueSlopesAddress, + position: position, + queryAddress: queryAddress, + n: n, + outputAddress: outputAddress + })); + } + _context3.next = 18; + return Promise.all(workerResults); + case 18: + setStatus(statusAddress, 0); + case 19: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return function pvPicollmAttentionAttend(_x17, _x18, _x19, _x20, _x21, _x22, _x23, _x24, _x25, _x26, _x27, _x28, _x29, _x30, _x31, _x32) { + return _ref3.apply(this, arguments); + }; + }(); + var pvPicollmAttentionUpdateKeys = /*#__PURE__*/function () { + var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(objAddress, numKvHeads, windowLength, headDimension, keysAddress, keyInterceptsAddress, keySlopesAddress, position, n, tfAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + objAddress = unsignedAddress(objAddress); + keysAddress = unsignedAddress(keysAddress); + keyInterceptsAddress = unsignedAddress(keyInterceptsAddress); + keySlopesAddress = unsignedAddress(keySlopesAddress); + tfAddress = unsignedAddress(tfAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context4.next = 10; + break; + } + setStatus(statusAddress, -1); + return _context4.abrupt("return"); + case 10: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmAttentionAction.ATTENTION_UPDATE_KEYS, + numKvHeads: numKvHeads, + windowLength: windowLength, + headDimension: headDimension, + keysAddress: keysAddress, + keyInterceptsAddress: keyInterceptsAddress, + keySlopesAddress: keySlopesAddress, + position: position, + n: n, + tfAddress: tfAddress + })); + } + _context4.next = 14; + return Promise.all(workerResults); + case 14: + setStatus(statusAddress, 0); + case 15: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + return function pvPicollmAttentionUpdateKeys(_x33, _x34, _x35, _x36, _x37, _x38, _x39, _x40, _x41, _x42, _x43) { + return _ref4.apply(this, arguments); + }; + }(); + var pvPicollmAttentionUpdateValues = /*#__PURE__*/function () { + var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(objAddress, numKvHeads, windowLength, headDimension, valuesAddress, valueInterceptsAddress, valueSlopesAddress, position, n, tfAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) switch (_context5.prev = _context5.next) { + case 0: + objAddress = unsignedAddress(objAddress); + valuesAddress = unsignedAddress(valuesAddress); + valueInterceptsAddress = unsignedAddress(valueInterceptsAddress); + valueSlopesAddress = unsignedAddress(valueSlopesAddress); + tfAddress = unsignedAddress(tfAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context5.next = 10; + break; + } + setStatus(statusAddress, -1); + return _context5.abrupt("return"); + case 10: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmAttentionAction.ATTENTION_UPDATE_VALUES, + numKvHeads: numKvHeads, + windowLength: windowLength, + headDimension: headDimension, + valuesAddress: valuesAddress, + valueInterceptsAddress: valueInterceptsAddress, + valueSlopesAddress: valueSlopesAddress, + position: position, + n: n, + tfAddress: tfAddress + })); + } + _context5.next = 14; + return Promise.all(workerResults); + case 14: + setStatus(statusAddress, 0); + case 15: + case "end": + return _context5.stop(); + } + }, _callee5); + })); + return function pvPicollmAttentionUpdateValues(_x44, _x45, _x46, _x47, _x48, _x49, _x50, _x51, _x52, _x53, _x54) { + return _ref5.apply(this, arguments); + }; + }(); + var pvPicollmAttentionTransposeQuery = /*#__PURE__*/function () { + var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6(objAddress, n, tfAddress, hfAddress, numHeads, headDimension, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee6$(_context6) { + while (1) switch (_context6.prev = _context6.next) { + case 0: + objAddress = unsignedAddress(objAddress); + tfAddress = unsignedAddress(tfAddress); + hfAddress = unsignedAddress(hfAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context6.next = 7; + break; + } + return _context6.abrupt("return"); + case 7: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmAttentionAction.ATTENTION_TRANSPOSE_QUERY, + n: n, + tfAddress: tfAddress, + hfAddress: hfAddress, + numHeads: numHeads, + headDimension: headDimension + })); + } + _context6.next = 11; + return Promise.all(workerResults); + case 11: + setStatus(statusAddress, 0); + case 12: + case "end": + return _context6.stop(); + } + }, _callee6); + })); + return function pvPicollmAttentionTransposeQuery(_x55, _x56, _x57, _x58, _x59, _x60, _x61) { + return _ref6.apply(this, arguments); + }; + }(); + return { + pv_picollm_attention_precompute_encoding_web_worker_wasm: pvPicollmAttentionPrecomputeEncoding, + pv_picollm_attention_encode_web_worker_wasm: pvPicollmAttentionEncode, + pv_picollm_attention_attend_web_worker_wasm: pvPicollmAttentionAttend, + pv_picollm_attention_update_keys_web_worker_wasm: pvPicollmAttentionUpdateKeys, + pv_picollm_attention_update_values_web_worker_wasm: pvPicollmAttentionUpdateValues, + pv_picollm_attention_transpose_query_web_worker_wasm: pvPicollmAttentionTransposeQuery + }; + }; + + var attentionPrecomputeEncoding = function attentionPrecomputeEncoding(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var encodingAddress = data.encodingAddress, + dimension = data.dimension, + steps = data.steps, + theta = data.theta; + var pv_picollm_attention_precompute_encoding = exports.pv_picollm_attention_precompute_encoding; + var _memAlloc$get = memAlloc.get(encodingAddress), + workerEncodingAddress = _memAlloc$get.workerMemAddress; + pv_picollm_attention_precompute_encoding(workerEncodingAddress, dimension, steps, theta); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var attentionEncode = function attentionEncode(data) { + try { + var _data$globals2 = data.globals, + exports = _data$globals2.exports, + memAlloc = _data$globals2.memAlloc; + var xAddress = data.xAddress, + newEncodingAddress = data.newEncodingAddress, + n = data.n, + numHeads = data.numHeads, + ropeInterleaved = data.ropeInterleaved, + headDimension = data.headDimension, + ropeDimension = data.ropeDimension, + position = data.position; + var pv_picollm_attention_encode = exports.pv_picollm_attention_encode; + var _memAlloc$get2 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get2.workerMemAddress; + var _memAlloc$get3 = memAlloc.get(newEncodingAddress), + workerNewEncodingAddress = _memAlloc$get3.workerMemAddress; + pv_picollm_attention_encode(workerXAddress, workerNewEncodingAddress, n, numHeads, ropeInterleaved, headDimension, ropeDimension, position); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var attentionAttend = function attentionAttend(data) { + try { + var _data$globals3 = data.globals, + exports = _data$globals3.exports, + memAlloc = _data$globals3.memAlloc; + var numHeads = data.numHeads, + numKvHeads = data.numKvHeads, + windowLength = data.windowLength, + headDimension = data.headDimension, + keysAddress = data.keysAddress, + keyInterceptsAddress = data.keyInterceptsAddress, + keySlopesAddress = data.keySlopesAddress, + valuesAddress = data.valuesAddress, + valueInterceptsAddress = data.valueInterceptsAddress, + valueSlopesAddress = data.valueSlopesAddress, + position = data.position, + queryAddress = data.queryAddress, + n = data.n, + outputAddress = data.outputAddress; + var pv_picollm_attention_attend = exports.pv_picollm_attention_attend; + var _memAlloc$get4 = memAlloc.get(keysAddress), + workerKeysAddress = _memAlloc$get4.workerMemAddress; + var _memAlloc$get5 = memAlloc.get(keyInterceptsAddress), + workerKeyInterceptsAddress = _memAlloc$get5.workerMemAddress; + var _memAlloc$get6 = memAlloc.get(keySlopesAddress), + workerKeySlopesAddress = _memAlloc$get6.workerMemAddress; + var _memAlloc$get7 = memAlloc.get(valuesAddress), + workerValuesAddress = _memAlloc$get7.workerMemAddress; + var _memAlloc$get8 = memAlloc.get(valueInterceptsAddress), + workerValueInterceptsAddress = _memAlloc$get8.workerMemAddress; + var _memAlloc$get9 = memAlloc.get(valueSlopesAddress), + workerValueSlopesAddress = _memAlloc$get9.workerMemAddress; + var _memAlloc$get10 = memAlloc.get(queryAddress), + workerQueryAddress = _memAlloc$get10.workerMemAddress; + var _memAlloc$get11 = memAlloc.get(outputAddress), + workerOutputAddress = _memAlloc$get11.workerMemAddress; + pv_picollm_attention_attend(numHeads, numKvHeads, windowLength, headDimension, workerKeysAddress, workerKeyInterceptsAddress, workerKeySlopesAddress, workerValuesAddress, workerValueInterceptsAddress, workerValueSlopesAddress, position, workerQueryAddress, n, workerOutputAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var attentionUpdateKeys = function attentionUpdateKeys(data) { + try { + var _data$globals4 = data.globals, + exports = _data$globals4.exports, + memAlloc = _data$globals4.memAlloc; + var numKvHeads = data.numKvHeads, + windowLength = data.windowLength, + headDimension = data.headDimension, + keysAddress = data.keysAddress, + keyInterceptsAddress = data.keyInterceptsAddress, + keySlopesAddress = data.keySlopesAddress, + position = data.position, + n = data.n, + tfAddress = data.tfAddress; + var pv_picollm_attention_update_keys = exports.pv_picollm_attention_update_keys; + var _memAlloc$get12 = memAlloc.get(keysAddress), + workerKeysAddress = _memAlloc$get12.workerMemAddress; + var _memAlloc$get13 = memAlloc.get(keyInterceptsAddress), + workerKeyInterceptsAddress = _memAlloc$get13.workerMemAddress; + var _memAlloc$get14 = memAlloc.get(keySlopesAddress), + workerKeySlopesAddress = _memAlloc$get14.workerMemAddress; + var _memAlloc$get15 = memAlloc.get(tfAddress), + workerTfAddress = _memAlloc$get15.workerMemAddress; + pv_picollm_attention_update_keys(numKvHeads, windowLength, headDimension, workerKeysAddress, workerKeyInterceptsAddress, workerKeySlopesAddress, position, n, workerTfAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var attentionUpdateValues = function attentionUpdateValues(data) { + try { + var _data$globals5 = data.globals, + exports = _data$globals5.exports, + memAlloc = _data$globals5.memAlloc; + var numKvHeads = data.numKvHeads, + windowLength = data.windowLength, + headDimension = data.headDimension, + valuesAddress = data.valuesAddress, + valueInterceptsAddress = data.valueInterceptsAddress, + valueSlopesAddress = data.valueSlopesAddress, + position = data.position, + n = data.n, + tfAddress = data.tfAddress; + var pv_picollm_attention_update_values = exports.pv_picollm_attention_update_values; + var _memAlloc$get16 = memAlloc.get(valuesAddress), + workerValuesAddress = _memAlloc$get16.workerMemAddress; + var _memAlloc$get17 = memAlloc.get(valueInterceptsAddress), + workerValueInterceptsAddress = _memAlloc$get17.workerMemAddress; + var _memAlloc$get18 = memAlloc.get(valueSlopesAddress), + workerValueSlopesAddress = _memAlloc$get18.workerMemAddress; + var _memAlloc$get19 = memAlloc.get(tfAddress), + workerTfAddress = _memAlloc$get19.workerMemAddress; + pv_picollm_attention_update_values(numKvHeads, windowLength, headDimension, workerValuesAddress, workerValueInterceptsAddress, workerValueSlopesAddress, position, n, workerTfAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var attentionTransposeQuery = function attentionTransposeQuery(data) { + try { + var _data$globals6 = data.globals, + exports = _data$globals6.exports, + memAlloc = _data$globals6.memAlloc; + var n = data.n, + tfAddress = data.tfAddress, + hfAddress = data.hfAddress, + numHeads = data.numHeads, + headDimension = data.headDimension; + var pv_picollm_attention_transpose_query = exports.pv_picollm_attention_transpose_query; + var _memAlloc$get20 = memAlloc.get(tfAddress), + workerTfAddress = _memAlloc$get20.workerMemAddress; + var _memAlloc$get21 = memAlloc.get(hfAddress), + workerHfAddress = _memAlloc$get21.workerMemAddress; + pv_picollm_attention_transpose_query(n, workerTfAddress, workerHfAddress, numHeads, headDimension); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, PvPicollmAttentionAction.ATTENTION_PRECOMPUTE_ENCODING, attentionPrecomputeEncoding), PvPicollmAttentionAction.ATTENTION_ENCODE, attentionEncode), PvPicollmAttentionAction.ATTENTION_ATTEND, attentionAttend), PvPicollmAttentionAction.ATTENTION_UPDATE_KEYS, attentionUpdateKeys), PvPicollmAttentionAction.ATTENTION_UPDATE_VALUES, attentionUpdateValues), PvPicollmAttentionAction.ATTENTION_TRANSPOSE_QUERY, attentionTransposeQuery); + + /* eslint camelcase: 0 */ + var PvPicollmFeedForwardAction; + (function (PvPicollmFeedForwardAction) { + PvPicollmFeedForwardAction[PvPicollmFeedForwardAction["FEED_FORWARD_SILU"] = 300] = "FEED_FORWARD_SILU"; + PvPicollmFeedForwardAction[PvPicollmFeedForwardAction["FEED_FORWARD_GELU"] = 301] = "FEED_FORWARD_GELU"; + PvPicollmFeedForwardAction[PvPicollmFeedForwardAction["FEED_FORWARD_ALMOST_GELU"] = 302] = "FEED_FORWARD_ALMOST_GELU"; + PvPicollmFeedForwardAction[PvPicollmFeedForwardAction["FEED_FORWARD_MULTIPLY_BUFFERS"] = 303] = "FEED_FORWARD_MULTIPLY_BUFFERS"; + })(PvPicollmFeedForwardAction || (PvPicollmFeedForwardAction = {})); + + var getPicollmFeedForwardWasmFunctions = function getPicollmFeedForwardWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmFeedForwardSilu = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, n, xAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 7; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 7: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmFeedForwardAction.FEED_FORWARD_SILU, + n: n, + xAddress: xAddress + })); + } + _context.next = 11; + return Promise.all(workerResults); + case 11: + setStatus(statusAddress, 0); + case 12: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmFeedForwardSilu(_x, _x2, _x3, _x4) { + return _ref.apply(this, arguments); + }; + }(); + var pvPicollmFeedForwardGelu = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(objAddress, n, xAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context2.next = 7; + break; + } + setStatus(statusAddress, -1); + return _context2.abrupt("return"); + case 7: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmFeedForwardAction.FEED_FORWARD_GELU, + n: n, + xAddress: xAddress + })); + } + _context2.next = 11; + return Promise.all(workerResults); + case 11: + setStatus(statusAddress, 0); + case 12: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function pvPicollmFeedForwardGelu(_x5, _x6, _x7, _x8) { + return _ref2.apply(this, arguments); + }; + }(); + var pvPicollmFeedForwardAlmostGelu = /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(objAddress, n, xAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context3.next = 6; + break; + } + return _context3.abrupt("return"); + case 6: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmFeedForwardAction.FEED_FORWARD_ALMOST_GELU, + n: n, + xAddress: xAddress + })); + } + _context3.next = 10; + return Promise.all(workerResults); + case 10: + setStatus(statusAddress, 0); + case 11: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return function pvPicollmFeedForwardAlmostGelu(_x9, _x10, _x11, _x12) { + return _ref3.apply(this, arguments); + }; + }(); + var pvPicollmFeedForwardMultiplyBuffers = /*#__PURE__*/function () { + var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(objAddress, n, xAddress, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context4.next = 8; + break; + } + setStatus(statusAddress, -1); + return _context4.abrupt("return"); + case 8: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmFeedForwardAction.FEED_FORWARD_MULTIPLY_BUFFERS, + n: n, + xAddress: xAddress, + yAddress: yAddress + })); + } + _context4.next = 12; + return Promise.all(workerResults); + case 12: + setStatus(statusAddress, 0); + case 13: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + return function pvPicollmFeedForwardMultiplyBuffers(_x13, _x14, _x15, _x16, _x17) { + return _ref4.apply(this, arguments); + }; + }(); + return { + pv_picollm_feed_forward_silu_web_worker_wasm: pvPicollmFeedForwardSilu, + pv_picollm_feed_forward_gelu_web_worker_wasm: pvPicollmFeedForwardGelu, + pv_picollm_feed_forward_almost_gelu_web_worker_wasm: pvPicollmFeedForwardAlmostGelu, + pv_picollm_feed_forward_multiply_buffers_web_worker_wasm: pvPicollmFeedForwardMultiplyBuffers + }; + }; + + var feedForwardSilu = function feedForwardSilu(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var n = data.n, + xAddress = data.xAddress; + var pv_picollm_feed_forward_silu = exports.pv_picollm_feed_forward_silu; + var _memAlloc$get = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get.workerMemAddress; + pv_picollm_feed_forward_silu(n, workerXAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var feedForwardGelu = function feedForwardGelu(data) { + try { + var _data$globals2 = data.globals, + exports = _data$globals2.exports, + memAlloc = _data$globals2.memAlloc; + var n = data.n, + xAddress = data.xAddress; + var pv_picollm_feed_forward_gelu = exports.pv_picollm_feed_forward_gelu; + var _memAlloc$get2 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get2.workerMemAddress; + pv_picollm_feed_forward_gelu(n, workerXAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var feedForwardAlmostGelu = function feedForwardAlmostGelu(data) { + try { + var _data$globals3 = data.globals, + exports = _data$globals3.exports, + memAlloc = _data$globals3.memAlloc; + var n = data.n, + xAddress = data.xAddress; + var pv_picollm_feed_forward_almost_gelu = exports.pv_picollm_feed_forward_almost_gelu; + var _memAlloc$get3 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get3.workerMemAddress; + pv_picollm_feed_forward_almost_gelu(n, workerXAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var feedForwardMultiplyBuffers = function feedForwardMultiplyBuffers(data) { + try { + var _data$globals4 = data.globals, + exports = _data$globals4.exports, + memAlloc = _data$globals4.memAlloc; + var n = data.n, + xAddress = data.xAddress, + yAddress = data.yAddress; + var pv_picollm_feed_forward_multiply_buffers = exports.pv_picollm_feed_forward_multiply_buffers; + var _memAlloc$get4 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get4.workerMemAddress; + var _memAlloc$get5 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get5.workerMemAddress; + pv_picollm_feed_forward_multiply_buffers(n, workerXAddress, workerYAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + _defineProperty(_defineProperty(_defineProperty(_defineProperty({}, PvPicollmFeedForwardAction.FEED_FORWARD_SILU, feedForwardSilu), PvPicollmFeedForwardAction.FEED_FORWARD_GELU, feedForwardGelu), PvPicollmFeedForwardAction.FEED_FORWARD_ALMOST_GELU, feedForwardAlmostGelu), PvPicollmFeedForwardAction.FEED_FORWARD_MULTIPLY_BUFFERS, feedForwardMultiplyBuffers); + + /* eslint camelcase: 0 */ + var PvPicollmGateAction; + (function (PvPicollmGateAction) { + PvPicollmGateAction[PvPicollmGateAction["GATE_FORWARD"] = 400] = "GATE_FORWARD"; + })(PvPicollmGateAction || (PvPicollmGateAction = {})); + + var getPicollmGateWasmFunctions = function getPicollmGateWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmGateForward = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, n, k, numExperts, indicesAddress, weightsAddress, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + indicesAddress = unsignedAddress(indicesAddress); + weightsAddress = unsignedAddress(weightsAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 9; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 9: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmGateAction.GATE_FORWARD, + n: n, + k: k, + numExperts: numExperts, + indicesAddress: indicesAddress, + weightsAddress: weightsAddress, + yAddress: yAddress + })); + } + _context.next = 13; + return Promise.all(workerResults); + case 13: + setStatus(statusAddress, 0); + case 14: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmGateForward(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8) { + return _ref.apply(this, arguments); + }; + }(); + return { + pv_picollm_gate_forward_web_worker_wasm: pvPicollmGateForward + }; + }; + + var gateForward = function gateForward(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var n = data.n, + k = data.k, + numExperts = data.numExperts, + indicesAddress = data.indicesAddress, + weightsAddress = data.weightsAddress, + yAddress = data.yAddress; + var pv_picollm_gate_forward = exports.pv_picollm_gate_forward; + var _memAlloc$get = memAlloc.get(indicesAddress), + workerIndicesAddress = _memAlloc$get.workerMemAddress; + var _memAlloc$get2 = memAlloc.get(weightsAddress), + workerWeightsAddress = _memAlloc$get2.workerMemAddress; + var _memAlloc$get3 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get3.workerMemAddress; + pv_picollm_gate_forward(n, k, numExperts, workerIndicesAddress, workerWeightsAddress, workerYAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + _defineProperty({}, PvPicollmGateAction.GATE_FORWARD, gateForward); + + /* eslint camelcase: 0 */ + var PvPicollmMoeTransformerAction; + (function (PvPicollmMoeTransformerAction) { + PvPicollmMoeTransformerAction[PvPicollmMoeTransformerAction["ADD_TO_BUFFER"] = 500] = "ADD_TO_BUFFER"; + PvPicollmMoeTransformerAction[PvPicollmMoeTransformerAction["MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER"] = 501] = "MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER"; + PvPicollmMoeTransformerAction[PvPicollmMoeTransformerAction["ADD_BUFFERS"] = 502] = "ADD_BUFFERS"; + })(PvPicollmMoeTransformerAction || (PvPicollmMoeTransformerAction = {})); + + var getPicollmMoeTransformerWasmFunctions = function getPicollmMoeTransformerWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmMoeTransformerAddToBuffer = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, n, xAddress, bufferAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + bufferAddress = unsignedAddress(bufferAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 8; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 8: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmMoeTransformerAction.ADD_TO_BUFFER, + n: n, + xAddress: xAddress, + bufferAddress: bufferAddress + })); + } + _context.next = 12; + return Promise.all(workerResults); + case 12: + setStatus(statusAddress, 0); + case 13: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmMoeTransformerAddToBuffer(_x, _x2, _x3, _x4, _x5) { + return _ref.apply(this, arguments); + }; + }(); + var pvPicollmMoeTransformerMultipleWeightAndAddToBuffer = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(objAddress, n, weightsIndex, yIndex, weightsAddress, xAddress, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + objAddress = unsignedAddress(objAddress); + weightsAddress = unsignedAddress(weightsAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context2.next = 9; + break; + } + setStatus(statusAddress, -1); + return _context2.abrupt("return"); + case 9: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmMoeTransformerAction.MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER, + n: n, + weightsIndex: weightsIndex, + yIndex: yIndex, + weightsAddress: weightsAddress, + xAddress: xAddress, + yAddress: yAddress + })); + } + _context2.next = 13; + return Promise.all(workerResults); + case 13: + setStatus(statusAddress, 0); + case 14: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function pvPicollmMoeTransformerMultipleWeightAndAddToBuffer(_x6, _x7, _x8, _x9, _x10, _x11, _x12, _x13) { + return _ref2.apply(this, arguments); + }; + }(); + var pvPicollmMoeTransformerAddBuffers = /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(objAddress, n, buffer1Address, buffer2Address, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + objAddress = unsignedAddress(objAddress); + buffer1Address = unsignedAddress(buffer1Address); + buffer2Address = unsignedAddress(buffer2Address); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context3.next = 9; + break; + } + setStatus(statusAddress, -1); + return _context3.abrupt("return"); + case 9: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmMoeTransformerAction.ADD_BUFFERS, + n: n, + buffer1Address: buffer1Address, + buffer2Address: buffer2Address, + yAddress: yAddress + })); + } + _context3.next = 13; + return Promise.all(workerResults); + case 13: + setStatus(statusAddress, 0); + case 14: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return function pvPicollmMoeTransformerAddBuffers(_x14, _x15, _x16, _x17, _x18, _x19) { + return _ref3.apply(this, arguments); + }; + }(); + return { + pv_picollm_moe_transformer_add_to_buffer_web_worker_wasm: pvPicollmMoeTransformerAddToBuffer, + pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer_web_worker_wasm: pvPicollmMoeTransformerMultipleWeightAndAddToBuffer, + pv_picollm_moe_transformer_add_buffers_web_worker_wasm: pvPicollmMoeTransformerAddBuffers + }; + }; + + var moeTransformerAddToBuffer = function moeTransformerAddToBuffer(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var n = data.n, + xAddress = data.xAddress, + bufferAddress = data.bufferAddress; + var pv_picollm_moe_transformer_add_to_buffer = exports.pv_picollm_moe_transformer_add_to_buffer; + var _memAlloc$get = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get.workerMemAddress; + var _memAlloc$get2 = memAlloc.get(bufferAddress), + workerBufferAddress = _memAlloc$get2.workerMemAddress; + pv_picollm_moe_transformer_add_to_buffer(n, workerXAddress, workerBufferAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var moeTransformerMultiplyWeightAndAddToBuffer = function moeTransformerMultiplyWeightAndAddToBuffer(data) { + try { + var _data$globals2 = data.globals, + exports = _data$globals2.exports, + memAlloc = _data$globals2.memAlloc; + var n = data.n, + weightsIndex = data.weightsIndex, + yIndex = data.yIndex, + weightsAddress = data.weightsAddress, + xAddress = data.xAddress, + yAddress = data.yAddress; + var pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer = exports.pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer; + var _memAlloc$get3 = memAlloc.get(weightsAddress), + workerWeightsAddress = _memAlloc$get3.workerMemAddress; + var _memAlloc$get4 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get4.workerMemAddress; + var _memAlloc$get5 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get5.workerMemAddress; + pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer(n, weightsIndex, yIndex, workerWeightsAddress, workerXAddress, workerYAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var moeTransformerAddBuffers = function moeTransformerAddBuffers(data) { + try { + var _data$globals3 = data.globals, + exports = _data$globals3.exports, + memAlloc = _data$globals3.memAlloc; + var n = data.n, + buffer1Address = data.buffer1Address, + buffer2Address = data.buffer2Address, + yAddress = data.yAddress; + var pv_picollm_moe_transformer_add_buffers = exports.pv_picollm_moe_transformer_add_buffers; + var _memAlloc$get6 = memAlloc.get(buffer1Address), + workerBuffer1Address = _memAlloc$get6.workerMemAddress; + var _memAlloc$get7 = memAlloc.get(buffer2Address), + workerBuffer2Address = _memAlloc$get7.workerMemAddress; + var _memAlloc$get8 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get8.workerMemAddress; + pv_picollm_moe_transformer_add_buffers(n, workerBuffer1Address, workerBuffer2Address, workerYAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + _defineProperty(_defineProperty(_defineProperty({}, PvPicollmMoeTransformerAction.ADD_TO_BUFFER, moeTransformerAddToBuffer), PvPicollmMoeTransformerAction.MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER, moeTransformerMultiplyWeightAndAddToBuffer), PvPicollmMoeTransformerAction.ADD_BUFFERS, moeTransformerAddBuffers); + + /* eslint camelcase: 0 */ + var PvPicollmNormAction; + (function (PvPicollmNormAction) { + PvPicollmNormAction[PvPicollmNormAction["NORM_FORWARD"] = 600] = "NORM_FORWARD"; + })(PvPicollmNormAction || (PvPicollmNormAction = {})); + + var getPicollmNormWasmFunctions = function getPicollmNormWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmNormForward = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, dimension, eps, weightAddress, n, xOffset, xAddress, yOffset, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + weightAddress = unsignedAddress(weightAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 9; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 9: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmNormAction.NORM_FORWARD, + dimension: dimension, + eps: eps, + weightAddress: weightAddress, + n: n, + xOffset: xOffset, + xAddress: xAddress, + yOffset: yOffset, + yAddress: yAddress + })); + } + _context.next = 13; + return Promise.all(workerResults); + case 13: + setStatus(statusAddress, 0); + case 14: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmNormForward(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9, _x10) { + return _ref.apply(this, arguments); + }; + }(); + return { + pv_picollm_norm_forward_web_worker_wasm: pvPicollmNormForward + }; + }; + + var normForward = function normForward(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var dimension = data.dimension, + eps = data.eps, + weightAddress = data.weightAddress, + n = data.n, + xOffset = data.xOffset, + xAddress = data.xAddress, + yOffset = data.yOffset, + yAddress = data.yAddress; + var pv_picollm_norm_forward = exports.pv_picollm_norm_forward; + var _memAlloc$get = memAlloc.get(weightAddress), + workerWeightAddress = _memAlloc$get.workerMemAddress; + var _memAlloc$get2 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get2.workerMemAddress; + var _memAlloc$get3 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get3.workerMemAddress; + pv_picollm_norm_forward(dimension, eps, workerWeightAddress, n, workerXAddress + xOffset, workerYAddress + yOffset); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + _defineProperty({}, PvPicollmNormAction.NORM_FORWARD, normForward); + + /* eslint camelcase: 0 */ + var PvPicollmNormLayerAction; + (function (PvPicollmNormLayerAction) { + PvPicollmNormLayerAction[PvPicollmNormLayerAction["NORM_LAYER_FORWARD"] = 800] = "NORM_LAYER_FORWARD"; + })(PvPicollmNormLayerAction || (PvPicollmNormLayerAction = {})); + + var getPicollmNormLayerWasmFunctions = function getPicollmNormLayerWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmNormLayerForward = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, dimension, eps, weightAddress, biasAddress, n, xOffset, xAddress, yOffset, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + weightAddress = unsignedAddress(weightAddress); + biasAddress = unsignedAddress(biasAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 10; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 10: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmNormLayerAction.NORM_LAYER_FORWARD, + dimension: dimension, + eps: eps, + weightAddress: weightAddress, + biasAddress: biasAddress, + n: n, + xOffset: xOffset, + xAddress: xAddress, + yOffset: yOffset, + yAddress: yAddress + })); + } + _context.next = 14; + return Promise.all(workerResults); + case 14: + setStatus(statusAddress, 0); + case 15: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmNormLayerForward(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9, _x10, _x11) { + return _ref.apply(this, arguments); + }; + }(); + return { + pv_picollm_norm_layer_forward_web_worker_wasm: pvPicollmNormLayerForward + }; + }; + + var normLayerForward = function normLayerForward(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var dimension = data.dimension, + eps = data.eps, + weightAddress = data.weightAddress, + biasAddress = data.biasAddress, + n = data.n, + xOffset = data.xOffset, + xAddress = data.xAddress, + yOffset = data.yOffset, + yAddress = data.yAddress; + var pv_picollm_norm_layer_forward = exports.pv_picollm_norm_layer_forward; + var _memAlloc$get = memAlloc.get(weightAddress), + workerWeightAddress = _memAlloc$get.workerMemAddress; + var _memAlloc$get2 = memAlloc.get(biasAddress), + workerBiasAddress = _memAlloc$get2.workerMemAddress; + var _memAlloc$get3 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get3.workerMemAddress; + var _memAlloc$get4 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get4.workerMemAddress; + pv_picollm_norm_layer_forward(dimension, eps, workerWeightAddress, workerBiasAddress, n, workerXAddress + xOffset, workerYAddress + yOffset); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + _defineProperty({}, PvPicollmNormLayerAction.NORM_LAYER_FORWARD, normLayerForward); + + /* eslint camelcase: 0 */ + var PvPicollmTransformerAction; + (function (PvPicollmTransformerAction) { + PvPicollmTransformerAction[PvPicollmTransformerAction["ADD_TO_BUFFER"] = 700] = "ADD_TO_BUFFER"; + PvPicollmTransformerAction[PvPicollmTransformerAction["ADD_BUFFERS"] = 701] = "ADD_BUFFERS"; + })(PvPicollmTransformerAction || (PvPicollmTransformerAction = {})); + + var getPicollmTransformerWasmFunctions = function getPicollmTransformerWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmTransformerAddToBuffer = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, n, xAddress, bufferAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + xAddress = unsignedAddress(xAddress); + bufferAddress = unsignedAddress(bufferAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 8; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 8: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmTransformerAction.ADD_TO_BUFFER, + n: n, + xAddress: xAddress, + bufferAddress: bufferAddress + })); + } + _context.next = 12; + return Promise.all(workerResults); + case 12: + setStatus(statusAddress, 0); + case 13: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmTransformerAddToBuffer(_x, _x2, _x3, _x4, _x5) { + return _ref.apply(this, arguments); + }; + }(); + var pvPicollmTransformerAddBuffers = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(objAddress, n, buffer1Address, buffer2Address, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + objAddress = unsignedAddress(objAddress); + buffer1Address = unsignedAddress(buffer1Address); + buffer2Address = unsignedAddress(buffer2Address); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context2.next = 9; + break; + } + setStatus(statusAddress, -1); + return _context2.abrupt("return"); + case 9: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmTransformerAction.ADD_BUFFERS, + n: n, + buffer1Address: buffer1Address, + buffer2Address: buffer2Address, + yAddress: yAddress + })); + } + _context2.next = 13; + return Promise.all(workerResults); + case 13: + setStatus(statusAddress, 0); + case 14: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function pvPicollmTransformerAddBuffers(_x6, _x7, _x8, _x9, _x10, _x11) { + return _ref2.apply(this, arguments); + }; + }(); + return { + pv_picollm_transformer_add_to_buffer_web_worker_wasm: pvPicollmTransformerAddToBuffer, + pv_picollm_transformer_add_buffers_web_worker_wasm: pvPicollmTransformerAddBuffers + }; + }; + + var transformerAddToBuffer = function transformerAddToBuffer(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc; + var n = data.n, + xAddress = data.xAddress, + bufferAddress = data.bufferAddress; + var pv_picollm_transformer_add_to_buffer = exports.pv_picollm_transformer_add_to_buffer; + var _memAlloc$get = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get.workerMemAddress; + var _memAlloc$get2 = memAlloc.get(bufferAddress), + workerBufferAddress = _memAlloc$get2.workerMemAddress; + pv_picollm_transformer_add_to_buffer(n, workerXAddress, workerBufferAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var transformerAddBuffers = function transformerAddBuffers(data) { + try { + var _data$globals2 = data.globals, + exports = _data$globals2.exports, + memAlloc = _data$globals2.memAlloc; + var n = data.n, + buffer1Address = data.buffer1Address, + buffer2Address = data.buffer2Address, + yAddress = data.yAddress; + var pv_picollm_transformer_add_buffers = exports.pv_picollm_transformer_add_buffers; + var _memAlloc$get3 = memAlloc.get(buffer1Address), + workerBuffer1Address = _memAlloc$get3.workerMemAddress; + var _memAlloc$get4 = memAlloc.get(buffer2Address), + workerBuffer2Address = _memAlloc$get4.workerMemAddress; + var _memAlloc$get5 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get5.workerMemAddress; + pv_picollm_transformer_add_buffers(n, workerBuffer1Address, workerBuffer2Address, workerYAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + _defineProperty(_defineProperty({}, PvPicollmTransformerAction.ADD_TO_BUFFER, transformerAddToBuffer), PvPicollmTransformerAction.ADD_BUFFERS, transformerAddBuffers); + + /* eslint camelcase: 0 */ + var PvPicollmWeightAction; + (function (PvPicollmWeightAction) { + PvPicollmWeightAction[PvPicollmWeightAction["WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS"] = 100] = "WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS"; + PvPicollmWeightAction[PvPicollmWeightAction["WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE"] = 101] = "WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE"; + PvPicollmWeightAction[PvPicollmWeightAction["WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE"] = 102] = "WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE"; + PvPicollmWeightAction[PvPicollmWeightAction["WEIGHT_BLOCK_MIXED_16X8_ADD_BIAS"] = 103] = "WEIGHT_BLOCK_MIXED_16X8_ADD_BIAS"; + PvPicollmWeightAction[PvPicollmWeightAction["WEIGHT_FLOAT_FORWARD"] = 104] = "WEIGHT_FLOAT_FORWARD"; + })(PvPicollmWeightAction || (PvPicollmWeightAction = {})); + + var getPicollmWeightWasmFunctions = function getPicollmWeightWasmFunctions(memory) { + var setStatus = function setStatus(statusAddress, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[statusAddress / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvPicollmWeightBlockMixed16x8PreprocessBlocks = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(objAddress, shapeAddress, numBitDepths, bitDepthsAddress, bitDepthsStartAddress, numBlockBytes, blocksAddress, statusAddress) { + var obj, memoryBufferInt32, shape, bitDepths, bitDepthStarts, workerResults, i; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + objAddress = unsignedAddress(objAddress); + shapeAddress = unsignedAddress(shapeAddress); + bitDepthsAddress = unsignedAddress(bitDepthsAddress); + bitDepthsStartAddress = unsignedAddress(bitDepthsStartAddress); + blocksAddress = unsignedAddress(blocksAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context.next = 10; + break; + } + setStatus(statusAddress, -1); + return _context.abrupt("return"); + case 10: + memoryBufferInt32 = new Int32Array(memory.buffer); + shape = memoryBufferInt32.slice(shapeAddress / Int32Array.BYTES_PER_ELEMENT, shapeAddress / Int32Array.BYTES_PER_ELEMENT + 2); + bitDepths = memoryBufferInt32.slice(bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT, bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT + numBitDepths); + bitDepthStarts = memoryBufferInt32.slice(bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT, bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT + numBitDepths); + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS, + shape: shape, + bitDepths: bitDepths, + bitDepthStarts: bitDepthStarts, + numBlockBytes: numBlockBytes, + blocksAddress: blocksAddress + })); + } + _context.next = 18; + return Promise.all(workerResults); + case 18: + setStatus(statusAddress, 0); + case 19: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvPicollmWeightBlockMixed16x8PreprocessBlocks(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8) { + return _ref.apply(this, arguments); + }; + }(); + var pvPicollmWeightBlockMixed16x8ForwardSingle = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(objAddress, shapeAddress, indicesAddress, numBitDepths, bitDepthsStartAddress, bitDepthsAddress, numMetas, metasAddress, numBlockBytes, blocksAddress, xOffset, xAddress, yAddress, statusAddress) { + var obj, memoryBufferInt32, shape, bitDepthStarts, bitDepths, workerResults, i; + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + objAddress = unsignedAddress(objAddress); + shapeAddress = unsignedAddress(shapeAddress); + indicesAddress = unsignedAddress(indicesAddress); + bitDepthsStartAddress = unsignedAddress(bitDepthsStartAddress); + bitDepthsAddress = unsignedAddress(bitDepthsAddress); + metasAddress = unsignedAddress(metasAddress); + blocksAddress = unsignedAddress(blocksAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context2.next = 14; + break; + } + setStatus(statusAddress, -1); + return _context2.abrupt("return"); + case 14: + memoryBufferInt32 = new Int32Array(memory.buffer); + shape = memoryBufferInt32.slice(shapeAddress / Int32Array.BYTES_PER_ELEMENT, shapeAddress / Int32Array.BYTES_PER_ELEMENT + 2); + bitDepthStarts = memoryBufferInt32.slice(bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT, bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT + numBitDepths); + bitDepths = memoryBufferInt32.slice(bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT, bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT + numBitDepths); + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE, + shape: shape, + indicesAddress: indicesAddress, + bitDepthStarts: bitDepthStarts, + bitDepths: bitDepths, + numMetas: numMetas, + metasAddress: metasAddress, + numBlockBytes: numBlockBytes, + blocksAddress: blocksAddress, + xOffset: xOffset, + xAddress: xAddress, + yAddress: yAddress + })); + } + _context2.next = 22; + return Promise.all(workerResults); + case 22: + setStatus(statusAddress, 0); + case 23: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function pvPicollmWeightBlockMixed16x8ForwardSingle(_x9, _x10, _x11, _x12, _x13, _x14, _x15, _x16, _x17, _x18, _x19, _x20, _x21, _x22) { + return _ref2.apply(this, arguments); + }; + }(); + var pvPicollmWeightBlockMixed16x8ForwardMultiple = /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(objAddress, shapeAddress, indicesAddress, numBitDepths, bitDepthsStartAddress, bitDepthsAddress, numMetas, metasAddress, numBlockBytes, blocksAddress, n, xOffset, xAddress, yAddress, statusAddress) { + var obj, memoryBufferInt32, shape, bitDepthStarts, bitDepths, workerResults, i; + return _regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + objAddress = unsignedAddress(objAddress); + shapeAddress = unsignedAddress(shapeAddress); + indicesAddress = unsignedAddress(indicesAddress); + bitDepthsStartAddress = unsignedAddress(bitDepthsStartAddress); + bitDepthsAddress = unsignedAddress(bitDepthsAddress); + metasAddress = unsignedAddress(metasAddress); + blocksAddress = unsignedAddress(blocksAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context3.next = 14; + break; + } + setStatus(statusAddress, -1); + return _context3.abrupt("return"); + case 14: + memoryBufferInt32 = new Int32Array(memory.buffer); + shape = memoryBufferInt32.slice(shapeAddress / Int32Array.BYTES_PER_ELEMENT, shapeAddress / Int32Array.BYTES_PER_ELEMENT + 2); + bitDepthStarts = memoryBufferInt32.slice(bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT, bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT + numBitDepths); + bitDepths = memoryBufferInt32.slice(bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT, bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT + numBitDepths); + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE, + shape: shape, + indicesAddress: indicesAddress, + bitDepthStarts: bitDepthStarts, + bitDepths: bitDepths, + numMetas: numMetas, + metasAddress: metasAddress, + numBlockBytes: numBlockBytes, + blocksAddress: blocksAddress, + n: n, + xOffset: xOffset, + xAddress: xAddress, + yAddress: yAddress + })); + } + _context3.next = 22; + return Promise.all(workerResults); + case 22: + setStatus(statusAddress, 0); + case 23: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return function pvPicollmWeightBlockMixed16x8ForwardMultiple(_x23, _x24, _x25, _x26, _x27, _x28, _x29, _x30, _x31, _x32, _x33, _x34, _x35, _x36, _x37) { + return _ref3.apply(this, arguments); + }; + }(); + var pvPicollmWeightBlockMixed16x8AddBias = /*#__PURE__*/function () { + var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(objAddress, n, dimension, yAddress, biasAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + objAddress = unsignedAddress(objAddress); + yAddress = unsignedAddress(yAddress); + biasAddress = unsignedAddress(biasAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context4.next = 8; + break; + } + setStatus(statusAddress, -1); + return _context4.abrupt("return"); + case 8: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_ADD_BIAS, + n: n, + dimension: dimension, + yAddress: yAddress, + biasAddress: biasAddress + })); + } + _context4.next = 12; + return Promise.all(workerResults); + case 12: + setStatus(statusAddress, 0); + case 13: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + return function pvPicollmWeightBlockMixed16x8AddBias(_x38, _x39, _x40, _x41, _x42, _x43) { + return _ref4.apply(this, arguments); + }; + }(); + var pvPicollmWeightFloatForward = /*#__PURE__*/function () { + var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(objAddress, n, nc, nr, wAddress, xOffset, xAddress, yAddress, statusAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) switch (_context5.prev = _context5.next) { + case 0: + objAddress = unsignedAddress(objAddress); + wAddress = unsignedAddress(wAddress); + xAddress = unsignedAddress(xAddress); + yAddress = unsignedAddress(yAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context5.next = 9; + break; + } + setStatus(statusAddress, -1); + return _context5.abrupt("return"); + case 9: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvPicollmWeightAction.WEIGHT_FLOAT_FORWARD, + n: n, + nc: nc, + nr: nr, + wAddress: wAddress, + xOffset: xOffset, + xAddress: xAddress, + yAddress: yAddress + })); + } + _context5.next = 13; + return Promise.all(workerResults); + case 13: + setStatus(statusAddress, 0); + case 14: + case "end": + return _context5.stop(); + } + }, _callee5); + })); + return function pvPicollmWeightFloatForward(_x44, _x45, _x46, _x47, _x48, _x49, _x50, _x51, _x52) { + return _ref5.apply(this, arguments); + }; + }(); + return { + pv_picollm_weight_block_mixed_16x8_preprocess_blocks_web_worker_wasm: pvPicollmWeightBlockMixed16x8PreprocessBlocks, + pv_picollm_weight_block_mixed_16x8_forward_single_web_worker_wasm: pvPicollmWeightBlockMixed16x8ForwardSingle, + pv_picollm_weight_block_mixed_16x8_forward_multiple_web_worker_wasm: pvPicollmWeightBlockMixed16x8ForwardMultiple, + pv_picollm_weight_block_mixed_16x8_add_bias_web_worker_wasm: pvPicollmWeightBlockMixed16x8AddBias, + pv_picollm_weight_float_forward_web_worker_wasm: pvPicollmWeightFloatForward + }; + }; + + var weightBlockMixed16x8PreprocessBlocks = function weightBlockMixed16x8PreprocessBlocks(data) { + try { + var _data$globals = data.globals, + exports = _data$globals.exports, + memAlloc = _data$globals.memAlloc, + memory = _data$globals.memory; + var shape = data.shape, + bitDepths = data.bitDepths, + bitDepthStarts = data.bitDepthStarts, + blocksAddress = data.blocksAddress; + var aligned_alloc = exports.aligned_alloc, + free = exports.free, + pv_picollm_weight_block_mixed_16x8_preprocess_blocks = exports.pv_picollm_weight_block_mixed_16x8_preprocess_blocks; + if (!memAlloc.has(blocksAddress)) { + self.postMessage({ + command: 'ok' + }); + return; + } + var _memAlloc$get = memAlloc.get(blocksAddress), + workerBlocksAddress = _memAlloc$get.workerMemAddress; + var shapeAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * shape.length); + var bitDepthsAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * bitDepths.length); + var bitDepthsStartAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * bitDepthStarts.length); + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32.set(shape, shapeAddress / Int32Array.BYTES_PER_ELEMENT); + memoryBufferInt32.set(bitDepths, bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT); + memoryBufferInt32.set(bitDepthStarts, bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT); + pv_picollm_weight_block_mixed_16x8_preprocess_blocks(shapeAddress, bitDepths.length, bitDepthsAddress, bitDepthsStartAddress, workerBlocksAddress); + free(shapeAddress); + free(bitDepthsAddress); + free(bitDepthsStartAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var weightBlockMixed16x8ForwardSingle = function weightBlockMixed16x8ForwardSingle(data) { + try { + var _data$globals2 = data.globals, + exports = _data$globals2.exports, + memAlloc = _data$globals2.memAlloc, + memory = _data$globals2.memory; + var shape = data.shape, + indicesAddress = data.indicesAddress, + bitDepthStarts = data.bitDepthStarts, + bitDepths = data.bitDepths, + metasAddress = data.metasAddress, + blocksAddress = data.blocksAddress, + xOffset = data.xOffset, + xAddress = data.xAddress, + yAddress = data.yAddress; + var aligned_alloc = exports.aligned_alloc, + free = exports.free, + pv_picollm_weight_block_mixed_16x8_forward_single = exports.pv_picollm_weight_block_mixed_16x8_forward_single; + if (!memAlloc.has(metasAddress) || !memAlloc.has(blocksAddress) || !memAlloc.has(xAddress) || !memAlloc.has(yAddress) || !memAlloc.has(indicesAddress)) { + self.postMessage({ + command: 'ok' + }); + return; + } + var _memAlloc$get2 = memAlloc.get(indicesAddress), + workerIndicesAddress = _memAlloc$get2.workerMemAddress; + var _memAlloc$get3 = memAlloc.get(metasAddress), + workerMetasAddress = _memAlloc$get3.workerMemAddress; + var _memAlloc$get4 = memAlloc.get(blocksAddress), + workerBlocksAddress = _memAlloc$get4.workerMemAddress; + var _memAlloc$get5 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get5.workerMemAddress; + var _memAlloc$get6 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get6.workerMemAddress; + var shapeAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * shape.length); + var bitDepthsStartAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * bitDepthStarts.length); + var bitDepthsAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * bitDepths.length); + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32.set(shape, shapeAddress / Int32Array.BYTES_PER_ELEMENT); + memoryBufferInt32.set(bitDepthStarts, bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT); + memoryBufferInt32.set(bitDepths, bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT); + pv_picollm_weight_block_mixed_16x8_forward_single(shapeAddress, workerIndicesAddress, bitDepths.length, bitDepthsStartAddress, bitDepthsAddress, workerMetasAddress, workerBlocksAddress, workerXAddress + xOffset, workerYAddress); + free(shapeAddress); + free(bitDepthsStartAddress); + free(bitDepthsAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var weightBlockMixed16x8ForwardMultiple = function weightBlockMixed16x8ForwardMultiple(data) { + try { + var _data$globals3 = data.globals, + exports = _data$globals3.exports, + memAlloc = _data$globals3.memAlloc, + memory = _data$globals3.memory; + var shape = data.shape, + indicesAddress = data.indicesAddress, + bitDepthStarts = data.bitDepthStarts, + bitDepths = data.bitDepths, + metasAddress = data.metasAddress, + blocksAddress = data.blocksAddress, + n = data.n, + xOffset = data.xOffset, + xAddress = data.xAddress, + yAddress = data.yAddress; + var aligned_alloc = exports.aligned_alloc, + free = exports.free, + pv_picollm_weight_block_mixed_16x8_forward_multiple = exports.pv_picollm_weight_block_mixed_16x8_forward_multiple; + if (!memAlloc.has(metasAddress) || !memAlloc.has(blocksAddress) || !memAlloc.has(xAddress) || !memAlloc.has(yAddress) || !memAlloc.has(indicesAddress)) { + self.postMessage({ + command: 'ok' + }); + return; + } + var _memAlloc$get7 = memAlloc.get(indicesAddress), + workerIndicesAddress = _memAlloc$get7.workerMemAddress; + var _memAlloc$get8 = memAlloc.get(metasAddress), + workerMetasAddress = _memAlloc$get8.workerMemAddress; + var _memAlloc$get9 = memAlloc.get(blocksAddress), + workerBlocksAddress = _memAlloc$get9.workerMemAddress; + var _memAlloc$get10 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get10.workerMemAddress; + var _memAlloc$get11 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get11.workerMemAddress; + var shapeAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * shape.length); + var bitDepthsStartAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * bitDepthStarts.length); + var bitDepthsAddress = aligned_alloc(Int32Array.BYTES_PER_ELEMENT, Int32Array.BYTES_PER_ELEMENT * bitDepths.length); + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32.set(shape, shapeAddress / Int32Array.BYTES_PER_ELEMENT); + memoryBufferInt32.set(bitDepthStarts, bitDepthsStartAddress / Int32Array.BYTES_PER_ELEMENT); + memoryBufferInt32.set(bitDepths, bitDepthsAddress / Int32Array.BYTES_PER_ELEMENT); + pv_picollm_weight_block_mixed_16x8_forward_multiple(shapeAddress, workerIndicesAddress, bitDepths.length, bitDepthsStartAddress, bitDepthsAddress, workerMetasAddress, workerBlocksAddress, n, workerXAddress + xOffset, workerYAddress); + free(shapeAddress); + free(bitDepthsStartAddress); + free(bitDepthsAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var weightBlockMixed16x8AddBias = function weightBlockMixed16x8AddBias(data) { + try { + var _data$globals4 = data.globals, + exports = _data$globals4.exports, + memAlloc = _data$globals4.memAlloc; + var n = data.n, + dimension = data.dimension, + yAddress = data.yAddress, + biasAddress = data.biasAddress; + var free = exports.free, + pv_picollm_weight_block_mixed_16x8_add_bias = exports.pv_picollm_weight_block_mixed_16x8_add_bias; + if (!memAlloc.has(yAddress) || !memAlloc.has(biasAddress)) { + self.postMessage({ + command: 'ok' + }); + return; + } + var _memAlloc$get12 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get12.workerMemAddress; + var _memAlloc$get13 = memAlloc.get(biasAddress), + workerBiasAddress = _memAlloc$get13.workerMemAddress; + pv_picollm_weight_block_mixed_16x8_add_bias(n, dimension, workerYAddress, workerBiasAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + var weightFloatForward = function weightFloatForward(data) { + try { + var _data$globals5 = data.globals, + exports = _data$globals5.exports, + memAlloc = _data$globals5.memAlloc; + var n = data.n, + nc = data.nc, + nr = data.nr, + wAddress = data.wAddress, + xOffset = data.xOffset, + xAddress = data.xAddress, + yAddress = data.yAddress; + var pv_picollm_weight_float_forward = exports.pv_picollm_weight_float_forward; + if (!memAlloc.has(wAddress) || !memAlloc.has(xAddress) || !memAlloc.has(yAddress)) { + self.postMessage({ + command: 'ok' + }); + return; + } + var _memAlloc$get14 = memAlloc.get(wAddress), + workerWAddress = _memAlloc$get14.workerMemAddress; + var _memAlloc$get15 = memAlloc.get(xAddress), + workerXAddress = _memAlloc$get15.workerMemAddress; + var _memAlloc$get16 = memAlloc.get(yAddress), + workerYAddress = _memAlloc$get16.workerMemAddress; + pv_picollm_weight_float_forward(n, nc, nr, workerWAddress, workerXAddress + xOffset, workerYAddress); + self.postMessage({ + command: 'ok' + }); + } catch (e) { + self.postMessage({ + command: 'error', + message: e.message + }); + } + }; + _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_PREPROCESS_BLOCKS, weightBlockMixed16x8PreprocessBlocks), PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_FORWARD_SINGLE, weightBlockMixed16x8ForwardSingle), PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_FORWARD_MULTIPLE, weightBlockMixed16x8ForwardMultiple), PvPicollmWeightAction.WEIGHT_BLOCK_MIXED_16X8_ADD_BIAS, weightBlockMixed16x8AddBias), PvPicollmWeightAction.WEIGHT_FLOAT_FORWARD, weightFloatForward); + + function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } + function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } + function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } + function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } + var initXpu = function initXpu(memory, xpuHelperWasm) { + var setInt = function setInt(address, value) { + var memoryBufferInt32 = new Int32Array(memory.buffer); + memoryBufferInt32[address / Int32Array.BYTES_PER_ELEMENT] = value; + }; + var pvXpuDeviceInfo = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(browserNameAddressAddress, browserVersionAddressAddress, osNameAddressAddress, numCoresAddress, statusAddress) { + var aligned_alloc, uaParser, memoryBufferUint8, browserName, browserNameAddress, i, browserVersion, browserVersionAddress, _i, osName, osNameAddress, _i2, numCores; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + browserNameAddressAddress = unsignedAddress(browserNameAddressAddress); + browserVersionAddressAddress = unsignedAddress(browserVersionAddressAddress); + osNameAddressAddress = unsignedAddress(osNameAddressAddress); + numCoresAddress = unsignedAddress(numCoresAddress); + statusAddress = unsignedAddress(statusAddress); + aligned_alloc = imports.aligned_alloc; + uaParser = Bowser.getParser(navigator.userAgent); + memoryBufferUint8 = new Uint8Array(memory.buffer); + browserName = uaParser.getBrowserName(); + _context.next = 11; + return aligned_alloc(Uint8Array.BYTES_PER_ELEMENT, (browserName.length + 1) * Uint8Array.BYTES_PER_ELEMENT); + case 11: + browserNameAddress = _context.sent; + if (!(browserNameAddress === 0)) { + _context.next = 15; + break; + } + setInt(statusAddress, -1); + return _context.abrupt("return"); + case 15: + setInt(browserNameAddressAddress, browserNameAddress); + for (i = 0; i < browserName.length; i++) { + memoryBufferUint8[browserNameAddress + i] = browserName.charCodeAt(i); + } + memoryBufferUint8[browserNameAddress + browserName.length] = 0; + browserVersion = uaParser.getBrowserVersion(); + _context.next = 21; + return aligned_alloc(Uint8Array.BYTES_PER_ELEMENT, (browserVersion.length + 1) * Uint8Array.BYTES_PER_ELEMENT); + case 21: + browserVersionAddress = _context.sent; + if (!(browserVersionAddress === 0)) { + _context.next = 25; + break; + } + setInt(statusAddress, -1); + return _context.abrupt("return"); + case 25: + setInt(browserVersionAddressAddress, browserVersionAddress); + for (_i = 0; _i < browserVersion.length; _i++) { + memoryBufferUint8[browserVersionAddress + _i] = browserVersion.charCodeAt(_i); + } + memoryBufferUint8[browserVersionAddress + browserVersion.length] = 0; + osName = uaParser.getOSName(); + _context.next = 31; + return aligned_alloc(Uint8Array.BYTES_PER_ELEMENT, (osName.length + 1) * Uint8Array.BYTES_PER_ELEMENT); + case 31: + osNameAddress = _context.sent; + if (!(osNameAddress === 0)) { + _context.next = 35; + break; + } + setInt(statusAddress, -1); + return _context.abrupt("return"); + case 35: + setInt(osNameAddressAddress, osNameAddress); + for (_i2 = 0; _i2 < osName.length; _i2++) { + memoryBufferUint8[osNameAddress + _i2] = osName.charCodeAt(_i2); + } + memoryBufferUint8[osNameAddress + osName.length] = 0; + numCores = window.navigator.hardwareConcurrency; + setInt(numCoresAddress, numCores ? numCores : 1); + setInt(statusAddress, 0); + case 41: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function pvXpuDeviceInfo(_x, _x2, _x3, _x4, _x5) { + return _ref.apply(this, arguments); + }; + }(); + var pvXpuDeviceInit = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(objAddress, numWorkers, statusAddress) { + var osWorkers, workerSize, workers, i, worker; + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + objAddress = unsignedAddress(objAddress); + statusAddress = unsignedAddress(statusAddress); + if (xpuHelperWasm) { + _context2.next = 5; + break; + } + setInt(statusAddress, -1); + return _context2.abrupt("return"); + case 5: + osWorkers = window.navigator.hardwareConcurrency; + workerSize = osWorkers && osWorkers < numWorkers ? osWorkers : numWorkers; + workers = []; + i = 0; + case 9: + if (!(i < workerSize)) { + _context2.next = 17; + break; + } + worker = new WorkerFactory(); + workers.push(worker); + _context2.next = 14; + return waitForWorker(worker, { + action: PvXpuAction.INIT, + wasm: xpuHelperWasm + }); + case 14: + i++; + _context2.next = 9; + break; + case 17: + PvXpu.addXpu(objAddress, { + deviceMem: new Set(), + numWorkers: workerSize, + workers: workers + }); + setInt(statusAddress, 0); + case 19: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + return function pvXpuDeviceInit(_x6, _x7, _x8) { + return _ref2.apply(this, arguments); + }; + }(); + var pvXpuDeviceCleanup = function pvXpuDeviceCleanup(objAddress) { + objAddress = unsignedAddress(objAddress); + var obj = PvXpu.getXpu(objAddress); + if (!obj) { + return; + } + var _iterator = _createForOfIteratorHelper(obj.workers), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var worker = _step.value; + worker.terminate(); + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + PvXpu.removeXpu(objAddress); + }; + var pvXpuDeviceMemAlloc = /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(objAddress, memAddress, sizeBytes, batchSize, isShared, statusAddress) { + var obj, batch, shared, chunkSize, remaining, workerResults, i; + return _regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + objAddress = unsignedAddress(objAddress); + memAddress = unsignedAddress(memAddress); + statusAddress = unsignedAddress(statusAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context3.next = 7; + break; + } + setInt(statusAddress, -1); + return _context3.abrupt("return"); + case 7: + batch = batchSize === 0 ? obj.numWorkers : batchSize; + shared = isShared === 1; + if (!(!shared && sizeBytes % batch !== 0)) { + _context3.next = 13; + break; + } + setInt(statusAddress, -1); + console.error("Failed to allocate memory: alloc size ".concat(sizeBytes, " must be divisible by batch ").concat(batch, ".")); + return _context3.abrupt("return"); + case 13: + chunkSize = Math.ceil(sizeBytes / batch / obj.numWorkers) * batch; + remaining = sizeBytes; + workerResults = []; + i = 0; + case 17: + if (!(i < obj.numWorkers)) { + _context3.next = 29; + break; + } + if (!shared) { + _context3.next = 22; + break; + } + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.ALLOC, + size: sizeBytes, + memAddress: memAddress + })); + _context3.next = 26; + break; + case 22: + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.ALLOC, + size: Math.min(remaining, chunkSize), + memAddress: memAddress + })); + remaining -= chunkSize; + if (!(remaining <= 0)) { + _context3.next = 26; + break; + } + return _context3.abrupt("break", 29); + case 26: + i++; + _context3.next = 17; + break; + case 29: + _context3.next = 31; + return Promise.all(workerResults); + case 31: + PvXpu.addMemory(memAddress, { + objAddress: objAddress, + isShared: shared, + allocSize: sizeBytes, + chunkSize: chunkSize + }); + setInt(statusAddress, 0); + case 33: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return function pvXpuDeviceMemAlloc(_x9, _x10, _x11, _x12, _x13, _x14) { + return _ref3.apply(this, arguments); + }; + }(); + var pvXpuDeviceMemFree = /*#__PURE__*/function () { + var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(memAddress) { + var _PvXpu$getMemory, objAddress, obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + memAddress = unsignedAddress(memAddress); + if (!PvXpu.hasMemory(memAddress)) { + _context4.next = 9; + break; + } + _PvXpu$getMemory = PvXpu.getMemory(memAddress), objAddress = _PvXpu$getMemory.objAddress; + obj = PvXpu.getXpu(objAddress); + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.FREE, + memAddress: memAddress + })); + } + _context4.next = 8; + return Promise.all(workerResults); + case 8: + PvXpu.removeMemory(memAddress); + case 9: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + return function pvXpuDeviceMemFree(_x15) { + return _ref4.apply(this, arguments); + }; + }(); + var pvXpuDeviceMemCopyToXpu = /*#__PURE__*/function () { + var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(memAddress, hostAddress, offset, sizeBytes) { + var mem, objAddress, isShared, chunkSize, obj, buffer, workerResults, remaining, i, chunkStart, chunkEnd, inChunkOffset, inChunkSize, inChunkBufferStart; + return _regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) switch (_context5.prev = _context5.next) { + case 0: + memAddress = unsignedAddress(memAddress); + hostAddress = unsignedAddress(hostAddress); + mem = PvXpu.getMemory(memAddress); + if (mem) { + _context5.next = 5; + break; + } + return _context5.abrupt("return"); + case 5: + objAddress = mem.objAddress, isShared = mem.isShared, chunkSize = mem.chunkSize; + obj = PvXpu.getXpu(objAddress); + buffer = new Uint8Array(memory.buffer).slice(hostAddress, hostAddress + sizeBytes); + workerResults = []; + remaining = sizeBytes; + i = 0; + case 11: + if (!(i < obj.numWorkers)) { + _context5.next = 24; + break; + } + if (!isShared) { + _context5.next = 16; + break; + } + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.COPY_TO_XPU, + memAddress: memAddress, + offset: offset, + buffer: buffer + })); + _context5.next = 21; + break; + case 16: + chunkStart = i * chunkSize; + chunkEnd = (i + 1) * chunkSize; + if (offset < chunkEnd) { + inChunkOffset = offset > chunkStart ? offset - chunkStart : 0; + inChunkSize = chunkSize - inChunkOffset; + inChunkBufferStart = sizeBytes - remaining; + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.COPY_TO_XPU, + memAddress: memAddress, + offset: inChunkOffset, + buffer: buffer.slice(inChunkBufferStart, inChunkBufferStart + inChunkSize) + })); + remaining -= inChunkSize; + } + if (!(remaining <= 0)) { + _context5.next = 21; + break; + } + return _context5.abrupt("break", 24); + case 21: + i++; + _context5.next = 11; + break; + case 24: + _context5.next = 26; + return Promise.all(workerResults); + case 26: + case "end": + return _context5.stop(); + } + }, _callee5); + })); + return function pvXpuDeviceMemCopyToXpu(_x16, _x17, _x18, _x19) { + return _ref5.apply(this, arguments); + }; + }(); + var pvXpuDeviceMemCopyFromXpu = /*#__PURE__*/function () { + var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6(memAddress, hostAddress, offset, sizeBytes) { + var mem, objAddress, allocSize, isShared, chunkSize, obj, memoryBufferUint8, workerResults, remaining, i, chunkStart, chunkEnd, inChunkOffset, inChunkSize, results, copied, _i3, result; + return _regeneratorRuntime.wrap(function _callee6$(_context6) { + while (1) switch (_context6.prev = _context6.next) { + case 0: + memAddress = unsignedAddress(memAddress); + hostAddress = unsignedAddress(hostAddress); + mem = PvXpu.getMemory(memAddress); + if (mem) { + _context6.next = 5; + break; + } + return _context6.abrupt("return"); + case 5: + objAddress = mem.objAddress, allocSize = mem.allocSize, isShared = mem.isShared, chunkSize = mem.chunkSize; + obj = PvXpu.getXpu(objAddress); + memoryBufferUint8 = new Uint8Array(memory.buffer); + workerResults = []; + if (!isShared) { + _context6.next = 13; + break; + } + workerResults.push(waitForWorker(obj.workers[0], { + action: PvXpuAction.COPY_FROM_XPU, + memAddress: memAddress, + offset: offset, + size: allocSize + })); + _context6.next = 24; + break; + case 13: + remaining = allocSize; + i = 0; + case 15: + if (!(i < obj.numWorkers)) { + _context6.next = 24; + break; + } + chunkStart = i * chunkSize; + chunkEnd = (i + 1) * chunkSize; + if (offset < chunkEnd) { + inChunkOffset = offset > chunkStart ? offset - chunkStart : 0; + inChunkSize = Math.min(remaining, chunkSize - inChunkOffset); + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.COPY_FROM_XPU, + memAddress: memAddress, + offset: inChunkOffset, + size: inChunkSize + })); + remaining -= inChunkSize; + } + if (!(remaining === 0)) { + _context6.next = 21; + break; + } + return _context6.abrupt("break", 24); + case 21: + i++; + _context6.next = 15; + break; + case 24: + _context6.next = 26; + return Promise.all(workerResults); + case 26: + results = _context6.sent; + copied = 0; + _i3 = 0; + case 29: + if (!(_i3 < results.length)) { + _context6.next = 41; + break; + } + result = results[_i3]; + if (!(copied + result.length > sizeBytes)) { + _context6.next = 36; + break; + } + memoryBufferUint8.set(result.slice(0, sizeBytes - copied), hostAddress + copied); + return _context6.abrupt("break", 41); + case 36: + memoryBufferUint8.set(result, hostAddress + copied); + copied += result.length; + case 38: + _i3++; + _context6.next = 29; + break; + case 41: + case "end": + return _context6.stop(); + } + }, _callee6); + })); + return function pvXpuDeviceMemCopyFromXpu(_x20, _x21, _x22, _x23) { + return _ref6.apply(this, arguments); + }; + }(); + var pvXpuDeviceMemMemset = /*#__PURE__*/function () { + var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7(memAddress, fillByte, sizeBytes) { + var mem, objAddress, allocSize, isShared, chunkSize, obj, workerResults, remaining, i; + return _regeneratorRuntime.wrap(function _callee7$(_context7) { + while (1) switch (_context7.prev = _context7.next) { + case 0: + memAddress = unsignedAddress(memAddress); + mem = PvXpu.getMemory(memAddress); + if (mem) { + _context7.next = 4; + break; + } + return _context7.abrupt("return"); + case 4: + objAddress = mem.objAddress, allocSize = mem.allocSize, isShared = mem.isShared, chunkSize = mem.chunkSize; + obj = PvXpu.getXpu(objAddress); + workerResults = []; + remaining = sizeBytes; + i = 0; + case 9: + if (!(i < obj.numWorkers)) { + _context7.next = 21; + break; + } + if (!isShared) { + _context7.next = 14; + break; + } + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.MEMSET, + memAddress: memAddress, + fillByte: fillByte, + size: allocSize + })); + _context7.next = 18; + break; + case 14: + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.MEMSET, + memAddress: memAddress, + fillByte: fillByte, + size: Math.min(remaining, chunkSize) + })); + remaining -= chunkSize; + if (!(remaining <= 0)) { + _context7.next = 18; + break; + } + return _context7.abrupt("break", 21); + case 18: + i++; + _context7.next = 9; + break; + case 21: + _context7.next = 23; + return Promise.all(workerResults); + case 23: + case "end": + return _context7.stop(); + } + }, _callee7); + })); + return function pvXpuDeviceMemMemset(_x24, _x25, _x26) { + return _ref7.apply(this, arguments); + }; + }(); + var pvXpuGetMaxWorkersWasm = /*#__PURE__*/function () { + var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee8(maxWorkersAddress) { + var maxWorkers; + return _regeneratorRuntime.wrap(function _callee8$(_context8) { + while (1) switch (_context8.prev = _context8.next) { + case 0: + maxWorkersAddress = unsignedAddress(maxWorkersAddress); + maxWorkers = window.navigator.hardwareConcurrency; + setInt(maxWorkersAddress, maxWorkers ? maxWorkers : 1); + case 3: + case "end": + return _context8.stop(); + } + }, _callee8); + })); + return function pvXpuGetMaxWorkersWasm(_x27) { + return _ref8.apply(this, arguments); + }; + }(); + var pvXpuTimerStart = /*#__PURE__*/function () { + var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee9(objAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee9$(_context9) { + while (1) switch (_context9.prev = _context9.next) { + case 0: + objAddress = unsignedAddress(objAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context9.next = 4; + break; + } + return _context9.abrupt("return"); + case 4: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.TIMER_START, + workerIndex: i + })); + } + _context9.next = 8; + return Promise.all(workerResults); + case 8: + case "end": + return _context9.stop(); + } + }, _callee9); + })); + return function pvXpuTimerStart(_x28) { + return _ref9.apply(this, arguments); + }; + }(); + var pvXpuTimerStop = /*#__PURE__*/function () { + var _ref10 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee10(objAddress) { + var obj, workerResults, i; + return _regeneratorRuntime.wrap(function _callee10$(_context10) { + while (1) switch (_context10.prev = _context10.next) { + case 0: + objAddress = unsignedAddress(objAddress); + obj = PvXpu.getXpu(objAddress); + if (obj) { + _context10.next = 4; + break; + } + return _context10.abrupt("return"); + case 4: + workerResults = []; + for (i = 0; i < obj.numWorkers; i++) { + workerResults.push(waitForWorker(obj.workers[i], { + action: PvXpuAction.TIMER_STOP + })); + } + _context10.next = 8; + return Promise.all(workerResults); + case 8: + case "end": + return _context10.stop(); + } + }, _callee10); + })); + return function pvXpuTimerStop(_x29) { + return _ref10.apply(this, arguments); + }; + }(); + var imports = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({ + aligned_alloc: function aligned_alloc(alignment, size) { + throw new Error("aligned_alloc was not passed in from parent module"); + }, + pv_xpu_web_worker_device_info_wasm: pvXpuDeviceInfo, + pv_xpu_web_worker_device_init_wasm: pvXpuDeviceInit, + pv_xpu_web_worker_device_cleanup_wasm: pvXpuDeviceCleanup, + pv_xpu_web_worker_device_mem_alloc_wasm: pvXpuDeviceMemAlloc, + pv_xpu_web_worker_device_mem_free_wasm: pvXpuDeviceMemFree, + pv_xpu_web_worker_device_mem_copy_to_xpu_wasm: pvXpuDeviceMemCopyToXpu, + pv_xpu_web_worker_device_mem_copy_from_xpu_wasm: pvXpuDeviceMemCopyFromXpu, + pv_xpu_web_worker_device_mem_memset_wasm: pvXpuDeviceMemMemset, + pv_xpu_web_worker_get_max_workers_wasm: pvXpuGetMaxWorkersWasm, + pv_xpu_web_worker_timer_start_wasm: pvXpuTimerStart, + pv_xpu_web_worker_timer_stop_wasm: pvXpuTimerStop + }, getMvmWasmFunctions(memory)), getPicollmAttentionWasmFunctions(memory)), getPicollmFeedForwardWasmFunctions(memory)), getPicollmGateWasmFunctions(memory)), getPicollmMoeTransformerWasmFunctions(memory)), getPicollmNormWasmFunctions(memory)), getPicollmNormLayerWasmFunctions(memory)), getPicollmTransformerWasmFunctions(memory)), getPicollmWeightWasmFunctions(memory)); + return imports; + }; + + return initXpu; + +})(); diff --git a/lib/wasm/dist/xpu_web_worker/iife/index.min.js b/lib/wasm/dist/xpu_web_worker/iife/index.min.js new file mode 100644 index 00000000..b0d57e08 --- /dev/null +++ b/lib/wasm/dist/xpu_web_worker/iife/index.min.js @@ -0,0 +1,7 @@ +var XpuWebWorker=function(){"use strict";function I(g){return I="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},I(g)}function g(g){var C=function(g,C){if("object"!=I(g)||!g)return g;var A=g[Symbol.toPrimitive];if(void 0!==A){var e=A.call(g,C||"default");if("object"!=I(e))return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===C?String:Number)(g)}(g,"string");return"symbol"==I(C)?C:String(C)}function C(I,C,A){return(C=g(C))in I?Object.defineProperty(I,C,{value:A,enumerable:!0,configurable:!0,writable:!0}):I[C]=A,I}function A(I,g,C,A,e,c,l){try{var t=I[c](l),s=t.value}catch(I){return void C(I)}t.done?g(s):Promise.resolve(s).then(A,e)}function e(I){return function(){var g=this,C=arguments;return new Promise((function(e,c){var l=I.apply(g,C);function t(I){A(l,e,c,t,s,"next",I)}function s(I){A(l,e,c,t,s,"throw",I)}t(void 0)}))}}function c(I){return I&&I.__esModule&&Object.prototype.hasOwnProperty.call(I,"default")?I.default:I}var l={exports:{}},t={exports:{}};!function(I){function g(C){return I.exports=g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},I.exports.__esModule=!0,I.exports.default=I.exports,g(C)}I.exports=g,I.exports.__esModule=!0,I.exports.default=I.exports}(t);var s=t.exports;!function(I){var g=s.default;function C(){I.exports=C=function(){return e},I.exports.__esModule=!0,I.exports.default=I.exports;var A,e={},c=Object.prototype,l=c.hasOwnProperty,t=Object.defineProperty||function(I,g,C){I[g]=C.value},s="function"==typeof Symbol?Symbol:{},Z=s.iterator||"@@iterator",d=s.asyncIterator||"@@asyncIterator",b=s.toStringTag||"@@toStringTag";function i(I,g,C){return Object.defineProperty(I,g,{value:C,enumerable:!0,configurable:!0,writable:!0}),I[g]}try{i({},"")}catch(A){i=function(I,g,C){return I[g]=C}}function r(I,g,C,A){var e=g&&g.prototype instanceof y?g:y,c=Object.create(e.prototype),l=new Y(A||[]);return t(c,"_invoke",{value:p(I,C,l)}),c}function o(I,g,C){try{return{type:"normal",arg:I.call(g,C)}}catch(I){return{type:"throw",arg:I}}}e.wrap=r;var n="suspendedStart",m="suspendedYield",G="executing",a="completed",B={};function y(){}function V(){}function W(){}var u={};i(u,Z,(function(){return this}));var R=Object.getPrototypeOf,X=R&&R(R(w([])));X&&X!==c&&l.call(X,Z)&&(u=X);var h=W.prototype=y.prototype=Object.create(u);function H(I){["next","throw","return"].forEach((function(g){i(I,g,(function(I){return this._invoke(g,I)}))}))}function k(I,C){function A(e,c,t,s){var Z=o(I[e],I,c);if("throw"!==Z.type){var d=Z.arg,b=d.value;return b&&"object"==g(b)&&l.call(b,"__await")?C.resolve(b.__await).then((function(I){A("next",I,t,s)}),(function(I){A("throw",I,t,s)})):C.resolve(b).then((function(I){d.value=I,t(d)}),(function(I){return A("throw",I,t,s)}))}s(Z.arg)}var e;t(this,"_invoke",{value:function(I,g){function c(){return new C((function(C,e){A(I,g,C,e)}))}return e=e?e.then(c,c):c()}})}function p(I,g,C){var e=n;return function(c,l){if(e===G)throw new Error("Generator is already running");if(e===a){if("throw"===c)throw l;return{value:A,done:!0}}for(C.method=c,C.arg=l;;){var t=C.delegate;if(t){var s=J(t,C);if(s){if(s===B)continue;return s}}if("next"===C.method)C.sent=C._sent=C.arg;else if("throw"===C.method){if(e===n)throw e=a,C.arg;C.dispatchException(C.arg)}else"return"===C.method&&C.abrupt("return",C.arg);e=G;var Z=o(I,g,C);if("normal"===Z.type){if(e=C.done?a:m,Z.arg===B)continue;return{value:Z.arg,done:C.done}}"throw"===Z.type&&(e=a,C.method="throw",C.arg=Z.arg)}}}function J(I,g){var C=g.method,e=I.iterator[C];if(e===A)return g.delegate=null,"throw"===C&&I.iterator.return&&(g.method="return",g.arg=A,J(I,g),"throw"===g.method)||"return"!==C&&(g.method="throw",g.arg=new TypeError("The iterator does not provide a '"+C+"' method")),B;var c=o(e,I.iterator,g.arg);if("throw"===c.type)return g.method="throw",g.arg=c.arg,g.delegate=null,B;var l=c.arg;return l?l.done?(g[I.resultName]=l.value,g.next=I.nextLoc,"return"!==g.method&&(g.method="next",g.arg=A),g.delegate=null,B):l:(g.method="throw",g.arg=new TypeError("iterator result is not an object"),g.delegate=null,B)}function F(I){var g={tryLoc:I[0]};1 in I&&(g.catchLoc=I[1]),2 in I&&(g.finallyLoc=I[2],g.afterLoc=I[3]),this.tryEntries.push(g)}function S(I){var g=I.completion||{};g.type="normal",delete g.arg,I.completion=g}function Y(I){this.tryEntries=[{tryLoc:"root"}],I.forEach(F,this),this.reset(!0)}function w(I){if(I||""===I){var C=I[Z];if(C)return C.call(I);if("function"==typeof I.next)return I;if(!isNaN(I.length)){var e=-1,c=function g(){for(;++e=0;--e){var c=this.tryEntries[e],t=c.completion;if("root"===c.tryLoc)return C("end");if(c.tryLoc<=this.prev){var s=l.call(c,"catchLoc"),Z=l.call(c,"finallyLoc");if(s&&Z){if(this.prev=0;--C){var A=this.tryEntries[C];if(A.tryLoc<=this.prev&&l.call(A,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),S(C),B}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var A=C.completion;if("throw"===A.type){var e=A.arg;S(C)}return e}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:w(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=A),B}},e}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(l);var Z=(0,l.exports)(),d=Z;try{regeneratorRuntime=Z}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=Z:Function("r","regeneratorRuntime = r")(Z)}var b=c(d);const i={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},r={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},o={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},n={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},m={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class G{static getFirstMatch(I,g){const C=g.match(I);return C&&C.length>0&&C[1]||""}static getSecondMatch(I,g){const C=g.match(I);return C&&C.length>1&&C[2]||""}static matchAndReturnConst(I,g,C){if(I.test(g))return C}static getWindowsVersionName(I){switch(I){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}static getMacOSVersionName(I){const g=I.split(".").splice(0,2).map((I=>parseInt(I,10)||0));if(g.push(0),10===g[0])switch(g[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}}static getAndroidVersionName(I){const g=I.split(".").splice(0,2).map((I=>parseInt(I,10)||0));if(g.push(0),!(1===g[0]&&g[1]<5))return 1===g[0]&&g[1]<6?"Cupcake":1===g[0]&&g[1]>=6?"Donut":2===g[0]&&g[1]<2?"Eclair":2===g[0]&&2===g[1]?"Froyo":2===g[0]&&g[1]>2?"Gingerbread":3===g[0]?"Honeycomb":4===g[0]&&g[1]<1?"Ice Cream Sandwich":4===g[0]&&g[1]<4?"Jelly Bean":4===g[0]&&g[1]>=4?"KitKat":5===g[0]?"Lollipop":6===g[0]?"Marshmallow":7===g[0]?"Nougat":8===g[0]?"Oreo":9===g[0]?"Pie":void 0}static getVersionPrecision(I){return I.split(".").length}static compareVersions(I,g,C=!1){const A=G.getVersionPrecision(I),e=G.getVersionPrecision(g);let c=Math.max(A,e),l=0;const t=G.map([I,g],(I=>{const g=c-G.getVersionPrecision(I),C=I+new Array(g+1).join(".0");return G.map(C.split("."),(I=>new Array(20-I.length).join("0")+I)).reverse()}));for(C&&(l=c-Math.min(A,e)),c-=1;c>=l;){if(t[0][c]>t[1][c])return 1;if(t[0][c]===t[1][c]){if(c===l)return 0;c-=1}else if(t[0][c]{C[g]=I[g]}))}}return I}static getBrowserAlias(I){return i[I]}static getBrowserTypeByAlias(I){return r[I]||""}}const a=/version\/(\d+(\.?_?\d+)+)/i,B=[{test:[/googlebot/i],describe(I){const g={name:"Googlebot"},C=G.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/opera/i],describe(I){const g={name:"Opera"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/opr\/|opios/i],describe(I){const g={name:"Opera"},C=G.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/SamsungBrowser/i],describe(I){const g={name:"Samsung Internet for Android"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/Whale/i],describe(I){const g={name:"NAVER Whale Browser"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/MZBrowser/i],describe(I){const g={name:"MZ Browser"},C=G.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/focus/i],describe(I){const g={name:"Focus"},C=G.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/swing/i],describe(I){const g={name:"Swing"},C=G.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/coast/i],describe(I){const g={name:"Opera Coast"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(I){const g={name:"Opera Touch"},C=G.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/yabrowser/i],describe(I){const g={name:"Yandex Browser"},C=G.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/ucbrowser/i],describe(I){const g={name:"UC Browser"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/Maxthon|mxios/i],describe(I){const g={name:"Maxthon"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/epiphany/i],describe(I){const g={name:"Epiphany"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/puffin/i],describe(I){const g={name:"Puffin"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/sleipnir/i],describe(I){const g={name:"Sleipnir"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/k-meleon/i],describe(I){const g={name:"K-Meleon"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/micromessenger/i],describe(I){const g={name:"WeChat"},C=G.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/qqbrowser/i],describe(I){const g={name:/qqbrowserlite/i.test(I)?"QQ Browser Lite":"QQ Browser"},C=G.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/msie|trident/i],describe(I){const g={name:"Internet Explorer"},C=G.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/\sedg\//i],describe(I){const g={name:"Microsoft Edge"},C=G.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/edg([ea]|ios)/i],describe(I){const g={name:"Microsoft Edge"},C=G.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/vivaldi/i],describe(I){const g={name:"Vivaldi"},C=G.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/seamonkey/i],describe(I){const g={name:"SeaMonkey"},C=G.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/sailfish/i],describe(I){const g={name:"Sailfish"},C=G.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,I);return C&&(g.version=C),g}},{test:[/silk/i],describe(I){const g={name:"Amazon Silk"},C=G.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/phantom/i],describe(I){const g={name:"PhantomJS"},C=G.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/slimerjs/i],describe(I){const g={name:"SlimerJS"},C=G.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(I){const g={name:"BlackBerry"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/(web|hpw)[o0]s/i],describe(I){const g={name:"WebOS Browser"},C=G.getFirstMatch(a,I)||G.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/bada/i],describe(I){const g={name:"Bada"},C=G.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/tizen/i],describe(I){const g={name:"Tizen"},C=G.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/qupzilla/i],describe(I){const g={name:"QupZilla"},C=G.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/firefox|iceweasel|fxios/i],describe(I){const g={name:"Firefox"},C=G.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/electron/i],describe(I){const g={name:"Electron"},C=G.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/MiuiBrowser/i],describe(I){const g={name:"Miui"},C=G.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/chromium/i],describe(I){const g={name:"Chromium"},C=G.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,I)||G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/chrome|crios|crmo/i],describe(I){const g={name:"Chrome"},C=G.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/GSA/i],describe(I){const g={name:"Google Search"},C=G.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test(I){const g=!I.test(/like android/i),C=I.test(/android/i);return g&&C},describe(I){const g={name:"Android Browser"},C=G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/playstation 4/i],describe(I){const g={name:"PlayStation 4"},C=G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/safari|applewebkit/i],describe(I){const g={name:"Safari"},C=G.getFirstMatch(a,I);return C&&(g.version=C),g}},{test:[/.*/i],describe(I){const g=-1!==I.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:G.getFirstMatch(g,I),version:G.getSecondMatch(g,I)}}}];var y=[{test:[/Roku\/DVP/],describe(I){const g=G.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,I);return{name:n.Roku,version:g}}},{test:[/windows phone/i],describe(I){const g=G.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,I);return{name:n.WindowsPhone,version:g}}},{test:[/windows /i],describe(I){const g=G.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,I),C=G.getWindowsVersionName(g);return{name:n.Windows,version:g,versionName:C}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(I){const g={name:n.iOS},C=G.getSecondMatch(/(Version\/)(\d[\d.]+)/,I);return C&&(g.version=C),g}},{test:[/macintosh/i],describe(I){const g=G.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,I).replace(/[_\s]/g,"."),C=G.getMacOSVersionName(g),A={name:n.MacOS,version:g};return C&&(A.versionName=C),A}},{test:[/(ipod|iphone|ipad)/i],describe(I){const g=G.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,I).replace(/[_\s]/g,".");return{name:n.iOS,version:g}}},{test(I){const g=!I.test(/like android/i),C=I.test(/android/i);return g&&C},describe(I){const g=G.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,I),C=G.getAndroidVersionName(g),A={name:n.Android,version:g};return C&&(A.versionName=C),A}},{test:[/(web|hpw)[o0]s/i],describe(I){const g=G.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,I),C={name:n.WebOS};return g&&g.length&&(C.version=g),C}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(I){const g=G.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,I)||G.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,I)||G.getFirstMatch(/\bbb(\d+)/i,I);return{name:n.BlackBerry,version:g}}},{test:[/bada/i],describe(I){const g=G.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,I);return{name:n.Bada,version:g}}},{test:[/tizen/i],describe(I){const g=G.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,I);return{name:n.Tizen,version:g}}},{test:[/linux/i],describe:()=>({name:n.Linux})},{test:[/CrOS/],describe:()=>({name:n.ChromeOS})},{test:[/PlayStation 4/],describe(I){const g=G.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,I);return{name:n.PlayStation4,version:g}}}],V=[{test:[/googlebot/i],describe:()=>({type:"bot",vendor:"Google"})},{test:[/huawei/i],describe(I){const g=G.getFirstMatch(/(can-l01)/i,I)&&"Nova",C={type:o.mobile,vendor:"Huawei"};return g&&(C.model=g),C}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:()=>({type:o.tablet,vendor:"Nexus"})},{test:[/ipad/i],describe:()=>({type:o.tablet,vendor:"Apple",model:"iPad"})},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:()=>({type:o.tablet,vendor:"Apple",model:"iPad"})},{test:[/kftt build/i],describe:()=>({type:o.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"})},{test:[/silk/i],describe:()=>({type:o.tablet,vendor:"Amazon"})},{test:[/tablet(?! pc)/i],describe:()=>({type:o.tablet})},{test(I){const g=I.test(/ipod|iphone/i),C=I.test(/like (ipod|iphone)/i);return g&&!C},describe(I){const g=G.getFirstMatch(/(ipod|iphone)/i,I);return{type:o.mobile,vendor:"Apple",model:g}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:()=>({type:o.mobile,vendor:"Nexus"})},{test:[/[^-]mobi/i],describe:()=>({type:o.mobile})},{test:I=>"blackberry"===I.getBrowserName(!0),describe:()=>({type:o.mobile,vendor:"BlackBerry"})},{test:I=>"bada"===I.getBrowserName(!0),describe:()=>({type:o.mobile})},{test:I=>"windows phone"===I.getBrowserName(),describe:()=>({type:o.mobile,vendor:"Microsoft"})},{test(I){const g=Number(String(I.getOSVersion()).split(".")[0]);return"android"===I.getOSName(!0)&&g>=3},describe:()=>({type:o.tablet})},{test:I=>"android"===I.getOSName(!0),describe:()=>({type:o.mobile})},{test:I=>"macos"===I.getOSName(!0),describe:()=>({type:o.desktop,vendor:"Apple"})},{test:I=>"windows"===I.getOSName(!0),describe:()=>({type:o.desktop})},{test:I=>"linux"===I.getOSName(!0),describe:()=>({type:o.desktop})},{test:I=>"playstation 4"===I.getOSName(!0),describe:()=>({type:o.tv})},{test:I=>"roku"===I.getOSName(!0),describe:()=>({type:o.tv})}],W=[{test:I=>"microsoft edge"===I.getBrowserName(!0),describe(I){if(/\sedg\//i.test(I))return{name:m.Blink};const g=G.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,I);return{name:m.EdgeHTML,version:g}}},{test:[/trident/i],describe(I){const g={name:m.Trident},C=G.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:I=>I.test(/presto/i),describe(I){const g={name:m.Presto},C=G.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test(I){const g=I.test(/gecko/i),C=I.test(/like gecko/i);return g&&!C},describe(I){const g={name:m.Gecko},C=G.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}},{test:[/(apple)?webkit\/537\.36/i],describe:()=>({name:m.Blink})},{test:[/(apple)?webkit/i],describe(I){const g={name:m.WebKit},C=G.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,I);return C&&(g.version=C),g}}];class u{constructor(I,g=!1){if(null==I||""===I)throw new Error("UserAgent parameter can't be empty");this._ua=I,this.parsedResult={},!0!==g&&this.parse()}getUA(){return this._ua}test(I){return I.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const I=G.find(B,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.browser=I.describe(this.getUA())),this.parsedResult.browser}getBrowser(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}getBrowserName(I){return I?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}parseOS(){this.parsedResult.os={};const I=G.find(y,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.os=I.describe(this.getUA())),this.parsedResult.os}getOSName(I){const{name:g}=this.getOS();return I?String(g).toLowerCase()||"":g||""}getOSVersion(){return this.getOS().version}getPlatform(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}getPlatformType(I=!1){const{type:g}=this.getPlatform();return I?String(g).toLowerCase()||"":g||""}parsePlatform(){this.parsedResult.platform={};const I=G.find(V,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.platform=I.describe(this.getUA())),this.parsedResult.platform}getEngine(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}getEngineName(I){return I?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const I=G.find(W,(I=>{if("function"==typeof I.test)return I.test(this);if(I.test instanceof Array)return I.test.some((I=>this.test(I)));throw new Error("Browser's test function is not valid")}));return I&&(this.parsedResult.engine=I.describe(this.getUA())),this.parsedResult.engine}parse(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}getResult(){return G.assign({},this.parsedResult)}satisfies(I){const g={};let C=0;const A={};let e=0;if(Object.keys(I).forEach((c=>{const l=I[c];"string"==typeof l?(A[c]=l,e+=1):"object"==typeof l&&(g[c]=l,C+=1)})),C>0){const I=Object.keys(g),C=G.find(I,(I=>this.isOS(I)));if(C){const I=this.satisfies(g[C]);if(void 0!==I)return I}const A=G.find(I,(I=>this.isPlatform(I)));if(A){const I=this.satisfies(g[A]);if(void 0!==I)return I}}if(e>0){const I=Object.keys(A),g=G.find(I,(I=>this.isBrowser(I,!0)));if(void 0!==g)return this.compareVersion(A[g])}}isBrowser(I,g=!1){const C=this.getBrowserName().toLowerCase();let A=I.toLowerCase();const e=G.getBrowserTypeByAlias(A);return g&&e&&(A=e.toLowerCase()),A===C}compareVersion(I){let g=[0],C=I,A=!1;const e=this.getBrowserVersion();if("string"==typeof e)return">"===I[0]||"<"===I[0]?(C=I.substr(1),"="===I[1]?(A=!0,C=I.substr(2)):g=[],">"===I[0]?g.push(1):g.push(-1)):"="===I[0]?C=I.substr(1):"~"===I[0]&&(A=!0,C=I.substr(1)),g.indexOf(G.compareVersions(e,C,A))>-1}isOS(I){return this.getOSName(!0)===String(I).toLowerCase()}isPlatform(I){return this.getPlatformType(!0)===String(I).toLowerCase()}isEngine(I){return this.getEngineName(!0)===String(I).toLowerCase()}is(I,g=!1){return this.isBrowser(I,g)||this.isOS(I)||this.isPlatform(I)}some(I=[]){return I.some((I=>this.is(I)))}} +/*! + * Bowser - a browser detector + * https://github.com/lancedikson/bowser + * MIT License | (c) Dustin Diaz 2012-2015 + * MIT License | (c) Denis Demchenko 2015-2019 + */class R{static getParser(I,g=!1){if("string"!=typeof I)throw new Error("UserAgent should be a string");return new u(I,g)}static parse(I){return new u(I).getResult()}static get BROWSER_MAP(){return r}static get ENGINE_MAP(){return m}static get OS_MAP(){return n}static get PLATFORMS_MAP(){return o}}var X={exports:{}},h={exports:{}};!function(I){function g(C){return I.exports=g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},I.exports.__esModule=!0,I.exports.default=I.exports,g(C)}I.exports=g,I.exports.__esModule=!0,I.exports.default=I.exports}(h);var H=h.exports;!function(I){var g=H.default;function C(){I.exports=C=function(){return e},I.exports.__esModule=!0,I.exports.default=I.exports;var A,e={},c=Object.prototype,l=c.hasOwnProperty,t=Object.defineProperty||function(I,g,C){I[g]=C.value},s="function"==typeof Symbol?Symbol:{},Z=s.iterator||"@@iterator",d=s.asyncIterator||"@@asyncIterator",b=s.toStringTag||"@@toStringTag";function i(I,g,C){return Object.defineProperty(I,g,{value:C,enumerable:!0,configurable:!0,writable:!0}),I[g]}try{i({},"")}catch(A){i=function(I,g,C){return I[g]=C}}function r(I,g,C,A){var e=g&&g.prototype instanceof y?g:y,c=Object.create(e.prototype),l=new Y(A||[]);return t(c,"_invoke",{value:p(I,C,l)}),c}function o(I,g,C){try{return{type:"normal",arg:I.call(g,C)}}catch(I){return{type:"throw",arg:I}}}e.wrap=r;var n="suspendedStart",m="suspendedYield",G="executing",a="completed",B={};function y(){}function V(){}function W(){}var u={};i(u,Z,(function(){return this}));var R=Object.getPrototypeOf,X=R&&R(R(w([])));X&&X!==c&&l.call(X,Z)&&(u=X);var h=W.prototype=y.prototype=Object.create(u);function H(I){["next","throw","return"].forEach((function(g){i(I,g,(function(I){return this._invoke(g,I)}))}))}function k(I,C){function A(e,c,t,s){var Z=o(I[e],I,c);if("throw"!==Z.type){var d=Z.arg,b=d.value;return b&&"object"==g(b)&&l.call(b,"__await")?C.resolve(b.__await).then((function(I){A("next",I,t,s)}),(function(I){A("throw",I,t,s)})):C.resolve(b).then((function(I){d.value=I,t(d)}),(function(I){return A("throw",I,t,s)}))}s(Z.arg)}var e;t(this,"_invoke",{value:function(I,g){function c(){return new C((function(C,e){A(I,g,C,e)}))}return e=e?e.then(c,c):c()}})}function p(I,g,C){var e=n;return function(c,l){if(e===G)throw new Error("Generator is already running");if(e===a){if("throw"===c)throw l;return{value:A,done:!0}}for(C.method=c,C.arg=l;;){var t=C.delegate;if(t){var s=J(t,C);if(s){if(s===B)continue;return s}}if("next"===C.method)C.sent=C._sent=C.arg;else if("throw"===C.method){if(e===n)throw e=a,C.arg;C.dispatchException(C.arg)}else"return"===C.method&&C.abrupt("return",C.arg);e=G;var Z=o(I,g,C);if("normal"===Z.type){if(e=C.done?a:m,Z.arg===B)continue;return{value:Z.arg,done:C.done}}"throw"===Z.type&&(e=a,C.method="throw",C.arg=Z.arg)}}}function J(I,g){var C=g.method,e=I.iterator[C];if(e===A)return g.delegate=null,"throw"===C&&I.iterator.return&&(g.method="return",g.arg=A,J(I,g),"throw"===g.method)||"return"!==C&&(g.method="throw",g.arg=new TypeError("The iterator does not provide a '"+C+"' method")),B;var c=o(e,I.iterator,g.arg);if("throw"===c.type)return g.method="throw",g.arg=c.arg,g.delegate=null,B;var l=c.arg;return l?l.done?(g[I.resultName]=l.value,g.next=I.nextLoc,"return"!==g.method&&(g.method="next",g.arg=A),g.delegate=null,B):l:(g.method="throw",g.arg=new TypeError("iterator result is not an object"),g.delegate=null,B)}function F(I){var g={tryLoc:I[0]};1 in I&&(g.catchLoc=I[1]),2 in I&&(g.finallyLoc=I[2],g.afterLoc=I[3]),this.tryEntries.push(g)}function S(I){var g=I.completion||{};g.type="normal",delete g.arg,I.completion=g}function Y(I){this.tryEntries=[{tryLoc:"root"}],I.forEach(F,this),this.reset(!0)}function w(I){if(I||""===I){var C=I[Z];if(C)return C.call(I);if("function"==typeof I.next)return I;if(!isNaN(I.length)){var e=-1,c=function g(){for(;++e=0;--e){var c=this.tryEntries[e],t=c.completion;if("root"===c.tryLoc)return C("end");if(c.tryLoc<=this.prev){var s=l.call(c,"catchLoc"),Z=l.call(c,"finallyLoc");if(s&&Z){if(this.prev=0;--C){var A=this.tryEntries[C];if(A.tryLoc<=this.prev&&l.call(A,"finallyLoc")&&this.prev=0;--g){var C=this.tryEntries[g];if(C.finallyLoc===I)return this.complete(C.completion,C.afterLoc),S(C),B}},catch:function(I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc===I){var A=C.completion;if("throw"===A.type){var e=A.arg;S(C)}return e}}throw new Error("illegal catch attempt")},delegateYield:function(I,g,C){return this.delegate={iterator:w(I),resultName:g,nextLoc:C},"next"===this.method&&(this.arg=A),B}},e}I.exports=C,I.exports.__esModule=!0,I.exports.default=I.exports}(X);var k=(0,X.exports)();try{regeneratorRuntime=k}catch(I){"object"==typeof globalThis?globalThis.regeneratorRuntime=k:Function("r","regeneratorRuntime = r")(k)}function p(I){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(I){return typeof I}:function(I){return I&&"function"==typeof Symbol&&I.constructor===Symbol&&I!==Symbol.prototype?"symbol":typeof I},p(I)}function J(I){var g=function(I,g){if("object"!==p(I)||null===I)return I;var C=I[Symbol.toPrimitive];if(void 0!==C){var A=C.call(I,g||"default");if("object"!==p(A))return A;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===g?String:Number)(I)}(I,"string");return"symbol"===p(g)?g:String(g)}function F(I,g){for(var C=0;C>>0:I}function Y(I,g,C){var A=void 0===g?null:g,e=function(I,g){var C=atob(I);if(g){for(var A=new Uint8Array(C.length),e=0,c=C.length;e=I.length?{done:!0}:{done:!1,value:I[A++]}},e:function(I){throw I},f:e}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var c,l=!0,t=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return l=I.done,I},e:function(I){t=!0,c=I},f:function(){try{l||null==C.return||C.return()}finally{if(t)throw c}}}}function M(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,A=new Array(g);C=I.length?{done:!0}:{done:!1,value:I[A++]}},e:function(I){throw I},f:e}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var c,l=!0,t=!1;return{s:function(){C=C.call(I)},n:function(){var I=C.next();return l=I.done,I},e:function(I){t=!0,c=I},f:function(){try{l||null==C.return||C.return()}finally{if(t)throw c}}}}function CI(I,g){(null==g||g>I.length)&&(g=I.length);for(var C=0,A=new Array(g);Cm?e-m:0),B=c-o,r.push(L(d.workers[n],{action:N.COPY_TO_XPU,memAddress:C,offset:G,buffer:i.slice(B,B+a)})),o-=a),!(o<=0)){g.next=21;break}return g.abrupt("break",24);case 21:n++,g.next=11;break;case 24:return g.next=26,Promise.all(r);case 26:case"end":return g.stop()}}),g)})));return function(I,C,A,e){return g.apply(this,arguments)}}(),Z=function(){var g=e(b.mark((function g(C,A,e,c){var l,t,s,Z,d,i,r,o,n,m,G,a,B,y,V,W,u;return b.wrap((function(g){for(;;)switch(g.prev=g.next){case 0:if(C=S(C),A=S(A),l=E.getMemory(C)){g.next=5;break}return g.abrupt("return");case 5:if(t=l.objAddress,s=l.allocSize,Z=l.isShared,d=l.chunkSize,i=E.getXpu(t),r=new Uint8Array(I.buffer),o=[],!Z){g.next=13;break}o.push(L(i.workers[0],{action:N.COPY_FROM_XPU,memAddress:C,offset:e,size:s})),g.next=24;break;case 13:n=s,m=0;case 15:if(!(mG?e-G:0,B=Math.min(n,d-a),o.push(L(i.workers[m],{action:N.COPY_FROM_XPU,memAddress:C,offset:a,size:B})),n-=B),0!==n){g.next=21;break}return g.abrupt("break",24);case 21:m++,g.next=15;break;case 24:return g.next=26,Promise.all(o);case 26:y=g.sent,V=0,W=0;case 29:if(!(Wc)){g.next=36;break}return r.set(u.slice(0,c-V),A+V),g.abrupt("break",41);case 36:r.set(u,A+V),V+=u.length;case 38:W++,g.next=29;break;case 41:case"end":return g.stop()}}),g)})));return function(I,C,A,e){return g.apply(this,arguments)}}(),d=function(){var I=e(b.mark((function I(g,C,A){var e,c,l,t,s,Z,d,i,r;return b.wrap((function(I){for(;;)switch(I.prev=I.next){case 0:if(g=S(g),e=E.getMemory(g)){I.next=4;break}return I.abrupt("return");case 4:c=e.objAddress,l=e.allocSize,t=e.isShared,s=e.chunkSize,Z=E.getXpu(c),d=[],i=A,r=0;case 9:if(!(r0&&G.set(a[B],B*r);for(n=[],y=0;y=0;--o){var a=this.tryEntries[o],u=a.completion;if("root"===a.tryLoc)return t("end");if(a.tryLoc<=this.prev){var c=i.call(a,"catchLoc"),f=i.call(a,"finallyLoc");if(c&&f){if(this.prev=0;--t){var n=this.tryEntries[t];if(n.tryLoc<=this.prev&&i.call(n,"finallyLoc")&&this.prev=0;--r){var t=this.tryEntries[r];if(t.finallyLoc===e)return this.complete(t.completion,t.afterLoc),k(t),m}},catch:function(e){for(var r=this.tryEntries.length-1;r>=0;--r){var t=this.tryEntries[r];if(t.tryLoc===e){var n=t.completion;if("throw"===n.type){var o=n.arg;k(t)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,t){return this.delegate={iterator:M(e),resultName:r,nextLoc:t},"next"===this.method&&(this.arg=n),m}},o}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports}(i);var f=(0,i.exports)(),s=f;try{regeneratorRuntime=f}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=f:Function("r","regeneratorRuntime = r")(f)}var l=a(s),p=new Map,v=new Map,d=o({},"pv_matrix_vector_multiply_mvm_shader",(function(e,r){e.bindGroupLayout=e.device.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}}]});var t,n=e.device.createPipelineLayout({bindGroupLayouts:[e.bindGroupLayout]}),o=e.device.createShaderModule({code:(t=r.workgroupSize,"\n@group(0) @binding(0)\nvar matrix: array;\n\n@group(0) @binding(1)\nvar vector: array;\n\n@group(0) @binding(2)\nvar result: array;\n\nstruct Metadata {\n m: u32, \n n_real: u32,\n}\n\n@group(0) @binding(3)\nvar metadata: Metadata;\n\n@compute @workgroup_size(".concat(t,")\nfn main(\n @builtin(global_invocation_id)\n global_id : vec3u,\n) { \n let i: u32 = global_id.x;\n if (i >= metadata.m) {\n return;\n }\n\n var sum: f32 = 0.0;\n for (var j: u32 = 0u; j < metadata.n_real; j = j + 1u) {\n let matrix_value: u32 = matrix[(i * metadata.n_real) + j];\n let val_1 : f32 = f32(extractBits(matrix_value, 0u, 4u));\n let val_2 : f32 = f32(extractBits(matrix_value, 4u, 4u));\n let val_3 : f32 = f32(extractBits(matrix_value, 8u, 4u));\n let val_4 : f32 = f32(extractBits(matrix_value, 12u, 4u));\n let val_5 : f32 = f32(extractBits(matrix_value, 16u, 4u));\n let val_6 : f32 = f32(extractBits(matrix_value, 20u, 4u));\n let val_7 : f32 = f32(extractBits(matrix_value, 24u, 4u));\n let val_8 : f32 = f32(extractBits(matrix_value, 28u, 4u));\n \n let vector_index: u32 = j * 8u;\n sum += (val_1 * vector[vector_index]);\n sum += (val_2 * vector[vector_index + 1u]);\n sum += (val_3 * vector[vector_index + 2u]);\n sum += (val_4 * vector[vector_index + 3u]);\n sum += (val_5 * vector[vector_index + 4u]);\n sum += (val_6 * vector[vector_index + 5u]);\n sum += (val_7 * vector[vector_index + 6u]);\n sum += (val_8 * vector[vector_index + 7u]); \n }\n \n result[i] = sum;\n}"))});e.settings=r,e.pipeline=e.device.createComputePipeline({layout:n,compute:{module:o,entryPoint:"main"}}),e.metadataBuffer=e.device.createBuffer({size:2*Uint32Array.BYTES_PER_ELEMENT,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}));function b(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function h(e){for(var r=1;r