@mnaoumov/typescript-dev-toolkit 0.0.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +15 -1
- package/bundlers/esbuild-impl/change-extension-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/custom-esbuild-options-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/fix-esm-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/index/package.json +6 -0
- package/bundlers/esbuild-impl/package.json +6 -0
- package/bundlers/esbuild-impl/preprocess-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/svelte-wrapper-plugin/package.json +6 -0
- package/bundlers/index/package.json +6 -0
- package/bundlers/package.json +6 -0
- package/dist/lib/cjs/build.cjs +191 -0
- package/dist/lib/cjs/build.d.cts +59 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.cjs +139 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.d.cts +25 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +96 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.cts +14 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.cjs +106 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.d.cts +13 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +111 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +6 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +211 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +143 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +129 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.d.cts +14 -0
- package/dist/lib/cjs/bundlers/index.cjs +99 -0
- package/dist/lib/cjs/bundlers/index.d.cts +2 -0
- package/dist/lib/cjs/check-project-types.cjs +163 -0
- package/dist/lib/cjs/check-project-types.d.cts +92 -0
- package/dist/lib/cjs/cli-utils.cjs +276 -0
- package/dist/lib/cjs/cli-utils.d.cts +123 -0
- package/dist/lib/cjs/code-generator.cjs +96 -0
- package/dist/lib/cjs/code-generator.d.cts +14 -0
- package/dist/lib/cjs/commitlint-config.cjs +110 -0
- package/dist/lib/cjs/commitlint-config.d.cts +14 -0
- package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +110 -0
- package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +37 -0
- package/dist/lib/cjs/commitlint-spellcheck-header.cjs +126 -0
- package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +40 -0
- package/dist/lib/cjs/env-toggle.cjs +133 -0
- package/dist/lib/cjs/env-toggle.d.cts +42 -0
- package/dist/lib/cjs/exec.cjs +455 -0
- package/dist/lib/cjs/exec.d.cts +162 -0
- package/dist/lib/cjs/forbidden-patterns.cjs +157 -0
- package/dist/lib/cjs/forbidden-patterns.d.cts +57 -0
- package/dist/lib/cjs/formatters/dprint.cjs +108 -0
- package/dist/lib/cjs/formatters/dprint.d.cts +33 -0
- package/dist/lib/cjs/formatters/index.cjs +99 -0
- package/dist/lib/cjs/formatters/index.d.cts +2 -0
- package/dist/lib/cjs/fs.cjs +123 -0
- package/dist/lib/cjs/fs.d.cts +80 -0
- package/dist/lib/cjs/gate.cjs +140 -0
- package/dist/lib/cjs/gate.d.cts +93 -0
- package/dist/lib/cjs/git.cjs +109 -0
- package/dist/lib/cjs/git.d.cts +37 -0
- package/dist/lib/cjs/index.cjs +186 -0
- package/dist/lib/cjs/index.d.cts +35 -0
- package/dist/lib/cjs/json.cjs +141 -0
- package/dist/lib/cjs/json.d.cts +102 -0
- package/dist/lib/cjs/library-build.cjs +475 -0
- package/dist/lib/cjs/library-build.d.cts +97 -0
- package/dist/lib/cjs/linters/cspell-content.cjs +124 -0
- package/dist/lib/cjs/linters/cspell-content.d.cts +46 -0
- package/dist/lib/cjs/linters/cspell.cjs +103 -0
- package/dist/lib/cjs/linters/cspell.d.cts +36 -0
- package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.cjs +94 -0
- package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.d.cts +49 -0
- package/dist/lib/cjs/linters/eslint-config.cjs +1068 -0
- package/dist/lib/cjs/linters/eslint-config.d.cts +123 -0
- package/dist/lib/cjs/linters/eslint-no-restricted-syntax.cjs +130 -0
- package/dist/lib/cjs/linters/eslint-no-restricted-syntax.d.cts +27 -0
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +116 -0
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +26 -0
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +132 -0
- package/dist/lib/cjs/linters/eslint-rules/index.d.cts +13 -0
- package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +175 -0
- package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.cjs +290 -0
- package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.cjs +265 -0
- package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.d.cts +41 -0
- package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.cjs +134 -0
- package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.d.cts +20 -0
- package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.cjs +217 -0
- package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.d.cts +36 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.cjs +126 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.cjs +125 -0
- package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.d.cts +20 -0
- package/dist/lib/cjs/linters/eslint-rules/require-method-template.cjs +181 -0
- package/dist/lib/cjs/linters/eslint-rules/require-method-template.d.cts +14 -0
- package/dist/lib/cjs/linters/eslint-rules/require-super-call.cjs +217 -0
- package/dist/lib/cjs/linters/eslint-rules/require-super-call.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.cjs +92 -0
- package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.d.cts +18 -0
- package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.cjs +92 -0
- package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.d.cts +23 -0
- package/dist/lib/cjs/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.cts +20 -0
- package/dist/lib/cjs/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.cts +17 -0
- package/dist/lib/cjs/linters/eslint.cjs +122 -0
- package/dist/lib/cjs/linters/eslint.d.cts +35 -0
- package/dist/lib/cjs/linters/index.cjs +138 -0
- package/dist/lib/cjs/linters/index.d.cts +15 -0
- package/dist/lib/cjs/linters/lint-ignores.cjs +91 -0
- package/dist/lib/cjs/linters/lint-ignores.d.cts +30 -0
- package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +169 -0
- package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +11 -0
- package/dist/lib/cjs/linters/markdownlint-content.cjs +120 -0
- package/dist/lib/cjs/linters/markdownlint-content.d.cts +47 -0
- package/dist/lib/cjs/linters/markdownlint-ignores.cjs +95 -0
- package/dist/lib/cjs/linters/markdownlint-ignores.d.cts +35 -0
- package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +99 -0
- package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +2 -0
- package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.cjs +152 -0
- package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.d.cts +35 -0
- package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.cts +1344 -0
- package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2.d.cts +67 -0
- package/dist/lib/cjs/linters/markdownlint.cjs +151 -0
- package/dist/lib/cjs/linters/markdownlint.d.cts +32 -0
- package/dist/lib/cjs/linters/over-exposure.cjs +685 -0
- package/dist/lib/cjs/linters/over-exposure.d.cts +357 -0
- package/dist/lib/cjs/nano-staged-config.cjs +148 -0
- package/dist/lib/cjs/nano-staged-config.d.cts +54 -0
- package/dist/lib/cjs/npm-publish.cjs +93 -0
- package/dist/lib/cjs/npm-publish.d.cts +19 -0
- package/dist/lib/cjs/npm-run.cjs +120 -0
- package/dist/lib/cjs/npm-run.d.cts +34 -0
- package/dist/lib/cjs/npm.cjs +200 -0
- package/dist/lib/cjs/npm.d.cts +168 -0
- package/dist/lib/cjs/package-lock-integrity.cjs +134 -0
- package/dist/lib/cjs/package-lock-integrity.d.cts +38 -0
- package/dist/lib/cjs/package-manager.cjs +291 -0
- package/dist/lib/cjs/package-manager.d.cts +93 -0
- package/dist/lib/cjs/released-issues.cjs +178 -0
- package/dist/lib/cjs/released-issues.d.cts +79 -0
- package/dist/lib/cjs/repo-paths.cjs +167 -0
- package/dist/lib/cjs/repo-paths.d.cts +318 -0
- package/dist/lib/cjs/root.cjs +150 -0
- package/dist/lib/cjs/root.d.cts +107 -0
- package/dist/lib/cjs/test-runners/index.cjs +102 -0
- package/dist/lib/cjs/test-runners/index.d.cts +3 -0
- package/dist/lib/cjs/test-runners/vitest-config.cjs +126 -0
- package/dist/lib/cjs/test-runners/vitest-config.d.cts +90 -0
- package/dist/lib/cjs/test-runners/vitest.cjs +115 -0
- package/dist/lib/cjs/test-runners/vitest.d.cts +52 -0
- package/dist/lib/cjs/validate-declarations.cjs +120 -0
- package/dist/lib/cjs/validate-declarations.d.cts +37 -0
- package/dist/lib/cjs/version.cjs +758 -0
- package/dist/lib/cjs/version.d.cts +418 -0
- package/dist/lib/esm/build.d.mts +59 -0
- package/dist/lib/esm/build.mjs +165 -0
- package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.d.mts +25 -0
- package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.mjs +101 -0
- package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.mts +14 -0
- package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.mjs +59 -0
- package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.d.mts +13 -0
- package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.mjs +69 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +6 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +60 -0
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +143 -0
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +176 -0
- package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.d.mts +14 -0
- package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.mjs +82 -0
- package/dist/lib/esm/bundlers/index.d.mts +2 -0
- package/dist/lib/esm/bundlers/index.mjs +52 -0
- package/dist/lib/esm/check-project-types.d.mts +92 -0
- package/dist/lib/esm/check-project-types.mjs +123 -0
- package/dist/lib/esm/cli-utils.d.mts +123 -0
- package/dist/lib/esm/cli-utils.mjs +225 -0
- package/dist/lib/esm/code-generator.d.mts +14 -0
- package/dist/lib/esm/code-generator.mjs +59 -0
- package/dist/lib/esm/commitlint-config.d.mts +14 -0
- package/dist/lib/esm/commitlint-config.mjs +79 -0
- package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +37 -0
- package/dist/lib/esm/commitlint-forbidden-patterns.mjs +75 -0
- package/dist/lib/esm/commitlint-spellcheck-header.d.mts +40 -0
- package/dist/lib/esm/commitlint-spellcheck-header.mjs +87 -0
- package/dist/lib/esm/env-toggle.d.mts +42 -0
- package/dist/lib/esm/env-toggle.mjs +84 -0
- package/dist/lib/esm/exec.d.mts +162 -0
- package/dist/lib/esm/exec.mjs +410 -0
- package/dist/lib/esm/forbidden-patterns.d.mts +57 -0
- package/dist/lib/esm/forbidden-patterns.mjs +108 -0
- package/dist/lib/esm/formatters/dprint.d.mts +33 -0
- package/dist/lib/esm/formatters/dprint.mjs +75 -0
- package/dist/lib/esm/formatters/index.d.mts +2 -0
- package/dist/lib/esm/formatters/index.mjs +52 -0
- package/dist/lib/esm/fs.d.mts +80 -0
- package/dist/lib/esm/fs.mjs +89 -0
- package/dist/lib/esm/gate.d.mts +93 -0
- package/dist/lib/esm/gate.mjs +106 -0
- package/dist/lib/esm/git.d.mts +37 -0
- package/dist/lib/esm/git.mjs +72 -0
- package/dist/lib/esm/index.d.mts +35 -0
- package/dist/lib/esm/index.mjs +110 -0
- package/dist/lib/esm/json.d.mts +102 -0
- package/dist/lib/esm/json.mjs +106 -0
- package/dist/lib/esm/library-build.d.mts +97 -0
- package/dist/lib/esm/library-build.mjs +435 -0
- package/dist/lib/esm/linters/cspell-content.d.mts +46 -0
- package/dist/lib/esm/linters/cspell-content.mjs +87 -0
- package/dist/lib/esm/linters/cspell.d.mts +36 -0
- package/dist/lib/esm/linters/cspell.mjs +69 -0
- package/dist/lib/esm/linters/eslint-agnostic-core-boundary.d.mts +49 -0
- package/dist/lib/esm/linters/eslint-agnostic-core-boundary.mjs +57 -0
- package/dist/lib/esm/linters/eslint-config.d.mts +123 -0
- package/dist/lib/esm/linters/eslint-config.mjs +1022 -0
- package/dist/lib/esm/linters/eslint-no-restricted-syntax.d.mts +27 -0
- package/dist/lib/esm/linters/eslint-no-restricted-syntax.mjs +93 -0
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +26 -0
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +77 -0
- package/dist/lib/esm/linters/eslint-rules/index.d.mts +13 -0
- package/dist/lib/esm/linters/eslint-rules/index.mjs +74 -0
- package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +144 -0
- package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.mjs +277 -0
- package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.d.mts +41 -0
- package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.mjs +227 -0
- package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.d.mts +20 -0
- package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.mjs +96 -0
- package/dist/lib/esm/linters/eslint-rules/params-options-name-match.d.mts +36 -0
- package/dist/lib/esm/linters/eslint-rules/params-options-name-match.mjs +179 -0
- package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.mjs +88 -0
- package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.d.mts +20 -0
- package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.mjs +87 -0
- package/dist/lib/esm/linters/eslint-rules/require-method-template.d.mts +14 -0
- package/dist/lib/esm/linters/eslint-rules/require-method-template.mjs +142 -0
- package/dist/lib/esm/linters/eslint-rules/require-super-call.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/require-super-call.mjs +183 -0
- package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.d.mts +18 -0
- package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.mjs +55 -0
- package/dist/lib/esm/linters/eslint-rules/ts-estree-node.d.mts +23 -0
- package/dist/lib/esm/linters/eslint-rules/ts-estree-node.mjs +55 -0
- package/dist/lib/esm/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.mts +20 -0
- package/dist/lib/esm/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.mts +17 -0
- package/dist/lib/esm/linters/eslint.d.mts +35 -0
- package/dist/lib/esm/linters/eslint.mjs +88 -0
- package/dist/lib/esm/linters/index.d.mts +15 -0
- package/dist/lib/esm/linters/index.mjs +78 -0
- package/dist/lib/esm/linters/lint-ignores.d.mts +30 -0
- package/dist/lib/esm/linters/lint-ignores.mjs +54 -0
- package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +11 -0
- package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +122 -0
- package/dist/lib/esm/linters/markdownlint-content.d.mts +47 -0
- package/dist/lib/esm/linters/markdownlint-content.mjs +83 -0
- package/dist/lib/esm/linters/markdownlint-ignores.d.mts +35 -0
- package/dist/lib/esm/linters/markdownlint-ignores.mjs +57 -0
- package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +2 -0
- package/dist/lib/esm/linters/markdownlint-rules/index.mjs +52 -0
- package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.d.mts +35 -0
- package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.mjs +114 -0
- package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.mts +1344 -0
- package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2.d.mts +67 -0
- package/dist/lib/esm/linters/markdownlint.d.mts +32 -0
- package/dist/lib/esm/linters/markdownlint.mjs +124 -0
- package/dist/lib/esm/linters/over-exposure.d.mts +357 -0
- package/dist/lib/esm/linters/over-exposure.mjs +672 -0
- package/dist/lib/esm/nano-staged-config.d.mts +54 -0
- package/dist/lib/esm/nano-staged-config.mjs +103 -0
- package/dist/lib/esm/npm-publish.d.mts +19 -0
- package/dist/lib/esm/npm-publish.mjs +56 -0
- package/dist/lib/esm/npm-run.d.mts +34 -0
- package/dist/lib/esm/npm-run.mjs +81 -0
- package/dist/lib/esm/npm.d.mts +168 -0
- package/dist/lib/esm/npm.mjs +155 -0
- package/dist/lib/esm/package-lock-integrity.d.mts +38 -0
- package/dist/lib/esm/package-lock-integrity.mjs +99 -0
- package/dist/lib/esm/package-manager.d.mts +93 -0
- package/dist/lib/esm/package-manager.mjs +245 -0
- package/dist/lib/esm/released-issues.d.mts +79 -0
- package/dist/lib/esm/released-issues.mjs +143 -0
- package/dist/lib/esm/repo-paths.d.mts +318 -0
- package/dist/lib/esm/repo-paths.mjs +130 -0
- package/dist/lib/esm/root.d.mts +107 -0
- package/dist/lib/esm/root.mjs +115 -0
- package/dist/lib/esm/test-runners/index.d.mts +3 -0
- package/dist/lib/esm/test-runners/index.mjs +54 -0
- package/dist/lib/esm/test-runners/vitest-config.d.mts +90 -0
- package/dist/lib/esm/test-runners/vitest-config.mjs +86 -0
- package/dist/lib/esm/test-runners/vitest.d.mts +52 -0
- package/dist/lib/esm/test-runners/vitest.mjs +76 -0
- package/dist/lib/esm/validate-declarations.d.mts +37 -0
- package/dist/lib/esm/validate-declarations.mjs +87 -0
- package/dist/lib/esm/version.d.mts +418 -0
- package/dist/lib/esm/version.mjs +723 -0
- package/formatters/dprint/package.json +6 -0
- package/formatters/index/package.json +6 -0
- package/formatters/package.json +6 -0
- package/linters/cspell/package.json +6 -0
- package/linters/cspell-content/package.json +6 -0
- package/linters/eslint/package.json +6 -0
- package/linters/eslint-agnostic-core-boundary/package.json +6 -0
- package/linters/eslint-config/package.json +6 -0
- package/linters/eslint-no-restricted-syntax/package.json +6 -0
- package/linters/eslint-rules/in-house-plugin/package.json +6 -0
- package/linters/eslint-rules/index/package.json +6 -0
- package/linters/eslint-rules/no-async-callback-to-unsafe-return/package.json +6 -0
- package/linters/eslint-rules/no-unresolved-jsdoc-link/package.json +6 -0
- package/linters/eslint-rules/no-unused-params-members/package.json +6 -0
- package/linters/eslint-rules/no-used-underscore-variables/package.json +6 -0
- package/linters/eslint-rules/package.json +6 -0
- package/linters/eslint-rules/params-options-name-match/package.json +6 -0
- package/linters/eslint-rules/prefer-noop-async/package.json +6 -0
- package/linters/eslint-rules/readonly-params-options-result-members/package.json +6 -0
- package/linters/eslint-rules/require-method-template/package.json +6 -0
- package/linters/eslint-rules/require-super-call/package.json +6 -0
- package/linters/eslint-rules/rule-tester-helper/package.json +6 -0
- package/linters/eslint-rules/ts-estree-node/package.json +6 -0
- package/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs/package.json +4 -0
- package/linters/eslint-types/@types/eslint-plugin-verify-tsdoc/package.json +4 -0
- package/linters/index/package.json +6 -0
- package/linters/lint-ignores/package.json +6 -0
- package/linters/markdownlint/package.json +6 -0
- package/linters/markdownlint-cli2-config/package.json +6 -0
- package/linters/markdownlint-content/package.json +6 -0
- package/linters/markdownlint-ignores/package.json +6 -0
- package/linters/markdownlint-rules/index/package.json +6 -0
- package/linters/markdownlint-rules/no-soft-break-in-paragraph/package.json +6 -0
- package/linters/markdownlint-rules/package.json +6 -0
- package/linters/markdownlint-types/@types/markdownlint-cli2/package.json +4 -0
- package/linters/markdownlint-types/@types/markdownlint-cli2-config-schema/package.json +4 -0
- package/linters/over-exposure/package.json +6 -0
- package/linters/package.json +6 -0
- package/package.json +329 -13
- package/test-runners/index/package.json +6 -0
- package/test-runners/package.json +6 -0
- package/test-runners/vitest/package.json +6 -0
- package/test-runners/vitest-config/package.json +6 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/// <reference path="./index.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* The build pipeline of a TypeScript LIBRARY package: one `dist/lib/{cjs,esm}` tree of unbundled modules beside its
|
|
6
|
+
* `.d.cts` / `.d.mts` declarations, the generated `index.ts` barrels, and the generated `package.json` `exports` map.
|
|
7
|
+
*
|
|
8
|
+
* Each step works on the current working folder, which is the package being built. A repository's
|
|
9
|
+
* `scripts/build-*.ts` entry points are thin `wrapCliTask` wrappers around these functions, and its `build` script
|
|
10
|
+
* runs them in order through {@link runBuildSteps}.
|
|
11
|
+
*/
|
|
12
|
+
import type { Plugin } from 'esbuild';
|
|
13
|
+
/**
|
|
14
|
+
* The banner every emitted library module opens with.
|
|
15
|
+
*/
|
|
16
|
+
export declare const LIBRARY_BANNER = "/*\nTHIS IS A GENERATED/BUNDLED FILE BY ESBUILD\nif you want to view the source, please visit the github repository of this plugin\n*/\n";
|
|
17
|
+
/**
|
|
18
|
+
* The steps of a library build, in the order {@link runBuildSteps} runs them.
|
|
19
|
+
*/
|
|
20
|
+
export declare const LIBRARY_BUILD_STEPS: readonly string[];
|
|
21
|
+
/**
|
|
22
|
+
* The export condition the `obsidian-dev-utils` workspace maps every subpath onto its TypeScript source with, so a
|
|
23
|
+
* package there can import a sibling package's source before anything is built. Pass it to
|
|
24
|
+
* {@link generateLibraryExports} through {@link GenerateLibraryExportsOptions.sourceCondition}.
|
|
25
|
+
*/
|
|
26
|
+
export declare const SOURCE_CONDITION = "@mnaoumov/source";
|
|
27
|
+
/**
|
|
28
|
+
* Options for {@link buildLibrary}.
|
|
29
|
+
*/
|
|
30
|
+
export interface BuildLibraryOptions {
|
|
31
|
+
/**
|
|
32
|
+
* Creates the preprocess plugin for one output format. Defaults to the generic one, which carries no
|
|
33
|
+
* environment-specific `require` patch.
|
|
34
|
+
*/
|
|
35
|
+
readonly preprocessPluginFactory?: (isEsm: boolean) => Plugin;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Options for {@link generateLibraryExports}.
|
|
39
|
+
*/
|
|
40
|
+
export interface GenerateLibraryExportsOptions {
|
|
41
|
+
/**
|
|
42
|
+
* An export condition to put first in every entry, mapping the subpath onto its TypeScript source. Only a
|
|
43
|
+
* repository holding several packages that import each other needs one; nothing outside it sets the condition, and
|
|
44
|
+
* the sources it points at do not ship, so the publish has to strip it again. Omitted, the map has none.
|
|
45
|
+
*/
|
|
46
|
+
readonly sourceCondition?: string | undefined;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Removes everything an earlier build left: `dist/`, the generated `index.ts` barrels, the `.d.ts` files `tsc` wrote
|
|
50
|
+
* beside the sources (hand-authored ones under `@types` stay), and the per-subpath `package.json` stubs.
|
|
51
|
+
*
|
|
52
|
+
* @returns A {@link Promise} that resolves when everything has been removed.
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildCleanLibrary(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Builds every source module, unbundled, into `dist/lib/cjs` (`.cjs`) and `dist/lib/esm` (`.mjs`).
|
|
57
|
+
*
|
|
58
|
+
* The output folders must already exist; {@link buildLibraryTypes} creates them.
|
|
59
|
+
*
|
|
60
|
+
* @param options - The build options.
|
|
61
|
+
* @returns A {@link Promise} that resolves when both formats have been built.
|
|
62
|
+
*/
|
|
63
|
+
export declare function buildLibrary(options?: BuildLibraryOptions): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Emits the declarations with `tsc --project ./tsconfig.types.json`, then copies each one into `dist/lib` twice: as a
|
|
66
|
+
* `.d.cts` whose relative imports name `.cjs` files and whose bare type imports carry `resolution-mode: import`, and
|
|
67
|
+
* as a `.d.mts` whose relative imports name `.mjs` files.
|
|
68
|
+
*
|
|
69
|
+
* The library's root declaration (`library.ts` where the package has one, otherwise the generated `index.ts`) carries
|
|
70
|
+
* every `lib` and `types` reference the package needs; every other declaration references it by path.
|
|
71
|
+
*
|
|
72
|
+
* @returns A {@link Promise} that resolves when the declarations have been written.
|
|
73
|
+
*/
|
|
74
|
+
export declare function buildLibraryTypes(): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Regenerates the `exports` map of the package's `package.json` from its source folders, and writes a `package.json`
|
|
77
|
+
* stub per subpath for resolvers that do not read `exports`.
|
|
78
|
+
*
|
|
79
|
+
* @param options - The {@link GenerateLibraryExportsOptions}.
|
|
80
|
+
* @returns A {@link Promise} that resolves when the map is current.
|
|
81
|
+
* @throws If the map changed, so the change gets reviewed and committed rather than shipped unseen.
|
|
82
|
+
*/
|
|
83
|
+
export declare function generateLibraryExports(options?: GenerateLibraryExportsOptions): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Generates an `index.ts` barrel in every source folder that has something to export, re-exporting each module and
|
|
86
|
+
* each sub-barrel under its own name.
|
|
87
|
+
*
|
|
88
|
+
* @returns A {@link Promise} that resolves when the barrels have been written.
|
|
89
|
+
*/
|
|
90
|
+
export declare function generateLibraryIndex(): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Runs each named npm script the package defines, in order, skipping the ones it does not define.
|
|
93
|
+
*
|
|
94
|
+
* @param steps - The npm script names.
|
|
95
|
+
* @returns A {@link Promise} that resolves when every step has run.
|
|
96
|
+
*/
|
|
97
|
+
export declare function runBuildSteps(steps?: readonly string[]): Promise<void>;
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
+
symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
|
|
9
|
+
symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function ensureBrowserProcess() {
|
|
13
|
+
const browserProcess = {
|
|
14
|
+
browser: true,
|
|
15
|
+
cwd() {
|
|
16
|
+
return '/';
|
|
17
|
+
},
|
|
18
|
+
env: {},
|
|
19
|
+
platform: 'android'
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const existingProcess = globalThis.process;
|
|
23
|
+
|
|
24
|
+
if (!existingProcess) {
|
|
25
|
+
globalThis.process = browserProcess;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (existingProcess.versions?.node) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const existingProcessRecord = existingProcess;
|
|
34
|
+
|
|
35
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
36
|
+
existingProcessRecord[key] ??= value;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
existingProcessRecord['browser'] = true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
(function initEsm() {
|
|
43
|
+
ensureDisposeSymbols();
|
|
44
|
+
ensureBrowserProcess();
|
|
45
|
+
})();
|
|
46
|
+
})();
|
|
47
|
+
|
|
48
|
+
import { asyncMap } from "@mnaoumov/typescript-lib/async";
|
|
49
|
+
import { isDeepEqual } from "@mnaoumov/typescript-lib/object-utils";
|
|
50
|
+
import {
|
|
51
|
+
basename,
|
|
52
|
+
dirname,
|
|
53
|
+
extname,
|
|
54
|
+
join,
|
|
55
|
+
normalizeIfRelative,
|
|
56
|
+
relative
|
|
57
|
+
} from "@mnaoumov/typescript-lib/path";
|
|
58
|
+
import { replaceAll } from "@mnaoumov/typescript-lib/string";
|
|
59
|
+
import { context } from "esbuild";
|
|
60
|
+
import {
|
|
61
|
+
existsSync,
|
|
62
|
+
readFileSync
|
|
63
|
+
} from "node:fs";
|
|
64
|
+
import {
|
|
65
|
+
mkdir,
|
|
66
|
+
readFile,
|
|
67
|
+
rm,
|
|
68
|
+
writeFile
|
|
69
|
+
} from "node:fs/promises";
|
|
70
|
+
import { relative as relativeNative } from "node:path";
|
|
71
|
+
import process from "node:process";
|
|
72
|
+
import { buildClean } from "./build.mjs";
|
|
73
|
+
import { changeExtensionPlugin } from "./bundlers/esbuild-impl/change-extension-plugin.mjs";
|
|
74
|
+
import { fixEsmPlugin } from "./bundlers/esbuild-impl/fix-esm-plugin.mjs";
|
|
75
|
+
import { preprocessPlugin } from "./bundlers/esbuild-impl/preprocess-plugin.mjs";
|
|
76
|
+
import { parseTsConfig } from "./check-project-types.mjs";
|
|
77
|
+
import { generate } from "./code-generator.mjs";
|
|
78
|
+
import { readdirPosix } from "./fs.mjs";
|
|
79
|
+
import { writeJson } from "./json.mjs";
|
|
80
|
+
import { npmRunOptional } from "./npm-run.mjs";
|
|
81
|
+
import { editPackageJson } from "./npm.mjs";
|
|
82
|
+
import { resolveToolCommand } from "./package-manager.mjs";
|
|
83
|
+
import { RepoPaths } from "./repo-paths.mjs";
|
|
84
|
+
import { execFromRoot } from "./root.mjs";
|
|
85
|
+
const LIBRARY_BANNER = `/*
|
|
86
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
87
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
88
|
+
*/
|
|
89
|
+
`;
|
|
90
|
+
const LIBRARY_BUILD_STEPS = [
|
|
91
|
+
"build:clean",
|
|
92
|
+
"build:generate-index",
|
|
93
|
+
"build:compile",
|
|
94
|
+
"build:types",
|
|
95
|
+
"build:validate-declarations",
|
|
96
|
+
"build:lib",
|
|
97
|
+
"build:generate-exports"
|
|
98
|
+
];
|
|
99
|
+
const SOURCE_CONDITION = "@mnaoumov/source";
|
|
100
|
+
const DECLARATION_REFERENCE_TYPES = /* @__PURE__ */ new Set(["node"]);
|
|
101
|
+
const REFERENCE_LIB_DIRECTIVE = ["<reference", "lib="].join(" ");
|
|
102
|
+
const REFERENCE_LIB_REG_EXP = /\/\/\/ <reference lib="(?<Lib>[^"]+)" \/>/gm;
|
|
103
|
+
const BARE_TYPE_IMPORT_REG_EXP = /^import type (?<Clause>.+?) from '(?<Specifier>[^.'][^']*)';$/gm;
|
|
104
|
+
const BARE_INLINE_IMPORT_TYPE_REG_EXP = /import\("(?<Specifier>[^."][^"]*)"\)/g;
|
|
105
|
+
const STATIC_IMPORT_REG_EXP = /from '(?<ImportPath>.+?)\.ts';/gm;
|
|
106
|
+
const DYNAMIC_IMPORT_REG_EXP = /import\((?<Quote>['"])(?<ImportPath>.+?)\.ts\k<Quote>\)/gm;
|
|
107
|
+
async function buildCleanLibrary() {
|
|
108
|
+
await buildClean();
|
|
109
|
+
for (const file of await readdirPosix(RepoPaths.Src, { recursive: true })) {
|
|
110
|
+
if (basename(file) === RepoPaths.IndexTs) {
|
|
111
|
+
await rm(join(RepoPaths.Src, file));
|
|
112
|
+
}
|
|
113
|
+
if (file.endsWith(RepoPaths.DtsExtension) && !file.split("/").includes(RepoPaths.Types)) {
|
|
114
|
+
await rm(join(RepoPaths.Src, file));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
for (const file of await readdirPosix(RepoPaths.CurrentFolder, { recursive: true })) {
|
|
118
|
+
if (basename(file) !== RepoPaths.PackageJson || file === RepoPaths.PackageJson || file.startsWith(RepoPaths.NodeModules)) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
await rm(file);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function buildLibrary(options = {}) {
|
|
125
|
+
const { preprocessPluginFactory = (isEsm) => preprocessPlugin({ isEsm }) } = options;
|
|
126
|
+
const libFiles = await getLibFiles();
|
|
127
|
+
await buildLibraryFormat({ format: "cjs", libFiles, preprocessPluginFactory });
|
|
128
|
+
await buildLibraryFormat({ format: "esm", libFiles, preprocessPluginFactory });
|
|
129
|
+
}
|
|
130
|
+
async function buildLibraryTypes() {
|
|
131
|
+
await execFromRoot([...resolveToolCommand({ tool: "tsc" }), "--project", "./tsconfig.types.json"]);
|
|
132
|
+
const libraryFileName = existsSync(join(RepoPaths.Src, "library.ts")) ? "library" : "index";
|
|
133
|
+
const allLibs = await collectAllLibs();
|
|
134
|
+
const allTypes = collectAllTypes();
|
|
135
|
+
for (const file of await readdirPosix(RepoPaths.Src, { recursive: true })) {
|
|
136
|
+
if (!file.endsWith(RepoPaths.DtsExtension) || file.startsWith(RepoPaths.TestHelpers)) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
const folder = dirname(file);
|
|
140
|
+
const name = basename(file, RepoPaths.DtsExtension);
|
|
141
|
+
const content = await readFile(join(RepoPaths.Src, file), "utf-8");
|
|
142
|
+
const ctsPath = join(RepoPaths.DistLib, RepoPaths.Cjs, folder, name + RepoPaths.DctsExtension);
|
|
143
|
+
const mtsPath = join(RepoPaths.DistLib, RepoPaths.Esm, folder, name + RepoPaths.DmtsExtension);
|
|
144
|
+
await mkdir(dirname(ctsPath), { recursive: true });
|
|
145
|
+
await mkdir(dirname(mtsPath), { recursive: true });
|
|
146
|
+
let ctsContent = toCtsContent(content);
|
|
147
|
+
let mtsContent = toMtsContent(content);
|
|
148
|
+
if (name === libraryFileName && folder === ".") {
|
|
149
|
+
const directives = buildAllReferenceLibDirectives(allLibs) + buildAllReferenceTypesDirectives(allTypes);
|
|
150
|
+
ctsContent = directives + ctsContent;
|
|
151
|
+
mtsContent = directives + mtsContent;
|
|
152
|
+
} else {
|
|
153
|
+
ctsContent = buildReferencePathDirective({ declarationFilePath: ctsPath, extension: RepoPaths.DctsExtension, libraryFileName, moduleDirectory: RepoPaths.Cjs }) + ctsContent;
|
|
154
|
+
mtsContent = buildReferencePathDirective({ declarationFilePath: mtsPath, extension: RepoPaths.DmtsExtension, libraryFileName, moduleDirectory: RepoPaths.Esm }) + mtsContent;
|
|
155
|
+
}
|
|
156
|
+
await writeFile(ctsPath, ctsContent);
|
|
157
|
+
await writeFile(mtsPath, mtsContent);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function generateLibraryExports(options = {}) {
|
|
161
|
+
const { sourceCondition } = options;
|
|
162
|
+
const srcFolders = [RepoPaths.Src];
|
|
163
|
+
for (const dirent of await readdirPosix(RepoPaths.Src, { recursive: true, withFileTypes: true })) {
|
|
164
|
+
if (!dirent.isDirectory()) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const path = join(dirent.parentPath, dirent.name);
|
|
168
|
+
if (path.includes(RepoPaths.Styles) || path.includes(RepoPaths.TestHelpers)) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
srcFolders.push(path);
|
|
172
|
+
}
|
|
173
|
+
srcFolders.sort();
|
|
174
|
+
let isChanged = false;
|
|
175
|
+
await editPackageJson(async (packageJson) => {
|
|
176
|
+
const oldExports = packageJson.exports;
|
|
177
|
+
const exportConditions = {};
|
|
178
|
+
packageJson.exports = exportConditions;
|
|
179
|
+
for (const srcFolder of srcFolders) {
|
|
180
|
+
await setExport({ exportConditions, isWildcard: false, sourceCondition, srcFolder });
|
|
181
|
+
await setExport({ exportConditions, isWildcard: true, sourceCondition, srcFolder });
|
|
182
|
+
}
|
|
183
|
+
isChanged = !isDeepEqual(oldExports, packageJson.exports);
|
|
184
|
+
});
|
|
185
|
+
if (isChanged) {
|
|
186
|
+
throw new Error("Package exports have changed. Please review the changes and commit them.");
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async function generateLibraryIndex() {
|
|
190
|
+
await generateIndex(RepoPaths.Src);
|
|
191
|
+
}
|
|
192
|
+
async function runBuildSteps(steps = LIBRARY_BUILD_STEPS) {
|
|
193
|
+
for (const step of steps) {
|
|
194
|
+
await npmRunOptional(step);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function buildAllReferenceLibDirectives(libs) {
|
|
198
|
+
return `${libs.map((lib) => `/// ${REFERENCE_LIB_DIRECTIVE}"${lib}" />`).join("\n")}
|
|
199
|
+
`;
|
|
200
|
+
}
|
|
201
|
+
function buildAllReferenceTypesDirectives(types) {
|
|
202
|
+
return types.length === 0 ? "" : `${types.map((type) => `/// <reference types="${type}" />`).join("\n")}
|
|
203
|
+
`;
|
|
204
|
+
}
|
|
205
|
+
async function buildLibraryFormat(params) {
|
|
206
|
+
const { format, libFiles, preprocessPluginFactory } = params;
|
|
207
|
+
const extension = format === "cjs" ? RepoPaths.CjsExtension : RepoPaths.MjsExtension;
|
|
208
|
+
const buildOptions = {
|
|
209
|
+
// Explicit, because esbuild otherwise takes the folder its service process started in.
|
|
210
|
+
// eslint-disable-next-line unicorn/name-replacements -- esbuild's own option name.
|
|
211
|
+
absWorkingDir: process.cwd(),
|
|
212
|
+
banner: {
|
|
213
|
+
js: LIBRARY_BANNER
|
|
214
|
+
},
|
|
215
|
+
bundle: false,
|
|
216
|
+
entryPoints: libFiles,
|
|
217
|
+
format,
|
|
218
|
+
logLevel: "info",
|
|
219
|
+
outdir: join(RepoPaths.DistLib, format),
|
|
220
|
+
platform: "node",
|
|
221
|
+
plugins: [
|
|
222
|
+
preprocessPluginFactory(format === "esm"),
|
|
223
|
+
fixEsmPlugin(),
|
|
224
|
+
changeExtensionPlugin(extension)
|
|
225
|
+
],
|
|
226
|
+
sourcemap: "inline",
|
|
227
|
+
target: "ES2022",
|
|
228
|
+
treeShaking: true,
|
|
229
|
+
write: false
|
|
230
|
+
};
|
|
231
|
+
const buildContext = await context(buildOptions);
|
|
232
|
+
try {
|
|
233
|
+
await buildContext.rebuild();
|
|
234
|
+
} finally {
|
|
235
|
+
await buildContext.dispose();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function buildReferencePathDirective(params) {
|
|
239
|
+
const { declarationFilePath, extension, libraryFileName, moduleDirectory } = params;
|
|
240
|
+
const libraryFilePath = join(RepoPaths.DistLib, moduleDirectory, libraryFileName + extension);
|
|
241
|
+
let relativePath = relativeNative(dirname(declarationFilePath), libraryFilePath).replaceAll("\\", "/");
|
|
242
|
+
if (!relativePath.startsWith(".")) {
|
|
243
|
+
relativePath = `./${relativePath}`;
|
|
244
|
+
}
|
|
245
|
+
return `/// <reference path="${relativePath}" />
|
|
246
|
+
`;
|
|
247
|
+
}
|
|
248
|
+
async function collectAllLibs() {
|
|
249
|
+
const { options } = parseTsConfig(RepoPaths.TsConfigJson);
|
|
250
|
+
const libs = new Set((options.lib ?? []).map((lib) => lib.toLowerCase().replace(/^lib\./, "").replace(/\.d\.ts$/, "")));
|
|
251
|
+
for (const file of await readdirPosix(RepoPaths.Src, { recursive: true })) {
|
|
252
|
+
if (!file.endsWith(".ts")) {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
const sourceContent = readFileSync(join(RepoPaths.Src, file), "utf-8");
|
|
256
|
+
for (const [, lib] of sourceContent.matchAll(REFERENCE_LIB_REG_EXP)) {
|
|
257
|
+
libs.add(String(lib).toLowerCase());
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return [...libs].sort();
|
|
261
|
+
}
|
|
262
|
+
function collectAllTypes() {
|
|
263
|
+
const { options } = parseTsConfig(RepoPaths.TsConfigJson);
|
|
264
|
+
return (options.types ?? []).filter((type) => DECLARATION_REFERENCE_TYPES.has(type)).sort();
|
|
265
|
+
}
|
|
266
|
+
async function generateIndex(folder) {
|
|
267
|
+
const dirents = await readdirPosix(folder, { withFileTypes: true });
|
|
268
|
+
const maybeLines = await asyncMap(dirents, (dirent) => handleIndexDirent(folder, dirent));
|
|
269
|
+
const lines = maybeLines.filter((line) => line !== void 0);
|
|
270
|
+
if (lines.length === 0) {
|
|
271
|
+
return "skipped" /* Skipped */;
|
|
272
|
+
}
|
|
273
|
+
await generate(join(folder, RepoPaths.IndexTs), lines);
|
|
274
|
+
return "success" /* Success */;
|
|
275
|
+
}
|
|
276
|
+
async function getLibFiles() {
|
|
277
|
+
let files = await readdirPosix(RepoPaths.Src, { recursive: true });
|
|
278
|
+
files = files.map((file) => normalizeIfRelative(join(RepoPaths.Src, file)));
|
|
279
|
+
return files.filter(
|
|
280
|
+
(file) => file.endsWith(RepoPaths.TsExtension) && !file.endsWith(RepoPaths.DtsExtension) && !file.endsWith(".test.ts") && !file.includes(`/${RepoPaths.TestHelpers}/`)
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
async function handleIndexDirent(folder, dirent) {
|
|
284
|
+
if (isExcludedFromIndex(folder, dirent)) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
let sourceFile;
|
|
288
|
+
let name;
|
|
289
|
+
if (dirent.isDirectory()) {
|
|
290
|
+
const result = await generateIndex(join(folder, dirent.name));
|
|
291
|
+
if (result !== "success" /* Success */) {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
sourceFile = normalizeIfRelative(join(dirent.name, RepoPaths.IndexTs));
|
|
295
|
+
name = dirent.name;
|
|
296
|
+
} else {
|
|
297
|
+
const extension = extname(dirent.name);
|
|
298
|
+
name = basename(dirent.name, extension);
|
|
299
|
+
sourceFile = normalizeIfRelative(dirent.name);
|
|
300
|
+
}
|
|
301
|
+
return `export * as '${name}' from '${sourceFile}';`;
|
|
302
|
+
}
|
|
303
|
+
function isExcludedFileName(name) {
|
|
304
|
+
return !name.endsWith(RepoPaths.TsExtension) || name.endsWith(".test.ts") || name === "setup.ts" || name.endsWith("-setup.ts");
|
|
305
|
+
}
|
|
306
|
+
function isExcludedFromIndex(folder, dirent) {
|
|
307
|
+
const excludedNames = [RepoPaths.IndexTs, RepoPaths.Types, RepoPaths.Styles, RepoPaths.TestHelpers];
|
|
308
|
+
const isExcludedEntry = excludedNames.includes(dirent.name) || dirent.name.endsWith(RepoPaths.DtsExtension) || folder.split("/").includes(RepoPaths.Types);
|
|
309
|
+
return isExcludedEntry || dirent.isFile() && isExcludedFileName(dirent.name);
|
|
310
|
+
}
|
|
311
|
+
async function setExport(params) {
|
|
312
|
+
const { exportConditions, isWildcard, sourceCondition, srcFolder } = params;
|
|
313
|
+
const importPath = replaceAll({
|
|
314
|
+
$string: srcFolder,
|
|
315
|
+
replacer: RepoPaths.CurrentFolder,
|
|
316
|
+
searchValue: RepoPaths.Src
|
|
317
|
+
});
|
|
318
|
+
const conditionPath = isWildcard ? `${importPath}/${RepoPaths.Any}` : importPath;
|
|
319
|
+
const dmtsPath = toDistPath({ format: RepoPaths.Esm, importPath, name: isWildcard ? RepoPaths.AnyDmts : RepoPaths.IndexDmts });
|
|
320
|
+
const dctsPath = toDistPath({ format: RepoPaths.Cjs, importPath, name: isWildcard ? RepoPaths.AnyDcts : RepoPaths.IndexDcts });
|
|
321
|
+
const dmtsFolderPath = dirname(dmtsPath);
|
|
322
|
+
const dctsFolderPath = dirname(dctsPath);
|
|
323
|
+
if (!isWildcard && !existsSync(dctsPath)) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
const isTypesOnly = importPath.includes(RepoPaths.Types);
|
|
327
|
+
const mjsPath = toDistPath({ format: RepoPaths.Esm, importPath, name: isWildcard ? RepoPaths.AnyMjs : RepoPaths.IndexMjs });
|
|
328
|
+
const cjsPath = toDistPath({ format: RepoPaths.Cjs, importPath, name: isWildcard ? RepoPaths.AnyCjs : RepoPaths.IndexCjs });
|
|
329
|
+
if (isTypesOnly) {
|
|
330
|
+
exportConditions[conditionPath] = {
|
|
331
|
+
import: {
|
|
332
|
+
types: dmtsPath
|
|
333
|
+
},
|
|
334
|
+
require: {
|
|
335
|
+
types: dctsPath
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
} else {
|
|
339
|
+
const sourcePath = normalizeIfRelative(join(RepoPaths.Src, importPath, isWildcard ? RepoPaths.AnyTs : RepoPaths.IndexTs));
|
|
340
|
+
exportConditions[conditionPath] = {
|
|
341
|
+
/* eslint-disable perfectionist/sort-objects -- Order matters once it is written to `package.json`. */
|
|
342
|
+
// First, so it wins wherever it is set: inside the repository, before anything is built.
|
|
343
|
+
...sourceCondition !== void 0 && { [sourceCondition]: sourcePath },
|
|
344
|
+
import: {
|
|
345
|
+
types: dmtsPath,
|
|
346
|
+
default: mjsPath
|
|
347
|
+
},
|
|
348
|
+
require: {
|
|
349
|
+
types: dctsPath,
|
|
350
|
+
default: cjsPath
|
|
351
|
+
}
|
|
352
|
+
/* eslint-enable perfectionist/sort-objects -- Order matters once it is written to `package.json`. */
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
if (importPath === RepoPaths.CurrentFolder) {
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (!isWildcard) {
|
|
359
|
+
await writeSubpathPackageJson(
|
|
360
|
+
importPath,
|
|
361
|
+
isTypesOnly ? { type: "module", types: relative(importPath, dctsPath) } : { main: relative(importPath, cjsPath), module: relative(importPath, mjsPath), type: "module", types: relative(importPath, dctsPath) }
|
|
362
|
+
);
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
for (const file of await readdirPosix(dctsFolderPath)) {
|
|
366
|
+
if (!file.endsWith(RepoPaths.DctsExtension)) {
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
const name = basename(file, RepoPaths.DctsExtension);
|
|
370
|
+
const packageJsonFolderPath = join(importPath, name);
|
|
371
|
+
const types = relative(packageJsonFolderPath, join(dctsFolderPath, name + RepoPaths.DctsExtension));
|
|
372
|
+
await writeSubpathPackageJson(
|
|
373
|
+
packageJsonFolderPath,
|
|
374
|
+
isTypesOnly ? { type: "module", types } : {
|
|
375
|
+
main: relative(packageJsonFolderPath, join(dctsFolderPath, name + RepoPaths.CjsExtension)),
|
|
376
|
+
module: relative(packageJsonFolderPath, join(dmtsFolderPath, name + RepoPaths.MjsExtension)),
|
|
377
|
+
type: "module",
|
|
378
|
+
types
|
|
379
|
+
}
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
function toCtsContent(content) {
|
|
384
|
+
let ctsContent = replaceAll({
|
|
385
|
+
$string: content,
|
|
386
|
+
replacer: "from '$<ImportPath>.cjs';",
|
|
387
|
+
searchValue: STATIC_IMPORT_REG_EXP
|
|
388
|
+
});
|
|
389
|
+
ctsContent = replaceAll({
|
|
390
|
+
$string: ctsContent,
|
|
391
|
+
replacer: "import($<Quote>$<ImportPath>.cjs$<Quote>)",
|
|
392
|
+
searchValue: DYNAMIC_IMPORT_REG_EXP
|
|
393
|
+
});
|
|
394
|
+
ctsContent = replaceAll({
|
|
395
|
+
$string: ctsContent,
|
|
396
|
+
replacer: "import type $<Clause> from '$<Specifier>' with { 'resolution-mode': 'import' };",
|
|
397
|
+
searchValue: BARE_TYPE_IMPORT_REG_EXP
|
|
398
|
+
});
|
|
399
|
+
return replaceAll({
|
|
400
|
+
$string: ctsContent,
|
|
401
|
+
replacer: `import("$<Specifier>", { with: { 'resolution-mode': 'import' } })`,
|
|
402
|
+
searchValue: BARE_INLINE_IMPORT_TYPE_REG_EXP
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
function toDistPath(params) {
|
|
406
|
+
return normalizeIfRelative(join(RepoPaths.DistLib, params.format, params.importPath, params.name));
|
|
407
|
+
}
|
|
408
|
+
function toMtsContent(content) {
|
|
409
|
+
const mtsContent = replaceAll({
|
|
410
|
+
$string: content,
|
|
411
|
+
replacer: "from '$<ImportPath>.mjs';",
|
|
412
|
+
searchValue: STATIC_IMPORT_REG_EXP
|
|
413
|
+
});
|
|
414
|
+
return replaceAll({
|
|
415
|
+
$string: mtsContent,
|
|
416
|
+
replacer: "import($<Quote>$<ImportPath>.mjs$<Quote>)",
|
|
417
|
+
searchValue: DYNAMIC_IMPORT_REG_EXP
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
async function writeSubpathPackageJson(folder, packageJson) {
|
|
421
|
+
await mkdir(folder, { recursive: true });
|
|
422
|
+
await writeJson(join(folder, RepoPaths.PackageJson), packageJson);
|
|
423
|
+
}
|
|
424
|
+
export {
|
|
425
|
+
LIBRARY_BANNER,
|
|
426
|
+
LIBRARY_BUILD_STEPS,
|
|
427
|
+
SOURCE_CONDITION,
|
|
428
|
+
buildCleanLibrary,
|
|
429
|
+
buildLibrary,
|
|
430
|
+
buildLibraryTypes,
|
|
431
|
+
generateLibraryExports,
|
|
432
|
+
generateLibraryIndex,
|
|
433
|
+
runBuildSteps
|
|
434
|
+
};
|
|
435
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xpYnJhcnktYnVpbGQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcblxuaW1wb3J0IHsgYnVpbGRDbGVhbiB9IGZyb20gJy4vYnVpbGQudHMnO1xuaW1wb3J0IHsgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvY2hhbmdlLWV4dGVuc2lvbi1wbHVnaW4udHMnO1xuaW1wb3J0IHsgZml4RXNtUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvZml4LWVzbS1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcHJlcHJvY2Vzc1BsdWdpbiB9IGZyb20gJy4vYnVuZGxlcnMvZXNidWlsZC1pbXBsL3ByZXByb2Nlc3MtcGx1Z2luLnRzJztcbmltcG9ydCB7IHBhcnNlVHNDb25maWcgfSBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICcuL2NvZGUtZ2VuZXJhdG9yLnRzJztcbmltcG9ydCB7IHJlYWRkaXJQb3NpeCB9IGZyb20gJy4vZnMudHMnO1xuaW1wb3J0IHsgd3JpdGVKc29uIH0gZnJvbSAnLi9qc29uLnRzJztcbmltcG9ydCB7IG5wbVJ1bk9wdGlvbmFsIH0gZnJvbSAnLi9ucG0tcnVuLnRzJztcbmltcG9ydCB7IGVkaXRQYWNrYWdlSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IHJlc29sdmVUb29sQ29tbWFuZCB9IGZyb20gJy4vcGFja2FnZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7IFJlcG9QYXRocyB9IGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5pbXBvcnQgeyBleGVjRnJvbVJvb3QgfSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIFRoZSBiYW5uZXIgZXZlcnkgZW1pdHRlZCBsaWJyYXJ5IG1vZHVsZSBvcGVucyB3aXRoLlxuICovXG5leHBvcnQgY29uc3QgTElCUkFSWV9CQU5ORVIgPSBgLypcblRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEVTQlVJTERcbmlmIHlvdSB3YW50IHRvIHZpZXcgdGhlIHNvdXJjZSwgcGxlYXNlIHZpc2l0IHRoZSBnaXRodWIgcmVwb3NpdG9yeSBvZiB0aGlzIHBsdWdpblxuKi9cbmA7XG5cbi8qKlxuICogVGhlIHN0ZXBzIG9mIGEgbGlicmFyeSBidWlsZCwgaW4gdGhlIG9yZGVyIHtAbGluayBydW5CdWlsZFN0ZXBzfSBydW5zIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JVSUxEX1NURVBTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgJ2J1aWxkOmNsZWFuJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWluZGV4JyxcbiAgJ2J1aWxkOmNvbXBpbGUnLFxuICAnYnVpbGQ6dHlwZXMnLFxuICAnYnVpbGQ6dmFsaWRhdGUtZGVjbGFyYXRpb25zJyxcbiAgJ2J1aWxkOmxpYicsXG4gICdidWlsZDpnZW5lcmF0ZS1leHBvcnRzJ1xuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0IGNvbmRpdGlvbiB0aGUgYG9ic2lkaWFuLWRldi11dGlsc2Agd29ya3NwYWNlIG1hcHMgZXZlcnkgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZSB3aXRoLCBzbyBhXG4gKiBwYWNrYWdlIHRoZXJlIGNhbiBpbXBvcnQgYSBzaWJsaW5nIHBhY2thZ2UncyBzb3VyY2UgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LiBQYXNzIGl0IHRvXG4gKiB7QGxpbmsgZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0c30gdGhyb3VnaCB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMuc291cmNlQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9DT05ESVRJT04gPSAnQG1uYW91bW92L3NvdXJjZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkTGlicmFyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcmVwcm9jZXNzIHBsdWdpbiBmb3Igb25lIG91dHB1dCBmb3JtYXQuIERlZmF1bHRzIHRvIHRoZSBnZW5lcmljIG9uZSwgd2hpY2ggY2FycmllcyBub1xuICAgKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBgcmVxdWlyZWAgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeT86IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBleHBvcnQgY29uZGl0aW9uIHRvIHB1dCBmaXJzdCBpbiBldmVyeSBlbnRyeSwgbWFwcGluZyB0aGUgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZS4gT25seSBhXG4gICAqIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIHRoYXQgaW1wb3J0IGVhY2ggb3RoZXIgbmVlZHMgb25lOyBub3RoaW5nIG91dHNpZGUgaXQgc2V0cyB0aGUgY29uZGl0aW9uLCBhbmRcbiAgICogdGhlIHNvdXJjZXMgaXQgcG9pbnRzIGF0IGRvIG5vdCBzaGlwLCBzbyB0aGUgcHVibGlzaCBoYXMgdG8gc3RyaXAgaXQgYWdhaW4uIE9taXR0ZWQsIHRoZSBtYXAgaGFzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTW9kdWxlRm9ybWF0ID0gJ2NqcycgfCAnZXNtJztcblxuY29uc3QgREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTID0gbmV3IFNldChbJ25vZGUnXSk7XG4vLyBTcGVsbGVkIGFwYXJ0IG9uIHB1cnBvc2U6IHtAbGluayBjb2xsZWN0QWxsTGlic30gc2NhbnMgZXZlcnkgc291cmNlIGZpbGUgb2YgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQgZm9yIHRoZVxuLy8gZGlyZWN0aXZlLCB0aGlzIG9uZSBpbmNsdWRlZCwgc28gYSBsaXRlcmFsIG9uZSBoZXJlIHdvdWxkIGJlIHJlYWQgYXMgYSBsaWIgdGhpcyBwYWNrYWdlIG5lZWRzLlxuY29uc3QgUkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkUgPSBbJzxyZWZlcmVuY2UnLCAnbGliPSddLmpvaW4oJyAnKTtcbmNvbnN0IFJFRkVSRU5DRV9MSUJfUkVHX0VYUCA9IC9cXC9cXC9cXC8gPHJlZmVyZW5jZSBsaWI9XCIoPzxMaWI+W15cIl0rKVwiIFxcLz4vZ207XG5cbi8vIEEgYmFyZS1zcGVjaWZpZXIgKG5vbi1yZWxhdGl2ZSkgdHlwZS1vbmx5IGltcG9ydCwgZS5nLiBgaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztgLlxuY29uc3QgQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQID0gL15pbXBvcnQgdHlwZSAoPzxDbGF1c2U+Lis/KSBmcm9tICcoPzxTcGVjaWZpZXI+W14uJ11bXiddKiknOyQvZ207XG5cbi8vIEEgYmFyZS1zcGVjaWZpZXIgKG5vbi1yZWxhdGl2ZSkgaW5saW5lIGltcG9ydCB0eXBlIG5vZGUsIGUuZy4gYGltcG9ydChcInR5cGUtZmVzdFwiKS5Qcm9taXNhYmxlYC5cbmNvbnN0IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFAgPSAvaW1wb3J0XFwoXCIoPzxTcGVjaWZpZXI+W14uXCJdW15cIl0qKVwiXFwpL2c7XG5cbmNvbnN0IFNUQVRJQ19JTVBPUlRfUkVHX0VYUCA9IC9mcm9tICcoPzxJbXBvcnRQYXRoPi4rPylcXC50cyc7L2dtO1xuXG4vLyBJbmxpbmUgaW1wb3J0LXR5cGUgbm9kZXMgKGB0eXBlb2YgaW1wb3J0KCcuL2Zvby50cycpYCkgcHJlc2VydmUgdGhlIHNvdXJjZSBxdW90ZSBzdHlsZS5cbi8vIEhhbmQtYXV0aG9yZWQgYC5kLnRzYCBmaWxlcyBlbWl0IHNpbmdsZSBxdW90ZXM7IHRzYy1nZW5lcmF0ZWQgZGVjbGFyYXRpb25zIGVtaXQgZG91YmxlIHF1b3Rlcy5cbi8vIENhcHR1cmUgdGhlIHF1b3RlIGFuZCByZXVzZSBpdCBpbiB0aGUgcmVwbGFjZW1lbnQgc28gYm90aCBzdHlsZXMgYXJlIHJld3JpdHRlbi5cbmNvbnN0IERZTkFNSUNfSU1QT1JUX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+WydcIl0pKD88SW1wb3J0UGF0aD4uKz8pXFwudHNcXGs8UXVvdGU+XFwpL2dtO1xuXG5lbnVtIEdlbmVyYXRlSW5kZXhSZXN1bHQge1xuICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnXG59XG5cbmludGVyZmFjZSBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMge1xuICByZWFkb25seSBmb3JtYXQ6IE1vZHVsZUZvcm1hdDtcbiAgcmVhZG9ubHkgbGliRmlsZXM6IHN0cmluZ1tdO1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeTogKGlzRXNtOiBib29sZWFuKSA9PiBQbHVnaW47XG59XG5cbmludGVyZmFjZSBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMge1xuICByZWFkb25seSBkZWNsYXJhdGlvbkZpbGVQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4dGVuc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBsaWJyYXJ5RmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kdWxlRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTZXRFeHBvcnRQYXJhbXMge1xuICByZWFkb25seSBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zO1xuICByZWFkb25seSBpc1dpbGRjYXJkOiBib29sZWFuO1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUb0Rpc3RQYXRoUGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltcG9ydFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlcnl0aGluZyBhbiBlYXJsaWVyIGJ1aWxkIGxlZnQ6IGBkaXN0L2AsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCB0aGUgYC5kLnRzYCBmaWxlcyBgdHNjYCB3cm90ZVxuICogYmVzaWRlIHRoZSBzb3VyY2VzIChoYW5kLWF1dGhvcmVkIG9uZXMgdW5kZXIgYEB0eXBlc2Agc3RheSksIGFuZCB0aGUgcGVyLXN1YnBhdGggYHBhY2thZ2UuanNvbmAgc3R1YnMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xlYW5MaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZENsZWFuKCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoYmFzZW5hbWUoZmlsZSkgPT09IFJlcG9QYXRocy5JbmRleFRzIGFzIHN0cmluZykge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICgoYmFzZW5hbWUoZmlsZSkgIT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IChmaWxlID09PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCBmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLk5vZGVNb2R1bGVzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgcm0oZmlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgZXZlcnkgc291cmNlIG1vZHVsZSwgdW5idW5kbGVkLCBpbnRvIGBkaXN0L2xpYi9janNgIChgLmNqc2ApIGFuZCBgZGlzdC9saWIvZXNtYCAoYC5tanNgKS5cbiAqXG4gKiBUaGUgb3V0cHV0IGZvbGRlcnMgbXVzdCBhbHJlYWR5IGV4aXN0OyB7QGxpbmsgYnVpbGRMaWJyYXJ5VHlwZXN9IGNyZWF0ZXMgdGhlbS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGJvdGggZm9ybWF0cyBoYXZlIGJlZW4gYnVpbHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnkob3B0aW9uczogQnVpbGRMaWJyYXJ5T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgPSAoaXNFc206IGJvb2xlYW4pOiBQbHVnaW4gPT4gcHJlcHJvY2Vzc1BsdWdpbih7IGlzRXNtIH0pIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaWJGaWxlcyA9IGF3YWl0IGdldExpYkZpbGVzKCk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2NqcycsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnZXNtJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZWNsYXJhdGlvbnMgd2l0aCBgdHNjIC0tcHJvamVjdCAuL3RzY29uZmlnLnR5cGVzLmpzb25gLCB0aGVuIGNvcGllcyBlYWNoIG9uZSBpbnRvIGBkaXN0L2xpYmAgdHdpY2U6IGFzIGFcbiAqIGAuZC5jdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLmNqc2AgZmlsZXMgYW5kIHdob3NlIGJhcmUgdHlwZSBpbXBvcnRzIGNhcnJ5IGByZXNvbHV0aW9uLW1vZGU6IGltcG9ydGAsIGFuZFxuICogYXMgYSBgLmQubXRzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5tanNgIGZpbGVzLlxuICpcbiAqIFRoZSBsaWJyYXJ5J3Mgcm9vdCBkZWNsYXJhdGlvbiAoYGxpYnJhcnkudHNgIHdoZXJlIHRoZSBwYWNrYWdlIGhhcyBvbmUsIG90aGVyd2lzZSB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2ApIGNhcnJpZXNcbiAqIGV2ZXJ5IGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZSB0aGUgcGFja2FnZSBuZWVkczsgZXZlcnkgb3RoZXIgZGVjbGFyYXRpb24gcmVmZXJlbmNlcyBpdCBieSBwYXRoLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVjbGFyYXRpb25zIGhhdmUgYmVlbiB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5VHlwZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbLi4ucmVzb2x2ZVRvb2xDb21tYW5kKHsgdG9vbDogJ3RzYycgfSksICctLXByb2plY3QnLCAnLi90c2NvbmZpZy50eXBlcy5qc29uJ10pO1xuXG4gIGNvbnN0IGxpYnJhcnlGaWxlTmFtZSA9IGV4aXN0c1N5bmMoam9pbihSZXBvUGF0aHMuU3JjLCAnbGlicmFyeS50cycpKSA/ICdsaWJyYXJ5JyA6ICdpbmRleCc7XG4gIGNvbnN0IGFsbExpYnMgPSBhd2FpdCBjb2xsZWN0QWxsTGlicygpO1xuICBjb25zdCBhbGxUeXBlcyA9IGNvbGxlY3RBbGxUeXBlcygpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgfHwgZmlsZS5zdGFydHNXaXRoKFJlcG9QYXRocy5UZXN0SGVscGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoZmlsZSk7XG4gICAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGUsIFJlcG9QYXRocy5EdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGN0c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgbXRzUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIGZvbGRlciwgbmFtZSArIFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uKTtcblxuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoY3RzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUobXRzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgbGV0IGN0c0NvbnRlbnQgPSB0b0N0c0NvbnRlbnQoY29udGVudCk7XG4gICAgbGV0IG10c0NvbnRlbnQgPSB0b010c0NvbnRlbnQoY29udGVudCk7XG5cbiAgICBpZiAobmFtZSA9PT0gbGlicmFyeUZpbGVOYW1lICYmIGZvbGRlciA9PT0gJy4nKSB7XG4gICAgICBjb25zdCBkaXJlY3RpdmVzID0gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKGFsbExpYnMpICsgYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXMoYWxsVHlwZXMpO1xuICAgICAgY3RzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBtdHNDb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjdHNDb250ZW50ID0gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHsgZGVjbGFyYXRpb25GaWxlUGF0aDogY3RzUGF0aCwgZXh0ZW5zaW9uOiBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbiwgbGlicmFyeUZpbGVOYW1lLCBtb2R1bGVEaXJlY3Rvcnk6IFJlcG9QYXRocy5DanMgfSlcbiAgICAgICAgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IG10c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24sIGxpYnJhcnlGaWxlTmFtZSwgbW9kdWxlRGlyZWN0b3J5OiBSZXBvUGF0aHMuRXNtIH0pXG4gICAgICAgICsgbXRzQ29udGVudDtcbiAgICB9XG5cbiAgICBhd2FpdCB3cml0ZUZpbGUoY3RzUGF0aCwgY3RzQ29udGVudCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKG10c1BhdGgsIG10c0NvbnRlbnQpO1xuICB9XG59XG5cbi8qKlxuICogUmVnZW5lcmF0ZXMgdGhlIGBleHBvcnRzYCBtYXAgb2YgdGhlIHBhY2thZ2UncyBgcGFja2FnZS5qc29uYCBmcm9tIGl0cyBzb3VyY2UgZm9sZGVycywgYW5kIHdyaXRlcyBhIGBwYWNrYWdlLmpzb25gXG4gKiBzdHViIHBlciBzdWJwYXRoIGZvciByZXNvbHZlcnMgdGhhdCBkbyBub3QgcmVhZCBgZXhwb3J0c2AuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFwIGlzIGN1cnJlbnQuXG4gKiBAdGhyb3dzIElmIHRoZSBtYXAgY2hhbmdlZCwgc28gdGhlIGNoYW5nZSBnZXRzIHJldmlld2VkIGFuZCBjb21taXR0ZWQgcmF0aGVyIHRoYW4gc2hpcHBlZCB1bnNlZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzKG9wdGlvbnM6IEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzb3VyY2VDb25kaXRpb24gfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNyY0ZvbGRlcnM6IHN0cmluZ1tdID0gW1JlcG9QYXRocy5TcmNdO1xuXG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBqb2luKGRpcmVudC5wYXJlbnRQYXRoLCBkaXJlbnQubmFtZSk7XG5cbiAgICBpZiAocGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuU3R5bGVzKSB8fCBwYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UZXN0SGVscGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHNyY0ZvbGRlcnMucHVzaChwYXRoKTtcbiAgfVxuXG4gIHNyY0ZvbGRlcnMuc29ydCgpO1xuXG4gIGxldCBpc0NoYW5nZWQgPSBmYWxzZTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUpzb24oYXN5bmMgKHBhY2thZ2VKc29uKSA9PiB7XG4gICAgY29uc3Qgb2xkRXhwb3J0cyA9IHBhY2thZ2VKc29uLmV4cG9ydHM7XG4gICAgY29uc3QgZXhwb3J0Q29uZGl0aW9uczogUGFja2FnZUpzb24uRXhwb3J0Q29uZGl0aW9ucyA9IHt9O1xuICAgIHBhY2thZ2VKc29uLmV4cG9ydHMgPSBleHBvcnRDb25kaXRpb25zO1xuICAgIGZvciAoY29uc3Qgc3JjRm9sZGVyIG9mIHNyY0ZvbGRlcnMpIHtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IGZhbHNlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IHRydWUsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0pO1xuICAgIH1cblxuICAgIGlzQ2hhbmdlZCA9ICFpc0RlZXBFcXVhbChvbGRFeHBvcnRzLCBwYWNrYWdlSnNvbi5leHBvcnRzKTtcbiAgfSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgY2hhbmdlZCBpbiB0aGUgYGVkaXRQYWNrYWdlSnNvbmAsIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgaWYgKGlzQ2hhbmdlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGFja2FnZSBleHBvcnRzIGhhdmUgY2hhbmdlZC4gUGxlYXNlIHJldmlldyB0aGUgY2hhbmdlcyBhbmQgY29tbWl0IHRoZW0uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYW4gYGluZGV4LnRzYCBiYXJyZWwgaW4gZXZlcnkgc291cmNlIGZvbGRlciB0aGF0IGhhcyBzb21ldGhpbmcgdG8gZXhwb3J0LCByZS1leHBvcnRpbmcgZWFjaCBtb2R1bGUgYW5kXG4gKiBlYWNoIHN1Yi1iYXJyZWwgdW5kZXIgaXRzIG93biBuYW1lLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFycmVscyBoYXZlIGJlZW4gd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGlicmFyeUluZGV4KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBnZW5lcmF0ZUluZGV4KFJlcG9QYXRocy5TcmMpO1xufVxuXG4vKipcbiAqIFJ1bnMgZWFjaCBuYW1lZCBucG0gc2NyaXB0IHRoZSBwYWNrYWdlIGRlZmluZXMsIGluIG9yZGVyLCBza2lwcGluZyB0aGUgb25lcyBpdCBkb2VzIG5vdCBkZWZpbmUuXG4gKlxuICogQHBhcmFtIHN0ZXBzIC0gVGhlIG5wbSBzY3JpcHQgbmFtZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlcnkgc3RlcCBoYXMgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwcyhzdGVwczogcmVhZG9ubHkgc3RyaW5nW10gPSBMSUJSQVJZX0JVSUxEX1NURVBTKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwcykge1xuICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKHN0ZXApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhsaWJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtcbiAgICBsaWJzXG4gICAgICAubWFwKChsaWIpID0+IGAvLy8gJHtSRUZFUkVOQ0VfTElCX0RJUkVDVElWRX1cIiR7bGlifVwiIC8+YClcbiAgICAgIC5qb2luKCdcXG4nKVxuICB9XFxuYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXModHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVzLmxlbmd0aCA9PT0gMFxuICAgID8gJydcbiAgICA6IGAke1xuICAgICAgdHlwZXNcbiAgICAgICAgLm1hcCgodHlwZSkgPT4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiJHt0eXBlfVwiIC8+YClcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfVxcbmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeUZvcm1hdChwYXJhbXM6IEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZvcm1hdCwgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGZvcm1hdCA9PT0gJ2NqcycgPyBSZXBvUGF0aHMuQ2pzRXh0ZW5zaW9uIDogUmVwb1BhdGhzLk1qc0V4dGVuc2lvbjtcbiAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLy8gRXhwbGljaXQsIGJlY2F1c2UgZXNidWlsZCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBpdHMgc2VydmljZSBwcm9jZXNzIHN0YXJ0ZWQgaW4uXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gZXNidWlsZCdzIG93biBvcHRpb24gbmFtZS5cbiAgICBhYnNXb3JraW5nRGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGJhbm5lcjoge1xuICAgICAganM6IExJQlJBUllfQkFOTkVSXG4gICAgfSxcbiAgICBidW5kbGU6IGZhbHNlLFxuICAgIGVudHJ5UG9pbnRzOiBsaWJGaWxlcyxcbiAgICBmb3JtYXQsXG4gICAgbG9nTGV2ZWw6ICdpbmZvJyxcbiAgICBvdXRkaXI6IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIGZvcm1hdCksXG4gICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeShmb3JtYXQgPT09ICdlc20nKSxcbiAgICAgIGZpeEVzbVBsdWdpbigpLFxuICAgICAgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luKGV4dGVuc2lvbilcbiAgICBdLFxuICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgdGFyZ2V0OiAnRVMyMDIyJyxcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICB3cml0ZTogZmFsc2VcbiAgfTtcblxuICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCBjb250ZXh0KGJ1aWxkT3B0aW9ucyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LnJlYnVpbGQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBidWlsZENvbnRleHQuZGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZShwYXJhbXM6IEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVjbGFyYXRpb25GaWxlUGF0aCwgZXh0ZW5zaW9uLCBsaWJyYXJ5RmlsZU5hbWUsIG1vZHVsZURpcmVjdG9yeSB9ID0gcGFyYW1zO1xuICBjb25zdCBsaWJyYXJ5RmlsZVBhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBtb2R1bGVEaXJlY3RvcnksIGxpYnJhcnlGaWxlTmFtZSArIGV4dGVuc2lvbik7XG4gIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZU5hdGl2ZShkaXJuYW1lKGRlY2xhcmF0aW9uRmlsZVBhdGgpLCBsaWJyYXJ5RmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICB9XG4gIHJldHVybiBgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIiR7cmVsYXRpdmVQYXRofVwiIC8+XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdEFsbExpYnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAvLyBUaGUgUkVTT0xWRUQgb3B0aW9ucywgYmVjYXVzZSBhIHBhY2thZ2UncyBgdHNjb25maWcuanNvbmAgaW5oZXJpdHMgYGxpYmAgZnJvbSB0aGUgc2hhcmVkIGJhc2UuIFRoZSByZXNvbHZlZFxuICAvLyBuYW1lcyBhcmUgZmlsZSBuYW1lcyAoYGxpYi5kb20uaXRlcmFibGUuZC50c2ApLCBzbyB0aGV5IGFyZSBtYXBwZWQgYmFjayBvbnRvIHRoZSBuYW1lcyBhIGRpcmVjdGl2ZSB0YWtlcy5cbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBsaWJzID0gbmV3IFNldCgob3B0aW9ucy5saWIgPz8gW10pLm1hcCgobGliKSA9PiBsaWIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ebGliXFwuLywgJycpLnJlcGxhY2UoL1xcLmRcXC50cyQvLCAnJykpKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKCcudHMnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlQ29udGVudCA9IHJlYWRGaWxlU3luYyhqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcbiAgICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIGFsd2F5cyBjYXB0dXJlcyBpdHMgb25lIGdyb3VwLCBzbyBubyBmYWxsYmFjayBmb3IgYSBtaXNzaW5nIG9uZSBpcyBuZWVkZWQuXG4gICAgZm9yIChjb25zdCBbLCBsaWJdIG9mIHNvdXJjZUNvbnRlbnQubWF0Y2hBbGwoUkVGRVJFTkNFX0xJQl9SRUdfRVhQKSkge1xuICAgICAgbGlicy5hZGQoU3RyaW5nKGxpYikudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFsuLi5saWJzXS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RBbGxUeXBlcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgcmV0dXJuIChvcHRpb25zLnR5cGVzID8/IFtdKVxuICAgIC5maWx0ZXIoKHR5cGUpID0+IERFQ0xBUkFUSU9OX1JFRkVSRU5DRV9UWVBFUy5oYXModHlwZSkpXG4gICAgLnNvcnQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleChmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8R2VuZXJhdGVJbmRleFJlc3VsdD4ge1xuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgcmVhZGRpclBvc2l4KGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBtYXliZUxpbmVzID0gYXdhaXQgYXN5bmNNYXAoZGlyZW50cywgKGRpcmVudCkgPT4gaGFuZGxlSW5kZXhEaXJlbnQoZm9sZGVyLCBkaXJlbnQpKTtcbiAgY29uc3QgbGluZXMgPSBtYXliZUxpbmVzLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gdW5kZWZpbmVkKTtcblxuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU2tpcHBlZDtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlKGpvaW4oZm9sZGVyLCBSZXBvUGF0aHMuSW5kZXhUcyksIGxpbmVzKTtcbiAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGliRmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBsZXQgZmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpKTtcbiAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZmlsZSkgPT5cbiAgICBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoJy50ZXN0LnRzJylcbiAgICAmJiAhZmlsZS5pbmNsdWRlcyhgLyR7UmVwb1BhdGhzLlRlc3RIZWxwZXJzfS9gKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVJbmRleERpcmVudChmb2xkZXI6IHN0cmluZywgZGlyZW50OiBEaXJlbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoaXNFeGNsdWRlZEZyb21JbmRleChmb2xkZXIsIGRpcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc291cmNlRmlsZTogc3RyaW5nO1xuICBsZXQgbmFtZTogc3RyaW5nO1xuICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUluZGV4KGpvaW4oZm9sZGVyLCBkaXJlbnQubmFtZSkpO1xuICAgIGlmIChyZXN1bHQgIT09IEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKGRpcmVudC5uYW1lLCBSZXBvUGF0aHMuSW5kZXhUcykpO1xuICAgIG5hbWUgPSBkaXJlbnQubmFtZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGRpcmVudC5uYW1lKTtcbiAgICBuYW1lID0gYmFzZW5hbWUoZGlyZW50Lm5hbWUsIGV4dGVuc2lvbik7XG4gICAgc291cmNlRmlsZSA9IG5vcm1hbGl6ZUlmUmVsYXRpdmUoZGlyZW50Lm5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGBleHBvcnQgKiBhcyAnJHtuYW1lfScgZnJvbSAnJHtzb3VyY2VGaWxlfSc7YDtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIW5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSB8fCBuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IG5hbWUgPT09ICdzZXR1cC50cycgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyOiBzdHJpbmcsIGRpcmVudDogRGlyZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4Y2x1ZGVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5JbmRleFRzLCBSZXBvUGF0aHMuVHlwZXMsIFJlcG9QYXRocy5TdHlsZXMsIFJlcG9QYXRocy5UZXN0SGVscGVyc107XG4gIGNvbnN0IGlzRXhjbHVkZWRFbnRyeSA9IGV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMoZGlyZW50Lm5hbWUpIHx8IGRpcmVudC5uYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pIHx8IGZvbGRlci5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIHJldHVybiBpc0V4Y2x1ZGVkRW50cnkgfHwgKGRpcmVudC5pc0ZpbGUoKSAmJiBpc0V4Y2x1ZGVkRmlsZU5hbWUoZGlyZW50Lm5hbWUpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydChcIiQ8U3BlY2lmaWVyPlwiLCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTXRzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtdHNDb250ZW50ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY29udGVudCxcbiAgICByZXBsYWNlcjogJ2Zyb20gXFwnJDxJbXBvcnRQYXRoPi5tanNcXCc7JyxcbiAgICBzZWFyY2hWYWx1ZTogU1RBVElDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbXRzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydCgkPFF1b3RlPiQ8SW1wb3J0UGF0aD4ubWpzJDxRdW90ZT4pJyxcbiAgICBzZWFyY2hWYWx1ZTogRFlOQU1JQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oZm9sZGVyOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2Rpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUpzb24oam9pbihmb2xkZXIsIFJlcG9QYXRocy5QYWNrYWdlSnNvbiksIHBhY2thZ2VKc29uKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsbUJBQW1CO0FBQzVCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsZUFBZTtBQUN4QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVksc0JBQXNCO0FBQzNDLE9BQU8sYUFBYTtBQUlwQixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLGdCQUFnQjtBQUN6QixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLG9CQUFvQjtBQUt0QixNQUFNLGlCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU3ZCLE1BQU0sc0JBQXlDO0FBQUEsRUFDcEQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQU9PLE1BQU0sbUJBQW1CO0FBMkJoQyxNQUFNLDhCQUE4QixvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO0FBR3BELE1BQU0sMEJBQTBCLENBQUMsY0FBYyxNQUFNLEVBQUUsS0FBSyxHQUFHO0FBQy9ELE1BQU0s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
|