diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index a260d3d9..00000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -dist/ -lib/ -node_modules/ -**/tests/** \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 47bb3377..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "plugins": ["@typescript-eslint"], - "extends": ["plugin:github/recommended"], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 9, - "sourceType": "module", - "project": "./tsconfig.json" - }, - "rules": { - "eslint-comments/no-use": "off", - "import/no-namespace": "off", - "no-constant-condition": "off", - "no-unused-vars": "off", - "i18n-text/no-en": "off", - "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/explicit-member-accessibility": ["error", {"accessibility": "no-public"}], - "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/array-type": "error", - "@typescript-eslint/await-thenable": "error", - "camelcase": "off", - "@typescript-eslint/explicit-function-return-type": ["error", {"allowExpressions": true}], - "@typescript-eslint/func-call-spacing": ["error", "never"], - "@typescript-eslint/no-array-constructor": "error", - "@typescript-eslint/no-empty-interface": "error", - "@typescript-eslint/no-explicit-any": "warn", - "@typescript-eslint/no-extraneous-class": "error", - "@typescript-eslint/no-floating-promises": "error", - "@typescript-eslint/no-for-in-array": "error", - "@typescript-eslint/no-inferrable-types": "error", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-non-null-assertion": "warn", - "@typescript-eslint/no-unnecessary-qualifier": "error", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - "@typescript-eslint/no-useless-constructor": "error", - "@typescript-eslint/no-var-requires": "error", - "@typescript-eslint/prefer-for-of": "warn", - "@typescript-eslint/prefer-function-type": "warn", - "@typescript-eslint/prefer-includes": "error", - "@typescript-eslint/prefer-string-starts-ends-with": "error", - "@typescript-eslint/promise-function-async": "error", - "@typescript-eslint/require-array-sort-compare": "error", - "@typescript-eslint/restrict-plus-operands": "error", - "semi": "off", - "@typescript-eslint/semi": ["error", "never"], - "@typescript-eslint/type-annotation-spacing": "error", - "@typescript-eslint/unbound-method": "error", - "no-shadow": "off", - "@typescript-eslint/no-shadow": ["error"] - }, - "env": { - "node": true, - "es6": true - } -} \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..642cb667 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,28 @@ +version: 2 + +updates: + # Group updates into a single PR per workspace package + - package-ecosystem: npm + directory: "/packages/docker" + schedule: + interval: weekly + groups: + all-dependencies: + patterns: + - "*" + - package-ecosystem: npm + directory: "/packages/hooklib" + schedule: + interval: weekly + groups: + all-dependencies: + patterns: + - "*" + - package-ecosystem: npm + directory: "/packages/k8s" + schedule: + interval: weekly + groups: + all-dependencies: + patterns: + - "*" diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f58fb534..7a3e1ec9 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -6,26 +6,75 @@ on: paths-ignore: - '**.md' workflow_dispatch: + jobs: - build: + format-and-lint: + name: Format & Lint Checks runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - run: sed -i "s|{{PATHTOREPO}}|$(pwd)|" packages/k8s/tests/test-kind.yaml - name: Setup kind cluster yaml config - - uses: helm/kind-action@v1.2.0 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v6 with: - config: packages/k8s/tests/test-kind.yaml - - run: npm install + node-version: 24 + cache: npm + - run: node --version && npm --version + name: Log Node and npm versions + - run: npm ci name: Install dependencies - run: npm run bootstrap name: Bootstrap the packages - run: npm run build-all name: Build packages - run: npm run format-check + name: Check formatting - name: Check linter run: | npm run lint - git diff --exit-code -- ':!packages/k8s/tests/test-kind.yaml' - - name: Run tests - run: npm run test \ No newline at end of file + git diff --exit-code -- . ':!packages/k8s/tests/test-kind.yaml' + + docker-tests: + name: Docker Hook Tests + runs-on: ubuntu-latest + needs: format-and-lint + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v6 + with: + node-version: 24 + cache: npm + - run: node --version && npm --version + name: Log Node and npm versions + - run: npm ci + name: Install dependencies + - run: npm run bootstrap + name: Bootstrap the packages + - run: npm run build-all + name: Build packages + - name: Run Docker tests + run: npm run test --prefix packages/docker + + k8s-tests: + name: Kubernetes Hook Tests + runs-on: ubuntu-latest + needs: format-and-lint + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v6 + with: + node-version: 24 + cache: npm + - run: sed -i "s|{{PATHTOREPO}}|$(pwd)|" packages/k8s/tests/test-kind.yaml + name: Setup kind cluster yaml config + - uses: helm/kind-action@v1.12.0 + with: + config: packages/k8s/tests/test-kind.yaml + - run: node --version && npm --version + name: Log Node and npm versions + - run: npm ci + name: Install dependencies + - run: npm run bootstrap + name: Bootstrap the packages + - run: npm run build-all + name: Build packages + - name: Run Kubernetes tests + run: npm run test --prefix packages/k8s \ No newline at end of file diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 1d98427f..dad303c2 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v5 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index cde0eac5..bf67d094 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -10,8 +10,12 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v6 + with: + node-version: 24 + cache: npm - name: Install dependencies run: npm install @@ -21,7 +25,7 @@ jobs: - name: Build packages run: npm run build-all - - uses: actions/github-script@v7 + - uses: actions/github-script@v8 id: releaseVersion with: result-encoding: string @@ -47,7 +51,7 @@ jobs: - name: Create release notes id: releaseNotes - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | const fs = require('fs'); diff --git a/CODEOWNERS b/CODEOWNERS index 65ed3222..165e8caa 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -* @actions/actions-launch +* @github/actions-runtime @nikola-jokic diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..569c1ec5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM swr.cn-north-4.myhuaweicloud.com/opensourceway/node:latest AS runner_builder + +WORKDIR /app + +COPY . /app/ + +RUN npm install && npm run bootstrap && npm run build-all + +FROM ghcr.nju.edu.cn/actions/actions-runner:2.334.0 + +COPY --from=runner_builder /app/packages/k8s/dist/index.js /home/runner/k8s/index.js + +USER runner diff --git a/READ-check-npu.md b/READ-check-npu.md new file mode 100644 index 00000000..d9d42e06 --- /dev/null +++ b/READ-check-npu.md @@ -0,0 +1,20 @@ +# 背景 +昇腾CI bug: [pod初始化报错8020](https://github.com/ascend-gha-runners/docs/issues/11) + +# 解决思路 +Github ARC 创建 container pod 的源码是[runner-container-hooks](https://github.com/actions/runner-container-hooks) + +我们 fork runner-container-hooks 仓库,修改源码,使得每次执行workflow之前先循环检查npu-smi命令。 + +# 实现流程 +1. 集群中配置[configmap](https://github.com/opensourceways/ascend-ci-deployment/blob/main/cllouud/vllm-ascend/config/pre-execute-script-check-npu-configmap.yaml),check.sh脚本检查npu-smi命令。 + +2. 使用以下命令构建本仓库。 +```bash +npm run bootstrap + +npm run build-all +``` +3. 构建完成后,将`./packages/k8s/dist/index.js`放入`pvc`,`pvc`挂载到`runner pod`,使用`initContainers`替换默认index.js文件。 + + diff --git a/coverage/clover.xml b/coverage/clover.xml new file mode 100644 index 00000000..5b506bc0 --- /dev/null +++ b/coverage/clover.xml @@ -0,0 +1,1531 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 00000000..f418035b --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 00000000..530d1ed2 --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/favicon.png b/coverage/lcov-report/favicon.png new file mode 100644 index 00000000..c1525b81 Binary files /dev/null and b/coverage/lcov-report/favicon.png differ diff --git a/coverage/lcov-report/hooklib/src/index.html b/coverage/lcov-report/hooklib/src/index.html new file mode 100644 index 00000000..1661e63a --- /dev/null +++ b/coverage/lcov-report/hooklib/src/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for hooklib/src + + + + + + + + + +
+
+

All files hooklib/src

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.ts +
+
0%0/00%0/00%0/00%0/0
interfaces.ts +
+
100%8/8100%0/0100%2/2100%8/8
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/hooklib/src/index.ts.html b/coverage/lcov-report/hooklib/src/index.ts.html new file mode 100644 index 00000000..388eec60 --- /dev/null +++ b/coverage/lcov-report/hooklib/src/index.ts.html @@ -0,0 +1,91 @@ + + + + + + Code coverage report for hooklib/src/index.ts + + + + + + + + + +
+
+

All files / hooklib/src index.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3  +  + 
export * from './interfaces'
+export * from './utils'
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/hooklib/src/interfaces.ts.html b/coverage/lcov-report/hooklib/src/interfaces.ts.html new file mode 100644 index 00000000..89f8c2a0 --- /dev/null +++ b/coverage/lcov-report/hooklib/src/interfaces.ts.html @@ -0,0 +1,361 @@ + + + + + + Code coverage report for hooklib/src/interfaces.ts + + + + + + + + + +
+
+

All files / hooklib/src interfaces.ts

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +931x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
export enum Command {
+  PrepareJob = 'prepare_job',
+  CleanupJob = 'cleanup_job',
+  RunContainerStep = 'run_container_step',
+  RunScriptStep = 'run_script_step'
+}
+ 
+export interface HookData {
+  command: Command
+  responseFile: string
+  args?: PrepareJobArgs | RunContainerStepArgs | RunScriptStepArgs
+  state?: { [key: string]: any }
+}
+ 
+export interface PrepareJobArgs {
+  container?: JobContainerInfo
+  services?: ServiceContainerInfo[]
+}
+ 
+export type RunContainerStepArgs = StepContainerInfo
+ 
+export interface RunScriptStepArgs {
+  entryPoint: string
+  entryPointArgs: string[]
+  environmentVariables?: { [key: string]: string }
+  prependPath?: string[]
+  workingDirectory: string
+}
+ 
+export interface ContainerInfo {
+  image?: string
+  entryPoint?: string
+  entryPointArgs?: string[]
+  createOptions?: string
+  environmentVariables?: { [key: string]: string }
+  userMountVolumes?: Mount[]
+  systemMountVolumes?: Mount[]
+  registry?: Registry
+  portMappings?: string[]
+}
+ 
+export interface ServiceContainerInfo extends ContainerInfo {
+  contextName: string
+  image: string
+}
+ 
+export interface JobContainerInfo extends ContainerInfo {
+  image: string
+  workingDirectory: string
+  systemMountVolumes: Mount[]
+}
+ 
+export interface StepContainerInfo extends ContainerInfo {
+  prependPath?: string[]
+  workingDirectory: string
+  dockerfile?: string
+  systemMountVolumes: Mount[]
+}
+ 
+export interface Mount {
+  sourceVolumePath: string
+  targetVolumePath: string
+  readOnly: boolean
+}
+ 
+export interface Registry {
+  username?: string
+  password?: string
+  serverUrl: string
+}
+ 
+export enum Protocol {
+  TCP = 'tcp',
+  UDP = 'udp'
+}
+ 
+export interface PrepareJobResponse {
+  state?: object
+  context?: ContainerContext
+  services?: { [key: string]: ContainerContext }
+  alpine: boolean
+}
+ 
+export interface ContainerContext {
+  id?: string
+  network?: string
+  ports?: { [key: string]: string }
+}
+ 
+export interface ContextPorts {
+  [source: string]: string // source -> target
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/hooklib/src/utils/index.html b/coverage/lcov-report/hooklib/src/utils/index.html new file mode 100644 index 00000000..0c2e10cc --- /dev/null +++ b/coverage/lcov-report/hooklib/src/utils/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for hooklib/src/utils + + + + + + + + + +
+
+

All files hooklib/src/utils

+
+ +
+ 58.82% + Statements + 10/17 +
+ + +
+ 100% + Branches + 12/12 +
+ + +
+ 50% + Functions + 2/4 +
+ + +
+ 58.82% + Lines + 10/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.ts +
+
58.82%10/17100%12/1250%2/458.82%10/17
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/hooklib/src/utils/index.ts.html b/coverage/lcov-report/hooklib/src/utils/index.ts.html new file mode 100644 index 00000000..cefc903f --- /dev/null +++ b/coverage/lcov-report/hooklib/src/utils/index.ts.html @@ -0,0 +1,211 @@ + + + + + + Code coverage report for hooklib/src/utils/index.ts + + + + + + + + + +
+
+

All files / hooklib/src/utils index.ts

+
+ +
+ 58.82% + Statements + 10/17 +
+ + +
+ 100% + Branches + 12/12 +
+ + +
+ 50% + Functions + 2/4 +
+ + +
+ 58.82% + Lines + 10/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +16x +1x +  +15x +1x +  +  +14x +  +  +  +  +  +14x +2x +12x +11x +  +1x +  + 
import * as events from 'events'
+import * as fs from 'fs'
+import * as os from 'os'
+import * as readline from 'readline'
+import { HookData } from '../interfaces'
+ 
+export async function getInputFromStdin(): Promise<HookData> {
+  let input = ''
+ 
+  const rl = readline.createInterface({
+    input: process.stdin
+  })
+ 
+  rl.on('line', line => {
+    input = line
+  })
+  await events.default.once(rl, 'close')
+  const inputJson = JSON.parse(input)
+  return inputJson as HookData
+}
+ 
+export function writeToResponseFile(filePath: string, message: any): void {
+  if (!filePath) {
+    throw new Error(`Expected file path`)
+  }
+  if (!fs.existsSync(filePath)) {
+    throw new Error(`Missing file at path: ${filePath}`)
+  }
+ 
+  fs.appendFileSync(filePath, `${toCommandValue(message)}${os.EOL}`, {
+    encoding: 'utf8'
+  })
+}
+ 
+function toCommandValue(input: any): string {
+  if (input === null || input === undefined) {
+    return ''
+  } else if (typeof input === 'string' || input instanceof String) {
+    return input as string
+  }
+  return JSON.stringify(input)
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html new file mode 100644 index 00000000..c2d24aac --- /dev/null +++ b/coverage/lcov-report/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 84.41% + Statements + 1257/1489 +
+ + +
+ 81.38% + Branches + 660/811 +
+ + +
+ 82.89% + Functions + 189/228 +
+ + +
+ 84.64% + Lines + 1240/1465 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
hooklib/src +
+
100%8/8100%0/0100%2/2100%8/8
hooklib/src/utils +
+
58.82%10/17100%12/1250%2/458.82%10/17
k8s/src +
+
0%0/220%0/70%0/10%0/22
k8s/src/hooks +
+
95.31%285/29984.81%134/15886.2%25/2995.3%284/298
k8s/src/k8s +
+
75.37%560/74371.71%251/35074.59%91/12275.68%551/728
k8s/src/k8s/utils +
+
98.5%394/40092.6%263/28498.57%69/7098.72%387/392
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/hooks/cleanup-job.ts.html b/coverage/lcov-report/k8s/src/hooks/cleanup-job.ts.html new file mode 100644 index 00000000..e554b4de --- /dev/null +++ b/coverage/lcov-report/k8s/src/hooks/cleanup-job.ts.html @@ -0,0 +1,145 @@ + + + + + + Code coverage report for k8s/src/hooks/cleanup-job.ts + + + + + + + + + +
+
+

All files / k8s/src/hooks cleanup-job.ts

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21  +  +  +  +  +  +  +  +  +  +  +4x +3x +3x +  +1x +  +  +4x +  + 
import * as core from '@actions/core'
+import { formatError } from '../k8s/utils'
+import { prunePods, pruneSecrets } from '../k8s'
+import {
+  collectAndPushNpuMetrics,
+  NPU_COLLECT_TIMEOUT_MS,
+  npuMetricsEnabled,
+  withTimeout
+} from '../k8s/utils/npu-metrics'
+ 
+export async function cleanupJob(): Promise<void> {
+  if (npuMetricsEnabled()) {
+    try {
+      await withTimeout(collectAndPushNpuMetrics(), NPU_COLLECT_TIMEOUT_MS)
+    } catch (err) {
+      core.debug(`npu-metrics: collection failed: ${formatError(err)}`)
+    }
+  }
+  await Promise.all([prunePods(), pruneSecrets()])
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/hooks/constants.ts.html b/coverage/lcov-report/k8s/src/hooks/constants.ts.html new file mode 100644 index 00000000..925ad135 --- /dev/null +++ b/coverage/lcov-report/k8s/src/hooks/constants.ts.html @@ -0,0 +1,280 @@ + + + + + + Code coverage report for k8s/src/hooks/constants.ts + + + + + + + + + +
+
+

All files / k8s/src/hooks constants.ts

+
+ +
+ 75% + Statements + 15/20 +
+ + +
+ 25% + Branches + 1/4 +
+ + +
+ 88.88% + Functions + 8/9 +
+ + +
+ 75% + Lines + 15/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66  +  +  +86x +86x +  +  +  +  +86x +  +  +  +42x +  +  +  +  +  +  +18x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +7x +7x +7x +7x +7x +  +  +  +  +17x +  +  +  +10x +  +  +  +10x +  +  +  +7x +  +  + 
import { v4 as uuidv4 } from 'uuid'
+ 
+export function getRunnerPodName(): string {
+  const name = process.env.ACTIONS_RUNNER_POD_NAME
+  Iif (!name) {
+    throw new Error(
+      "'ACTIONS_RUNNER_POD_NAME' env is required, please contact your self hosted runner administrator"
+    )
+  }
+  return name
+}
+ 
+export function getJobPodName(): string {
+  return `${getRunnerPodName().substring(
+    0,
+    MAX_POD_NAME_LENGTH - '-workflow'.length
+  )}-workflow`
+}
+ 
+export function getStepPodName(): string {
+  return `${getRunnerPodName().substring(
+    0,
+    MAX_POD_NAME_LENGTH - ('-step-'.length + STEP_POD_NAME_SUFFIX_LENGTH)
+  )}-step-${uuidv4().substring(0, STEP_POD_NAME_SUFFIX_LENGTH)}`
+}
+ 
+export function getVolumeClaimName(): string {
+  const name = process.env.ACTIONS_RUNNER_CLAIM_NAME
+  if (!name) {
+    return `${getRunnerPodName()}-work`
+  }
+  return name
+}
+ 
+export function getSecretName(): string {
+  return `${getRunnerPodName().substring(
+    0,
+    MAX_POD_NAME_LENGTH - ('-secret-'.length + STEP_POD_NAME_SUFFIX_LENGTH)
+  )}-secret-${uuidv4().substring(0, STEP_POD_NAME_SUFFIX_LENGTH)}`
+}
+ 
+export const MAX_POD_NAME_LENGTH = 63
+export const STEP_POD_NAME_SUFFIX_LENGTH = 8
+export const CONTAINER_EXTENSION_PREFIX = '$'
+export const JOB_CONTAINER_NAME = 'job'
+export const JOB_CONTAINER_EXTENSION_NAME = '$job'
+ 
+export class RunnerInstanceLabel {
+  private podName: string
+  constructor() {
+    this.podName = getRunnerPodName()
+  }
+ 
+  get key(): string {
+    return 'runner-pod'
+  }
+ 
+  get value(): string {
+    return this.podName
+  }
+ 
+  toString(): string {
+    return `runner-pod=${this.podName}`
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/hooks/index.html b/coverage/lcov-report/k8s/src/hooks/index.html new file mode 100644 index 00000000..aa7488e6 --- /dev/null +++ b/coverage/lcov-report/k8s/src/hooks/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for k8s/src/hooks + + + + + + + + + +
+
+

All files k8s/src/hooks

+
+ +
+ 95.31% + Statements + 285/299 +
+ + +
+ 84.81% + Branches + 134/158 +
+ + +
+ 86.2% + Functions + 25/29 +
+ + +
+ 95.3% + Lines + 284/298 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cleanup-job.ts +
+
100%5/5100%2/2100%1/1100%5/5
constants.ts +
+
75%15/2025%1/488.88%8/975%15/20
index.ts +
+
0%0/00%0/00%0/00%0/0
prepare-job.ts +
+
97.63%124/12786.66%78/9088.88%8/997.63%124/127
run-container-step.ts +
+
95.09%97/10286%43/5071.42%5/795.09%97/102
run-script-step.ts +
+
97.77%44/4583.33%10/12100%3/397.72%43/44
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/hooks/index.ts.html b/coverage/lcov-report/k8s/src/hooks/index.ts.html new file mode 100644 index 00000000..14382ac4 --- /dev/null +++ b/coverage/lcov-report/k8s/src/hooks/index.ts.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for k8s/src/hooks/index.ts + + + + + + + + + +
+
+

All files / k8s/src/hooks index.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5  +  +  +  + 
export * from './cleanup-job'
+export * from './prepare-job'
+export * from './run-script-step'
+export * from './run-container-step'
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/hooks/prepare-job.ts.html b/coverage/lcov-report/k8s/src/hooks/prepare-job.ts.html new file mode 100644 index 00000000..b1421e34 --- /dev/null +++ b/coverage/lcov-report/k8s/src/hooks/prepare-job.ts.html @@ -0,0 +1,1174 @@ + + + + + + Code coverage report for k8s/src/hooks/prepare-job.ts + + + + + + + + + +
+
+

All files / k8s/src/hooks prepare-job.ts

+
+ +
+ 97.63% + Statements + 124/127 +
+ + +
+ 86.66% + Branches + 78/90 +
+ + +
+ 88.88% + Functions + 8/9 +
+ + +
+ 97.63% + Lines + 124/127 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +20x +1x +  +  +19x +  +19x +  +19x +19x +18x +  +  +  +  +  +18x +  +  +19x +19x +19x +4x +4x +6x +6x +  +  +4x +4x +6x +6x +6x +  +  +6x +4x +  +2x +  +  +6x +6x +6x +  +  +  +19x +1x +  +  +18x +18x +18x +  +  +  +  +  +  +  +6x +6x +  +  +  +  +  +  +6x +6x +  +  +  +  +  +  +6x +6x +  +  +6x +  +6x +  +  +6x +  +  +5x +5x +  +  +5x +5x +5x +2x +  +  +2x +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +6x +  +  +12x +1x +  +11x +  +  +  +20x +20x +1x +  +10x +  +  +10x +2x +  +  +10x +10x +  +  +  +  +  +  +1x +  +  +  +1x +1x +  +  +9x +  +9x +2x +  +  +  +  +  +2x +2x +2x +  +  +  +  +  +  +  +2x +  +  +9x +  +9x +9x +9x +  +  +  +  +1x +1x +1x +  +8x +8x +  +  +  +  +  +  +  +  +  +8x +  +  +8x +  +  +  +  +  +  +  +8x +8x +  +8x +8x +8x +8x +  +  +  +  +  +8x +  +  +  +  +  +8x +  +4x +  +  +  +4x +10x +  +6x +6x +1x +1x +1x +  +  +  +  +6x +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +35x +1x +1x +  +  +35x +  +  +  +  +35x +1x +  +  +35x +28x +  +  +35x +20x +  +  +35x +35x +  +  +2x +1x +  +  +  +35x +  +  +  +  +35x +34x +  +  +  +  +  +35x +  +35x +34x +  +  +1x +1x +  +  +35x +1x +  +  +1x +  + 
import * as core from '@actions/core'
+import * as k8s from '@kubernetes/client-node'
+import {
+  JobContainerInfo,
+  ContextPorts,
+  PrepareJobArgs,
+  writeToResponseFile,
+  ServiceContainerInfo
+} from 'hooklib'
+import {
+  containerPorts,
+  createJobPod,
+  isPodContainerAlpine,
+  prunePods,
+  waitForPodPhases,
+  getPrepareJobTimeoutSeconds,
+  execCpToPod,
+  execPodStep
+} from '../k8s'
+import {
+  CONTAINER_VOLUMES,
+  DEFAULT_CONTAINER_ENTRY_POINT,
+  DEFAULT_CONTAINER_ENTRY_POINT_ARGS,
+  formatError,
+  generateContainerName,
+  mergeContainerWithOptions,
+  readExtensionFromFile,
+  PodPhase,
+  fixArgs,
+  prepareJobScript
+} from '../k8s/utils'
+import {
+  CONTAINER_EXTENSION_PREFIX,
+  getJobPodName,
+  JOB_CONTAINER_NAME
+} from './constants'
+import { maybeInjectNpuMetrics } from '../k8s/utils/npu-metrics'
+import { dirname } from 'path'
+ 
+export async function prepareJob(
+  args: PrepareJobArgs,
+  responseFile
+): Promise<void> {
+  if (!args.container) {
+    throw new Error('Job Container is required.')
+  }
+ 
+  await prunePods()
+ 
+  const extension = readExtensionFromFile()
+ 
+  let container: k8s.V1Container | undefined = undefined
+  if (args.container?.image) {
+    container = createContainerSpec(
+      args.container,
+      JOB_CONTAINER_NAME,
+      true,
+      extension
+    )
+    maybeInjectNpuMetrics(container)
+  }
+ 
+  let services: k8s.V1Container[] = []
+  let serviceNames: string[] = []
+  if (args.services?.length) {
+    const occurrences = new Map<string, number>()
+    for (const s of args.services) {
+      const base = generateContainerName(s.image)
+      occurrences.set(base, (occurrences.get(base) || 0) + 1)
+    }
+ 
+    const indices = new Map<string, number>()
+    services = args.services.map(service => {
+      const base = generateContainerName(service.image)
+      const total = occurrences.get(base) || 0
+      const idx = indices.get(base) || 0
+ 
+      let name: string
+      if (total > 1) {
+        name = `${base}-${idx}`
+      } else {
+        name = base
+      }
+ 
+      indices.set(base, idx + 1)
+      serviceNames.push(name)
+      return createContainerSpec(service, name, false, extension)
+    })
+  }
+ 
+  if (!container && !services?.length) {
+    throw new Error('No containers exist, skipping hook invocation')
+  }
+ 
+  let createdPod: k8s.V1Pod | undefined = undefined
+  try {
+    createdPod = await createJobPod(
+      getJobPodName(),
+      container,
+      services,
+      args.container.registry,
+      extension
+    )
+  } catch (err) {
+    await prunePods()
+    core.debug(`createPod failed: ${JSON.stringify(err)}`)
+    // The k8s client throws HttpException whose message is a multi-line string
+    // containing the raw HTTP dump. Extract the human-readable "message" field
+    // from the embedded JSON body so the log shows something like:
+    //   failed to create job pod:
+    //     spec.volumes[5].name: Duplicate value: "bad-hostpath"
+    // instead of the full HTTP dump.
+    const raw = err instanceof Error ? err.message : String(err)
+    let detail = raw
+    // The k8s HttpException message is a multi-line dump:
+    //   HTTP-Code: 422
+    //   Message: Unknown API Status Code!
+    //   Body: "{\"kind\":\"Status\",\"message\":\"...\\n\"}"
+    //   Headers: {...}
+    // Extract the Body JSON string, unescape it, and pull out "message".
+    try {
+      const bodyStart = raw.indexOf('Body: "')
+      // The boundary may be '"\nHeaders:' (real newline) or the literal
+      // string ends before Headers — use the last '"' before 'Headers:' as fallback
+      const headersIdx = raw.indexOf('Headers:')
+      const bodyEnd =
+        headersIdx !== -1
+          ? raw.lastIndexOf('"', headersIdx) // last " before Headers:
+          : raw.indexOf('"\nHeaders:')
+      if (bodyStart !== -1 && bodyEnd !== -1 && bodyEnd > bodyStart) {
+        // Body content is a JSON string literal (without surrounding quotes).
+        // Wrap it in quotes and JSON.parse to properly unescape \" \\ \n \t etc.
+        const escaped = raw.substring(bodyStart + 7, bodyEnd)
+        const bodyStr = JSON.parse('"' + escaped + '"')
+        // bodyStr may be plain text (e.g. 502 Bad Gateway) instead of JSON.
+        // Parse separately so a non-JSON body still yields a friendly message.
+        try {
+          const parsed = JSON.parse(bodyStr)
+          if (typeof parsed?.message === 'string') {
+            detail = parsed.message
+          }
+        } catch {
+          detail = bodyStr
+        }
+      }
+    } catch {
+      // Parsing failed — fall through and show the raw string
+    }
+    const errorMessage = [
+      'failed to create job pod:',
+      `  ✗ ${detail}`,
+      '-'.repeat(60),
+      '  → Pod spec was rejected by the k8s API. Check:',
+      '    - resources.requests does not exceed resources.limits',
+      '    - volumeMounts reference a volume defined in spec.volumes',
+      '    - envFrom / valueFrom reference existing Secrets / ConfigMaps',
+      '    - Field types match the k8s schema (kubectl explain pod.spec.containers)'
+    ].join('\n')
+    throw new Error(errorMessage)
+  }
+ 
+  if (!createdPod?.metadata?.name) {
+    throw new Error('created pod should have metadata.name')
+  }
+  core.debug(
+    `Job pod created, waiting for it to come online ${createdPod?.metadata?.name}`
+  )
+ 
+  const runnerWorkspaceEnv = process.env.RUNNER_WORKSPACE
+  if (!runnerWorkspaceEnv) {
+    throw new Error('RUNNER_WORKSPACE environment variable is not set')
+  }
+  const runnerWorkspace = dirname(runnerWorkspaceEnv)
+ 
+  let prepareScript: { containerPath: string; runnerPath: string } | undefined
+  if (args.container?.userMountVolumes?.length) {
+    prepareScript = prepareJobScript(args.container.userMountVolumes || [])
+  }
+ 
+  try {
+    await waitForPodPhases(
+      createdPod.metadata.name,
+      new Set([PodPhase.RUNNING]),
+      new Set([PodPhase.PENDING]),
+      getPrepareJobTimeoutSeconds()
+    )
+  } catch (err) {
+    await prunePods()
+    // Unwrap nested "Error: " prefix so the message renders as:
+    //   pod failed to come online:
+    //   <detail from waitForPodPhases, already formatted with sections>
+    const detail = err instanceof Error ? err.message : String(err)
+    throw new Error(`pod failed to come online:\n${detail}`)
+  }
+ 
+  await execCpToPod(createdPod.metadata.name, runnerWorkspace, '/__w')
+ 
+  if (prepareScript) {
+    await execPodStep(
+      ['sh', '-e', prepareScript.containerPath],
+      createdPod.metadata.name,
+      JOB_CONTAINER_NAME
+    )
+ 
+    const promises: Promise<void>[] = []
+    for (const vol of args?.container?.userMountVolumes || []) {
+      promises.push(
+        execCpToPod(
+          createdPod.metadata.name,
+          vol.sourceVolumePath,
+          vol.targetVolumePath
+        )
+      )
+    }
+    await Promise.all(promises)
+  }
+ 
+  core.debug('Job pod is ready for traffic')
+ 
+  let isAlpine = false
+  try {
+    isAlpine = await isPodContainerAlpine(
+      createdPod.metadata.name,
+      JOB_CONTAINER_NAME
+    )
+  } catch (err) {
+    const message = formatError(err)
+    core.debug(`Failed to determine if the pod is alpine: ${message}`)
+    throw new Error(`failed to determine if the pod is alpine: ${message}`)
+  }
+  core.debug(`Setting isAlpine to ${isAlpine}`)
+  generateResponseFile(responseFile, args, createdPod, isAlpine, serviceNames)
+}
+ 
+function generateResponseFile(
+  responseFile: string,
+  args: PrepareJobArgs,
+  appPod: k8s.V1Pod,
+  isAlpine: boolean,
+  serviceNames?: string[]
+): void {
+  Iif (!appPod.metadata?.name) {
+    throw new Error('app pod must have metadata.name specified')
+  }
+  const response = {
+    state: {
+      jobPod: appPod.metadata.name
+    },
+    context: {},
+    isAlpine
+  }
+ 
+  const mainContainer = appPod.spec?.containers?.find(
+    c => c.name === JOB_CONTAINER_NAME
+  )
+  Eif (mainContainer) {
+    const mainContainerContextPorts: ContextPorts = {}
+    Eif (mainContainer?.ports) {
+      for (const port of mainContainer.ports) {
+        mainContainerContextPorts[port.containerPort] =
+          mainContainerContextPorts.hostPort
+      }
+    }
+ 
+    response.context['container'] = {
+      image: mainContainer.image,
+      ports: mainContainerContextPorts
+    }
+  }
+ 
+  if (args.services?.length) {
+    const serviceContainerNames =
+      serviceNames && serviceNames.length
+        ? serviceNames
+        : args.services?.map(s => generateContainerName(s.image)) || []
+ 
+    response.context['services'] = appPod?.spec?.containers
+      ?.filter(c => serviceContainerNames.includes(c.name))
+      .map(c => {
+        const ctxPorts: ContextPorts = {}
+        if (c.ports?.length) {
+          for (const port of c.ports) {
+            Eif (port.containerPort && port.hostPort) {
+              ctxPorts[port.containerPort.toString()] = port.hostPort.toString()
+            }
+          }
+        }
+ 
+        return {
+          image: c.image,
+          ports: ctxPorts
+        }
+      })
+  }
+ 
+  writeToResponseFile(responseFile, JSON.stringify(response))
+}
+ 
+export function createContainerSpec(
+  container: JobContainerInfo | ServiceContainerInfo,
+  name: string,
+  jobContainer = false,
+  extension?: k8s.V1PodTemplateSpec
+): k8s.V1Container {
+  if (!container.entryPoint && jobContainer) {
+    container.entryPoint = DEFAULT_CONTAINER_ENTRY_POINT
+    container.entryPointArgs = DEFAULT_CONTAINER_ENTRY_POINT_ARGS
+  }
+ 
+  const podContainer = {
+    name,
+    image: container.image,
+    ports: containerPorts(container)
+  } as k8s.V1Container
+  if (container['workingDirectory']) {
+    podContainer.workingDir = container['workingDirectory']
+  }
+ 
+  if (container.entryPoint) {
+    podContainer.command = [container.entryPoint]
+  }
+ 
+  if (container.entryPointArgs && container.entryPointArgs.length > 0) {
+    podContainer.args = fixArgs(container.entryPointArgs)
+  }
+ 
+  podContainer.env = []
+  for (const [key, value] of Object.entries(
+    container['environmentVariables'] || {}
+  )) {
+    if (value && key !== 'HOME') {
+      podContainer.env.push({ name: key, value })
+    }
+  }
+ 
+  podContainer.env.push({
+    name: 'GITHUB_ACTIONS',
+    value: 'true'
+  })
+ 
+  if (!('CI' in (container['environmentVariables'] || {}))) {
+    podContainer.env.push({
+      name: 'CI',
+      value: 'true'
+    })
+  }
+ 
+  podContainer.volumeMounts = CONTAINER_VOLUMES
+ 
+  if (!extension) {
+    return podContainer
+  }
+ 
+  const from = extension.spec?.containers?.find(
+    c => c.name === CONTAINER_EXTENSION_PREFIX + name
+  )
+ 
+  if (from) {
+    mergeContainerWithOptions(podContainer, from)
+  }
+ 
+  return podContainer
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/hooks/run-container-step.ts.html b/coverage/lcov-report/k8s/src/hooks/run-container-step.ts.html new file mode 100644 index 00000000..d8f76429 --- /dev/null +++ b/coverage/lcov-report/k8s/src/hooks/run-container-step.ts.html @@ -0,0 +1,898 @@ + + + + + + Code coverage report for k8s/src/hooks/run-container-step.ts + + + + + + + + + +
+
+

All files / k8s/src/hooks run-container-step.ts

+
+ +
+ 95.09% + Statements + 97/102 +
+ + +
+ 86% + Branches + 43/50 +
+ + +
+ 71.42% + Functions + 5/7 +
+ + +
+ 95.09% + Lines + 97/102 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +20x +1x +  +  +19x +1x +  +  +  +  +18x +20x +20x +17x +  +  +18x +  +18x +18x +  +  +18x +18x +  +2x +2x +2x +  +  +16x +1x +  +  +  +  +  +15x +  +15x +15x +  +  +  +  +  +  +14x +14x +14x +1x +  +  +  +13x +13x +13x +13x +1x +  +12x +  +12x +  +  +12x +  +12x +  +  +  +  +  +  +  +12x +  +12x +  +12x +12x +12x +  +  +  +  +10x +3x +  +  +  +  +  +7x +  +  +  +  +7x +  +9x +  +9x +  +  +  +  +7x +  +2x +2x +  +12x +  +  +12x +12x +11x +11x +1x +1x +  +  +  +  +  +  +12x +12x +  +15x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +7x +7x +  +7x +7x +6x +5x +  +7x +7x +4x +  +4x +  +  +  +4x +1x +1x +1x +  +  +  +3x +  +  +3x +  +  +  +  +  +2x +  +6x +1x +  +  +  +  +  +1x +  +  +7x +1x +  +2x +  +1x +  +  +7x +7x +3x +  +7x +  +  +  +  +  +  +18x +18x +18x +18x +18x +18x +  +18x +  +18x +18x +  +  +  +  +  +18x +  +  +  +  +  + 
import * as core from '@actions/core'
+import * as fs from 'fs'
+import * as k8s from '@kubernetes/client-node'
+import { RunContainerStepArgs } from 'hooklib'
+import { dirname } from 'path'
+import {
+  createContainerStepPod,
+  deletePod,
+  describePodFailure,
+  execCpFromPod,
+  execCpToPod,
+  execPodStepWithOutput,
+  getContainerTerminatedErrors,
+  getPodByName,
+  getPrepareJobTimeoutSeconds,
+  getTerminatedReasonHint,
+  waitForPodPhases
+} from '../k8s'
+import {
+  CONTAINER_VOLUMES,
+  formatError,
+  mergeContainerWithOptions,
+  PodPhase,
+  readExtensionFromFile,
+  DEFAULT_CONTAINER_ENTRY_POINT_ARGS,
+  writeContainerStepScript
+} from '../k8s/utils'
+import {
+  getJobPodName,
+  getStepPodName,
+  JOB_CONTAINER_EXTENSION_NAME,
+  JOB_CONTAINER_NAME
+} from './constants'
+import { maybeInjectNpuMetrics } from '../k8s/utils/npu-metrics'
+ 
+export async function runContainerStep(
+  stepContainer: RunContainerStepArgs
+): Promise<number> {
+  if (stepContainer.dockerfile) {
+    throw new Error('Building container actions is not currently supported')
+  }
+ 
+  if (!stepContainer.entryPoint) {
+    throw new Error(
+      'failed to start the container since the entrypoint is overwritten'
+    )
+  }
+ 
+  const envs = stepContainer.environmentVariables || {}
+  envs['GITHUB_ACTIONS'] = 'true'
+  if (!('CI' in envs)) {
+    envs.CI = 'true'
+  }
+ 
+  const extension = readExtensionFromFile()
+ 
+  const container = createContainerSpec(stepContainer, extension)
+  maybeInjectNpuMetrics(container)
+ 
+  let pod: k8s.V1Pod
+  try {
+    pod = await createContainerStepPod(getStepPodName(), container, extension)
+  } catch (err) {
+    const message = formatError(err)
+    core.debug(`createContainerStepPod failed: ${message}`)
+    throw new Error(`failed to run container step: ${message}`)
+  }
+ 
+  if (!pod.metadata?.name) {
+    throw new Error(
+      `Expected job ${JSON.stringify(
+        pod
+      )} to have correctly set the metadata.name`
+    )
+  }
+  const podName = pod.metadata.name
+ 
+  try {
+    await waitForPodPhases(
+      podName,
+      new Set([PodPhase.RUNNING]),
+      new Set([PodPhase.PENDING, PodPhase.UNKNOWN]),
+      getPrepareJobTimeoutSeconds()
+    )
+ 
+    const runnerWorkspaceEnv = process.env.RUNNER_WORKSPACE
+    const githubWorkspaceEnv = process.env.GITHUB_WORKSPACE
+    if (!runnerWorkspaceEnv || !githubWorkspaceEnv) {
+      throw new Error(
+        'RUNNER_WORKSPACE or GITHUB_WORKSPACE environment variable is not set'
+      )
+    }
+    const runnerWorkspace = dirname(runnerWorkspaceEnv)
+    const githubWorkspace = githubWorkspaceEnv
+    const parts = githubWorkspace.split('/').slice(-2)
+    if (parts.length !== 2) {
+      throw new Error(`Invalid github workspace directory: ${githubWorkspace}`)
+    }
+    const relativeWorkspace = parts.join('/')
+ 
+    core.debug(
+      `Copying files from pod ${getJobPodName()} to ${runnerWorkspace}/${relativeWorkspace}`
+    )
+    await execCpFromPod(getJobPodName(), `/__w`, `${runnerWorkspace}`)
+ 
+    const { containerPath, runnerPath } = writeContainerStepScript(
+      `${runnerWorkspace}/__w/_temp`,
+      githubWorkspace,
+      stepContainer.entryPoint,
+      stepContainer.entryPointArgs,
+      envs
+    )
+ 
+    await execCpToPod(podName, `${runnerWorkspace}/__w`, '/__w')
+ 
+    fs.rmSync(`${runnerWorkspace}/__w`, { recursive: true, force: true })
+ 
+    try {
+      core.debug(`Executing container step script in pod ${podName}`)
+      const { code, output } = await execPodStepWithOutput(
+        ['sh', '-e', containerPath],
+        pod.metadata.name,
+        JOB_CONTAINER_NAME
+      )
+      if (code === 0) {
+        return 0
+      }
+      // Non-zero exit: surface a structured error so the user can tell whether
+      // it was their script or the container that failed. Read container
+      // status BEFORE deletePod runs (in the outer finally) to inspect the
+      // terminated reason, if it is already available.
+      const classification = await classifyScriptError(
+        pod.metadata.name,
+        code,
+        output
+      )
+      throw new Error(classification)
+    } catch (err) {
+      core.debug(`execPodStep failed: ${formatError(err)}`)
+      // Re-throw our classified errors verbatim; wrap anything else.
+      if (
+        err instanceof Error &&
+        (err.message.startsWith('Step failed:') ||
+          err.message.startsWith('failed to run script step'))
+      ) {
+        throw err
+      }
+      const message = formatError(err)
+      throw new Error(`failed to run container step: ${message}`)
+    } finally {
+      fs.rmSync(runnerPath, { force: true })
+    }
+  } catch (error) {
+    try {
+      const errorPod = await getPodByName(podName)
+      const terminatedErrors = getContainerTerminatedErrors(errorPod)
+      if (terminatedErrors.length > 0) {
+        const details = await describePodFailure(podName)
+        core.error(
+          `Pod ${podName} has unrecoverable container errors:\n${terminatedErrors.join('\n')}\n${details}`
+        )
+      }
+    } catch {
+      // Best-effort: pod may already be deleted or unreachable
+    }
+    core.error(`Failed to run container step: ${error}`)
+    throw error
+  } finally {
+    await deletePod(podName).catch(err => {
+      core.error(`Failed to delete step pod ${podName}: ${err}`)
+    })
+  }
+}
+ 
+// Inspect the pod's container status to determine whether a non-zero exit
+// code came from the user's script (container terminated cleanly with
+// reason=Completed) or from a container-level failure (OOMKilled, etc.).
+// The container state may not yet be 'terminated' when called (k8s updates
+// it asynchronously), so we default to treating unknown state as a script
+// issue and let the user check their script first.
+async function classifyScriptError(
+  podName: string,
+  exitCode: number,
+  tailOutput: string
+): Promise<string> {
+  const sep = '-'.repeat(60)
+  const errors: string[] = [`  ✗ exit code: ${exitCode}`]
+  const sections: string[] = []
+ 
+  try {
+    const pod = await getPodByName(podName)
+    const cs = pod.status?.containerStatuses?.find(
+      s => s.name === JOB_CONTAINER_NAME
+    )
+    const term = cs?.state?.terminated
+    if (term) {
+      const reason = term.reason ?? 'Completed'
+      const isContainerFault =
+        reason === 'OOMKilled' ||
+        reason === 'Error' ||
+        reason === 'FailedPostStartHookError' ||
+        (term.exitCode === 137 && reason !== 'Completed')
+      if (isContainerFault) {
+        const detail = term.message ? `\n    ${term.message}` : ''
+        const hint = `\n${getTerminatedReasonHint(reason, term.exitCode)}`
+        errors.push(
+          `  ✗ container "${JOB_CONTAINER_NAME}": ${reason} (exit code ${term.exitCode})${detail}${hint}`
+        )
+      } else {
+        errors.push(
+          `  → your script exited with a non-zero code; please check your script for errors`
+        )
+        sections.push(
+          `Container status: ${reason} (exit code ${term.exitCode})`
+        )
+      }
+    } else {
+      // Container state unavailable — treat as script issue by default
+      errors.push(`  → please check your script for errors`)
+    }
+    if (cs?.state?.waiting) {
+      errors.push(
+        `  ✗ container "${JOB_CONTAINER_NAME}" waiting: ${cs.state.waiting.reason ?? 'unknown'}`
+      )
+    }
+  } catch {
+    // pod already gone or API error — default hint
+    errors.push(`  → please check your script for errors`)
+  }
+ 
+  if (tailOutput) {
+    const outputLines = tailOutput
+      .split('\n')
+      .map(l => `  ${l}`)
+      .join('\n')
+    sections.push(`Last output:\n${outputLines}`)
+  }
+ 
+  let result = `failed to run script step:\n${errors.join('\n')}`
+  if (sections.length) {
+    result += `\n${sep}\n${sections.join('\n')}`
+  }
+  return result
+}
+ 
+function createContainerSpec(
+  container: RunContainerStepArgs,
+  extension?: k8s.V1PodTemplateSpec
+): k8s.V1Container {
+  const podContainer = new k8s.V1Container()
+  podContainer.name = JOB_CONTAINER_NAME
+  podContainer.image = container.image
+  podContainer.workingDir = '/__w'
+  podContainer.command = ['tail']
+  podContainer.args = DEFAULT_CONTAINER_ENTRY_POINT_ARGS
+ 
+  podContainer.volumeMounts = CONTAINER_VOLUMES
+ 
+  Eif (!extension) {
+    return podContainer
+  }
+ 
+  const from = extension.spec?.containers?.find(
+    c => c.name === JOB_CONTAINER_EXTENSION_NAME
+  )
+  Iif (from) {
+    mergeContainerWithOptions(podContainer, from)
+  }
+ 
+  return podContainer
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/hooks/run-script-step.ts.html b/coverage/lcov-report/k8s/src/hooks/run-script-step.ts.html new file mode 100644 index 00000000..d5819a23 --- /dev/null +++ b/coverage/lcov-report/k8s/src/hooks/run-script-step.ts.html @@ -0,0 +1,526 @@ + + + + + + Code coverage report for k8s/src/hooks/run-script-step.ts + + + + + + + + + +
+
+

All files / k8s/src/hooks run-script-step.ts

+
+ +
+ 97.77% + Statements + 44/45 +
+ + +
+ 83.33% + Branches + 10/12 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 97.72% + Lines + 43/44 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +  +  +  +2x +2x +2x +  +2x +  +2x +  +2x +2x +2x +  +  +  +  +  +  +  +10x +2x +  +  +  +  +  +8x +8x +  +  +  +  +  +  +  +8x +8x +8x +8x +  +8x +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +8x +  +  +  +  +  +1x +1x +1x +  +  +  +7x +7x +7x +7x +  +  +  +  +5x +2x +  +  +4x +4x +  +  +  +3x +  +1x +1x +  +7x +7x +  +  +  +  +  +3x +3x +  +  +3x +  +  +  +  +  +1x +  +  + 
/* eslint-disable @typescript-eslint/no-unused-vars */
+import * as fs from 'fs'
+import * as core from '@actions/core'
+import { RunScriptStepArgs } from 'hooklib'
+import {
+  execCpFromPod,
+  execCpToPod,
+  execPodStep,
+  execPodStepWithOutput
+} from '../k8s'
+import { formatError, writeRunScript } from '../k8s/utils'
+import { JOB_CONTAINER_NAME } from './constants'
+import { dirname } from 'path'
+import * as shlex from 'shlex'
+ 
+function formatScriptError(exitCode: number, tailOutput: string): string {
+  const sep = '-'.repeat(60)
+  const errors = [
+    `  ✗ exit code: ${exitCode}`,
+    `  → your script exited with a non-zero code; please check your script for errors`
+  ]
+  const sections: string[] = []
+  Eif (tailOutput) {
+    const outputLines = tailOutput
+      .split('\n')
+      .map(l => `  ${l}`)
+      .join('\n')
+    sections.push(`Last output:\n${outputLines}`)
+  }
+  let result = `failed to run script step:\n${errors.join('\n')}`
+  Eif (sections.length) result += `\n${sep}\n${sections.join('\n')}`
+  return result
+}
+ 
+export async function runScriptStep(
+  args: RunScriptStepArgs,
+  state
+): Promise<void> {
+  // Validate that pod was created successfully (prepareJob succeeded)
+  if (!state?.jobPod) {
+    throw new Error(
+      'jobPod must be set - ensure prepareJob completed successfully before running script steps'
+    )
+  }
+ 
+  // Write the entrypoint first. This will be later coppied to the workflow pod
+  const { entryPoint, entryPointArgs, environmentVariables } = args
+  const { containerPath, runnerPath } = writeRunScript(
+    args.workingDirectory,
+    entryPoint,
+    entryPointArgs,
+    args.prependPath,
+    environmentVariables
+  )
+ 
+  const workdir = dirname(process.env.RUNNER_WORKSPACE as string)
+  const runnerTemp = `${workdir}/_temp`
+  const containerTemp = '/__w/_temp'
+  const containerTempSrc = '/__w/_temp_pre'
+  // Ensure base and staging dirs exist before copying
+  await execPodStep(
+    [
+      'sh',
+      '-c',
+      'mkdir -p /__w && mkdir -p /__w/_temp && mkdir -p /__w/_temp_pre'
+    ],
+    state.jobPod,
+    JOB_CONTAINER_NAME
+  )
+  await execCpToPod(state.jobPod, runnerTemp, containerTempSrc)
+ 
+  // Copy GitHub directories from temp to /github
+  // Merge strategy:
+  // - Overwrite files in _runner_file_commands
+  // - Append files not already present elsewhere
+  const mergeCommands = [
+    'set -e',
+    'mkdir -p /__w/_temp /__w/_temp_pre',
+    'SRC=/__w/_temp_pre',
+    'DST=/__w/_temp',
+    // Overwrite _runner_file_commands
+    'cp -a "$SRC/_runner_file_commands/." "$DST/_runner_file_commands"',
+    `find "$SRC" -type f ! -path "*/_runner_file_commands/*" -exec sh -c '
+    rel="\${1#$2/}"
+    target="$3/$rel"
+    mkdir -p "$(dirname "$target")"
+    cp -a "$1" "$target"
+  ' _ {} "$SRC" "$DST" \\;`,
+    // Remove _temp_pre after merging
+    'rm -rf /__w/_temp_pre'
+  ]
+ 
+  try {
+    await execPodStep(
+      ['sh', '-c', mergeCommands.join(' && ')],
+      state.jobPod,
+      JOB_CONTAINER_NAME
+    )
+  } catch (err) {
+    const message = formatError(err)
+    core.debug(`Failed to merge temp directories: ${message}`)
+    throw new Error(`failed to merge temp dirs: ${message}`)
+  }
+ 
+  // Execute the entrypoint script
+  args.entryPoint = 'sh'
+  args.entryPointArgs = ['-e', containerPath]
+  try {
+    const { code, output } = await execPodStepWithOutput(
+      [args.entryPoint, ...args.entryPointArgs],
+      state.jobPod,
+      JOB_CONTAINER_NAME
+    )
+    if (code !== 0) {
+      throw new Error(formatScriptError(code, output))
+    }
+  } catch (err) {
+    core.debug(`execPodStep failed: ${formatError(err)}`)
+    if (
+      err instanceof Error &&
+      err.message.startsWith('failed to run script step')
+    ) {
+      throw err
+    }
+    const message = formatError(err)
+    throw new Error(`failed to run script step: ${message}`)
+  } finally {
+    try {
+      fs.rmSync(runnerPath, { force: true })
+    } catch (removeErr) {
+      core.debug(`Failed to remove file ${runnerPath}: ${removeErr}`)
+    }
+  }
+ 
+  try {
+    core.debug(
+      `Copying from job pod '${state.jobPod}' ${containerTemp} to ${runnerTemp}`
+    )
+    await execCpFromPod(
+      state.jobPod,
+      `${containerTemp}/_runner_file_commands`,
+      `${workdir}/_temp`
+    )
+  } catch (error) {
+    core.warning('Failed to copy _temp from pod')
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/index.html b/coverage/lcov-report/k8s/src/index.html new file mode 100644 index 00000000..aa916fa7 --- /dev/null +++ b/coverage/lcov-report/k8s/src/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for k8s/src + + + + + + + + + +
+
+

All files k8s/src

+
+ +
+ 0% + Statements + 0/22 +
+ + +
+ 0% + Branches + 0/7 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.ts +
+
0%0/220%0/70%0/10%0/22
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/index.ts.html b/coverage/lcov-report/k8s/src/index.ts.html new file mode 100644 index 00000000..b20f21ec --- /dev/null +++ b/coverage/lcov-report/k8s/src/index.ts.html @@ -0,0 +1,253 @@ + + + + + + Code coverage report for k8s/src/index.ts + + + + + + + + + +
+
+

All files / k8s/src index.ts

+
+ +
+ 0% + Statements + 0/22 +
+ + +
+ 0% + Branches + 0/7 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as core from '@actions/core'
+import {
+  Command,
+  getInputFromStdin,
+  PrepareJobArgs,
+  RunContainerStepArgs,
+  RunScriptStepArgs
+} from 'hooklib'
+import {
+  cleanupJob,
+  prepareJob,
+  runContainerStep,
+  runScriptStep
+} from './hooks'
+import { isAuthPermissionsOK, namespace, requiredPermissions } from './k8s'
+ 
+async function run(): Promise<void> {
+  try {
+    const input = await getInputFromStdin()
+ 
+    const args = input['args']
+    const command = input['command']
+    const responseFile = input['responseFile']
+    const state = input['state']
+    if (!(await isAuthPermissionsOK())) {
+      throw new Error(
+        `The Service account needs the following permissions ${JSON.stringify(
+          requiredPermissions
+        )} on the pod resource in the '${namespace()}' namespace. Please contact your self hosted runner administrator.`
+      )
+    }
+ 
+    let exitCode = 0
+    switch (command) {
+      case Command.PrepareJob:
+        await prepareJob(args as PrepareJobArgs, responseFile)
+        return process.exit(0)
+      case Command.CleanupJob:
+        await cleanupJob()
+        return process.exit(0)
+      case Command.RunScriptStep:
+        await runScriptStep(args as RunScriptStepArgs, state)
+        return process.exit(0)
+      case Command.RunContainerStep:
+        exitCode = await runContainerStep(args as RunContainerStepArgs)
+        return process.exit(exitCode)
+      default:
+        throw new Error(`Command not recognized: ${command}`)
+    }
+  } catch (error) {
+    core.error(error as Error)
+    process.exit(1)
+  }
+}
+ 
+void run()
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/k8s/heartbeat.ts.html b/coverage/lcov-report/k8s/src/k8s/heartbeat.ts.html new file mode 100644 index 00000000..ace7a457 --- /dev/null +++ b/coverage/lcov-report/k8s/src/k8s/heartbeat.ts.html @@ -0,0 +1,493 @@ + + + + + + Code coverage report for k8s/src/k8s/heartbeat.ts + + + + + + + + + +
+
+

All files / k8s/src/k8s heartbeat.ts

+
+ +
+ 95.08% + Statements + 58/61 +
+ + +
+ 86.66% + Branches + 26/30 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 95.08% + Lines + 58/61 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +22x +  +  +  +20x +20x +20x +2x +  +  +20x +20x +  +  +  +38x +38x +8x +8x +  +30x +  +  +  +21x +8x +  +21x +9x +9x +  +21x +6x +6x +  +  +  +  +16x +  +  +16x +  +16x +9x +1x +1x +  +9x +3x +  +  +3x +3x +3x +  +  +  +3x +  +  +  +  +  +  +  +  +  +16x +  +16x +1x +  +  +1x +1x +  +  +  +16x +1x +1x +  +  +16x +1x +1x +  +  +  +16x +21x +  +4x +  +17x +16x +16x +16x +8x +8x +  +15x +  +  +  +1x +1x +  +  +  +1x +  +  +  +  +1x +  +  +  +  + 
import * as core from '@actions/core'
+ 
+export interface HeartbeatWebSocket {
+  readyState: number
+  ping(): void
+  close(): void
+  on(event: string, listener: (...args: any[]) => void): this
+  once(event: string, listener: (...args: any[]) => void): this
+}
+ 
+export function parsePositiveMsEnv(
+  value: string | undefined,
+  fallback: number
+): number {
+  const parsed = Number.parseInt(value ?? '', 10)
+  return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback
+}
+ 
+export class WebSocketHeartbeat {
+  private pingInterval: ReturnType<typeof setInterval> | null = null
+  private pongTimeout: ReturnType<typeof setTimeout> | null = null
+  private lastHeartbeatLog = 0
+  private static readonly LOG_INTERVAL_MS = 2 * 60 * 1000
+ 
+  constructor(
+    private readonly pingPeriodMs: number,
+    private readonly pongDeadlineMs: number
+  ) {}
+ 
+  private shouldLog(): boolean {
+    const now = Date.now()
+    if (now - this.lastHeartbeatLog >= WebSocketHeartbeat.LOG_INTERVAL_MS) {
+      this.lastHeartbeatLog = now
+      return true
+    }
+    return false
+  }
+ 
+  stop(): void {
+    if (this.shouldLog()) {
+      core.debug('[Heartbeat] stopping heartbeat')
+    }
+    if (this.pingInterval) {
+      clearInterval(this.pingInterval)
+      this.pingInterval = null
+    }
+    if (this.pongTimeout) {
+      clearTimeout(this.pongTimeout)
+      this.pongTimeout = null
+    }
+  }
+ 
+  start(ws: HeartbeatWebSocket, reject: (err: Error) => void): void {
+    core.debug(
+      `[Heartbeat] Starting with period=${this.pingPeriodMs}ms, deadline=${this.pongDeadlineMs}ms`
+    )
+    this.lastHeartbeatLog = Date.now()
+ 
+    const resetPongTimeout = (): void => {
+      if (this.pongTimeout) {
+        clearTimeout(this.pongTimeout)
+        this.pongTimeout = null
+      }
+      this.pongTimeout = setTimeout(() => {
+        core.warning(
+          `[Heartbeat] No pong received in ${this.pongDeadlineMs}ms, closing stale connection`
+        )
+        this.stop()
+        try {
+          ws.close()
+        } catch {
+          // ignore errors closing an already-closing socket
+        }
+        reject(
+          new Error(
+            `WebSocket heartbeat timeout: no pong within ${this.pongDeadlineMs}ms`
+          )
+        )
+      }, this.pongDeadlineMs)
+    }
+ 
+    // Arm the deadline only after the first ping is sent, not immediately on
+    // start, so a slow CONNECTING socket cannot time out before any exchange.
+    let deadlineArmed = false
+ 
+    ws.on('pong', () => {
+      Iif (this.shouldLog()) {
+        core.debug('[Heartbeat] Pong received')
+      }
+      Eif (deadlineArmed) {
+        resetPongTimeout()
+      }
+    })
+ 
+    ws.on('error', (err: Error) => {
+      core.error(`[Heartbeat] WebSocket error: ${err.message}`)
+      this.stop()
+    })
+ 
+    ws.on('close', () => {
+      core.debug('[Heartbeat] WebSocket closed, stopping heartbeat')
+      this.stop()
+    })
+ 
+    // WebSocket readyState: 0 = CONNECTING, 1 = OPEN, 2 = CLOSING, 3 = CLOSED
+    this.pingInterval = setInterval(() => {
+      if (ws.readyState === 0) {
+        // Still connecting — skip this tick but keep the interval alive
+        return
+      }
+      if (ws.readyState === 1) {
+        try {
+          ws.ping()
+          if (!deadlineArmed) {
+            deadlineArmed = true
+            resetPongTimeout()
+          }
+          Iif (this.shouldLog()) {
+            core.debug('[Heartbeat] Ping sent')
+          }
+        } catch (err) {
+          core.error(`[Heartbeat] Ping failed: ${err}`)
+          this.stop()
+        }
+      } else {
+        // CLOSING (2) or CLOSED (3)
+        Iif (this.shouldLog()) {
+          core.debug(
+            `[Heartbeat] WebSocket closing/closed (readyState=${ws.readyState}), stopping heartbeat`
+          )
+        }
+        this.stop()
+      }
+    }, this.pingPeriodMs)
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/k8s/index.html b/coverage/lcov-report/k8s/src/k8s/index.html new file mode 100644 index 00000000..d8509633 --- /dev/null +++ b/coverage/lcov-report/k8s/src/k8s/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for k8s/src/k8s + + + + + + + + + +
+
+

All files k8s/src/k8s

+
+ +
+ 75.37% + Statements + 560/743 +
+ + +
+ 71.71% + Branches + 251/350 +
+ + +
+ 74.59% + Functions + 91/122 +
+ + +
+ 75.68% + Lines + 551/728 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
heartbeat.ts +
+
95.08%58/6186.66%26/30100%11/1195.08%58/61
index.ts +
+
73.6%502/68270.31%225/32072.07%80/11173.91%493/667
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/k8s/index.ts.html b/coverage/lcov-report/k8s/src/k8s/index.ts.html new file mode 100644 index 00000000..6ea6ceca --- /dev/null +++ b/coverage/lcov-report/k8s/src/k8s/index.ts.html @@ -0,0 +1,5599 @@ + + + + + + Code coverage report for k8s/src/k8s/index.ts + + + + + + + + + +
+
+

All files / k8s/src/k8s index.ts

+
+ +
+ 73.6% + Statements + 502/682 +
+ + +
+ 70.31% + Branches + 225/320 +
+ + +
+ 72.07% + Functions + 80/111 +
+ + +
+ 73.91% + Lines + 493/667 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533 +1534 +1535 +1536 +1537 +1538 +1539 +1540 +1541 +1542 +1543 +1544 +1545 +1546 +1547 +1548 +1549 +1550 +1551 +1552 +1553 +1554 +1555 +1556 +1557 +1558 +1559 +1560 +1561 +1562 +1563 +1564 +1565 +1566 +1567 +1568 +1569 +1570 +1571 +1572 +1573 +1574 +1575 +1576 +1577 +1578 +1579 +1580 +1581 +1582 +1583 +1584 +1585 +1586 +1587 +1588 +1589 +1590 +1591 +1592 +1593 +1594 +1595 +1596 +1597 +1598 +1599 +1600 +1601 +1602 +1603 +1604 +1605 +1606 +1607 +1608 +1609 +1610 +1611 +1612 +1613 +1614 +1615 +1616 +1617 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628 +1629 +1630 +1631 +1632 +1633 +1634 +1635 +1636 +1637 +1638 +1639 +1640 +1641 +1642 +1643 +1644 +1645 +1646 +1647 +1648 +1649 +1650 +1651 +1652 +1653 +1654 +1655 +1656 +1657 +1658 +1659 +1660 +1661 +1662 +1663 +1664 +1665 +1666 +1667 +1668 +1669 +1670 +1671 +1672 +1673 +1674 +1675 +1676 +1677 +1678 +1679 +1680 +1681 +1682 +1683 +1684 +1685 +1686 +1687 +1688 +1689 +1690 +1691 +1692 +1693 +1694 +1695 +1696 +1697 +1698 +1699 +1700 +1701 +1702 +1703 +1704 +1705 +1706 +1707 +1708 +1709 +1710 +1711 +1712 +1713 +1714 +1715 +1716 +1717 +1718 +1719 +1720 +1721 +1722 +1723 +1724 +1725 +1726 +1727 +1728 +1729 +1730 +1731 +1732 +1733 +1734 +1735 +1736 +1737 +1738 +1739 +1740 +1741 +1742 +1743 +1744 +1745 +1746 +1747 +1748 +1749 +1750 +1751 +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761 +1762 +1763 +1764 +1765 +1766 +1767 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1775 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1784 +1785 +1786 +1787 +1788 +1789 +1790 +1791 +1792 +1793 +1794 +1795 +1796 +1797 +1798 +1799 +1800 +1801 +1802 +1803 +1804 +1805 +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817 +1818 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828 +1829 +1830 +1831 +1832 +1833 +1834 +1835 +1836 +1837 +1838 +1839  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +1x +1x +1x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +5x +4x +  +5x +1x +  +  +5x +  +5x +5x +  +5x +5x +  +5x +5x +  +  +5x +  +5x +5x +5x +  +  +  +  +  +5x +5x +  +5x +  +  +  +  +  +  +5x +5x +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +5x +1x +  +  +5x +1x +  +  +5x +  +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +  +1x +1x +  +1x +1x +  +  +1x +  +1x +1x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +7x +7x +  +  +  +7x +  +7x +7x +  +  +  +7x +  +  +  +7x +  +  +  +7x +  +7x +7x +7x +  +7x +  +  +  +  +  +  +  +  +  +  +6x +  +  +  +6x +  +  +6x +6x +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +3x +3x +3x +  +3x +  +  +3x +3x +  +  +  +  +6x +6x +6x +4x +  +2x +  +  +  +5x +5x +  +  +5x +5x +2x +2x +  +  +  +  +  +  +2x +1x +1x +  +2x +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +5x +  +  +5x +5x +2x +2x +2x +  +  +  +5x +5x +1x +1x +1x +2x +  +  +5x +5x +  +  +  +  +  +  +5x +5x +  +  +  +5x +  +  +  +  +  +5x +  +1x +1x +1x +1x +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +4x +4x +  +  +5x +5x +  +  +  +  +  +  +  +  +  +  +3x +3x +3x +1x +  +  +  +  +2x +2x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +3x +  +3x +3x +  +2x +2x +2x +  +  +  +  +  +  +3x +3x +  +  +  +  +  +  +  +  +  +  +2x +2x +1x +  +1x +  +  +  +  +  +1x +  +  +  +1x +  +  +1x +  +  +1x +  +4x +  +1x +  +1x +1x +1x +  +  +  +  +  +2x +  +2x +  +  +  +2x +2x +1x +  +2x +2x +2x +  +1x +  +2x +  +1x +  +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +1x +  +  +1x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +2x +  +2x +2x +2x +2x +2x +2x +2x +2x +  +  +2x +2x +2x +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +2x +  +2x +2x +2x +2x +2x +2x +  +2x +  +  +2x +2x +2x +2x +  +  +2x +  +  +  +2x +  +  +  +3x +  +  +  +  +  +  +2x +  +  +  +2x +1x +  +  +1x +  +  +3x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +28x +28x +26x +  +2x +2x +2x +2x +2x +  +  +2x +  +  +  +  +  +  +21x +21x +20x +  +1x +1x +1x +1x +1x +  +  +1x +  +  +  +  +20x +20x +19x +  +1x +1x +3x +3x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +11x +26x +  +  +  +  +  +  +  +  +  +  +  +  +15x +15x +5x +1x +  +4x +4x +8x +8x +5x +5x +  +1x +  +  +  +  +4x +4x +4x +  +  +  +10x +  +5x +  +  +  +  +  +  +  +2x +  +2x +  +1x +  +  +  +  +20x +20x +20x +  +  +  +20x +13x +13x +10x +10x +10x +10x +  +  +20x +  +  +  +  +  +  +14x +5x +  +9x +2x +  +7x +6x +  +1x +  +  +  +1x +  +1x +  +3x +  +  +1x +  +  +  +18x +18x +18x +  +  +  +18x +11x +11x +7x +7x +7x +7x +  +  +18x +  +  +  +10x +  +7x +  +  +  +  +  +  +1x +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +19x +19x +  +  +  +  +19x +19x +  +  +  +18x +  +1x +  +  +  +  +1x +  +  +18x +18x +18x +14x +  +  +  +  +1x +  +  +  +  +13x +  +  +  +2x +  +  +  +  +2x +  +11x +1x +  +10x +10x +14x +14x +14x +14x +  +18x +  +  +  +  +  +  +  +  +  +  +7x +7x +  +1x +  +  +  +  +6x +6x +  +  +6x +6x +  +  +7x +7x +  +  +  +  +6x +  +  +  +  +  +  +6x +  +  +6x +6x +  +  +  +7x +7x +2x +2x +  +  +1x +  +  +  +  +  +  +2x +  +2x +1x +1x +1x +  +  +  +  +6x +1x +  +  +  +6x +6x +3x +  +  +6x +  +  +6x +  +  +  +  +  +  +  +6x +6x +  +  +  +6x +  +  +  +  +  +  +  +  +  +6x +6x +3x +  +  +3x +  +  +  +3x +  +3x +3x +3x +3x +  +3x +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +8x +  +8x +  +  +  +8x +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +6x +6x +  +8x +8x +  +  +  +  +2x +  +  +  +  +2x +2x +  +  +  +  +  +  +  +2x +  +6x +6x +2x +  +  +  +  +  +  +  +4x +1x +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +3x +3x +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +4x +1x +  +  +3x +3x +2x +  +  +2x +  +  +1x +  +  +  +15x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +13x +3x +  +10x +  +  +  +2x +  +  +  +2x +1x +  +1x +  +  +  +  +  +  +2x +2x +2x +  +  +  +  +2x +  +  +  +  +2x +2x +2x +1x +1x +  +  +  +  +  +2x +  +  +  +2x +1x +  +  +1x +  +2x +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +2x +2x +2x +8x +26x +26x +26x +26x +26x +26x +26x +26x +  +  +  +  +2x +14x +  +  +  +  +  +  +2x +2x +2x +  +  +  +  +  +  +  +  +  +1x +  +  +2x +  +  +  +117x +116x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +8x +8x +8x +2x +  +  +  +  +2x +2x +  +2x +2x +  +  +2x +2x +  +2x +  +  +  +  +  +  +  +  +12x +12x +2x +  +10x +11x +11x +1x +  +  +10x +10x +  +  +11x +11x +1x +  +  +9x +13x +13x +3x +  +10x +  +  +9x +5x +  +4x +4x +  +  +6x +  +5x +  +  +  +2x +  +  +  +  +  +  +2x +  +  +  +  +  +  +3x +  +  +  +2x +  + 
import * as core from '@actions/core'
+import * as fs from 'fs'
+import * as path from 'path'
+import { spawn } from 'child_process'
+import * as k8s from '@kubernetes/client-node'
+import tar from 'tar-fs'
+import * as stream from 'stream'
+import { WritableStreamBuffer } from 'stream-buffers'
+import { createHash } from 'crypto'
+import type { ContainerInfo, Registry } from 'hooklib'
+import {
+  getSecretName,
+  JOB_CONTAINER_NAME,
+  RunnerInstanceLabel
+} from '../hooks/constants'
+import {
+  PodPhase,
+  formatError,
+  mergePodSpecWithOptions,
+  mergeObjectMeta,
+  fixArgs,
+  listDirAllCommand,
+  sleep,
+  EXTERNALS_VOLUME_NAME,
+  GITHUB_VOLUME_NAME,
+  WORK_VOLUME
+} from './utils'
+import * as shlex from 'shlex'
+import { parsePositiveMsEnv, WebSocketHeartbeat } from './heartbeat'
+import type { HeartbeatWebSocket } from './heartbeat'
+ 
+const kc = new k8s.KubeConfig()
+ 
+kc.loadFromDefault()
+ 
+const k8sApi = kc.makeApiClient(k8s.CoreV1Api)
+const k8sBatchV1Api = kc.makeApiClient(k8s.BatchV1Api)
+const k8sAuthorizationV1Api = kc.makeApiClient(k8s.AuthorizationV1Api)
+ 
+const DEFAULT_WAIT_FOR_POD_TIME_SECONDS = 10 * 60 // 10 min
+ 
+export const requiredPermissions = [
+  {
+    group: '',
+    verbs: ['get', 'list', 'create', 'delete'],
+    resource: 'pods',
+    subresource: ''
+  },
+  {
+    group: '',
+    verbs: ['get', 'create'],
+    resource: 'pods',
+    subresource: 'exec'
+  },
+  {
+    group: '',
+    verbs: ['get', 'list', 'watch'],
+    resource: 'pods',
+    subresource: 'log'
+  },
+  {
+    group: '',
+    verbs: ['create', 'delete', 'get', 'list'],
+    resource: 'secrets',
+    subresource: ''
+  }
+]
+ 
+export async function createJobPod(
+  name: string,
+  jobContainer?: k8s.V1Container,
+  services?: k8s.V1Container[],
+  registry?: Registry,
+  extension?: k8s.V1PodTemplateSpec
+): Promise<k8s.V1Pod> {
+  const containers: k8s.V1Container[] = []
+  if (jobContainer) {
+    containers.push(jobContainer)
+  }
+  if (services?.length) {
+    containers.push(...services)
+  }
+ 
+  const appPod = new k8s.V1Pod()
+ 
+  appPod.apiVersion = 'v1'
+  appPod.kind = 'Pod'
+ 
+  appPod.metadata = new k8s.V1ObjectMeta()
+  appPod.metadata.name = name
+ 
+  const instanceLabel = new RunnerInstanceLabel()
+  appPod.metadata.labels = {
+    [instanceLabel.key]: instanceLabel.value
+  }
+  appPod.metadata.annotations = {}
+ 
+  appPod.spec = new k8s.V1PodSpec()
+  appPod.spec.containers = containers
+  appPod.spec.securityContext = {
+    fsGroup: 1001
+  }
+ 
+  // Extract working directory from GITHUB_WORKSPACE
+  // GITHUB_WORKSPACE is like /__w/repo-name/repo-name
+  const githubWorkspace = process.env.GITHUB_WORKSPACE
+  const workingDirPath = githubWorkspace?.split('/').slice(-2).join('/') ?? ''
+ 
+  const initCommands = [
+    'mkdir -p /mnt/externals',
+    'mkdir -p /mnt/work',
+    'mkdir -p /mnt/github',
+    'mv /home/runner/externals/* /mnt/externals/'
+  ]
+ 
+  Eif (workingDirPath) {
+    initCommands.push(`mkdir -p /mnt/work/${workingDirPath}`)
+  }
+ 
+  appPod.spec.initContainers = [
+    {
+      name: 'fs-init',
+      image:
+        process.env.ACTIONS_RUNNER_IMAGE ||
+        'ghcr.io/actions/actions-runner:latest',
+      command: ['sh', '-c', initCommands.join(' && ')],
+      securityContext: {
+        runAsGroup: 1001,
+        runAsUser: 1001
+      },
+      volumeMounts: [
+        {
+          name: EXTERNALS_VOLUME_NAME,
+          mountPath: '/mnt/externals'
+        },
+        {
+          name: WORK_VOLUME,
+          mountPath: '/mnt/work'
+        },
+        {
+          name: GITHUB_VOLUME_NAME,
+          mountPath: '/mnt/github'
+        }
+      ]
+    }
+  ]
+ 
+  appPod.spec.restartPolicy = 'Never'
+ 
+  appPod.spec.volumes = [
+    {
+      name: EXTERNALS_VOLUME_NAME,
+      emptyDir: {}
+    },
+    {
+      name: GITHUB_VOLUME_NAME,
+      emptyDir: {}
+    },
+    {
+      name: WORK_VOLUME,
+      emptyDir: {}
+    }
+  ]
+ 
+  Iif (registry) {
+    const secret = await createDockerSecret(registry)
+    if (!secret?.metadata?.name) {
+      throw new Error(`created secret does not have secret.metadata.name`)
+    }
+    const secretReference = new k8s.V1LocalObjectReference()
+    secretReference.name = secret.metadata.name
+    appPod.spec.imagePullSecrets = [secretReference]
+  }
+ 
+  if (extension?.metadata) {
+    mergeObjectMeta(appPod, extension.metadata)
+  }
+ 
+  if (extension?.spec) {
+    mergePodSpecWithOptions(appPod.spec, extension.spec)
+  }
+ 
+  return await k8sApi.createNamespacedPod({
+    namespace: namespace(),
+    body: appPod
+  })
+}
+ 
+export async function createContainerStepPod(
+  name: string,
+  container: k8s.V1Container,
+  extension?: k8s.V1PodTemplateSpec
+): Promise<k8s.V1Pod> {
+  const appPod = new k8s.V1Pod()
+ 
+  appPod.apiVersion = 'v1'
+  appPod.kind = 'Pod'
+ 
+  appPod.metadata = new k8s.V1ObjectMeta()
+  appPod.metadata.name = name
+ 
+  const instanceLabel = new RunnerInstanceLabel()
+  appPod.metadata.labels = {
+    [instanceLabel.key]: instanceLabel.value
+  }
+  appPod.metadata.annotations = {}
+ 
+  appPod.spec = new k8s.V1PodSpec()
+  appPod.spec.containers = [container]
+ 
+  appPod.spec.restartPolicy = 'Never'
+ 
+  appPod.spec.volumes = [
+    {
+      name: EXTERNALS_VOLUME_NAME,
+      emptyDir: {}
+    },
+    {
+      name: GITHUB_VOLUME_NAME,
+      emptyDir: {}
+    },
+    {
+      name: WORK_VOLUME,
+      emptyDir: {}
+    }
+  ]
+ 
+  Iif (extension?.metadata) {
+    mergeObjectMeta(appPod, extension.metadata)
+  }
+ 
+  Iif (extension?.spec) {
+    mergePodSpecWithOptions(appPod.spec, extension.spec)
+  }
+ 
+  return await k8sApi.createNamespacedPod({
+    namespace: namespace(),
+    body: appPod
+  })
+}
+ 
+export async function deletePod(name: string): Promise<void> {
+  await k8sApi.deleteNamespacedPod({
+    name,
+    namespace: namespace(),
+    gracePeriodSeconds: 0
+  })
+}
+ 
+export async function execPodStep(
+  command: string[],
+  podName: string,
+  containerName: string,
+  stdin?: stream.Readable
+): Promise<number> {
+  const exec = new k8s.Exec(kc)
+  core.debug(
+    `[execPodStep] Starting: cmd="${command[0]}" (${command.length} args), pod=${podName}, container=${containerName}`
+  )
+ 
+  command = fixArgs(command)
+ 
+  const DEFAULT_PING_PERIOD_MS = 5000
+  const pingPeriodMs = parsePositiveMsEnv(
+    process.env.ACTIONS_RUNNER_HEARTBEAT_PERIOD_MS,
+    DEFAULT_PING_PERIOD_MS
+  )
+  const pongDeadlineMs = parsePositiveMsEnv(
+    process.env.ACTIONS_RUNNER_HEARTBEAT_DEADLINE_MS,
+    pingPeriodMs * 12 + 1000
+  )
+  core.debug(
+    `[execPodStep] Heartbeat config: pingPeriodMs=${pingPeriodMs}, pongDeadlineMs=${pongDeadlineMs}`
+  )
+ 
+  const heartbeat = new WebSocketHeartbeat(pingPeriodMs, pongDeadlineMs)
+ 
+  return new Promise<number>((resolve, reject) => {
+    core.debug('[execPodStep] About to call exec.exec')
+    let ws: HeartbeatWebSocket | null = null
+ 
+    exec
+      .exec(
+        namespace(),
+        podName,
+        containerName,
+        command,
+        process.stdout,
+        process.stderr,
+        stdin ?? null,
+        false /* tty */,
+        async resp => {
+          core.debug(
+            `[execPodStep] execPodStep response: ${JSON.stringify(resp)}`
+          )
+ 
+          heartbeat.stop()
+ 
+          // Close WebSocket and wait for it before resolving/rejecting
+          const closeWebSocket = async (): Promise<void> => {
+            const socket = ws
+            Iif (
+              socket &&
+              (socket.readyState === 1 || socket.readyState === 0)
+            ) {
+              return new Promise<void>(closeResolve => {
+                const closeTimeout = setTimeout(() => {
+                  core.warning(
+                    '[execPodStep] WebSocket close timeout, forcing cleanup'
+                  )
+                  closeResolve()
+                }, 5000)
+ 
+                socket.once('close', () => {
+                  clearTimeout(closeTimeout)
+                  core.debug('[execPodStep] WebSocket closed cleanly')
+                  closeResolve()
+                })
+                socket.close()
+              })
+            }
+          }
+ 
+          if (resp.status === 'Success') {
+            core.debug(`[execPodStep] Success, code: ${resp.code}`)
+            await closeWebSocket()
+            resolve(resp.code || 0)
+          } else {
+            core.debug(
+              `[execPodStep] Failure: ${JSON.stringify({ message: resp?.message, details: resp?.details })}`
+            )
+            await closeWebSocket()
+            reject(new Error(resp?.message || 'execPodStep failed'))
+          }
+        }
+      )
+      .then(websocket => {
+        core.debug('[execPodStep] exec.exec resolved, ws object received')
+        ws = websocket
+        if (ws) {
+          heartbeat.start(ws, reject)
+        } else {
+          core.warning('[Heartbeat] WebSocket is null, heartbeat not started')
+        }
+      })
+      .catch(async e => {
+        heartbeat.stop()
+        core.error(`[execPodStep] exec.exec threw error: ${e}`)
+ 
+        // Close WebSocket before rejecting with timeout protection
+        const socket = ws
+        if (socket && (socket.readyState === 1 || socket.readyState === 0)) {
+          await new Promise<void>(closeResolve => {
+            const closeTimeout = setTimeout(() => {
+              core.warning(
+                '[execPodStep] WebSocket close timeout in error handler'
+              )
+              closeResolve()
+            }, 5000)
+ 
+            socket.once('close', () => {
+              clearTimeout(closeTimeout)
+              closeResolve()
+            })
+            socket.close()
+          })
+        }
+ 
+        reject(e)
+      })
+  })
+}
+ 
+// Variant of execPodStep that also captures the last `tailLines` lines of
+// combined stdout/stderr so callers can surface the script's own output on
+// failure. Returns the exit code plus the tail (empty string on success or if
+// nothing was emitted). The original streams are still tee'd to
+// process.stdout/process.stderr so GitHub Actions logs are unchanged.
+export async function execPodStepWithOutput(
+  command: string[],
+  podName: string,
+  containerName: string,
+  tailLines = 20,
+  stdin?: stream.Readable
+): Promise<{ code: number; output: string }> {
+  const exec = new k8s.Exec(kc)
+  command = fixArgs(command)
+ 
+  // Ring buffer of the last N non-empty lines (cap to keep memory bounded).
+  const buffer: string[] = []
+  const push = (line: string): void => {
+    Iif (line.length === 0) return
+    buffer.push(line)
+    Iif (buffer.length > tailLines) buffer.shift()
+  }
+ 
+  // Separate pending buffers per stream to prevent stdout/stderr interleaving.
+  let pendingOut = ''
+  const ingestOut = (chunk: Buffer | string): void => {
+    pendingOut += chunk.toString('utf8')
+    const lines = pendingOut.split(/\r?\n/)
+    pendingOut = lines.pop() ?? ''
+    for (const line of lines) push(line)
+  }
+ 
+  let pendingErr = ''
+  const ingestErr = (chunk: Buffer | string): void => {
+    pendingErr += chunk.toString('utf8')
+    const lines = pendingErr.split(/\r?\n/)
+    pendingErr = lines.pop() ?? ''
+    for (const line of lines) push(line)
+  }
+ 
+  const flushPending = (): void => {
+    Iif (pendingOut) {
+      push(pendingOut)
+      pendingOut = ''
+    }
+    Iif (pendingErr) {
+      push(pendingErr)
+      pendingErr = ''
+    }
+  }
+ 
+  const capture = new stream.Writable({
+    write(chunk: Buffer | string, _enc, cb) {
+      try {
+        ingestOut(chunk)
+        process.stdout.write(chunk)
+        cb()
+      } catch (e) {
+        cb(e as Error)
+      }
+    }
+  })
+  const captureErr = new stream.Writable({
+    write(chunk: Buffer | string, _enc, cb) {
+      try {
+        ingestErr(chunk)
+        process.stderr.write(chunk)
+        cb()
+      } catch (e) {
+        cb(e as Error)
+      }
+    }
+  })
+ 
+  // Parse an exit code from a k8s exec error/status message.
+  // Handles both "command terminated with exit code N" and
+  // "command terminated with non-zero exit code: command terminated with exit code N".
+  const parseExitCode = (msg: string | undefined): number | null => {
+    const m = msg?.match(/exit code[:\s]+(\d+)/i)
+    return m ? parseInt(m[1], 10) : null
+  }
+ 
+  return await new Promise(function (resolve, reject) {
+    exec
+      .exec(
+        namespace(),
+        podName,
+        containerName,
+        command,
+        capture,
+        captureErr,
+        stdin ?? null,
+        false /* tty */,
+        resp => {
+          core.debug(`execPodStepWithOutput response: ${JSON.stringify(resp)}`)
+          flushPending()
+          if (resp.status === 'Success') {
+            resolve({ code: resp.code || 0, output: buffer.join('\n') })
+          } else {
+            // k8s exec returns status='Failure' for non-zero script exit.
+            // resp.code may be undefined depending on k8s version; fall back
+            // to parsing the exit code from the message string.
+            const code = parseExitCode(resp?.message)
+            if (code !== null) {
+              resolve({ code, output: buffer.join('\n') })
+            } else {
+              reject(new Error(resp?.message || 'execPodStepWithOutput failed'))
+            }
+          }
+        }
+      )
+      .catch(e => {
+        // In @kubernetes/client-node v1.x the promise returned by exec()
+        // itself rejects for non-zero exits (the status callback may or may
+        // not fire first). Detect this case via the error message so the
+        // caller can classify the error instead of treating it as a hook
+        // failure. Genuine failures (connection drop, etc.) still reject.
+        flushPending()
+        const errMsg = e instanceof Error ? e.message : String(e)
+        const code = parseExitCode(errMsg)
+        if (code !== null) {
+          resolve({ code, output: buffer.join('\n') })
+        } else {
+          reject(e)
+        }
+      })
+  })
+}
+ 
+export async function execCalculateOutputHashSorted(
+  podName: string,
+  containerName: string,
+  command: string[]
+): Promise<{ hash: string; lines: string[] }> {
+  const exec = new k8s.Exec(kc)
+ 
+  let output = ''
+  const outputWriter = new stream.Writable({
+    write(chunk, _enc, cb) {
+      try {
+        output += chunk.toString('utf8')
+        cb()
+      } catch (e) {
+        cb(e as Error)
+      }
+    }
+  })
+ 
+  await new Promise<void>((resolve, reject) => {
+    exec
+      .exec(
+        namespace(),
+        podName,
+        containerName,
+        command,
+        outputWriter, // capture stdout
+        process.stderr,
+        null,
+        false /* tty */,
+        resp => {
+          core.debug(`internalExecOutput response: ${JSON.stringify(resp)}`)
+          if (resp.status === 'Success') {
+            resolve()
+          } else {
+            core.debug(
+              JSON.stringify({
+                message: resp?.message,
+                details: resp?.details
+              })
+            )
+            reject(new Error(resp?.message || 'internalExecOutput failed'))
+          }
+        }
+      )
+      .catch(e => reject(e))
+  })
+ 
+  outputWriter.end()
+ 
+  // Sort lines for consistent ordering across platforms
+  const lines = output
+    .split('\n')
+    .filter(line => line.length > 0)
+    .sort()
+  const sortedOutput = lines.join('\n') + '\n'
+ 
+  const hash = createHash('sha256')
+  hash.update(sortedOutput)
+  return { hash: hash.digest('hex'), lines }
+}
+ 
+export async function localCalculateOutputHashSorted(
+  commands: string[]
+): Promise<{ hash: string; lines: string[] }> {
+  return await new Promise<{ hash: string; lines: string[] }>(
+    (resolve, reject) => {
+      const child = spawn(commands[0], commands.slice(1), {
+        stdio: ['ignore', 'pipe', 'ignore']
+      })
+ 
+      let output = ''
+      child.stdout.on('data', chunk => {
+        output += chunk.toString('utf8')
+      })
+      child.on('error', reject)
+      child.on('close', (code: number) => {
+        if (code === 0) {
+          // Sort lines for consistent ordering across distributions/platforms
+          const lines = output
+            .split('\n')
+            .filter(line => line.length > 0)
+            .sort()
+          const sortedOutput = lines.join('\n') + '\n'
+ 
+          const hash = createHash('sha256')
+          hash.update(sortedOutput)
+          resolve({ hash: hash.digest('hex'), lines })
+        } else {
+          reject(new Error(`child process exited with code ${code}`))
+        }
+      })
+    }
+  )
+}
+ 
+export async function execCpToPod(
+  podName: string,
+  runnerPath: string,
+  containerPath: string
+): Promise<void> {
+  core.debug(`Copying ${runnerPath} to pod ${podName} at ${containerPath}`)
+ 
+  let attempt = 0
+  while (true) {
+    try {
+      const exec = new k8s.Exec(kc)
+      // Use tar to extract with --no-same-owner to avoid ownership issues.
+      // Then use find to fix permissions. The -m flag helps but we also need to fix permissions after.
+      const command = [
+        'sh',
+        '-c',
+        `tar xf - --no-same-owner -C ${shlex.quote(containerPath)} 2>/dev/null; ` +
+          `find ${shlex.quote(containerPath)} -type f -exec chmod u+rw {} \\; 2>/dev/null; ` +
+          `find ${shlex.quote(containerPath)} -type d -exec chmod u+rwx {} \\; 2>/dev/null; ` +
+          `sync 2>/dev/null || true`
+      ]
+      const readStream = tar.pack(runnerPath)
+      const errStream = new WritableStreamBuffer()
+      await new Promise((resolve, reject) => {
+        exec
+          .exec(
+            namespace(),
+            podName,
+            JOB_CONTAINER_NAME,
+            command,
+            null,
+            errStream,
+            readStream,
+            false,
+            async status => {
+              if (errStream.size()) {
+                return reject(
+                  new Error(
+                    `Error from execCpToPod - status: ${status.status}, details: \n ${errStream.getContentsAsString()}`
+                  )
+                )
+              }
+              resolve(status)
+            }
+          )
+          .catch(e => reject(e))
+      })
+      break
+    } catch (error) {
+      core.debug(`cpToPod: Attempt ${attempt + 1} failed: ${error}`)
+      attempt++
+      if (attempt >= 30) {
+        throw new Error(
+          `cpToPod failed after ${attempt} attempts: ${formatError(error)}`
+        )
+      }
+      await sleep(1000)
+    }
+  }
+ 
+  let attempts = 15
+  const delay = 1000
+  for (let i = 0; i < attempts; i++) {
+    try {
+      const { hash: want, lines: wantLines } =
+        await localCalculateOutputHashSorted([
+          'sh',
+          '-c',
+          listDirAllCommand(runnerPath)
+        ])
+ 
+      const { hash: got, lines: gotLines } =
+        await execCalculateOutputHashSorted(podName, JOB_CONTAINER_NAME, [
+          'sh',
+          '-c',
+          listDirAllCommand(containerPath)
+        ])
+ 
+      if (got !== want) {
+        core.debug(
+          `[cpToPod hash mismatch attempt ${i + 1}/${attempts}] want='${want}' got='${got}'`
+        )
+        core.debug(
+          `[cpToPod] runner file count=${wantLines.length} pod file count=${gotLines.length}`
+        )
+        const wantMap = new Map(
+          wantLines.map(l => [l.replace(/^\d+ /, ''), l.split(' ')[0]])
+        )
+        const gotMap = new Map(
+          gotLines.map(l => [l.replace(/^\d+ /, ''), l.split(' ')[0]])
+        )
+        const onlyInWant = wantLines.filter(
+          l => !gotMap.has(l.replace(/^\d+ /, ''))
+        )
+        const onlyInGot = gotLines.filter(
+          l => !wantMap.has(l.replace(/^\d+ /, ''))
+        )
+        const sizeDiff = wantLines
+          .filter(l => {
+            const name = l.replace(/^\d+ /, '')
+            return gotMap.has(name) && gotMap.get(name) !== wantMap.get(name)
+          })
+          .map(l => {
+            const name = l.replace(/^\d+ /, '')
+            return `${name}: runner=${wantMap.get(name)} pod=${gotMap.get(name)}`
+          })
+        core.debug(`[cpToPod] only in runner: ${JSON.stringify(onlyInWant)}`)
+        core.debug(`[cpToPod] only in pod:    ${JSON.stringify(onlyInGot)}`)
+        core.debug(`[cpToPod] size mismatch:  ${JSON.stringify(sizeDiff)}`)
+        await sleep(delay)
+        continue
+      }
+ 
+      break
+    } catch (error) {
+      core.debug(`Attempt ${i + 1} failed: ${error}`)
+      await sleep(delay)
+    }
+  }
+}
+ 
+export async function execCpFromPod(
+  podName: string,
+  containerPath: string,
+  parentRunnerPath: string
+): Promise<void> {
+  const targetRunnerPath = `${parentRunnerPath}/${path.basename(containerPath)}`
+  core.debug(
+    `Copying from pod ${podName} ${containerPath} to ${targetRunnerPath}`
+  )
+ 
+  // Clear target before extracting so deleted-on-pod files don't linger locally.
+  // tar.extract() appends into the destination; without this, stale files (e.g.
+  // git-credentials removed by checkout cleanup inside the pod) cause a permanent
+  // hash mismatch that no amount of retrying can resolve.
+  if (fs.existsSync(targetRunnerPath)) {
+    fs.rmSync(targetRunnerPath, { recursive: true, force: true })
+  }
+ 
+  let attempt = 0
+  while (true) {
+    try {
+      // make temporary directory
+      const exec = new k8s.Exec(kc)
+      const containerPaths = containerPath.split('/')
+      const dirname = containerPaths.pop() as string
+      const command = [
+        'tar',
+        'cf',
+        '-',
+        '-C',
+        containerPaths.join('/') || '/',
+        dirname
+      ]
+      const writerStream = tar.extract(parentRunnerPath)
+      const errStream = new WritableStreamBuffer()
+ 
+      await new Promise((resolve, reject) => {
+        // Resolve only after writerStream finishes flushing to disk.
+        // The k8s status callback fires when the pod-side tar process exits,
+        // but tar-fs may still be writing buffered data to the local filesystem.
+        // Waiting for 'finish' ensures all files are on disk before hash check.
+        writerStream.on('finish', resolve)
+        writerStream.on('error', reject)
+        exec
+          .exec(
+            namespace(),
+            podName,
+            JOB_CONTAINER_NAME,
+            command,
+            writerStream,
+            errStream,
+            null,
+            false,
+            async (_s: k8s.V1Status) => {
+              if (errStream.size()) {
+                return reject(
+                  new Error(
+                    `Error from cpFromPod - details: \n ${errStream.getContentsAsString()}`
+                  )
+                )
+              }
+            }
+          )
+          .catch(e => reject(e))
+      })
+      break
+    } catch (error) {
+      core.debug(`Attempt ${attempt + 1} failed: ${error}`)
+      attempt++
+      if (attempt >= 30) {
+        throw new Error(
+          `execCpFromPod failed after ${attempt} attempts: ${formatError(error)}`
+        )
+      }
+      await sleep(1000)
+    }
+  }
+ 
+  let attempts = 15
+  const delay = 1000
+  for (let i = 0; i < attempts; i++) {
+    try {
+      const { hash: want, lines: wantLines } =
+        await execCalculateOutputHashSorted(podName, JOB_CONTAINER_NAME, [
+          'sh',
+          '-c',
+          listDirAllCommand(containerPath)
+        ])
+ 
+      const { hash: got, lines: gotLines } =
+        await localCalculateOutputHashSorted([
+          'sh',
+          '-c',
+          listDirAllCommand(targetRunnerPath)
+        ])
+ 
+      if (got !== want) {
+        core.debug(
+          `[cpFromPod hash mismatch attempt ${i + 1}/${attempts}] want='${want}' got='${got}'`
+        )
+        core.debug(
+          `[cpFromPod] pod file count=${wantLines.length} runner file count=${gotLines.length}`
+        )
+        const wantMap = new Map(
+          wantLines.map(l => [l.replace(/^\d+ /, ''), l.split(' ')[0]])
+        )
+        const gotMap = new Map(
+          gotLines.map(l => [l.replace(/^\d+ /, ''), l.split(' ')[0]])
+        )
+        const onlyInWant = wantLines.filter(
+          l => !gotMap.has(l.replace(/^\d+ /, ''))
+        )
+        const onlyInGot = gotLines.filter(
+          l => !wantMap.has(l.replace(/^\d+ /, ''))
+        )
+        const sizeDiff = wantLines
+          .filter(l => {
+            const name = l.replace(/^\d+ /, '')
+            return gotMap.has(name) && gotMap.get(name) !== wantMap.get(name)
+          })
+          .map(l => {
+            const name = l.replace(/^\d+ /, '')
+            return `${name}: pod=${wantMap.get(name)} runner=${gotMap.get(name)}`
+          })
+        core.debug(`[cpFromPod] only in pod:    ${JSON.stringify(onlyInWant)}`)
+        core.debug(`[cpFromPod] only in runner: ${JSON.stringify(onlyInGot)}`)
+        core.debug(`[cpFromPod] size mismatch:  ${JSON.stringify(sizeDiff)}`)
+        await sleep(delay)
+        continue
+      }
+ 
+      break
+    } catch (error) {
+      core.debug(`Attempt ${i + 1} failed: ${error}`)
+      await sleep(delay)
+    }
+  }
+}
+ 
+export async function waitForJobToComplete(jobName: string): Promise<void> {
+  const backOffManager = new BackOffManager()
+  while (true) {
+    try {
+      if (await isJobSucceeded(jobName)) {
+        return
+      }
+    } catch (error) {
+      throw new Error(`job ${jobName} has failed: ${formatError(error)}`)
+    }
+    await backOffManager.backOff()
+  }
+}
+ 
+export async function createDockerSecret(
+  registry: Registry
+): Promise<k8s.V1Secret> {
+  const authContent = {
+    auths: {
+      [registry.serverUrl || 'https://index.docker.io/v1/']: {
+        username: registry.username,
+        password: registry.password,
+        auth: Buffer.from(`${registry.username}:${registry.password}`).toString(
+          'base64'
+        )
+      }
+    }
+  }
+ 
+  const runnerInstanceLabel = new RunnerInstanceLabel()
+ 
+  const secretName = getSecretName()
+  const secret = new k8s.V1Secret()
+  secret.immutable = true
+  secret.apiVersion = 'v1'
+  secret.metadata = new k8s.V1ObjectMeta()
+  secret.metadata.name = secretName
+  secret.metadata.namespace = namespace()
+  secret.metadata.labels = {
+    [runnerInstanceLabel.key]: runnerInstanceLabel.value
+  }
+  secret.type = 'kubernetes.io/dockerconfigjson'
+  secret.kind = 'Secret'
+  secret.data = {
+    '.dockerconfigjson': Buffer.from(JSON.stringify(authContent)).toString(
+      'base64'
+    )
+  }
+ 
+  return await k8sApi.createNamespacedSecret({
+    namespace: namespace(),
+    body: secret
+  })
+}
+ 
+export async function createSecretForEnvs(envs: {
+  [key: string]: string
+}): Promise<string> {
+  const runnerInstanceLabel = new RunnerInstanceLabel()
+ 
+  const secret = new k8s.V1Secret()
+  const secretName = getSecretName()
+  secret.immutable = true
+  secret.apiVersion = 'v1'
+  secret.metadata = new k8s.V1ObjectMeta()
+  secret.metadata.name = secretName
+ 
+  secret.metadata.labels = {
+    [runnerInstanceLabel.key]: runnerInstanceLabel.value
+  }
+  secret.kind = 'Secret'
+  secret.data = {}
+  for (const [key, value] of Object.entries(envs)) {
+    secret.data[key] = Buffer.from(value).toString('base64')
+  }
+ 
+  await k8sApi.createNamespacedSecret({
+    namespace: namespace(),
+    body: secret
+  })
+  return secretName
+}
+ 
+export async function deleteSecret(name: string): Promise<void> {
+  await k8sApi.deleteNamespacedSecret({
+    name,
+    namespace: namespace()
+  })
+}
+ 
+export async function pruneSecrets(): Promise<void> {
+  const secretList = await k8sApi.listNamespacedSecret({
+    namespace: namespace(),
+    labelSelector: new RunnerInstanceLabel().toString()
+  })
+  if (!secretList.items.length) {
+    return
+  }
+ 
+  await Promise.all(
+    secretList.items.map(
+      async secret =>
+        secret.metadata?.name && (await deleteSecret(secret.metadata.name))
+    )
+  )
+}
+ 
+export const UNRECOVERABLE_WAITING_REASONS = new Set([
+  // k8s has already retried image pull multiple times with exponential backoff.
+  // ErrImagePull is excluded: it fires on the first failure (could be a transient
+  // TLS timeout or network blip) and k8s will naturally promote it to
+  // ImagePullBackOff after a moment. Fast-failing on ErrImagePull would kill
+  // jobs that would have succeeded on the next pull attempt.
+  'ImagePullBackOff',
+  // Image name is syntactically invalid — cannot self-heal without a config fix.
+  'InvalidImageName',
+  // Container spec is invalid (bad env vars, resource limits, securityContext) —
+  // cannot self-heal without a config fix.
+  'CreateContainerConfigError'
+  // CreateContainerError is excluded: it is sometimes emitted transiently by the
+  // container runtime (e.g. during a node-level runtime restart). It can
+  // self-resolve on the next kubelet retry cycle.
+])
+ 
+// Pod *event* reasons (from the event stream, not container status) that
+// indicate a permanent failure the pod will never recover from on its own.
+// These surface as Warning events on the pod (visible via `kubectl describe`)
+// rather than in container.status.state.waiting.reason, so they need a separate
+// list + a separate (async) detection path.
+//
+//   - FailedMount: a volume cannot be mounted (e.g. hostPath `type: Directory`
+//     pointing at a path that does not exist on the node, missing PVC, missing
+//     Secret/ConfigMap volume). The container stays in `ContainerCreating`
+//     waiting state, which is NOT in UNRECOVERABLE_WAITING_REASONS, so without
+//     this check the hook polls until the 3600s timeout.
+//   - FailedBinding: a PVC could not be bound (no matching PV, storage class
+//     misconfiguration). Usually paired with FailedMount once the pod retries.
+//
+// FailedScheduling is included but gated by PERMANENT_SCHEDULING_PATTERNS:
+// only messages that positively identify a permanent configuration error
+// trigger fast-fail. Resource shortages ("Insufficient cpu/memory/gpu")
+// are silently skipped so the pod keeps queuing until the timeout.
+export const UNRECOVERABLE_EVENT_REASONS = new Set([
+  'FailedMount',
+  'FailedBinding',
+  'FailedScheduling'
+])
+ 
+// Patterns that POSITIVELY IDENTIFY a permanent, unrecoverable scheduling
+// failure in a FailedScheduling event message. Fast-fail fires ONLY when
+// one of these matches. Anything else (resource shortages, unknown format,
+// absent message) is treated as transient — the pod keeps queuing.
+//
+// Permanent examples (WILL fast-fail):
+//   "0/3 nodes: 3 node(s) didn't match Pod's node affinity/selector."
+//   "0/3 nodes: 3 node(s) had untolerated taint {gpu: true}."
+//   "0/3 nodes: persistentvolumeclaim "my-pvc" not found."
+//
+// Transient examples (will NOT fast-fail, keep queuing):
+//   "0/3 nodes: 3 Insufficient nvidia.com/gpu."
+//   "0/3 nodes: 3 Insufficient memory."
+//   "0/1 nodes are available"  ← ambiguous, unknown
+//
+// Extend at runtime via env var ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS
+// (comma-separated regex strings; cannot remove built-in entries).
+export const PERMANENT_SCHEDULING_PATTERNS: readonly RegExp[] = [
+  // Node selector / affinity label mismatch — no node carries the required
+  // labels. Will not self-resolve without a pod-spec or node-label change.
+  /node\(s\) didn't match Pod's node affinity\/selector/i,
+  /node\(s\) didn't match node affinity/i,
+  // Untolerated taint — every node carries a taint the pod does not tolerate.
+  // Will not self-resolve without adding a toleration or removing the taint.
+  /node\(s\) had untolerated taint/i,
+  // PVC referenced in the pod spec does not exist in the namespace. The
+  // scheduler refuses to place the pod until the PVC is created. The workflow
+  // job spec is wrong — it won't self-resolve.
+  /persistentvolumeclaim "[^"]+" not found/i
+]
+ 
+export const UNRECOVERABLE_TERMINATED_REASONS = new Set([
+  'OOMKilled',
+  'Error',
+  'FailedPostStartHookError'
+])
+ 
+// Maximum number of Warning events to include in a pod's failure description so
+// that the GitHub Actions log is not flooded.
+const MAX_DIAGNOSTIC_EVENTS = 10
+ 
+// The fast-fail whitelist can be extended (not narrowed) from the environment so
+// operators can add deterministic terminal reasons without a code change. This
+// reuses the same env-var configuration pattern as the prepare-job timeout. When
+// the variable is unset, behaviour is identical to the built-in defaults.
+export function getUnrecoverableWaitingReasons(): Set<string> {
+  const extra = process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_WAITING_REASONS']
+  if (!extra) {
+    return UNRECOVERABLE_WAITING_REASONS
+  }
+  const reasons = new Set(UNRECOVERABLE_WAITING_REASONS)
+  for (const reason of extra.split(',')) {
+    const trimmed = reason.trim()
+    Eif (trimmed) {
+      reasons.add(trimmed)
+    }
+  }
+  return reasons
+}
+ 
+// Mirrors getUnrecoverableWaitingReasons() but for pod *event* reasons. The
+// env var ACTIONS_RUNNER_K8S_UNRECOVERABLE_EVENT_REASONS adds to (never removes
+// from) the built-in UNRECOVERABLE_EVENT_REASONS set.
+export function getUnrecoverableEventReasons(): Set<string> {
+  const extra = process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_EVENT_REASONS']
+  if (!extra) {
+    return UNRECOVERABLE_EVENT_REASONS
+  }
+  const reasons = new Set(UNRECOVERABLE_EVENT_REASONS)
+  for (const reason of extra.split(',')) {
+    const trimmed = reason.trim()
+    Eif (trimmed) {
+      reasons.add(trimmed)
+    }
+  }
+  return reasons
+}
+ 
+export function getUnrecoverableTerminatedReasons(): Set<string> {
+  const extra =
+    process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_TERMINATED_REASONS']
+  if (!extra) {
+    return UNRECOVERABLE_TERMINATED_REASONS
+  }
+  const reasons = new Set(UNRECOVERABLE_TERMINATED_REASONS)
+  for (const reason of extra.split(',')) {
+    const trimmed = reason.trim()
+    if (trimmed) {
+      reasons.add(trimmed)
+    }
+  }
+  return reasons
+}
+ 
+// Returns true when a FailedScheduling event message positively identifies a
+// permanent configuration error that will not self-resolve. Returns false
+// (treat as transient, keep queuing) for:
+//   - absent/empty messages   → unknown, assume transient
+//   - resource shortages      → Insufficient cpu/memory/gpu/etc.
+//   - any unrecognised format → unknown, assume transient
+export function isPermanentSchedulingFailure(
+  message: string | undefined
+): boolean {
+  if (!message) return false
+  return getPermanentSchedulingPatterns().some(p => p.test(message))
+}
+ 
+// Returns PERMANENT_SCHEDULING_PATTERNS extended by any extra patterns from
+// ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS (comma-separated regexes).
+// Invalid regex strings are skipped with a warning.
+// The compiled result is cached: env var changes during a single process are
+// rare (effectively never in a runner job), but this avoids repeated split +
+// RegExp construction on every FailedScheduling poll iteration.
+let _cachedSchedulingPatterns: readonly RegExp[] | undefined
+let _lastSchedulingPatternsEnv: string | undefined
+ 
+export function getPermanentSchedulingPatterns(): readonly RegExp[] {
+  const extra = process.env['ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS']
+  if (!extra) return PERMANENT_SCHEDULING_PATTERNS
+  if (_cachedSchedulingPatterns && _lastSchedulingPatternsEnv === extra) {
+    return _cachedSchedulingPatterns
+  }
+  const patterns: RegExp[] = [...PERMANENT_SCHEDULING_PATTERNS]
+  for (const raw of extra.split(',')) {
+    const trimmed = raw.trim()
+    if (!trimmed) continue
+    try {
+      patterns.push(new RegExp(trimmed, 'i'))
+    } catch {
+      core.warning(
+        `ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS: invalid regex "${trimmed}", skipped`
+      )
+    }
+  }
+  _lastSchedulingPatternsEnv = extra
+  _cachedSchedulingPatterns = patterns
+  return patterns
+}
+ 
+function getWaitingReasonHint(reason: string): string {
+  switch (reason) {
+    case 'ImagePullBackOff':
+      return [
+        `  → Image pull has failed repeatedly (k8s retried with exponential backoff). Check:`,
+        `    - Image name and tag are correct and exist in the registry`,
+        `    - If private registry: imagePullSecret is configured and credentials are valid`,
+        `    - Network connectivity from the node to the registry (DNS, firewall, proxy, TLS)`,
+        `    Run: kubectl describe pod <pod> | grep -A10 "Events"`
+      ].join('\n')
+    case 'InvalidImageName':
+      return `  → Image name is malformed. Check the workflow/job container image configuration.`
+    case 'CreateContainerConfigError':
+      return `  → Container config is invalid. Check env vars, resource limits, and securityContext in the job spec.`
+    default:
+      return `  → Check pod events with: kubectl describe pod <pod>`
+  }
+}
+ 
+export function getContainerErrors(pod: k8s.V1Pod): string[] {
+  const errors: string[] = []
+  const unrecoverableReasons = getUnrecoverableWaitingReasons()
+  const allStatuses = [
+    ...(pod.status?.initContainerStatuses ?? []),
+    ...(pod.status?.containerStatuses ?? [])
+  ]
+  for (const cs of allStatuses) {
+    const waiting = cs.state?.waiting
+    if (waiting?.reason && unrecoverableReasons.has(waiting.reason)) {
+      const reason = `  ✗ container "${cs.name}": ${waiting.reason}`
+      const detail = waiting.message ? `\n    ${waiting.message}` : ''
+      const hint = `\n${getWaitingReasonHint(waiting.reason)}`
+      errors.push(`${reason}${detail}${hint}`)
+    }
+  }
+  return errors
+}
+ 
+export function getTerminatedReasonHint(
+  reason: string,
+  exitCode: number | undefined
+): string {
+  if (reason === 'OOMKilled') {
+    return `  → Container exceeded its memory limit and was killed by the OOM killer.\n    Increase the memory limit in the job spec or reduce memory usage in the script.`
+  }
+  if (reason === 'FailedPostStartHookError') {
+    return `  → The postStart lifecycle hook failed. Check the hook command and its exit code.`
+  }
+  if (reason === 'Error') {
+    switch (exitCode) {
+      case 137:
+        return `  → Exit code 137: process was killed (SIGKILL). Likely OOM or forceful termination.\n    Check memory usage and resource limits.`
+      case 139:
+        return `  → Exit code 139: segmentation fault (SIGSEGV). The process crashed due to a memory access error.`
+      case 126:
+        return `  → Exit code 126: permission denied. The script or binary is not executable.\n    Check file permissions inside the container image.`
+      case 127:
+        return `  → Exit code 127: command not found. The script or binary does not exist in the container.\n    Check the image contents and the command/entrypoint configuration.`
+      default:
+        return `  → Script or process exited with a non-zero code (${exitCode ?? 'unknown'}).\n    Check the step output above for error messages.\n    Common causes: script logic errors, missing dependencies, unhandled exceptions.`
+    }
+  }
+  return `  → Check pod logs with: kubectl logs <pod> -c ${reason}`
+}
+ 
+export function getContainerTerminatedErrors(pod: k8s.V1Pod): string[] {
+  const errors: string[] = []
+  const unrecoverableReasons = getUnrecoverableTerminatedReasons()
+  const allStatuses = [
+    ...(pod.status?.initContainerStatuses ?? []),
+    ...(pod.status?.containerStatuses ?? [])
+  ]
+  for (const cs of allStatuses) {
+    const terminated = cs.state?.terminated
+    if (terminated?.reason && unrecoverableReasons.has(terminated.reason)) {
+      const reason = `  ✗ container "${cs.name}": ${terminated.reason} (exit code ${terminated.exitCode})`
+      const detail = terminated.message ? `\n    ${terminated.message}` : ''
+      const hint = `\n${getTerminatedReasonHint(terminated.reason, terminated.exitCode)}`
+      errors.push(`${reason}${detail}${hint}`)
+    }
+  }
+  return errors
+}
+ 
+function getEventReasonHint(reason: string): string {
+  switch (reason) {
+    case 'FailedMount':
+      return [
+        `  → A volume could not be mounted. Check:`,
+        `    - PVC is bound (kubectl get pvc)`,
+        `    - Secret/ConfigMap referenced in the volume exists`,
+        `    - hostPath directories exist on the scheduled node`
+      ].join('\n')
+    case 'FailedBinding':
+      return [
+        `  → A PVC could not be bound to a PV. Check:`,
+        `    - StorageClass exists and has a provisioner`,
+        `    - Sufficient capacity is available`,
+        `    - Access mode (ReadWriteOnce/ReadWriteMany) matches available PVs`
+      ].join('\n')
+    case 'FailedScheduling':
+      return [
+        `  → Pod cannot be scheduled due to a permanent configuration error. Check:`,
+        `    - nodeSelector / nodeAffinity labels match at least one node`,
+        `    - All tolerations are present for node taints`,
+        `    - PVCs referenced in the pod spec exist in the namespace`
+      ].join('\n')
+    default:
+      return `  → Check pod events with: kubectl describe pod <pod>`
+  }
+}
+ 
+// Inspects the pod's Warning events for reasons in UNRECOVERABLE_EVENT_REASONS.
+// For FailedScheduling, only fast-fails when the message positively matches
+// a known-permanent configuration error (see PERMANENT_SCHEDULING_PATTERNS).
+// Resource shortages ("Insufficient cpu/memory/gpu") are silently skipped so
+// the pod keeps queuing until the timeout. Best-effort: if events cannot be
+// listed (e.g. the optional 'events' RBAC permission is missing) it returns []
+// instead of blocking container-level fast-fail detection. Deduplicates by
+// reason so a repeatedly-retried event is reported once.
+export async function getPodEventErrors(podName: string): Promise<string[]> {
+  const unrecoverableReasons = getUnrecoverableEventReasons()
+  Iif (unrecoverableReasons.size === 0) {
+    return []
+  }
+ 
+  let items: k8s.CoreV1Event[]
+  try {
+    const result = await k8sApi.listNamespacedEvent({
+      namespace: namespace(),
+      fieldSelector: `involvedObject.name=${podName}`
+    })
+    items = result.items ?? []
+  } catch (err) {
+    core.debug(
+      `Could not list events for pod ${podName} during fast-fail check: ${
+        err instanceof Error ? err.message : String(err)
+      }`
+    )
+    return []
+  }
+ 
+  const errors: string[] = []
+  const seenReasons = new Set<string>()
+  for (const e of items) {
+    if (
+      e.type !== 'Warning' ||
+      !e.reason ||
+      !unrecoverableReasons.has(e.reason)
+    ) {
+      continue
+    }
+    // FailedScheduling: only fast-fail when the message positively matches a
+    // known-permanent config error. Resource shortages and unknown messages
+    // are treated as transient — let the pod keep queuing.
+    if (
+      e.reason === 'FailedScheduling' &&
+      !isPermanentSchedulingFailure(e.message)
+    ) {
+      core.debug(
+        `[fast-fail] Skipping FailedScheduling (not a recognised permanent error): ${
+          e.message ?? '(no message)'
+        }`
+      )
+      continue
+    }
+    if (seenReasons.has(e.reason)) {
+      continue
+    }
+    seenReasons.add(e.reason)
+    const count = e.count && e.count > 1 ? ` (x${e.count})` : ''
+    const reason = `  ✗ event: ${e.reason}${count}`
+    const detail = e.message ? `\n    ${e.message}` : ''
+    const hint = getEventReasonHint(e.reason)
+    errors.push(`${reason}${detail}\n${hint}`)
+  }
+  return errors
+}
+ 
+// describePodFailure aggregates everything that might explain why a pod is not
+// healthy into a single human-readable string. It makes NO success/failure
+// judgement of its own (a terminated exitCode=0 container is just reported as
+// such) -- callers decide what is "bad". It never throws: if it cannot read the
+// pod or list events it returns/embeds a best-effort note instead, so it is safe
+// to call from any error path.
+export async function describePodFailure(podName: string): Promise<string> {
+  let pod: k8s.V1Pod
+  try {
+    pod = await readPod(podName)
+  } catch (err) {
+    return `Could not read pod ${podName} for diagnostics: ${
+      err instanceof Error ? err.message : String(err)
+    }`
+  }
+ 
+  const sections: string[] = []
+  const status = pod.status
+ 
+  // --- Pod-level status ---
+  const podLines: string[] = []
+  const phaseLabel = status?.phase
+    ? `${status.phase}${status.reason ? ` (${status.reason})` : ''}`
+    : 'Unknown'
+  podLines.push(`Pod status: ${phaseLabel}`)
+  Iif (status?.message) {
+    podLines.push(`  ${status.message}`)
+  }
+ 
+  // Surface conditions that are False (e.g. PodScheduled=False from FailedScheduling)
+  for (const cond of status?.conditions ?? []) {
+    if (cond.status === 'False') {
+      const reason = cond.reason ? ` (${cond.reason})` : ''
+      const msg = cond.message ? `: ${cond.message}` : ''
+      podLines.push(`  ✗ ${cond.type}=False${reason}${msg}`)
+    }
+  }
+  sections.push(podLines.join('\n'))
+ 
+  // --- Container-level status (non-zero exits and non-unrecoverable waits) ---
+  const unrecoverableReasons = getUnrecoverableWaitingReasons()
+  const allStatuses = [
+    ...(status?.initContainerStatuses ?? []),
+    ...(status?.containerStatuses ?? [])
+  ]
+  const containerLines: string[] = []
+  for (const cs of allStatuses) {
+    const waiting = cs.state?.waiting
+    if (waiting?.reason) {
+      // Skip reasons already surfaced by getContainerErrors() in the caller's
+      // first line to avoid printing the same error twice.
+      Iif (!unrecoverableReasons.has(waiting.reason)) {
+        const msg = waiting.message ? `\n    ${waiting.message}` : ''
+        containerLines.push(
+          `  ✗ container "${cs.name}" waiting: ${waiting.reason}${msg}`
+        )
+      }
+    }
+    const terminated = cs.state?.terminated
+    // Only surface non-zero exits; exit 0 (e.g. fs-init Completed) is noise.
+    if (terminated && terminated.exitCode !== 0) {
+      const reason = terminated.reason ?? 'Unknown'
+      const msg = terminated.message ? `\n    ${terminated.message}` : ''
+      containerLines.push(
+        `  ✗ container "${cs.name}" terminated: ${reason} (exit code ${terminated.exitCode})${msg}`
+      )
+    }
+  }
+  if (containerLines.length) {
+    sections.push(`Container details:\n${containerLines.join('\n')}`)
+  }
+ 
+  // --- Warning events ---
+  const eventLines = await describePodWarningEvents(podName)
+  if (eventLines.length) {
+    sections.push(`Recent warning events:\n${eventLines.join('\n')}`)
+  }
+ 
+  Iif (!sections.length) {
+    return `No additional diagnostic information available for pod ${podName}`
+  }
+  return sections.join('\n\n')
+}
+ 
+// Reads the most recent Warning events for a pod. Best-effort: listing events
+// requires the optional "events" get/list permission, so any error (including
+// RBAC Forbidden) is swallowed and an empty list is returned.
+async function describePodWarningEvents(podName: string): Promise<string[]> {
+  let items: k8s.CoreV1Event[]
+  try {
+    const result = await k8sApi.listNamespacedEvent({
+      namespace: namespace(),
+      fieldSelector: `involvedObject.name=${podName}`
+    })
+    items = result.items ?? []
+  } catch (err) {
+    core.debug(
+      `Could not list events for pod ${podName} (the 'events' permission may be missing): ${
+        err instanceof Error ? err.message : String(err)
+      }`
+    )
+    return []
+  }
+ 
+  const warnings = items.filter(e => e.type === 'Warning')
+  if (!warnings.length) {
+    return []
+  }
+ 
+  const eventTime = (e: k8s.CoreV1Event): number => {
+    const t = e.lastTimestamp ?? e.eventTime ?? e.firstTimestamp
+    return t ? new Date(t).getTime() : 0
+  }
+  warnings.sort((a, b) => eventTime(a) - eventTime(b))
+ 
+  const recent = warnings.slice(-MAX_DIAGNOSTIC_EVENTS)
+  const lines = recent.map(e => {
+    const count = e.count && e.count > 1 ? ` (x${e.count})` : ''
+    return `  [${e.reason ?? 'Warning'}]${count} ${e.message ?? ''}`.trimEnd()
+  })
+  Iif (warnings.length > recent.length) {
+    lines.unshift(
+      `  (showing ${recent.length} of ${warnings.length} warning events)`
+    )
+  }
+  return lines
+}
+ 
+// Inspects the pod's status.conditions for scheduling failures. FailedScheduling
+// is intentionally excluded from fast-fail detection (see UNRECOVERABLE_EVENT_REASONS
+// comment) — scheduling failures are transient resource waits that should queue
+// until the timeout, not terminate early. This function always returns [] as a
+// result, but is kept so checkUnrecoverableErrors compiles and the dedup logic
+// remains intact for future use.
+export function getPodConditionErrors(_p: k8s.V1Pod): string[] {
+  return []
+}
+ 
+// Aggregates the three independent error-detection sources (container waiting
+// reasons, pod Warning events, and pod conditions) into a single list, applying
+// the cross-source deduplication rule (FailedScheduling event + Unschedulable
+// condition = same failure, report once). Returns [] when no unrecoverable
+// error is detected. The caller decides what to do with the list -- typically
+// attach describePodFailure diagnostics and throw.
+export async function checkUnrecoverableErrors(
+  pod: k8s.V1Pod,
+  podName: string
+): Promise<string[]> {
+  // Deterministic terminal errors on a container (e.g. ImagePullBackOff).
+  const containerErrors = getContainerErrors(pod)
+  // Terminated container errors (e.g. OOMKilled, non-zero exit) with hints.
+  const terminatedErrors = getContainerTerminatedErrors(pod)
+  // Best-effort: returns [] when the optional events RBAC permission is absent.
+  const eventErrors = await getPodEventErrors(podName)
+  // Conditions are set near-instantly by the scheduler while events may take
+  // a few extra seconds to propagate, so always run the check. Deduplicate
+  // against events so the same FailedScheduling isn't printed twice.
+  const conditionErrors = getPodConditionErrors(pod).filter(
+    c =>
+      !eventErrors.some(
+        e => e.includes('FailedScheduling') && c.includes('Unschedulable')
+      )
+  )
+  return [
+    ...containerErrors,
+    ...terminatedErrors,
+    ...eventErrors,
+    ...conditionErrors
+  ]
+}
+ 
+export async function waitForPodPhases(
+  podName: string,
+  awaitingPhases: Set<PodPhase>,
+  backOffPhases: Set<PodPhase>,
+  maxTimeSeconds = DEFAULT_WAIT_FOR_POD_TIME_SECONDS
+): Promise<void> {
+  const backOffManager = new BackOffManager(maxTimeSeconds)
+  let phase: PodPhase = PodPhase.UNKNOWN
+  while (true) {
+    let pod: k8s.V1Pod
+    try {
+      pod = await readPod(podName)
+    } catch (err) {
+      // Transient API error (network blip, API server busy): log and back off
+      // rather than crashing the loop. The timeout will eventually fire if the
+      // pod stays permanently unreadable (e.g. RBAC issue).
+      core.warning(
+        `[waitForPodPhases] Could not read pod ${podName}, will retry after backoff: ${
+          err instanceof Error ? err.message : String(err)
+        }`
+      )
+      try {
+        await backOffManager.backOff()
+      } catch {
+        throw new Error(
+          `Pod ${podName} timed out after ${maxTimeSeconds}s (pod read failed: ${
+            err instanceof Error ? err.message : String(err)
+          })\n${'-'.repeat(60)}\n(pod was unreadable; no further diagnostics available)`
+        )
+      }
+      continue
+    }
+    phase = parsePodPhase(pod)
+    if (awaitingPhases.has(phase)) {
+      return
+    }
+ 
+    // The pod reached a phase we are not willing to keep waiting on
+    // (a terminal/unhealthy phase). First check for unrecoverable
+    // container-level errors (e.g. OOMKilled, non-zero exit) so they are
+    // reported with actionable hints. Fall back to the generic "is unhealthy"
+    // message when no specific error is found.
+    if (!backOffPhases.has(phase)) {
+      const errors = await checkUnrecoverableErrors(pod, podName)
+      const details = await describePodFailure(podName)
+      Iif (errors.length > 0) {
+        throw new Error(
+          `Pod ${podName} has unrecoverable errors:\n${errors.join('\n')}\n${'-'.repeat(60)}\n${details}`
+        )
+      }
+      throw new Error(
+        `Pod ${podName} is unhealthy (phase: ${phase})\n${'-'.repeat(60)}\n${details}`
+      )
+    }
+ 
+    // Still in a back-off phase, but a deterministic unrecoverable error
+    // was detected (container / event / condition). Fail fast with
+    // diagnostics instead of waiting out the full timeout.
+    const errors = await checkUnrecoverableErrors(pod, podName)
+    Eif (errors.length > 0) {
+      const details = await describePodFailure(podName)
+      throw new Error(
+        `Pod ${podName} has unrecoverable errors:\n${errors.join('\n')}\n${'-'.repeat(60)}\n${details}`
+      )
+    }
+ 
+    try {
+      await backOffManager.backOff()
+    } catch (_err) {
+      // BackOffManager throws "backoff timeout" when maxTimeSeconds is exceeded.
+      // Don't surface that bare message: collect diagnostics first so the user
+      // can see WHY the pod never became ready.
+      const details = await describePodFailure(podName)
+      throw new Error(
+        `Pod ${podName} timed out after ${maxTimeSeconds}s (phase: ${phase})\n${'-'.repeat(60)}\n${details}`
+      )
+    }
+  }
+}
+ 
+export function getPrepareJobTimeoutSeconds(): number {
+  const envTimeoutSeconds =
+    process.env['ACTIONS_RUNNER_PREPARE_JOB_TIMEOUT_SECONDS']
+ 
+  if (!envTimeoutSeconds) {
+    return DEFAULT_WAIT_FOR_POD_TIME_SECONDS
+  }
+ 
+  const timeoutSeconds = parseInt(envTimeoutSeconds, 10)
+  if (!timeoutSeconds || timeoutSeconds <= 0) {
+    core.warning(
+      `Prepare job timeout is invalid ("${timeoutSeconds}"): use an int > 0`
+    )
+    return DEFAULT_WAIT_FOR_POD_TIME_SECONDS
+  }
+ 
+  return timeoutSeconds
+}
+ 
+async function readPod(podName: string): Promise<k8s.V1Pod> {
+  return await k8sApi.readNamespacedPod({
+    name: podName,
+    namespace: namespace()
+  })
+}
+ 
+const podPhaseLookup = new Set<string>([
+  PodPhase.PENDING,
+  PodPhase.RUNNING,
+  PodPhase.SUCCEEDED,
+  PodPhase.FAILED,
+  PodPhase.UNKNOWN
+])
+ 
+export function parsePodPhase(pod: k8s.V1Pod): PodPhase {
+  if (!pod.status?.phase || !podPhaseLookup.has(pod.status.phase)) {
+    return PodPhase.UNKNOWN
+  }
+  return pod.status.phase as PodPhase
+}
+ 
+async function isJobSucceeded(name: string): Promise<boolean> {
+  const job = await k8sBatchV1Api.readNamespacedJob({
+    name,
+    namespace: namespace()
+  })
+  if (job.status?.failed) {
+    throw new Error(`job ${name} has failed`)
+  }
+  return !!job.status?.succeeded
+}
+ 
+export async function getPodLogs(
+  podName: string,
+  containerName: string
+): Promise<void> {
+  const log = new k8s.Log(kc)
+  const logStream = new stream.PassThrough()
+  logStream.on('data', chunk => {
+    // use write rather than console.log to prevent double line feed
+    process.stdout.write(chunk)
+  })
+ 
+  await log.log(namespace(), podName, containerName, logStream, {
+    follow: true,
+    pretty: false,
+    timestamps: false
+  })
+  await new Promise((resolve, reject) => {
+    logStream.on('end', () => resolve(null))
+    logStream.on('error', err => {
+      process.stderr.write(err.message)
+      reject(err)
+    })
+  })
+}
+ 
+export async function prunePods(): Promise<void> {
+  const podList = await k8sApi.listNamespacedPod({
+    namespace: namespace(),
+    labelSelector: new RunnerInstanceLabel().toString()
+  })
+  if (!podList.items.length) {
+    return
+  }
+ 
+  await Promise.all(
+    podList.items.map(
+      async pod => pod.metadata?.name && (await deletePod(pod.metadata.name))
+    )
+  )
+}
+ 
+export async function getPodStatus(
+  name: string
+): Promise<k8s.V1PodStatus | undefined> {
+  const pod = await k8sApi.readNamespacedPod({
+    name,
+    namespace: namespace()
+  })
+  return pod.status
+}
+ 
+export async function isAuthPermissionsOK(): Promise<boolean> {
+  const sar = new k8s.V1SelfSubjectAccessReview()
+  const asyncs: Promise<k8s.V1SelfSubjectAccessReview>[] = []
+  for (const resource of requiredPermissions) {
+    for (const verb of resource.verbs) {
+      sar.spec = new k8s.V1SelfSubjectAccessReviewSpec()
+      sar.spec.resourceAttributes = new k8s.V1ResourceAttributes()
+      sar.spec.resourceAttributes.verb = verb
+      sar.spec.resourceAttributes.namespace = namespace()
+      sar.spec.resourceAttributes.group = resource.group
+      sar.spec.resourceAttributes.resource = resource.resource
+      sar.spec.resourceAttributes.subresource = resource.subresource
+      asyncs.push(
+        k8sAuthorizationV1Api.createSelfSubjectAccessReview({ body: sar })
+      )
+    }
+  }
+  const responses = await Promise.all(asyncs)
+  return responses.every(resp => resp.status?.allowed)
+}
+ 
+export async function isPodContainerAlpine(
+  podName: string,
+  containerName: string
+): Promise<boolean> {
+  let isAlpine = true
+  try {
+    await execPodStep(
+      [
+        'sh',
+        '-c',
+        `[ $(cat /etc/*release* | grep -i -e "^ID=*alpine*" -c) != 0 ] || exit 1`
+      ],
+      podName,
+      containerName
+    )
+  } catch {
+    isAlpine = false
+  }
+ 
+  return isAlpine
+}
+ 
+export function namespace(): string {
+  if (process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE']) {
+    return process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE']
+  }
+ 
+  const context = kc.getContexts().find(ctx => ctx.namespace)
+  Eif (context?.namespace) {
+    return context.namespace
+  }
+ 
+  // When running in-cluster the kubeconfig context has no namespace field;
+  // read it from the mounted ServiceAccount file instead.
+  const saNamespaceFile =
+    '/var/run/secrets/kubernetes.io/serviceaccount/namespace'
+  try {
+    const ns = fs.readFileSync(saNamespaceFile, 'utf8').trim()
+    if (ns) {
+      return ns
+    }
+  } catch {
+    // not running in-cluster, fall through to error
+  }
+ 
+  throw new Error(
+    'Failed to determine namespace. Set the ACTIONS_RUNNER_KUBERNETES_NAMESPACE environment variable or ensure the kubeconfig context includes a namespace.'
+  )
+}
+ 
+class BackOffManager {
+  private backOffSeconds = 1
+  totalTime = 0
+  constructor(private throwAfterSeconds?: number) {
+    if (!throwAfterSeconds || throwAfterSeconds < 0) {
+      this.throwAfterSeconds = undefined
+    }
+  }
+ 
+  async backOff(): Promise<void> {
+    await new Promise(resolve =>
+      setTimeout(resolve, this.backOffSeconds * 1000)
+    )
+    this.totalTime += this.backOffSeconds
+    Iif (this.throwAfterSeconds && this.throwAfterSeconds < this.totalTime) {
+      throw new Error('backoff timeout')
+    }
+    Eif (this.backOffSeconds < 20) {
+      this.backOffSeconds *= 2
+    }
+    Iif (this.backOffSeconds > 20) {
+      this.backOffSeconds = 20
+    }
+  }
+}
+ 
+export function containerPorts(
+  container: ContainerInfo
+): k8s.V1ContainerPort[] {
+  const ports: k8s.V1ContainerPort[] = []
+  if (!container.portMappings?.length) {
+    return ports
+  }
+  for (const portDefinition of container.portMappings) {
+    const portProtoSplit = portDefinition.split('/')
+    if (portProtoSplit.length > 2) {
+      throw new Error(`Unexpected port format: ${portDefinition}`)
+    }
+ 
+    const port = new k8s.V1ContainerPort()
+    port.protocol =
+      portProtoSplit.length === 2 ? portProtoSplit[1].toUpperCase() : 'TCP'
+ 
+    const portSplit = portProtoSplit[0].split(':')
+    if (portSplit.length > 2) {
+      throw new Error('ports should have at most one ":" separator')
+    }
+ 
+    const parsePort = (p: string): number => {
+      const num = Number(p)
+      if (!Number.isInteger(num) || num < 1 || num > 65535) {
+        throw new Error(`invalid container port: ${p}`)
+      }
+      return num
+    }
+ 
+    if (portSplit.length === 1) {
+      port.containerPort = parsePort(portSplit[0])
+    } else {
+      port.hostPort = parsePort(portSplit[0])
+      port.containerPort = parsePort(portSplit[1])
+    }
+ 
+    ports.push(port)
+  }
+  return ports
+}
+ 
+export async function getPodByName(name): Promise<k8s.V1Pod> {
+  return await k8sApi.readNamespacedPod({
+    name,
+    namespace: namespace()
+  })
+}
+ 
+export async function getSecretByName(name: string): Promise<k8s.V1Secret> {
+  return await k8sApi.readNamespacedSecret({
+    name,
+    namespace: namespace()
+  })
+}
+ 
+export async function listPodsByRunnerInstance(): Promise<k8s.V1Pod[]> {
+  const podList = await k8sApi.listNamespacedPod({
+    namespace: namespace(),
+    labelSelector: new RunnerInstanceLabel().toString()
+  })
+  return podList.items ?? []
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/k8s/utils/index.html b/coverage/lcov-report/k8s/src/k8s/utils/index.html new file mode 100644 index 00000000..531eaa89 --- /dev/null +++ b/coverage/lcov-report/k8s/src/k8s/utils/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for k8s/src/k8s/utils + + + + + + + + + +
+
+

All files k8s/src/k8s/utils

+
+ +
+ 98.5% + Statements + 394/400 +
+ + +
+ 92.6% + Branches + 263/284 +
+ + +
+ 98.57% + Functions + 69/70 +
+ + +
+ 98.72% + Lines + 387/392 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.ts +
+
98.48%130/13295.78%91/95100%19/1998.47%129/131
npu-metrics.ts +
+
98.5%264/26891%172/18998.03%50/5198.85%258/261
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/k8s/utils/index.ts.html b/coverage/lcov-report/k8s/src/k8s/utils/index.ts.html new file mode 100644 index 00000000..05c9207f --- /dev/null +++ b/coverage/lcov-report/k8s/src/k8s/utils/index.ts.html @@ -0,0 +1,1159 @@ + + + + + + Code coverage report for k8s/src/k8s/utils/index.ts + + + + + + + + + +
+
+

All files / k8s/src/k8s/utils index.ts

+
+ +
+ 98.48% + Statements + 130/132 +
+ + +
+ 95.78% + Branches + 91/95 +
+ + +
+ 100% + Functions + 19/19 +
+ + +
+ 98.47% + Lines + 129/131 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359  +  +  +  +  +  +  +  +  +7x +7x +  +7x +7x +  +7x +7x +7x +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +5x +  +  +5x +  +  +  +  +  +  +5x +5x +5x +5x +  +  +  +  +  +  +  +  +  +  +  +  +16x +16x +  +  +2x +2x +  +  +16x +  +16x +  +  +  +  +  +  +  +  +16x +16x +16x +16x +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +3x +3x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +3x +3x +3x +3x +3x +  +  +  +  +  +  +19x +7x +  +12x +12x +14x +  +  +  +  +  +3x +  +  +  +11x +  +  +  +  +  +  +  +  +9x +  +  +  +9x +  +  +  +18x +18x +  +18x +2x +  +  +16x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +9x +2x +  +  +2x +7x +1x +1x +6x +2x +2x +4x +1x +1x +3x +2x +2x +  +1x +  +  +  +  +  +  +  +  +2x +5x +2x +  +1x +  +  +3x +1x +1x +  +2x +  +  +  +  +  +  +  +  +6x +2x +  +  +  +4x +3x +3x +1x +  +3x +  +  +  +4x +3x +3x +1x +  +  +  +3x +  +  +  +  +  +42x +42x +38x +  +4x +4x +1x +  +1x +  +  +  +3x +  +  +7x +7x +7x +7x +7x +7x +7x +  +  +  +6x +6x +1x +  +5x +5x +  +  +  +  +  +35x +8x +  +27x +  +  +  +1x +  +  +  +2x +  +  +  +  +  +  +  +  +  +39x +2x +  +  +  +  +  +37x +  +39x +5x +5x +5x +5x +  +  +  +  +  +32x +27x +  +  +5x +  +  +  +  +3x +3x +1x +  +2x +2x +  +1x +  +  +  +  +  +2x +  + 
import * as k8s from '@kubernetes/client-node'
+import * as fs from 'fs'
+import * as yaml from 'js-yaml'
+import * as core from '@actions/core'
+import { v1 as uuidv4 } from 'uuid'
+import { CONTAINER_EXTENSION_PREFIX } from '../../hooks/constants'
+import * as shlex from 'shlex'
+import { Mount } from 'hooklib'
+ 
+export const DEFAULT_CONTAINER_ENTRY_POINT_ARGS = [`-f`, `/dev/null`]
+export const DEFAULT_CONTAINER_ENTRY_POINT = 'tail'
+ 
+export const ENV_HOOK_TEMPLATE_PATH = 'ACTIONS_RUNNER_CONTAINER_HOOK_TEMPLATE'
+export const ENV_USE_KUBE_SCHEDULER = 'ACTIONS_RUNNER_USE_KUBE_SCHEDULER'
+ 
+export const EXTERNALS_VOLUME_NAME = 'externals'
+export const GITHUB_VOLUME_NAME = 'github'
+export const WORK_VOLUME = 'work'
+ 
+export const CONTAINER_VOLUMES: k8s.V1VolumeMount[] = [
+  {
+    name: EXTERNALS_VOLUME_NAME,
+    mountPath: '/__e'
+  },
+  {
+    name: WORK_VOLUME,
+    mountPath: '/__w'
+  },
+  {
+    name: GITHUB_VOLUME_NAME,
+    mountPath: '/github'
+  }
+]
+ 
+export function prepareJobScript(userVolumeMounts: Mount[]): {
+  containerPath: string
+  runnerPath: string
+} {
+  let mountDirs = userVolumeMounts
+    .map(m => shlex.quote(m.targetVolumePath))
+    .join(' ')
+ 
+  const content = `#!/bin/sh -l
+set -e
+cp -R /__w/_temp/_github_home /github/home
+cp -R /__w/_temp/_github_workflow /github/workflow
+mkdir -p ${mountDirs}
+`
+ 
+  const filename = `${uuidv4()}.sh`
+  const entryPointPath = `${process.env.RUNNER_TEMP}/${filename}`
+  fs.writeFileSync(entryPointPath, content)
+  return {
+    containerPath: `/__w/_temp/${filename}`,
+    runnerPath: entryPointPath
+  }
+}
+ 
+export function writeRunScript(
+  workingDirectory: string,
+  entryPoint: string,
+  entryPointArgs?: string[],
+  prependPath?: string[],
+  environmentVariables?: { [key: string]: string }
+): { containerPath: string; runnerPath: string } {
+  let exportPath = ''
+  if (prependPath?.length) {
+    // TODO: remove compatibility with typeof prependPath === 'string' as we bump to next major version, the hooks will lose PrependPath compat with runners 2.293.0 and older
+    const prepend =
+      typeof prependPath === 'string' ? prependPath : prependPath.join(':')
+    exportPath = `export PATH=${prepend}:$PATH`
+  }
+ 
+  let environmentPrefix = scriptEnv(environmentVariables)
+ 
+  const content = `#!/bin/sh -l
+set -e
+rm "$0" # remove script after running
+${exportPath}
+cd ${workingDirectory} && \
+exec ${environmentPrefix} ${entryPoint} ${
+    entryPointArgs?.length ? entryPointArgs.join(' ') : ''
+  }
+`
+  const filename = `${uuidv4()}.sh`
+  const entryPointPath = `${process.env.RUNNER_TEMP}/${filename}`
+  fs.writeFileSync(entryPointPath, content)
+  return {
+    containerPath: `/__w/_temp/${filename}`,
+    runnerPath: entryPointPath
+  }
+}
+ 
+export function writeContainerStepScript(
+  dst: string,
+  workingDirectory: string,
+  entryPoint: string,
+  entryPointArgs?: string[],
+  environmentVariables?: { [key: string]: string }
+): { containerPath: string; runnerPath: string } {
+  let environmentPrefix = scriptEnv(environmentVariables)
+ 
+  const parts = workingDirectory.split('/').slice(-2)
+  if (parts.length !== 2) {
+    throw new Error(`Invalid working directory: ${workingDirectory}`)
+  }
+ 
+  const content = `#!/bin/sh -l
+rm "$0" # remove script after running
+mv /__w/_temp/_github_home /github/home && \
+mv /__w/_temp/_github_workflow /github/workflow && \
+mv /__w/_temp/_runner_file_commands /github/file_commands || true && \
+mv ${shlex.quote('/__w/' + parts.join('/') + '/')} /github/workspace && \
+cd /github/workspace && \
+exec ${environmentPrefix} ${shlex.quote(entryPoint)} ${
+    entryPointArgs?.length ? entryPointArgs.map(shlex.quote).join(' ') : ''
+  }
+`
+  const filename = `${uuidv4()}.sh`
+  const entryPointPath = `${dst}/${filename}`
+  core.debug(`Writing container step script to ${entryPointPath}`)
+  fs.writeFileSync(entryPointPath, content)
+  return {
+    containerPath: `/__w/_temp/${filename}`,
+    runnerPath: entryPointPath
+  }
+}
+ 
+function scriptEnv(envs?: { [key: string]: string }): string {
+  if (!envs || !Object.entries(envs).length) {
+    return ''
+  }
+  const envBuffer: string[] = []
+  for (const [key, value] of Object.entries(envs)) {
+    if (
+      key.includes(`=`) ||
+      key.includes(`'`) ||
+      key.includes(`"`) ||
+      key.includes(`$`)
+    ) {
+      throw new Error(
+        `environment key ${key} is invalid - the key must not contain =, $, ', or "`
+      )
+    }
+    envBuffer.push(
+      `"${key}=${value
+        .replace(/\\/g, '\\\\')
+        .replace(/"/g, '\\"')
+        .replace(/\$/g, '\\$')
+        .replace(/`/g, '\\`')}"`
+    )
+  }
+ 
+  Iif (!envBuffer?.length) {
+    return ''
+  }
+ 
+  return `env ${envBuffer.join(' ')} `
+}
+ 
+export function generateContainerName(image: string): string {
+  const nameWithTag = image.split('/').pop()
+  const name = nameWithTag?.split(':')[0]
+ 
+  if (!name) {
+    throw new Error(`Image definition '${image}' is invalid`)
+  }
+ 
+  return name
+}
+ 
+// Overwrite or append based on container options
+//
+// Keep in mind, envs and volumes could be passed as fields in container definition
+// so default volume mounts and envs are appended first, and then create options are used
+// to append more values
+//
+// Rest of the fields are just applied
+// For example, container.createOptions.container.image is going to overwrite container.image field
+export function mergeContainerWithOptions(
+  base: k8s.V1Container,
+  from: k8s.V1Container
+): void {
+  for (const [key, value] of Object.entries(from)) {
+    if (key === 'name') {
+      Iif (value !== CONTAINER_EXTENSION_PREFIX + base.name) {
+        core.warning("Skipping name override: name can't be overwritten")
+      }
+      continue
+    } else if (key === 'image') {
+      core.warning("Skipping image override: image can't be overwritten")
+      continue
+    } else if (key === 'env') {
+      const envs = value as k8s.V1EnvVar[]
+      base.env = mergeLists(base.env, envs)
+    } else if (key === 'volumeMounts' && value) {
+      const volumeMounts = value as k8s.V1VolumeMount[]
+      base.volumeMounts = mergeLists(base.volumeMounts, volumeMounts)
+    } else if (key === 'ports' && value) {
+      const ports = value as k8s.V1ContainerPort[]
+      base.ports = mergeLists(base.ports, ports)
+    } else {
+      base[key] = value
+    }
+  }
+}
+ 
+export function mergePodSpecWithOptions(
+  base: k8s.V1PodSpec,
+  from: k8s.V1PodSpec
+): void {
+  for (const [key, value] of Object.entries(from)) {
+    if (key === 'containers') {
+      base.containers.push(
+        ...from.containers.filter(
+          e => !e.name?.startsWith(CONTAINER_EXTENSION_PREFIX)
+        )
+      )
+    } else if (key === 'volumes' && value) {
+      const volumes = value as k8s.V1Volume[]
+      base.volumes = mergeLists(base.volumes, volumes)
+    } else {
+      base[key] = value
+    }
+  }
+}
+ 
+export function mergeObjectMeta(
+  base: { metadata?: k8s.V1ObjectMeta },
+  from: k8s.V1ObjectMeta
+): void {
+  if (!base.metadata?.labels || !base.metadata?.annotations) {
+    throw new Error(
+      "Can't merge metadata: base.metadata or base.annotations field is undefined"
+    )
+  }
+  if (from?.labels) {
+    for (const [key, value] of Object.entries(from.labels)) {
+      if (base.metadata?.labels?.[key]) {
+        core.warning(`Label ${key} is already defined and will be overwritten`)
+      }
+      base.metadata.labels[key] = value
+    }
+  }
+ 
+  if (from?.annotations) {
+    for (const [key, value] of Object.entries(from.annotations)) {
+      if (base.metadata?.annotations?.[key]) {
+        core.warning(
+          `Annotation ${key} is already defined and will be overwritten`
+        )
+      }
+      base.metadata.annotations[key] = value
+    }
+  }
+}
+ 
+export function readExtensionFromFile(): k8s.V1PodTemplateSpec | undefined {
+  const filePath = process.env[ENV_HOOK_TEMPLATE_PATH]
+  if (!filePath) {
+    return undefined
+  }
+  const doc = yaml.load(fs.readFileSync(filePath, 'utf8'))
+  if (!doc || typeof doc !== 'object') {
+    throw new Error(`Failed to parse ${filePath}`)
+  }
+  return doc as k8s.V1PodTemplateSpec
+}
+ 
+export function useKubeScheduler(): boolean {
+  return process.env[ENV_USE_KUBE_SCHEDULER] === 'true'
+}
+ 
+export enum PodPhase {
+  PENDING = 'Pending',
+  RUNNING = 'Running',
+  SUCCEEDED = 'Succeeded',
+  FAILED = 'Failed',
+  UNKNOWN = 'Unknown',
+  COMPLETED = 'Completed'
+}
+ 
+function mergeLists<T>(base?: T[], from?: T[]): T[] {
+  const b: T[] = base || []
+  if (!from?.length) {
+    return b
+  }
+  b.push(...from)
+  return b
+}
+ 
+export function fixArgs(args: string[]): string[] {
+  // Preserve shell command strings passed via `sh -c` without re-tokenizing.
+  // Retokenizing would split the script into multiple args, breaking `sh -c`.
+  if (args.length >= 2 && args[0] === 'sh' && args[1] === '-c') {
+    return args
+  }
+  return shlex.split(args.join(' '))
+}
+ 
+export async function sleep(ms: number): Promise<void> {
+  return new Promise(resolve => setTimeout(resolve, ms))
+}
+ 
+export function listDirAllCommand(dir: string): string {
+  return `cd ${shlex.quote(dir)} && find . -type f -not -path '*/_runner_hook_responses*' -exec stat -c '%s %n' {} \\;`
+}
+ 
+// Safely turn an unknown thrown value into a diagnostic string without
+// throwing. The previous `JSON.stringify(err)` pattern crashed with
+// `TypeError: Converting circular structure to JSON` when err was a
+// @kubernetes/client-node HTTP error (its response embeds a
+// TLSSocket <-> HTTPParser cycle). The thrown TypeError shadowed the
+// original failure in every catch block that used it (issue #329).
+export function formatError(err: unknown): string {
+  if (err === null || err === undefined) {
+    return String(err)
+  }
+ 
+  // @kubernetes/client-node API errors expose the actual server message
+  // under response.body — prefer that when available.
+  const body =
+    (err as { response?: { body?: unknown } })?.response?.body ??
+    (err as { body?: unknown })?.body
+  if (body && typeof body === 'object') {
+    const msg = (body as { message?: unknown }).message
+    const reason = (body as { reason?: unknown }).reason
+    Eif (typeof msg === 'string') {
+      return typeof reason === 'string' && reason.length > 0
+        ? `${msg} (reason: ${reason})`
+        : msg
+    }
+  }
+ 
+  if (err instanceof Error) {
+    return err.message
+  }
+ 
+  if (typeof err === 'object') {
+    // Non-Error objects sometimes carry a top-level message (axios-style
+    // errors, hand-rolled error-likes). Extract before the JSON.stringify
+    // branch so a circular ref doesn't reduce the diagnostic to
+    // "[object Object]".
+    const msg = (err as { message?: unknown }).message
+    if (typeof msg === 'string') {
+      return msg
+    }
+    try {
+      return JSON.stringify(err)
+    } catch {
+      return String(err)
+    }
+  }
+ 
+  // Primitives serialise more readably via String() than JSON.stringify
+  // (which would quote strings and refuse to handle symbols).
+  return String(err)
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/k8s/src/k8s/utils/npu-metrics.ts.html b/coverage/lcov-report/k8s/src/k8s/utils/npu-metrics.ts.html new file mode 100644 index 00000000..72e1233a --- /dev/null +++ b/coverage/lcov-report/k8s/src/k8s/utils/npu-metrics.ts.html @@ -0,0 +1,2359 @@ + + + + + + Code coverage report for k8s/src/k8s/utils/npu-metrics.ts + + + + + + + + + +
+
+

All files / k8s/src/k8s/utils npu-metrics.ts

+
+ +
+ 98.5% + Statements + 264/268 +
+ + +
+ 91% + Branches + 172/189 +
+ + +
+ 98.03% + Functions + 50/51 +
+ + +
+ 98.85% + Lines + 258/261 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +3x +3x +3x +  +3x +3x +3x +  +3x +3x +3x +3x +  +3x +3x +3x +  +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +51x +  +  +  +  +  +  +  +5x +5x +1x +  +4x +4x +2x +  +  +2x +  +2x +  +  +  +  +  +9x +9x +7x +  +2x +2x +1x +  +  +1x +  +1x +  +  +  +60x +60x +107x +16x +14x +  +  +  +46x +  +  +  +18x +  +  +  +19x +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +11x +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +10x +  +  +  +  +  +1x +  +  +  +  +  +9x +2x +  +10x +  +  +  +  +  +  +7x +7x +  +  +  +1x +  +  +6x +  +  +  +1x +  +  +1x +  +  +5x +5x +  +5x +  +  +  +  +  +  +  +7x +  +  +  +  +  +  +  +7x +7x +  +  +  +39x +1x +  +38x +37x +  +1x +  +  +  +  +  +17x +2x +  +15x +15x +2x +  +13x +13x +13x +12x +  +13x +  +15x +15x +  +2x +  +13x +2x +  +11x +11x +11x +2x +  +9x +  +  +  +  +  +  +  +  +  +11x +  +2x +  +  +  +  +  +  +14x +1x +  +15x +  +  +  +111x +  +  +  +8x +88x +88x +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +8x +8x +8x +8x +8x +8x +8x +8x +8x +  +88x +  +  +8x +8x +8x +8x +8x +  +8x +8x +  +  +8x +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +7x +  +  +  +  +  +  +  +  +3x +3x +3x +  +2x +2x +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +18x +18x +18x +  +  +18x +5x +  +  +5x +  +17x +17x +  +  +  +  +  +  +  +  +5x +5x +5x +  +  +  +17x +17x +17x +  +  +  +  +  +  +  +  +  +13x +13x +13x +13x +  +13x +25x +12x +  +25x +25x +  +  +  +  +  +  +9x +8x +  +1x +  +16x +  +  +17x +  +  +  +  +  +8x +8x +18x +18x +5x +  +13x +13x +13x +  +  +  +  +8x +8x +3x +  +5x +  +  +  +  +  +  +  +5x +5x +4x +  +1x +  +  +1x +  +  +  +  +11x +  +  +11x +11x +  +  +  +10x +10x +10x +  +  +  +10x +8x +6x +6x +6x +  +  +  +4x +2x +2x +1x +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +9x +9x +9x +9x +9x +  +  +  +18x +8x +8x +8x +8x +  +  +  +  +9x +7x +  +9x +9x +  +  +9x +  +  +  +  +  +  +  +  +  +  +9x +7x +  +2x +9x +9x +1x +  +1x +  +  +  +  +  +12x +12x +1x +  +11x +11x +  +12x +12x +5x +  +6x +1x +  +5x +  +  +  +  +  +4x +  +  +  +8x +1x +  +7x +7x +7x +  +1x +1x +  +6x +16x +  +6x +1x +  +  +5x +5x +5x +5x +  +  +  +  +5x +5x +1x +  +  +1x +  +  +4x +8x +8x +8x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +8x +7x +1x +1x +  +  +6x +6x +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +8x +8x +8x +4x +  +2x +2x +2x +  +  +  +  +  + 
import * as core from '@actions/core'
+import * as k8s from '@kubernetes/client-node'
+import * as https from 'https'
+import * as http from 'http'
+import { URL } from 'url'
+import { getRunnerPodName, JOB_CONTAINER_NAME } from '../../hooks/constants'
+import { formatError } from './index'
+import {
+  execPodStepWithOutput,
+  getPodByName,
+  getSecretByName,
+  listPodsByRunnerInstance,
+  namespace
+} from '../index'
+ 
+export const NPU_METRICS_MARKER = 'NPU_METRICS_V1'
+export const ENV_NPU_METRICS_ENABLED = 'ACTIONS_RUNNER_NPU_METRICS'
+export const ENV_NPU_SAMPLE_INTERVAL = 'NPU_SAMPLE_INTERVAL'
+export const ENV_NPU_IDLE_THRESHOLD = 'NPU_IDLE_THRESHOLD'
+ 
+export const DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS = 1
+export const MIN_NPU_SAMPLE_INTERVAL_SECONDS = 0.2
+export const DEFAULT_NPU_IDLE_THRESHOLD_PERCENT = 5
+ 
+export const NPU_SAMPLES_FILE = '/tmp/npu-samples.jsonl'
+export const NPU_TERMINATION_LOG = '/dev/termination-log'
+export const NPU_SAMPLES_MAX_BYTES = 4 * 1024 * 1024
+export const NPU_AGGREGATE_MAX_BYTES = 4096
+ 
+export const NPU_METRICS_SECRET_NAME = 'npu-metrics-pushgw'
+export const NPU_METRICS_PUSH_JOB = 'npu-job-record'
+export const NPU_COLLECT_TIMEOUT_MS = 10_000
+ 
+const NPU_RESOURCE_REGEX = /^huawei\.com\/(ascend\S*)$/i
+const SCALE_SET_NAME_REGEX = /^linux-[a-z0-9]+-[a-z0-9]+-\d+-([a-z][a-z0-9-]*)$/
+ 
+export interface NpuCardAggregate {
+  card: string
+  samples: number
+  peakUtil: number
+  avgUtil: number
+  peakHbm: number
+  firstTs: number
+  lastTs: number
+}
+ 
+export interface NpuAggregatePayload {
+  version: string
+  ts: number
+  cards: NpuCardAggregate[]
+}
+ 
+export interface NpuPushConfig {
+  url: string
+  username?: string
+  password?: string
+}
+ 
+export interface NpuJobLabels {
+  cluster: string
+  namespace: string
+  pod: string
+  podType: string
+  repo: string
+  runId: string
+  npuType: string
+  cardsRequested: string
+  result: string
+}
+ 
+export function npuMetricsEnabled(
+  env: Record<string, string | undefined> = process.env
+): boolean {
+  return (
+    (env[ENV_NPU_METRICS_ENABLED] ?? '').trim().toLowerCase() !== 'disabled'
+  )
+}
+ 
+export function getNpuSampleIntervalSeconds(
+  env: Record<string, string | undefined> = process.env
+): number {
+  const raw = env[ENV_NPU_SAMPLE_INTERVAL]
+  if (!raw) {
+    return DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS
+  }
+  const parsed = Number(raw)
+  if (!Number.isFinite(parsed) || parsed <= 0) {
+    core.warning(
+      `NPU_SAMPLE_INTERVAL is invalid ("${raw}"): use ${DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS}`
+    )
+    return DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS
+  }
+  return Math.max(parsed, MIN_NPU_SAMPLE_INTERVAL_SECONDS)
+}
+ 
+export function getIdleThresholdPercent(
+  env: Record<string, string | undefined> = process.env
+): number {
+  const raw = env[ENV_NPU_IDLE_THRESHOLD]
+  if (!raw) {
+    return DEFAULT_NPU_IDLE_THRESHOLD_PERCENT
+  }
+  const parsed = Number(raw)
+  if (!Number.isFinite(parsed) || parsed < 0) {
+    core.warning(
+      `NPU_IDLE_THRESHOLD is invalid ("${raw}"): use ${DEFAULT_NPU_IDLE_THRESHOLD_PERCENT}`
+    )
+    return DEFAULT_NPU_IDLE_THRESHOLD_PERCENT
+  }
+  return parsed
+}
+ 
+export function containerHasNpuRequest(container: k8s.V1Container): boolean {
+  const resources = [container.resources?.requests, container.resources?.limits]
+  for (const entry of resources) {
+    for (const key of Object.keys(entry ?? {})) {
+      if (NPU_RESOURCE_REGEX.test(key)) {
+        return true
+      }
+    }
+  }
+  return false
+}
+ 
+export function hasNpuRequest(spec: k8s.V1PodSpec | undefined): boolean {
+  return (spec?.containers ?? []).some(c => containerHasNpuRequest(c))
+}
+ 
+function listNpuCardsCommand(): string {
+  return `ls /dev/davinci[0-9]* 2>/dev/null | sed 's|.*/davinci||' | sort -n | uniq | tr '\\n' ' '`
+}
+ 
+export function buildNpuSamplerScript(
+  intervalSeconds = DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS
+): string {
+  return [
+    `# ${NPU_METRICS_MARKER} sampler (detached, best-effort)`,
+    `F=${NPU_SAMPLES_FILE}`,
+    `CARDS=$(${listNpuCardsCommand()})`,
+    `[ -z "$CARDS" ] && exit 0`,
+    `while :; do`,
+    `  NOW=$(date +%s)`,
+    `  for C in $CARDS; do`,
+    `    OUT=$(npu-smi info -t usages -i "$C" 2>/dev/null) || continue`,
+    `    U=$(printf '%s\\n' "$OUT" | awk '{l=$0; gsub(/[ \\t\\r]/, "", l)} l ~ /AICore/ { if (match(l, /[0-9.]+%?$/)) { v = substr(l, RSTART, RLENGTH); sub(/%$/, "", v); print v; exit } }')`,
+    `    H=$(printf '%s\\n' "$OUT" | awk '{l=$0; gsub(/[ \\t\\r]/, "", l)} l ~ /HBM/ { if (match(l, /[0-9.]+%?$/)) { v = substr(l, RSTART, RLENGTH); sub(/%$/, "", v); print v; exit } }')`,
+    `    printf '{"ts":%s,"card":%s,"util":%s,"hbm":%s}\\n' "$NOW" "$C" "\${U:-0}" "\${H:-0}" >> "$F" 2>/dev/null || true`,
+    `  done`,
+    `  SZ=$(wc -c < "$F" 2>/dev/null || echo 0)`,
+    `  if [ "$SZ" -gt ${NPU_SAMPLES_MAX_BYTES} ]; then`,
+    `    tail -n 2000 "$F" > "$F.r" 2>/dev/null && mv "$F.r" "$F" || true`,
+    `  fi`,
+    `  sleep ${intervalSeconds}`,
+    `done`
+  ].join('\n')
+}
+ 
+const AGGREGATE_AWK = [
+  `BEGIN {`,
+  `  n = split(cards, a, " ")`,
+  `  for (i = 1; i <= n; i++) { cnt[a[i]] = 0; pu[a[i]] = 0; ph[a[i]] = 0; su[a[i]] = 0; fs[a[i]] = 0; ls[a[i]] = 0 }`,
+  `}`,
+  `{`,
+  `  ts = $0; sub(/.*"ts":/, "", ts); sub(/[^0-9].*/, "", ts)`,
+  `  c = $0;  sub(/.*"card":/, "", c); sub(/[^0-9].*/, "", c)`,
+  `  u = $0; sub(/.*"util":/, "", u); sub(/[^0-9.].*/, "", u)`,
+  `  h = $0; sub(/.*"hbm":/, "", h); sub(/[^0-9.].*/, "", h)`,
+  `  if (c == "") next`,
+  `  cnt[c]++`,
+  `  if (ts != "") { t = ts + 0; if (fs[c] == 0 || t < fs[c]) fs[c] = t; if (t > ls[c]) ls[c] = t }`,
+  `  if (u + 0 > pu[c]) pu[c] = u + 0`,
+  `  if (h + 0 > ph[c]) ph[c] = h + 0`,
+  `  su[c] += u + 0`,
+  `}`,
+  `END {`,
+  `  printf "{\\"v\\":\\"${NPU_METRICS_MARKER}\\",\\"ts\\":%d,\\"cards\\":[", now`,
+  `  sep = ""`,
+  `  for (c in cnt) {`,
+  `    au = cnt[c] > 0 ? su[c] / cnt[c] : 0`,
+  `    printf "%s{\\"c\\":\\"%s\\",\\"n\\":%d,\\"pu\\":%.1f,\\"au\\":%.1f,\\"ph\\":%.1f,\\"fs\\":%d,\\"ls\\":%d}", sep, c, cnt[c], pu[c], au, ph[c], fs[c], ls[c]`,
+  `    sep = ","`,
+  `  }`,
+  `  printf "]}\\n"`,
+  `}`
+].join('\n')
+ 
+export function buildNpuAggregateScript(): string {
+  return [
+    `# ${NPU_METRICS_MARKER} aggregate`,
+    `F=${NPU_SAMPLES_FILE}`,
+    `CARDS=$(${listNpuCardsCommand()})`,
+    `NOW=$(date +%s)`,
+    `touch "$F" 2>/dev/null || true`,
+    `awk -v now="$NOW" -v cards="$CARDS" '${AGGREGATE_AWK}' "$F" 2>/dev/null`
+  ].join('\n')
+}
+ 
+function commandHasMarker(command: string[] | undefined): boolean {
+  return (command ?? []).join(' ').includes(NPU_METRICS_MARKER)
+}
+ 
+function appendExecCommand(
+  existing: string[] | undefined,
+  appendLines: string[]
+): string[] {
+  if (
+    existing &&
+    existing.length >= 3 &&
+    /(^|\/)sh$/.test(existing[0]) &&
+    existing[1] === '-c'
+  ) {
+    return [
+      existing[0],
+      existing[1],
+      [...existing.slice(2), ...appendLines].join('\n')
+    ]
+  }
+  const prefix = (existing ?? []).map(
+    part => `'${part.replace(/'/g, "'\\''")}'`
+  )
+  return ['sh', '-c', [prefix.join(' '), ...appendLines].join('\n')]
+}
+ 
+export function injectNpuMetrics(
+  container: k8s.V1Container,
+  intervalSeconds = DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS
+): boolean {
+  const lifecycle = container.lifecycle ?? {}
+  if (
+    commandHasMarker(lifecycle.postStart?.exec?.command) ||
+    commandHasMarker(lifecycle.preStop?.exec?.command)
+  ) {
+    return false
+  }
+ 
+  if (
+    (lifecycle.postStart && !lifecycle.postStart.exec) ||
+    (lifecycle.preStop && !lifecycle.preStop.exec)
+  ) {
+    core.warning(
+      'npu-metrics: container already has a non-exec lifecycle handler, skip injection'
+    )
+    return false
+  }
+ 
+  const samplerLine = `(${buildNpuSamplerScript(intervalSeconds)}) >/dev/null 2>&1 &`
+  const aggregateLine = `{ ( ${buildNpuAggregateScript()} ) | head -c ${NPU_AGGREGATE_MAX_BYTES} > ${NPU_TERMINATION_LOG}; } 2>/dev/null || true`
+ 
+  lifecycle.postStart = {
+    exec: {
+      command: appendExecCommand(lifecycle.postStart?.exec?.command, [
+        `# ${NPU_METRICS_MARKER} postStart: start detached npu sampler`,
+        samplerLine
+      ])
+    }
+  }
+  lifecycle.preStop = {
+    exec: {
+      command: appendExecCommand(lifecycle.preStop?.exec?.command, [
+        `# ${NPU_METRICS_MARKER} preStop: write npu aggregate to termination log`,
+        aggregateLine
+      ])
+    }
+  }
+  container.lifecycle = lifecycle
+  return true
+}
+ 
+export function maybeInjectNpuMetrics(container: k8s.V1Container): boolean {
+  if (!npuMetricsEnabled()) {
+    return false
+  }
+  if (!containerHasNpuRequest(container)) {
+    return false
+  }
+  return injectNpuMetrics(container)
+}
+ 
+export function parseNpuAggregate(
+  raw: string | undefined
+): NpuAggregatePayload | undefined {
+  if (!raw) {
+    return undefined
+  }
+  const start = raw.indexOf('{"v":')
+  if (start === -1) {
+    return undefined
+  }
+  const candidates = [raw.slice(start)]
+  const end = raw.lastIndexOf('}')
+  if (end > start) {
+    candidates.push(raw.slice(start, end + 1))
+  }
+  for (const candidate of candidates) {
+    let parsed: any
+    try {
+      parsed = JSON.parse(candidate)
+    } catch {
+      continue
+    }
+    if (parsed?.v !== NPU_METRICS_MARKER || !Array.isArray(parsed.cards)) {
+      continue
+    }
+    const cards: NpuCardAggregate[] = []
+    for (const c of parsed.cards) {
+      if (c === null || typeof c !== 'object' || c.c === undefined) {
+        continue
+      }
+      cards.push({
+        card: String(c.c),
+        samples: Number(c.n) || 0,
+        peakUtil: Number(c.pu) || 0,
+        avgUtil: Number(c.au) || 0,
+        peakHbm: Number(c.ph) || 0,
+        firstTs: Number(c.fs) || 0,
+        lastTs: Number(c.ls) || 0
+      })
+    }
+    return { version: parsed.v, ts: Number(parsed.ts) || 0, cards }
+  }
+  return undefined
+}
+ 
+export function isIdleRecord(
+  cards: NpuCardAggregate[],
+  threshold = DEFAULT_NPU_IDLE_THRESHOLD_PERCENT
+): boolean {
+  if (!cards.length) {
+    return false
+  }
+  return cards.every(c => c.peakUtil < threshold && c.avgUtil < threshold)
+}
+ 
+export function escapePromLabelValue(value: string): string {
+  return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n')
+}
+ 
+export function formatPromLabels(labels: Record<string, string>): string {
+  return Object.entries(labels)
+    .filter(([, v]) => v !== undefined)
+    .map(([k, v]) => `${k}="${escapePromLabelValue(v)}"`)
+    .join(',')
+}
+ 
+const NPU_JOB_METRIC_LABEL_KEYS = [
+  'cluster',
+  'namespace',
+  'repo',
+  'run_id',
+  'pod',
+  'pod_type',
+  'card',
+  'npu_type',
+  'cards_requested',
+  'result',
+  'idle'
+]
+ 
+export function buildNpuJobMetricsBody(
+  labels: NpuJobLabels,
+  cards: NpuCardAggregate[],
+  idleThreshold = DEFAULT_NPU_IDLE_THRESHOLD_PERCENT
+): string {
+  const base: Record<string, string> = {
+    cluster: labels.cluster,
+    namespace: labels.namespace,
+    repo: labels.repo,
+    run_id: labels.runId,
+    pod: labels.pod,
+    pod_type: labels.podType,
+    npu_type: labels.npuType,
+    cards_requested: labels.cardsRequested,
+    result: labels.result
+  }
+  const idle = isIdleRecord(cards, idleThreshold) ? 'true' : 'false'
+  const lines: string[] = []
+  lines.push('# TYPE custom_npu_job_peak_util_percent gauge')
+  lines.push('# TYPE custom_npu_job_avg_util_percent gauge')
+  lines.push('# TYPE custom_npu_job_duration_seconds gauge')
+  lines.push('# TYPE custom_npu_job_sample_count gauge')
+  for (const card of cards) {
+    const cardLabels = { ...base, card: card.card, idle }
+    const l = formatPromLabels(
+      Object.fromEntries(
+        NPU_JOB_METRIC_LABEL_KEYS.map(k => [k, cardLabels[k]])
+      ) as Record<string, string>
+    )
+    lines.push(`custom_npu_job_peak_util_percent{${l}} ${card.peakUtil}`)
+    lines.push(`custom_npu_job_avg_util_percent{${l}} ${card.avgUtil}`)
+    const duration = Math.max(card.lastTs - card.firstTs, 0)
+    lines.push(`custom_npu_job_duration_seconds{${l}} ${duration}`)
+    lines.push(`custom_npu_job_sample_count{${l}} ${card.samples}`)
+  }
+  lines.push('# TYPE custom_npu_job_push_total counter')
+  lines.push(
+    `custom_npu_job_push_total{cluster="${escapePromLabelValue(labels.cluster)}",namespace="${escapePromLabelValue(labels.namespace)}",status="success"} 1`
+  )
+  return lines.join('\n') + '\n'
+}
+ 
+export function buildNpuPushFailedBody(labels: NpuJobLabels): string {
+  return (
+    `# TYPE custom_npu_job_push_total counter\n` +
+    `custom_npu_job_push_total{cluster="${escapePromLabelValue(labels.cluster)}",namespace="${escapePromLabelValue(labels.namespace)}",status="failed"} 1\n`
+  )
+}
+ 
+export function buildPushgatewayPath(
+  cluster: string,
+  ns: string,
+  pod: string
+): string {
+  return `/metrics/job/${NPU_METRICS_PUSH_JOB}/cluster/${encodeURIComponent(
+    cluster
+  )}/ns/${encodeURIComponent(ns)}/pod/${encodeURIComponent(pod)}`
+}
+ 
+export async function withTimeout<T>(
+  promise: Promise<T>,
+  timeoutMs: number
+): Promise<T> {
+  return await new Promise<T>((resolve, reject) => {
+    const timer = setTimeout(() => reject(new Error('timeout')), timeoutMs)
+    promise.then(
+      value => {
+        clearTimeout(timer)
+        resolve(value)
+      },
+      err => {
+        clearTimeout(timer)
+        reject(err)
+      }
+    )
+  })
+}
+ 
+export interface PushRequest {
+  url: string
+  method: string
+  body: string
+  username?: string
+  password?: string
+  timeoutMs?: number
+}
+ 
+export type RequestFn = (req: PushRequest) => Promise<{ statusCode: number }>
+ 
+export async function nodeRequest(req: PushRequest): Promise<{
+  statusCode: number
+}> {
+  const target = new URL(req.url)
+  const client = target.protocol === 'http:' ? http : https
+  const headers: Record<string, string> = {
+    'Content-Type': 'text/plain'
+  }
+  if (req.username !== undefined || req.password !== undefined) {
+    const basic = Buffer.from(
+      `${req.username ?? ''}:${req.password ?? ''}`
+    ).toString('base64')
+    headers['Authorization'] = `Basic ${basic}`
+  }
+  return await new Promise((resolve, reject) => {
+    const request = client.request(
+      target,
+      {
+        method: req.method,
+        headers,
+        timeout: req.timeoutMs ?? 5000,
+        rejectUnauthorized: false
+      },
+      response => {
+        response.resume()
+        response.on('end', () =>
+          resolve({ statusCode: response.statusCode ?? 0 })
+        )
+      }
+    )
+    request.on('timeout', () => request.destroy(new Error('request timeout')))
+    request.on('error', reject)
+    request.end(req.body)
+  })
+}
+ 
+export async function pushToPushgateway(
+  config: NpuPushConfig,
+  path: string,
+  body: string,
+  options?: { retries?: number; retryDelayMs?: number; requestFn?: RequestFn }
+): Promise<void> {
+  const retries = options?.retries ?? 2
+  const retryDelayMs = options?.retryDelayMs ?? 1000
+  const requestFn = options?.requestFn ?? nodeRequest
+  const url = `${config.url.replace(/\/+$/, '')}${path}`
+  let lastError: unknown
+  for (let attempt = 0; attempt <= retries; attempt++) {
+    if (attempt > 0) {
+      await new Promise(resolve => setTimeout(resolve, retryDelayMs))
+    }
+    try {
+      const response = await requestFn({
+        url,
+        method: 'POST',
+        body,
+        username: config.username,
+        password: config.password
+      })
+      if (response.statusCode >= 200 && response.statusCode < 300) {
+        return
+      }
+      lastError = new Error(`pushgateway returned ${response.statusCode}`)
+    } catch (err) {
+      lastError = err
+    }
+  }
+  throw lastError instanceof Error ? lastError : new Error(String(lastError))
+}
+ 
+export function decodePushSecret(
+  secret: k8s.V1Secret | undefined
+): NpuPushConfig | undefined {
+  const data = secret?.data ?? {}
+  const decode = (key: string): string | undefined => {
+    const encoded = data[key]
+    if (!encoded) {
+      return undefined
+    }
+    try {
+      const decoded = Buffer.from(encoded, 'base64').toString('utf8')
+      return decoded.length ? decoded : undefined
+    } catch {
+      return undefined
+    }
+  }
+  const url = decode('PUSHGATEWAY_URL')
+  if (!url) {
+    return undefined
+  }
+  return {
+    url,
+    username: decode('PUSHGATEWAY_USER'),
+    password: decode('PUSHGATEWAY_PASSWORD')
+  }
+}
+ 
+export async function readNpuPushConfig(): Promise<NpuPushConfig | undefined> {
+  try {
+    const secret = await getSecretByName(NPU_METRICS_SECRET_NAME)
+    return decodePushSecret(secret)
+  } catch (err) {
+    core.debug(
+      `npu-metrics: secret ${NPU_METRICS_SECRET_NAME} unavailable, skip push: ${formatError(err)}`
+    )
+    return undefined
+  }
+}
+ 
+function parseScaleSetSuffix(value: string | undefined): string | undefined {
+  Iif (!value) {
+    return undefined
+  }
+  const match = value.match(SCALE_SET_NAME_REGEX)
+  return match ? match[1] : undefined
+}
+ 
+export function extractClusterFromRunnerPod(pod: k8s.V1Pod): string {
+  const labels = pod.metadata?.labels ?? {}
+  const annotations = pod.metadata?.annotations ?? {}
+  const entries: [string, string][] = [
+    ...Object.entries(labels),
+    ...Object.entries(annotations)
+  ]
+  for (const [key, value] of entries) {
+    if (/scale[-_]?set|runner[-_]?deployment/i.test(key)) {
+      const suffix = parseScaleSetSuffix(value)
+      Eif (suffix) {
+        return suffix
+      }
+    }
+  }
+  for (const [, value] of entries) {
+    const suffix = parseScaleSetSuffix(value)
+    if (suffix) {
+      return suffix
+    }
+  }
+  return parseScaleSetSuffix(pod.metadata?.name) ?? 'unknown'
+}
+ 
+export function resolveNpuLabelsFromPod(
+  pod: k8s.V1Pod,
+  podName: string
+): {
+  podType: string
+  npuType: string
+  cardsRequested: string
+  result: string
+} {
+  const podType = podName.includes('-step-') ? 'step' : 'workflow'
+  const npuTypes = new Set<string>()
+  let cards = 0
+  for (const container of pod.spec?.containers ?? []) {
+    for (const resources of [
+      container.resources?.requests,
+      container.resources?.limits
+    ]) {
+      for (const [key, quantity] of Object.entries(resources ?? {})) {
+        const match = key.match(NPU_RESOURCE_REGEX)
+        Eif (match) {
+          npuTypes.add(match[1])
+          cards = Math.max(cards, parseInt(String(quantity), 10) || 0)
+        }
+      }
+    }
+  }
+  const mainStatus = (pod.status?.containerStatuses ?? []).find(
+    s => s.name === JOB_CONTAINER_NAME
+  )
+  const terminated = mainStatus?.state?.terminated
+  const result = terminated
+    ? String(terminated.exitCode)
+    : (pod.status?.phase ?? 'unknown')
+  return {
+    podType,
+    npuType: Array.from(npuTypes).sort().join(',') || 'unknown',
+    cardsRequested: String(cards || 0),
+    result
+  }
+}
+ 
+export function repoFromEnv(
+  env: Record<string, string | undefined> = process.env
+): string {
+  if (env.GITHUB_REPOSITORY) {
+    return env.GITHUB_REPOSITORY
+  }
+  const workspace = env.GITHUB_WORKSPACE ?? ''
+  const parts = workspace.split('/').filter(p => p.length > 0)
+  if (parts.length >= 2) {
+    return `${parts[parts.length - 2]}/${parts[parts.length - 1]}`
+  }
+  return 'unknown'
+}
+ 
+export async function collectNpuAggregateFromPod(
+  pod: k8s.V1Pod
+): Promise<NpuAggregatePayload | undefined> {
+  const podName = pod.metadata?.name
+  if (!podName) {
+    return undefined
+  }
+  const mainStatus = (pod.status?.containerStatuses ?? []).find(
+    s => s.name === JOB_CONTAINER_NAME
+  )
+  const terminatedMessage = mainStatus?.state?.terminated?.message
+  if (terminatedMessage) {
+    return parseNpuAggregate(terminatedMessage)
+  }
+  if (!mainStatus?.state?.running) {
+    return undefined
+  }
+  const { output } = await execPodStepWithOutput(
+    ['sh', '-c', buildNpuAggregateScript()],
+    podName,
+    JOB_CONTAINER_NAME,
+    5
+  )
+  return parseNpuAggregate(output)
+}
+ 
+export async function collectAndPushNpuMetrics(): Promise<void> {
+  if (!npuMetricsEnabled()) {
+    return
+  }
+  let pods: k8s.V1Pod[] = []
+  try {
+    pods = await listPodsByRunnerInstance()
+  } catch (err) {
+    core.debug(`npu-metrics: pod list failed: ${formatError(err)}`)
+    return
+  }
+  const npuPods = pods.filter(
+    pod => pod.metadata?.name && hasNpuRequest(pod.spec)
+  )
+  if (!npuPods.length) {
+    return
+  }
+ 
+  let cluster = 'unknown'
+  try {
+    const runnerPod = await getPodByName(getRunnerPodName())
+    cluster = extractClusterFromRunnerPod(runnerPod)
+  } catch (err) {
+    core.debug(`npu-metrics: cluster label unresolved: ${formatError(err)}`)
+  }
+ 
+  const config = await readNpuPushConfig()
+  if (!config) {
+    core.debug(
+      `npu-metrics: push config missing (secret ${NPU_METRICS_SECRET_NAME}), skip push`
+    )
+    return
+  }
+ 
+  for (const pod of npuPods) {
+    const podName = pod.metadata?.name as string
+    try {
+      await collectAndPushForPod(pod, podName, cluster, config)
+    } catch (err) {
+      core.debug(
+        `npu-metrics: collection failed for ${podName}: ${formatError(err)}`
+      )
+    }
+  }
+}
+ 
+async function collectAndPushForPod(
+  pod: k8s.V1Pod,
+  podName: string,
+  cluster: string,
+  config: NpuPushConfig
+): Promise<void> {
+  const payload = await collectNpuAggregateFromPod(pod)
+  if (!payload || !payload.cards.length) {
+    core.debug(`npu-metrics: no aggregate payload for ${podName}, skip`)
+    return
+  }
+ 
+  const npuInfo = resolveNpuLabelsFromPod(pod, podName)
+  const labels: NpuJobLabels = {
+    cluster,
+    namespace: namespace(),
+    pod: podName,
+    podType: npuInfo.podType,
+    repo: repoFromEnv(),
+    runId: process.env.GITHUB_RUN_ID ?? '',
+    npuType: npuInfo.npuType,
+    cardsRequested: npuInfo.cardsRequested,
+    result: npuInfo.result
+  }
+ 
+  const body = buildNpuJobMetricsBody(
+    labels,
+    payload.cards,
+    getIdleThresholdPercent()
+  )
+  const path = buildPushgatewayPath(labels.cluster, labels.namespace, podName)
+  try {
+    await pushToPushgateway(config, path, body)
+    core.debug(`npu-metrics: pushed job record for ${podName}`)
+  } catch (err) {
+    core.warning(`npu-metrics: push failed for ${podName}: ${formatError(err)}`)
+    try {
+      await pushToPushgateway(config, path, buildNpuPushFailedBody(labels))
+    } catch {
+      // pushgateway unreachable, nothing else to record
+    }
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 00000000..b3225238 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 00000000..6ed68316 Binary files /dev/null and b/coverage/lcov-report/sort-arrow-sprite.png differ diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js new file mode 100644 index 00000000..4ed70ae5 --- /dev/null +++ b/coverage/lcov-report/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 00000000..b4f6bc44 --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,2858 @@ +TN: +SF:packages/hooklib/src/index.ts +FNF:0 +FNH:0 +LF:0 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:packages/hooklib/src/interfaces.ts +FN:1,(anonymous_0) +FN:72,(anonymous_1) +FNF:2 +FNH:2 +FNDA:1,(anonymous_0) +FNDA:1,(anonymous_1) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:72,1 +DA:73,1 +DA:74,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:packages/hooklib/src/utils/index.ts +FN:7,getInputFromStdin +FN:14,(anonymous_1) +FN:22,writeToResponseFile +FN:35,toCommandValue +FNF:4 +FNH:2 +FNDA:0,getInputFromStdin +FNDA:0,(anonymous_1) +FNDA:16,writeToResponseFile +FNDA:14,toCommandValue +DA:8,0 +DA:10,0 +DA:14,0 +DA:15,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:23,16 +DA:24,1 +DA:26,15 +DA:27,1 +DA:30,14 +DA:36,14 +DA:37,2 +DA:38,12 +DA:39,11 +DA:41,1 +LF:17 +LH:10 +BRDA:23,0,0,1 +BRDA:23,0,1,15 +BRDA:26,1,0,1 +BRDA:26,1,1,14 +BRDA:36,2,0,2 +BRDA:36,2,1,12 +BRDA:36,3,0,14 +BRDA:36,3,1,13 +BRDA:38,4,0,11 +BRDA:38,4,1,1 +BRDA:38,5,0,12 +BRDA:38,5,1,1 +BRF:12 +BRH:12 +end_of_record +TN: +SF:packages/k8s/src/index.ts +FN:17,run +FNF:1 +FNH:0 +FNDA:0,run +DA:18,0 +DA:19,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:33,0 +DA:34,0 +DA:36,0 +DA:37,0 +DA:39,0 +DA:40,0 +DA:42,0 +DA:43,0 +DA:45,0 +DA:46,0 +DA:48,0 +DA:51,0 +DA:52,0 +DA:56,0 +LF:22 +LH:0 +BRDA:25,0,0,0 +BRDA:25,0,1,0 +BRDA:34,1,0,0 +BRDA:34,1,1,0 +BRDA:34,1,2,0 +BRDA:34,1,3,0 +BRDA:34,1,4,0 +BRF:7 +BRH:0 +end_of_record +TN: +SF:packages/k8s/src/hooks/cleanup-job.ts +FN:11,cleanupJob +FNF:1 +FNH:1 +FNDA:4,cleanupJob +DA:12,4 +DA:13,3 +DA:14,3 +DA:16,1 +DA:19,4 +LF:5 +LH:5 +BRDA:12,0,0,3 +BRDA:12,0,1,1 +BRF:2 +BRH:2 +end_of_record +TN: +SF:packages/k8s/src/hooks/constants.ts +FN:3,getRunnerPodName +FN:13,getJobPodName +FN:20,getStepPodName +FN:27,getVolumeClaimName +FN:35,getSecretName +FN:50,constructor +FN:54,key +FN:58,value +FN:62,toString +FNF:9 +FNH:8 +FNDA:86,getRunnerPodName +FNDA:42,getJobPodName +FNDA:18,getStepPodName +FNDA:0,getVolumeClaimName +FNDA:4,getSecretName +FNDA:17,constructor +FNDA:10,key +FNDA:10,value +FNDA:7,toString +DA:4,86 +DA:5,86 +DA:6,0 +DA:10,86 +DA:14,42 +DA:21,18 +DA:28,0 +DA:29,0 +DA:30,0 +DA:32,0 +DA:36,4 +DA:42,7 +DA:43,7 +DA:44,7 +DA:45,7 +DA:46,7 +DA:51,17 +DA:55,10 +DA:59,10 +DA:63,7 +LF:20 +LH:15 +BRDA:5,0,0,0 +BRDA:5,0,1,86 +BRDA:29,1,0,0 +BRDA:29,1,1,0 +BRF:4 +BRH:1 +end_of_record +TN: +SF:packages/k8s/src/hooks/index.ts +FNF:0 +FNH:0 +LF:0 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:packages/k8s/src/hooks/prepare-job.ts +FN:40,prepareJob +FN:73,(anonymous_1) +FN:235,generateResponseFile +FN:253,(anonymous_3) +FN:275,(anonymous_4) +FN:278,(anonymous_5) +FN:279,(anonymous_6) +FN:299,createContainerSpec +FN:354,(anonymous_8) +FNF:9 +FNH:8 +FNDA:20,prepareJob +FNDA:6,(anonymous_1) +FNDA:8,generateResponseFile +FNDA:8,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:10,(anonymous_5) +FNDA:6,(anonymous_6) +FNDA:35,createContainerSpec +FNDA:1,(anonymous_8) +DA:44,20 +DA:45,1 +DA:48,19 +DA:50,19 +DA:52,19 +DA:53,19 +DA:54,18 +DA:60,18 +DA:63,19 +DA:64,19 +DA:65,19 +DA:66,4 +DA:67,4 +DA:68,6 +DA:69,6 +DA:72,4 +DA:73,4 +DA:74,6 +DA:75,6 +DA:76,6 +DA:79,6 +DA:80,4 +DA:82,2 +DA:85,6 +DA:86,6 +DA:87,6 +DA:91,19 +DA:92,1 +DA:95,18 +DA:96,18 +DA:97,18 +DA:105,6 +DA:106,6 +DA:113,6 +DA:114,6 +DA:121,6 +DA:122,6 +DA:125,6 +DA:127,6 +DA:130,6 +DA:133,5 +DA:134,5 +DA:137,5 +DA:138,5 +DA:139,5 +DA:140,2 +DA:143,2 +DA:149,6 +DA:159,6 +DA:162,12 +DA:163,1 +DA:165,11 +DA:169,20 +DA:170,20 +DA:171,1 +DA:173,10 +DA:176,10 +DA:177,2 +DA:180,10 +DA:181,10 +DA:188,1 +DA:192,1 +DA:193,1 +DA:196,9 +DA:198,9 +DA:199,2 +DA:205,2 +DA:206,2 +DA:207,2 +DA:215,2 +DA:218,9 +DA:220,9 +DA:221,9 +DA:222,9 +DA:227,1 +DA:228,1 +DA:229,1 +DA:231,8 +DA:232,8 +DA:242,8 +DA:243,0 +DA:245,8 +DA:253,8 +DA:254,8 +DA:256,8 +DA:257,8 +DA:258,8 +DA:259,8 +DA:260,0 +DA:265,8 +DA:271,8 +DA:273,4 +DA:275,0 +DA:277,4 +DA:278,10 +DA:280,6 +DA:281,6 +DA:282,1 +DA:283,1 +DA:284,1 +DA:289,6 +DA:296,8 +DA:305,35 +DA:306,1 +DA:307,1 +DA:310,35 +DA:315,35 +DA:316,1 +DA:319,35 +DA:320,28 +DA:323,35 +DA:324,20 +DA:327,35 +DA:328,35 +DA:331,2 +DA:332,1 +DA:336,35 +DA:341,35 +DA:342,34 +DA:348,35 +DA:350,35 +DA:351,34 +DA:354,1 +DA:355,1 +DA:358,35 +DA:359,1 +DA:362,1 +LF:127 +LH:124 +BRDA:44,0,0,1 +BRDA:44,0,1,19 +BRDA:53,1,0,18 +BRDA:53,1,1,1 +BRDA:65,2,0,4 +BRDA:65,2,1,15 +BRDA:69,3,0,6 +BRDA:69,3,1,4 +BRDA:75,4,0,6 +BRDA:75,4,1,0 +BRDA:76,5,0,6 +BRDA:76,5,1,4 +BRDA:79,6,0,4 +BRDA:79,6,1,2 +BRDA:91,7,0,1 +BRDA:91,7,1,18 +BRDA:91,8,0,19 +BRDA:91,8,1,1 +BRDA:113,9,0,6 +BRDA:113,9,1,0 +BRDA:127,10,0,5 +BRDA:127,10,1,1 +BRDA:130,11,0,5 +BRDA:130,11,1,1 +BRDA:130,12,0,6 +BRDA:130,12,1,5 +BRDA:130,12,2,5 +BRDA:139,13,0,2 +BRDA:139,13,1,3 +BRDA:162,14,0,1 +BRDA:162,14,1,11 +BRDA:170,15,0,1 +BRDA:170,15,1,19 +BRDA:176,16,0,2 +BRDA:176,16,1,8 +BRDA:177,17,0,2 +BRDA:177,17,1,0 +BRDA:192,18,0,1 +BRDA:192,18,1,0 +BRDA:198,19,0,2 +BRDA:198,19,1,7 +BRDA:206,20,0,2 +BRDA:206,20,1,0 +BRDA:242,21,0,0 +BRDA:242,21,1,8 +BRDA:256,22,0,8 +BRDA:256,22,1,0 +BRDA:258,23,0,8 +BRDA:258,23,1,0 +BRDA:271,24,0,4 +BRDA:271,24,1,4 +BRDA:273,25,0,4 +BRDA:273,25,1,0 +BRDA:273,26,0,4 +BRDA:273,26,1,4 +BRDA:275,27,0,0 +BRDA:275,27,1,0 +BRDA:281,28,0,1 +BRDA:281,28,1,5 +BRDA:283,29,0,1 +BRDA:283,29,1,0 +BRDA:283,30,0,1 +BRDA:283,30,1,1 +BRDA:302,31,0,35 +BRDA:305,32,0,1 +BRDA:305,32,1,34 +BRDA:305,33,0,35 +BRDA:305,33,1,8 +BRDA:315,34,0,1 +BRDA:315,34,1,34 +BRDA:319,35,0,28 +BRDA:319,35,1,7 +BRDA:323,36,0,20 +BRDA:323,36,1,15 +BRDA:323,37,0,35 +BRDA:323,37,1,20 +BRDA:329,38,0,35 +BRDA:329,38,1,9 +BRDA:331,39,0,1 +BRDA:331,39,1,1 +BRDA:331,40,0,2 +BRDA:331,40,1,2 +BRDA:341,41,0,34 +BRDA:341,41,1,1 +BRDA:341,42,0,35 +BRDA:341,42,1,9 +BRDA:350,43,0,34 +BRDA:350,43,1,1 +BRDA:358,44,0,1 +BRDA:358,44,1,34 +BRF:90 +BRH:78 +end_of_record +TN: +SF:packages/k8s/src/hooks/run-container-step.ts +FN:36,runContainerStep +FN:169,(anonymous_1) +FN:181,classifyScriptError +FN:192,(anonymous_3) +FN:234,(anonymous_4) +FN:246,createContainerSpec +FN:263,(anonymous_6) +FNF:7 +FNH:5 +FNDA:20,runContainerStep +FNDA:0,(anonymous_1) +FNDA:7,classifyScriptError +FNDA:5,(anonymous_3) +FNDA:2,(anonymous_4) +FNDA:18,createContainerSpec +FNDA:0,(anonymous_6) +DA:39,20 +DA:40,1 +DA:43,19 +DA:44,1 +DA:49,18 +DA:50,20 +DA:51,20 +DA:52,17 +DA:55,18 +DA:57,18 +DA:58,18 +DA:61,18 +DA:62,18 +DA:64,2 +DA:65,2 +DA:66,2 +DA:69,16 +DA:70,1 +DA:76,15 +DA:78,15 +DA:79,15 +DA:86,14 +DA:87,14 +DA:88,14 +DA:89,1 +DA:93,13 +DA:94,13 +DA:95,13 +DA:96,13 +DA:97,1 +DA:99,12 +DA:101,12 +DA:104,12 +DA:106,12 +DA:114,12 +DA:116,12 +DA:118,12 +DA:119,12 +DA:120,12 +DA:125,10 +DA:126,3 +DA:132,7 +DA:137,7 +DA:139,9 +DA:141,9 +DA:146,7 +DA:148,2 +DA:149,2 +DA:151,12 +DA:154,12 +DA:155,12 +DA:156,11 +DA:157,11 +DA:158,1 +DA:159,1 +DA:166,12 +DA:167,12 +DA:169,15 +DA:170,0 +DA:186,7 +DA:187,7 +DA:188,7 +DA:190,7 +DA:191,7 +DA:192,6 +DA:193,5 +DA:195,7 +DA:196,7 +DA:197,4 +DA:199,4 +DA:203,4 +DA:204,1 +DA:205,1 +DA:206,1 +DA:210,3 +DA:213,3 +DA:219,2 +DA:221,6 +DA:222,1 +DA:228,1 +DA:231,7 +DA:232,1 +DA:234,2 +DA:236,1 +DA:239,7 +DA:240,7 +DA:241,3 +DA:243,7 +DA:250,18 +DA:251,18 +DA:252,18 +DA:253,18 +DA:254,18 +DA:255,18 +DA:257,18 +DA:259,18 +DA:260,18 +DA:263,0 +DA:264,0 +DA:266,18 +DA:267,0 +DA:270,0 +LF:102 +LH:97 +BRDA:39,0,0,1 +BRDA:39,0,1,19 +BRDA:43,1,0,1 +BRDA:43,1,1,18 +BRDA:49,2,0,18 +BRDA:49,2,1,0 +BRDA:51,3,0,17 +BRDA:51,3,1,3 +BRDA:69,4,0,1 +BRDA:69,4,1,15 +BRDA:88,5,0,1 +BRDA:88,5,1,13 +BRDA:88,6,0,14 +BRDA:88,6,1,13 +BRDA:96,7,0,1 +BRDA:96,7,1,12 +BRDA:125,8,0,3 +BRDA:125,8,1,7 +BRDA:141,9,0,7 +BRDA:141,9,1,2 +BRDA:142,10,0,9 +BRDA:142,10,1,9 +BRDA:142,10,2,9 +BRDA:157,11,0,1 +BRDA:157,11,1,10 +BRDA:196,12,0,4 +BRDA:196,12,1,2 +BRDA:197,13,0,4 +BRDA:197,13,1,0 +BRDA:199,14,0,4 +BRDA:199,14,1,3 +BRDA:199,14,2,3 +BRDA:199,14,3,3 +BRDA:199,14,4,0 +BRDA:203,15,0,1 +BRDA:203,15,1,3 +BRDA:204,16,0,0 +BRDA:204,16,1,1 +BRDA:221,17,0,1 +BRDA:221,17,1,5 +BRDA:223,18,0,1 +BRDA:223,18,1,0 +BRDA:231,19,0,1 +BRDA:231,19,1,6 +BRDA:240,20,0,3 +BRDA:240,20,1,4 +BRDA:259,21,0,18 +BRDA:259,21,1,0 +BRDA:266,22,0,0 +BRDA:266,22,1,18 +BRF:50 +BRH:43 +end_of_record +TN: +SF:packages/k8s/src/hooks/run-script-step.ts +FN:16,formatScriptError +FN:26,(anonymous_1) +FN:35,runScriptStep +FNF:3 +FNH:3 +FNDA:2,formatScriptError +FNDA:2,(anonymous_1) +FNDA:10,runScriptStep +DA:17,2 +DA:18,2 +DA:22,2 +DA:23,2 +DA:24,2 +DA:26,2 +DA:28,2 +DA:30,2 +DA:31,2 +DA:32,2 +DA:40,10 +DA:41,2 +DA:47,8 +DA:48,8 +DA:56,8 +DA:57,8 +DA:58,8 +DA:59,8 +DA:61,8 +DA:70,8 +DA:76,8 +DA:93,8 +DA:94,8 +DA:100,1 +DA:101,1 +DA:102,1 +DA:106,7 +DA:107,7 +DA:108,7 +DA:109,7 +DA:114,5 +DA:115,2 +DA:118,4 +DA:119,4 +DA:123,3 +DA:125,1 +DA:126,1 +DA:128,7 +DA:129,7 +DA:131,0 +DA:135,3 +DA:136,3 +DA:139,3 +DA:145,1 +LF:44 +LH:43 +BRDA:23,0,0,2 +BRDA:23,0,1,0 +BRDA:31,1,0,2 +BRDA:31,1,1,0 +BRDA:40,2,0,2 +BRDA:40,2,1,8 +BRDA:114,3,0,2 +BRDA:114,3,1,3 +BRDA:119,4,0,3 +BRDA:119,4,1,1 +BRDA:120,5,0,4 +BRDA:120,5,1,4 +BRF:12 +BRH:10 +end_of_record +TN: +SF:packages/k8s/src/k8s/heartbeat.ts +FN:11,parsePositiveMsEnv +FN:25,constructor +FN:30,shouldLog +FN:39,stop +FN:53,start +FN:59,(anonymous_5) +FN:64,(anonymous_6) +FN:86,(anonymous_7) +FN:95,(anonymous_8) +FN:100,(anonymous_9) +FN:106,(anonymous_10) +FNF:11 +FNH:11 +FNDA:22,parsePositiveMsEnv +FNDA:20,constructor +FNDA:38,shouldLog +FNDA:21,stop +FNDA:16,start +FNDA:9,(anonymous_5) +FNDA:3,(anonymous_6) +FNDA:1,(anonymous_7) +FNDA:1,(anonymous_8) +FNDA:1,(anonymous_9) +FNDA:21,(anonymous_10) +DA:15,22 +DA:16,22 +DA:20,20 +DA:21,20 +DA:22,20 +DA:23,2 +DA:26,20 +DA:27,20 +DA:31,38 +DA:32,38 +DA:33,8 +DA:34,8 +DA:36,30 +DA:40,21 +DA:41,8 +DA:43,21 +DA:44,9 +DA:45,9 +DA:47,21 +DA:48,6 +DA:49,6 +DA:54,16 +DA:57,16 +DA:59,16 +DA:60,9 +DA:61,1 +DA:62,1 +DA:64,9 +DA:65,3 +DA:68,3 +DA:69,3 +DA:70,3 +DA:74,3 +DA:84,16 +DA:86,16 +DA:87,1 +DA:88,0 +DA:90,1 +DA:91,1 +DA:95,16 +DA:96,1 +DA:97,1 +DA:100,16 +DA:101,1 +DA:102,1 +DA:106,16 +DA:107,21 +DA:109,4 +DA:111,17 +DA:112,16 +DA:113,16 +DA:114,16 +DA:115,8 +DA:116,8 +DA:118,15 +DA:119,0 +DA:122,1 +DA:123,1 +DA:127,1 +DA:128,0 +DA:132,1 +LF:61 +LH:58 +BRDA:15,0,0,22 +BRDA:15,0,1,15 +BRDA:16,1,0,3 +BRDA:16,1,1,19 +BRDA:16,2,0,22 +BRDA:16,2,1,5 +BRDA:32,3,0,8 +BRDA:32,3,1,30 +BRDA:40,4,0,8 +BRDA:40,4,1,13 +BRDA:43,5,0,9 +BRDA:43,5,1,12 +BRDA:47,6,0,6 +BRDA:47,6,1,15 +BRDA:60,7,0,1 +BRDA:60,7,1,8 +BRDA:87,8,0,0 +BRDA:87,8,1,1 +BRDA:90,9,0,1 +BRDA:90,9,1,0 +BRDA:107,10,0,4 +BRDA:107,10,1,17 +BRDA:111,11,0,16 +BRDA:111,11,1,1 +BRDA:114,12,0,8 +BRDA:114,12,1,8 +BRDA:118,13,0,0 +BRDA:118,13,1,15 +BRDA:127,14,0,0 +BRDA:127,14,1,1 +BRF:30 +BRH:26 +end_of_record +TN: +SF:packages/k8s/src/k8s/index.ts +FN:69,createJobPod +FN:189,createContainerStepPod +FN:242,deletePod +FN:250,execPodStep +FN:278,(anonymous_4) +FN:292,(anonymous_5) +FN:300,(anonymous_6) +FN:306,(anonymous_7) +FN:307,(anonymous_8) +FN:314,(anonymous_9) +FN:337,(anonymous_10) +FN:346,(anonymous_11) +FN:353,(anonymous_12) +FN:354,(anonymous_13) +FN:361,(anonymous_14) +FN:379,execPodStepWithOutput +FN:391,(anonymous_16) +FN:399,(anonymous_17) +FN:407,(anonymous_18) +FN:414,(anonymous_19) +FN:426,write +FN:437,write_2 +FN:451,(anonymous_22) +FN:456,(anonymous_23) +FN:466,(anonymous_24) +FN:485,(anonymous_25) +FN:503,execCalculateOutputHashSorted +FN:512,write_3 +FN:522,(anonymous_28) +FN:532,(anonymous_29) +FN:548,(anonymous_30) +FN:556,(anonymous_31) +FN:565,localCalculateOutputHashSorted +FN:568,(anonymous_33) +FN:575,(anonymous_34) +FN:579,(anonymous_35) +FN:584,(anonymous_36) +FN:599,execCpToPod +FN:622,(anonymous_38) +FN:633,(anonymous_39) +FN:644,(anonymous_40) +FN:685,(anonymous_41) +FN:688,(anonymous_42) +FN:690,(anonymous_43) +FN:693,(anonymous_44) +FN:697,(anonymous_45) +FN:701,(anonymous_46) +FN:720,execCpFromPod +FN:756,(anonymous_48) +FN:773,(anonymous_49) +FN:783,(anonymous_50) +FN:824,(anonymous_51) +FN:827,(anonymous_52) +FN:829,(anonymous_53) +FN:832,(anonymous_54) +FN:836,(anonymous_55) +FN:840,(anonymous_56) +FN:859,waitForJobToComplete +FN:873,createDockerSecret +FN:914,createSecretForEnvs +FN:942,deleteSecret +FN:949,pruneSecrets +FN:960,(anonymous_62) +FN:1052,getUnrecoverableWaitingReasons +FN:1070,getUnrecoverableEventReasons +FN:1085,getUnrecoverableTerminatedReasons +FN:1107,isPermanentSchedulingFailure +FN:1111,(anonymous_67) +FN:1123,getPermanentSchedulingPatterns +FN:1146,getWaitingReasonHint +FN:1165,getContainerErrors +FN:1184,getTerminatedReasonHint +FN:1211,getContainerTerminatedErrors +FN:1230,getEventReasonHint +FN:1266,getPodEventErrors +FN:1331,describePodFailure +FN:1412,describePodWarningEvents +FN:1429,(anonymous_77) +FN:1434,(anonymous_78) +FN:1438,(anonymous_79) +FN:1441,(anonymous_80) +FN:1459,getPodConditionErrors +FN:1469,checkUnrecoverableErrors +FN:1482,(anonymous_83) +FN:1484,(anonymous_84) +FN:1496,waitForPodPhases +FN:1576,getPrepareJobTimeoutSeconds +FN:1595,readPod +FN:1610,parsePodPhase +FN:1617,isJobSucceeded +FN:1628,getPodLogs +FN:1634,(anonymous_91) +FN:1644,(anonymous_92) +FN:1645,(anonymous_93) +FN:1646,(anonymous_94) +FN:1653,prunePods +FN:1664,(anonymous_96) +FN:1669,getPodStatus +FN:1679,isAuthPermissionsOK +FN:1697,(anonymous_99) +FN:1700,isPodContainerAlpine +FN:1722,namespace +FN:1727,(anonymous_102) +FN:1753,constructor +FN:1759,backOff +FN:1760,(anonymous_105) +FN:1776,containerPorts +FN:1798,(anonymous_107) +FN:1818,getPodByName +FN:1825,getSecretByName +FN:1832,listPodsByRunnerInstance +FNF:111 +FNH:80 +FNDA:5,createJobPod +FNDA:1,createContainerStepPod +FNDA:3,deletePod +FNDA:7,execPodStep +FNDA:7,(anonymous_4) +FNDA:6,(anonymous_5) +FNDA:6,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:6,(anonymous_10) +FNDA:5,(anonymous_11) +FNDA:2,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:1,(anonymous_14) +FNDA:5,execPodStepWithOutput +FNDA:2,(anonymous_16) +FNDA:1,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:5,(anonymous_19) +FNDA:1,write +FNDA:0,write_2 +FNDA:4,(anonymous_22) +FNDA:5,(anonymous_23) +FNDA:3,(anonymous_24) +FNDA:2,(anonymous_25) +FNDA:3,execCalculateOutputHashSorted +FNDA:2,write_3 +FNDA:3,(anonymous_28) +FNDA:2,(anonymous_29) +FNDA:1,(anonymous_30) +FNDA:4,(anonymous_31) +FNDA:2,localCalculateOutputHashSorted +FNDA:2,(anonymous_33) +FNDA:1,(anonymous_34) +FNDA:2,(anonymous_35) +FNDA:2,(anonymous_36) +FNDA:0,execCpToPod +FNDA:0,(anonymous_38) +FNDA:0,(anonymous_39) +FNDA:0,(anonymous_40) +FNDA:0,(anonymous_41) +FNDA:0,(anonymous_42) +FNDA:0,(anonymous_43) +FNDA:0,(anonymous_44) +FNDA:0,(anonymous_45) +FNDA:0,(anonymous_46) +FNDA:0,execCpFromPod +FNDA:0,(anonymous_48) +FNDA:0,(anonymous_49) +FNDA:0,(anonymous_50) +FNDA:0,(anonymous_51) +FNDA:0,(anonymous_52) +FNDA:0,(anonymous_53) +FNDA:0,(anonymous_54) +FNDA:0,(anonymous_55) +FNDA:0,(anonymous_56) +FNDA:2,waitForJobToComplete +FNDA:2,createDockerSecret +FNDA:2,createSecretForEnvs +FNDA:3,deleteSecret +FNDA:2,pruneSecrets +FNDA:3,(anonymous_62) +FNDA:28,getUnrecoverableWaitingReasons +FNDA:21,getUnrecoverableEventReasons +FNDA:20,getUnrecoverableTerminatedReasons +FNDA:11,isPermanentSchedulingFailure +FNDA:26,(anonymous_67) +FNDA:15,getPermanentSchedulingPatterns +FNDA:10,getWaitingReasonHint +FNDA:20,getContainerErrors +FNDA:14,getTerminatedReasonHint +FNDA:18,getContainerTerminatedErrors +FNDA:10,getEventReasonHint +FNDA:19,getPodEventErrors +FNDA:7,describePodFailure +FNDA:6,describePodWarningEvents +FNDA:3,(anonymous_77) +FNDA:0,(anonymous_78) +FNDA:0,(anonymous_79) +FNDA:3,(anonymous_80) +FNDA:9,getPodConditionErrors +FNDA:8,checkUnrecoverableErrors +FNDA:0,(anonymous_83) +FNDA:0,(anonymous_84) +FNDA:6,waitForPodPhases +FNDA:4,getPrepareJobTimeoutSeconds +FNDA:15,readPod +FNDA:13,parsePodPhase +FNDA:2,isJobSucceeded +FNDA:2,getPodLogs +FNDA:0,(anonymous_91) +FNDA:2,(anonymous_92) +FNDA:1,(anonymous_93) +FNDA:1,(anonymous_94) +FNDA:2,prunePods +FNDA:2,(anonymous_96) +FNDA:1,getPodStatus +FNDA:2,isAuthPermissionsOK +FNDA:14,(anonymous_99) +FNDA:2,isPodContainerAlpine +FNDA:117,namespace +FNDA:1,(anonymous_102) +FNDA:8,constructor +FNDA:2,backOff +FNDA:2,(anonymous_105) +FNDA:12,containerPorts +FNDA:13,(anonymous_107) +FNDA:2,getPodByName +FNDA:2,getSecretByName +FNDA:3,listPodsByRunnerInstance +DA:32,1 +DA:34,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:40,1 +DA:42,1 +DA:76,5 +DA:77,5 +DA:78,4 +DA:80,5 +DA:81,1 +DA:84,5 +DA:86,5 +DA:87,5 +DA:89,5 +DA:90,5 +DA:92,5 +DA:93,5 +DA:96,5 +DA:98,5 +DA:99,5 +DA:100,5 +DA:106,5 +DA:107,5 +DA:109,5 +DA:116,5 +DA:117,5 +DA:120,5 +DA:148,5 +DA:150,5 +DA:165,5 +DA:166,0 +DA:167,0 +DA:168,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:175,5 +DA:176,1 +DA:179,5 +DA:180,1 +DA:183,5 +DA:194,1 +DA:196,1 +DA:197,1 +DA:199,1 +DA:200,1 +DA:202,1 +DA:203,1 +DA:206,1 +DA:208,1 +DA:209,1 +DA:211,1 +DA:213,1 +DA:228,1 +DA:229,0 +DA:232,1 +DA:233,0 +DA:236,1 +DA:243,3 +DA:256,7 +DA:257,7 +DA:261,7 +DA:263,7 +DA:264,7 +DA:268,7 +DA:272,7 +DA:276,7 +DA:278,7 +DA:279,7 +DA:280,7 +DA:282,7 +DA:293,6 +DA:297,6 +DA:300,6 +DA:301,6 +DA:302,6 +DA:306,0 +DA:307,0 +DA:308,0 +DA:311,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:319,0 +DA:324,6 +DA:325,3 +DA:326,3 +DA:327,3 +DA:329,3 +DA:332,3 +DA:333,3 +DA:338,6 +DA:339,6 +DA:340,6 +DA:341,4 +DA:343,2 +DA:347,5 +DA:348,5 +DA:351,5 +DA:352,5 +DA:353,2 +DA:354,2 +DA:355,0 +DA:358,0 +DA:361,2 +DA:362,1 +DA:363,1 +DA:365,2 +DA:369,4 +DA:386,5 +DA:387,5 +DA:390,5 +DA:391,5 +DA:392,2 +DA:393,2 +DA:394,2 +DA:398,5 +DA:399,5 +DA:400,1 +DA:401,1 +DA:402,1 +DA:403,2 +DA:406,5 +DA:407,5 +DA:408,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:414,5 +DA:415,5 +DA:416,0 +DA:417,0 +DA:419,5 +DA:420,0 +DA:421,0 +DA:425,5 +DA:427,1 +DA:428,1 +DA:429,1 +DA:430,1 +DA:432,0 +DA:436,5 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:443,0 +DA:451,5 +DA:452,4 +DA:453,4 +DA:456,5 +DA:457,5 +DA:468,3 +DA:469,3 +DA:470,3 +DA:471,1 +DA:476,2 +DA:477,2 +DA:478,1 +DA:480,1 +DA:491,2 +DA:492,2 +DA:493,2 +DA:494,2 +DA:495,1 +DA:497,1 +DA:508,3 +DA:510,3 +DA:511,3 +DA:513,2 +DA:514,2 +DA:515,2 +DA:517,0 +DA:522,3 +DA:523,3 +DA:534,2 +DA:535,2 +DA:536,1 +DA:538,1 +DA:544,1 +DA:548,1 +DA:551,1 +DA:554,1 +DA:556,4 +DA:558,1 +DA:560,1 +DA:561,1 +DA:562,1 +DA:568,2 +DA:570,2 +DA:574,2 +DA:575,2 +DA:576,1 +DA:578,2 +DA:579,2 +DA:580,2 +DA:582,1 +DA:584,2 +DA:586,1 +DA:588,1 +DA:589,1 +DA:590,1 +DA:592,1 +DA:604,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:612,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:634,0 +DA:635,0 +DA:641,0 +DA:644,0 +DA:646,0 +DA:648,0 +DA:649,0 +DA:650,0 +DA:651,0 +DA:655,0 +DA:659,0 +DA:660,0 +DA:661,0 +DA:662,0 +DA:664,0 +DA:671,0 +DA:677,0 +DA:678,0 +DA:681,0 +DA:684,0 +DA:685,0 +DA:687,0 +DA:688,0 +DA:690,0 +DA:691,0 +DA:693,0 +DA:694,0 +DA:696,0 +DA:698,0 +DA:699,0 +DA:702,0 +DA:703,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:708,0 +DA:709,0 +DA:712,0 +DA:714,0 +DA:715,0 +DA:725,0 +DA:726,0 +DA:734,0 +DA:735,0 +DA:738,0 +DA:739,0 +DA:740,0 +DA:742,0 +DA:743,0 +DA:744,0 +DA:745,0 +DA:753,0 +DA:754,0 +DA:756,0 +DA:761,0 +DA:762,0 +DA:763,0 +DA:774,0 +DA:775,0 +DA:783,0 +DA:785,0 +DA:787,0 +DA:788,0 +DA:789,0 +DA:790,0 +DA:794,0 +DA:798,0 +DA:799,0 +DA:800,0 +DA:801,0 +DA:803,0 +DA:810,0 +DA:816,0 +DA:817,0 +DA:820,0 +DA:823,0 +DA:824,0 +DA:826,0 +DA:827,0 +DA:829,0 +DA:830,0 +DA:832,0 +DA:833,0 +DA:835,0 +DA:837,0 +DA:838,0 +DA:841,0 +DA:842,0 +DA:844,0 +DA:845,0 +DA:846,0 +DA:847,0 +DA:848,0 +DA:851,0 +DA:853,0 +DA:854,0 +DA:860,2 +DA:861,2 +DA:862,2 +DA:863,2 +DA:864,1 +DA:867,1 +DA:869,0 +DA:876,2 +DA:888,2 +DA:890,2 +DA:891,2 +DA:892,2 +DA:893,2 +DA:894,2 +DA:895,2 +DA:896,2 +DA:897,2 +DA:900,2 +DA:901,2 +DA:902,2 +DA:908,2 +DA:917,2 +DA:919,2 +DA:920,2 +DA:921,2 +DA:922,2 +DA:923,2 +DA:924,2 +DA:926,2 +DA:929,2 +DA:930,2 +DA:931,2 +DA:932,2 +DA:935,2 +DA:939,2 +DA:943,3 +DA:950,2 +DA:954,2 +DA:955,1 +DA:958,1 +DA:961,3 +DA:966,1 +DA:1001,1 +DA:1024,1 +DA:1038,1 +DA:1046,1 +DA:1053,28 +DA:1054,28 +DA:1055,26 +DA:1057,2 +DA:1058,2 +DA:1059,2 +DA:1060,2 +DA:1061,2 +DA:1064,2 +DA:1071,21 +DA:1072,21 +DA:1073,20 +DA:1075,1 +DA:1076,1 +DA:1077,1 +DA:1078,1 +DA:1079,1 +DA:1082,1 +DA:1087,20 +DA:1088,20 +DA:1089,19 +DA:1091,1 +DA:1092,1 +DA:1093,3 +DA:1094,3 +DA:1095,1 +DA:1098,1 +DA:1110,11 +DA:1111,26 +DA:1124,15 +DA:1125,15 +DA:1126,5 +DA:1127,1 +DA:1129,4 +DA:1130,4 +DA:1131,8 +DA:1132,8 +DA:1133,5 +DA:1134,5 +DA:1136,1 +DA:1141,4 +DA:1142,4 +DA:1143,4 +DA:1147,10 +DA:1149,5 +DA:1157,2 +DA:1159,2 +DA:1161,1 +DA:1166,20 +DA:1167,20 +DA:1168,20 +DA:1172,20 +DA:1173,13 +DA:1174,13 +DA:1175,10 +DA:1176,10 +DA:1177,10 +DA:1178,10 +DA:1181,20 +DA:1188,14 +DA:1189,5 +DA:1191,9 +DA:1192,2 +DA:1194,7 +DA:1195,6 +DA:1197,1 +DA:1199,0 +DA:1201,1 +DA:1203,1 +DA:1205,3 +DA:1208,1 +DA:1212,18 +DA:1213,18 +DA:1214,18 +DA:1218,18 +DA:1219,11 +DA:1220,11 +DA:1221,7 +DA:1222,7 +DA:1223,7 +DA:1224,7 +DA:1227,18 +DA:1231,10 +DA:1233,7 +DA:1240,1 +DA:1247,2 +DA:1254,0 +DA:1267,19 +DA:1268,19 +DA:1269,0 +DA:1273,19 +DA:1274,19 +DA:1278,18 +DA:1280,1 +DA:1285,1 +DA:1288,18 +DA:1289,18 +DA:1290,18 +DA:1291,14 +DA:1296,1 +DA:1301,13 +DA:1305,2 +DA:1310,2 +DA:1312,11 +DA:1313,1 +DA:1315,10 +DA:1316,10 +DA:1317,14 +DA:1318,14 +DA:1319,14 +DA:1320,14 +DA:1322,18 +DA:1333,7 +DA:1334,7 +DA:1336,1 +DA:1341,6 +DA:1342,6 +DA:1345,6 +DA:1346,6 +DA:1349,7 +DA:1350,7 +DA:1351,0 +DA:1355,6 +DA:1356,0 +DA:1357,0 +DA:1358,0 +DA:1359,0 +DA:1362,6 +DA:1365,6 +DA:1366,6 +DA:1370,7 +DA:1371,7 +DA:1372,2 +DA:1373,2 +DA:1376,1 +DA:1377,0 +DA:1378,0 +DA:1383,2 +DA:1385,2 +DA:1386,1 +DA:1387,1 +DA:1388,1 +DA:1393,6 +DA:1394,1 +DA:1398,6 +DA:1399,6 +DA:1400,3 +DA:1403,6 +DA:1404,0 +DA:1406,6 +DA:1414,6 +DA:1415,6 +DA:1419,6 +DA:1421,0 +DA:1426,0 +DA:1429,6 +DA:1430,6 +DA:1431,3 +DA:1434,3 +DA:1435,0 +DA:1436,0 +DA:1438,3 +DA:1440,3 +DA:1441,3 +DA:1442,3 +DA:1443,3 +DA:1445,3 +DA:1446,0 +DA:1450,3 +DA:1460,9 +DA:1474,8 +DA:1476,8 +DA:1478,8 +DA:1482,8 +DA:1484,0 +DA:1485,0 +DA:1488,8 +DA:1502,6 +DA:1503,6 +DA:1504,6 +DA:1506,8 +DA:1507,8 +DA:1512,2 +DA:1517,2 +DA:1518,2 +DA:1520,0 +DA:1526,2 +DA:1528,6 +DA:1529,6 +DA:1530,2 +DA:1538,4 +DA:1539,1 +DA:1540,1 +DA:1541,1 +DA:1542,0 +DA:1546,1 +DA:1554,3 +DA:1555,3 +DA:1556,3 +DA:1557,3 +DA:1562,0 +DA:1563,0 +DA:1568,0 +DA:1569,0 +DA:1578,4 +DA:1580,4 +DA:1581,1 +DA:1584,3 +DA:1585,3 +DA:1586,2 +DA:1589,2 +DA:1592,1 +DA:1596,15 +DA:1602,1 +DA:1611,13 +DA:1612,3 +DA:1614,10 +DA:1618,2 +DA:1622,2 +DA:1623,1 +DA:1625,1 +DA:1632,2 +DA:1633,2 +DA:1634,2 +DA:1636,0 +DA:1639,2 +DA:1644,2 +DA:1645,2 +DA:1646,2 +DA:1647,1 +DA:1648,1 +DA:1654,2 +DA:1658,2 +DA:1659,1 +DA:1662,1 +DA:1664,2 +DA:1672,1 +DA:1676,1 +DA:1680,2 +DA:1681,2 +DA:1682,2 +DA:1683,8 +DA:1684,26 +DA:1685,26 +DA:1686,26 +DA:1687,26 +DA:1688,26 +DA:1689,26 +DA:1690,26 +DA:1691,26 +DA:1696,2 +DA:1697,14 +DA:1704,2 +DA:1705,2 +DA:1706,2 +DA:1716,1 +DA:1719,2 +DA:1723,117 +DA:1724,116 +DA:1727,1 +DA:1728,1 +DA:1729,1 +DA:1735,0 +DA:1736,0 +DA:1737,0 +DA:1738,0 +DA:1739,0 +DA:1745,0 +DA:1751,8 +DA:1752,8 +DA:1753,8 +DA:1754,8 +DA:1755,2 +DA:1760,2 +DA:1761,2 +DA:1763,2 +DA:1764,2 +DA:1765,0 +DA:1767,2 +DA:1768,2 +DA:1770,2 +DA:1771,0 +DA:1779,12 +DA:1780,12 +DA:1781,2 +DA:1783,10 +DA:1784,11 +DA:1785,11 +DA:1786,1 +DA:1789,10 +DA:1790,10 +DA:1793,11 +DA:1794,11 +DA:1795,1 +DA:1798,9 +DA:1799,13 +DA:1800,13 +DA:1801,3 +DA:1803,10 +DA:1806,9 +DA:1807,5 +DA:1809,4 +DA:1810,4 +DA:1813,6 +DA:1815,5 +DA:1819,2 +DA:1826,2 +DA:1833,3 +DA:1837,2 +LF:667 +LH:493 +BRDA:77,0,0,4 +BRDA:77,0,1,1 +BRDA:80,1,0,1 +BRDA:80,1,1,4 +BRDA:107,2,0,5 +BRDA:107,2,1,0 +BRDA:116,3,0,5 +BRDA:116,3,1,0 +BRDA:124,4,0,5 +BRDA:124,4,1,5 +BRDA:165,5,0,0 +BRDA:165,5,1,5 +BRDA:167,6,0,0 +BRDA:167,6,1,0 +BRDA:175,7,0,1 +BRDA:175,7,1,4 +BRDA:179,8,0,1 +BRDA:179,8,1,4 +BRDA:228,9,0,0 +BRDA:228,9,1,1 +BRDA:232,10,0,0 +BRDA:232,10,1,1 +BRDA:290,11,0,7 +BRDA:290,11,1,7 +BRDA:302,12,0,0 +BRDA:302,12,1,6 +BRDA:303,13,0,6 +BRDA:303,13,1,0 +BRDA:303,13,2,0 +BRDA:324,14,0,3 +BRDA:324,14,1,3 +BRDA:327,15,0,3 +BRDA:327,15,1,2 +BRDA:333,16,0,3 +BRDA:333,16,1,0 +BRDA:340,17,0,4 +BRDA:340,17,1,2 +BRDA:352,18,0,2 +BRDA:352,18,1,3 +BRDA:352,19,0,5 +BRDA:352,19,1,4 +BRDA:352,19,2,2 +BRDA:383,20,0,5 +BRDA:392,21,0,0 +BRDA:392,21,1,2 +BRDA:394,22,0,0 +BRDA:394,22,1,2 +BRDA:402,23,0,1 +BRDA:402,23,1,0 +BRDA:410,24,0,0 +BRDA:410,24,1,0 +BRDA:415,25,0,0 +BRDA:415,25,1,5 +BRDA:419,26,0,0 +BRDA:419,26,1,5 +BRDA:453,27,0,2 +BRDA:453,27,1,2 +BRDA:465,28,0,5 +BRDA:465,28,1,5 +BRDA:470,29,0,1 +BRDA:470,29,1,2 +BRDA:471,30,0,1 +BRDA:471,30,1,1 +BRDA:477,31,0,1 +BRDA:477,31,1,1 +BRDA:480,32,0,1 +BRDA:480,32,1,0 +BRDA:492,33,0,2 +BRDA:492,33,1,0 +BRDA:494,34,0,1 +BRDA:494,34,1,1 +BRDA:535,35,0,1 +BRDA:535,35,1,1 +BRDA:544,36,0,1 +BRDA:544,36,1,0 +BRDA:580,37,0,1 +BRDA:580,37,1,1 +BRDA:634,38,0,0 +BRDA:634,38,1,0 +BRDA:650,39,0,0 +BRDA:650,39,1,0 +BRDA:677,40,0,0 +BRDA:677,40,1,0 +BRDA:699,41,0,0 +BRDA:699,41,1,0 +BRDA:734,42,0,0 +BRDA:734,42,1,0 +BRDA:750,43,0,0 +BRDA:750,43,1,0 +BRDA:774,44,0,0 +BRDA:774,44,1,0 +BRDA:789,45,0,0 +BRDA:789,45,1,0 +BRDA:816,46,0,0 +BRDA:816,46,1,0 +BRDA:838,47,0,0 +BRDA:838,47,1,0 +BRDA:863,48,0,1 +BRDA:863,48,1,1 +BRDA:878,49,0,2 +BRDA:878,49,1,1 +BRDA:954,50,0,1 +BRDA:954,50,1,1 +BRDA:961,51,0,3 +BRDA:961,51,1,2 +BRDA:1054,52,0,26 +BRDA:1054,52,1,2 +BRDA:1060,53,0,2 +BRDA:1060,53,1,0 +BRDA:1072,54,0,20 +BRDA:1072,54,1,1 +BRDA:1078,55,0,1 +BRDA:1078,55,1,0 +BRDA:1088,56,0,19 +BRDA:1088,56,1,1 +BRDA:1094,57,0,1 +BRDA:1094,57,1,2 +BRDA:1110,58,0,2 +BRDA:1110,58,1,9 +BRDA:1125,59,0,10 +BRDA:1125,59,1,5 +BRDA:1126,60,0,1 +BRDA:1126,60,1,4 +BRDA:1126,61,0,5 +BRDA:1126,61,1,4 +BRDA:1132,62,0,3 +BRDA:1132,62,1,5 +BRDA:1147,63,0,5 +BRDA:1147,63,1,2 +BRDA:1147,63,2,2 +BRDA:1147,63,3,1 +BRDA:1169,64,0,20 +BRDA:1169,64,1,19 +BRDA:1170,65,0,20 +BRDA:1170,65,1,8 +BRDA:1174,66,0,10 +BRDA:1174,66,1,3 +BRDA:1174,67,0,13 +BRDA:1174,67,1,12 +BRDA:1176,68,0,2 +BRDA:1176,68,1,8 +BRDA:1188,69,0,5 +BRDA:1188,69,1,9 +BRDA:1191,70,0,2 +BRDA:1191,70,1,7 +BRDA:1194,71,0,6 +BRDA:1194,71,1,1 +BRDA:1195,72,0,1 +BRDA:1195,72,1,0 +BRDA:1195,72,2,1 +BRDA:1195,72,3,1 +BRDA:1195,72,4,3 +BRDA:1205,73,0,3 +BRDA:1205,73,1,0 +BRDA:1215,74,0,18 +BRDA:1215,74,1,17 +BRDA:1216,75,0,18 +BRDA:1216,75,1,8 +BRDA:1220,76,0,7 +BRDA:1220,76,1,4 +BRDA:1220,77,0,11 +BRDA:1220,77,1,8 +BRDA:1222,78,0,0 +BRDA:1222,78,1,7 +BRDA:1231,79,0,7 +BRDA:1231,79,1,1 +BRDA:1231,79,2,2 +BRDA:1231,79,3,0 +BRDA:1268,80,0,0 +BRDA:1268,80,1,19 +BRDA:1278,81,0,18 +BRDA:1278,81,1,0 +BRDA:1282,82,0,1 +BRDA:1282,82,1,0 +BRDA:1291,83,0,1 +BRDA:1291,83,1,13 +BRDA:1292,84,0,14 +BRDA:1292,84,1,13 +BRDA:1292,84,2,13 +BRDA:1301,85,0,2 +BRDA:1301,85,1,11 +BRDA:1302,86,0,13 +BRDA:1302,86,1,4 +BRDA:1307,87,0,2 +BRDA:1307,87,1,0 +BRDA:1312,88,0,1 +BRDA:1312,88,1,10 +BRDA:1316,89,0,1 +BRDA:1316,89,1,9 +BRDA:1316,90,0,10 +BRDA:1316,90,1,1 +BRDA:1318,91,0,10 +BRDA:1318,91,1,0 +BRDA:1337,92,0,1 +BRDA:1337,92,1,0 +BRDA:1346,93,0,6 +BRDA:1346,93,1,0 +BRDA:1347,94,0,0 +BRDA:1347,94,1,6 +BRDA:1350,95,0,0 +BRDA:1350,95,1,7 +BRDA:1355,96,0,6 +BRDA:1355,96,1,6 +BRDA:1356,97,0,0 +BRDA:1356,97,1,0 +BRDA:1357,98,0,0 +BRDA:1357,98,1,0 +BRDA:1358,99,0,0 +BRDA:1358,99,1,0 +BRDA:1367,100,0,6 +BRDA:1367,100,1,6 +BRDA:1368,101,0,7 +BRDA:1368,101,1,4 +BRDA:1373,102,0,1 +BRDA:1373,102,1,1 +BRDA:1376,103,0,0 +BRDA:1376,103,1,1 +BRDA:1377,104,0,0 +BRDA:1377,104,1,0 +BRDA:1385,105,0,1 +BRDA:1385,105,1,1 +BRDA:1385,106,0,2 +BRDA:1385,106,1,1 +BRDA:1386,107,0,1 +BRDA:1386,107,1,0 +BRDA:1387,108,0,0 +BRDA:1387,108,1,1 +BRDA:1393,109,0,1 +BRDA:1393,109,1,5 +BRDA:1399,110,0,3 +BRDA:1399,110,1,3 +BRDA:1403,111,0,0 +BRDA:1403,111,1,6 +BRDA:1419,112,0,6 +BRDA:1419,112,1,0 +BRDA:1423,113,0,0 +BRDA:1423,113,1,0 +BRDA:1430,114,0,3 +BRDA:1430,114,1,3 +BRDA:1435,115,0,0 +BRDA:1435,115,1,0 +BRDA:1435,115,2,0 +BRDA:1436,116,0,0 +BRDA:1436,116,1,0 +BRDA:1442,117,0,0 +BRDA:1442,117,1,3 +BRDA:1442,118,0,3 +BRDA:1442,118,1,0 +BRDA:1443,119,0,3 +BRDA:1443,119,1,0 +BRDA:1443,120,0,3 +BRDA:1443,120,1,0 +BRDA:1445,121,0,0 +BRDA:1445,121,1,3 +BRDA:1485,122,0,0 +BRDA:1485,122,1,0 +BRDA:1500,123,0,6 +BRDA:1514,124,0,2 +BRDA:1514,124,1,0 +BRDA:1522,125,0,0 +BRDA:1522,125,1,0 +BRDA:1529,126,0,2 +BRDA:1529,126,1,4 +BRDA:1538,127,0,1 +BRDA:1538,127,1,3 +BRDA:1541,128,0,0 +BRDA:1541,128,1,1 +BRDA:1555,129,0,3 +BRDA:1555,129,1,0 +BRDA:1580,130,0,1 +BRDA:1580,130,1,3 +BRDA:1585,131,0,2 +BRDA:1585,131,1,1 +BRDA:1585,132,0,3 +BRDA:1585,132,1,1 +BRDA:1611,133,0,3 +BRDA:1611,133,1,10 +BRDA:1611,134,0,13 +BRDA:1611,134,1,11 +BRDA:1622,135,0,1 +BRDA:1622,135,1,1 +BRDA:1658,136,0,1 +BRDA:1658,136,1,1 +BRDA:1664,137,0,2 +BRDA:1664,137,1,2 +BRDA:1723,138,0,116 +BRDA:1723,138,1,1 +BRDA:1728,139,0,1 +BRDA:1728,139,1,0 +BRDA:1738,140,0,0 +BRDA:1738,140,1,0 +BRDA:1754,141,0,2 +BRDA:1754,141,1,6 +BRDA:1754,142,0,8 +BRDA:1754,142,1,6 +BRDA:1764,143,0,0 +BRDA:1764,143,1,2 +BRDA:1764,144,0,2 +BRDA:1764,144,1,2 +BRDA:1767,145,0,2 +BRDA:1767,145,1,0 +BRDA:1770,146,0,0 +BRDA:1770,146,1,2 +BRDA:1780,147,0,2 +BRDA:1780,147,1,10 +BRDA:1785,148,0,1 +BRDA:1785,148,1,10 +BRDA:1791,149,0,3 +BRDA:1791,149,1,7 +BRDA:1794,150,0,1 +BRDA:1794,150,1,10 +BRDA:1800,151,0,3 +BRDA:1800,151,1,10 +BRDA:1800,152,0,13 +BRDA:1800,152,1,12 +BRDA:1800,152,2,11 +BRDA:1806,153,0,5 +BRDA:1806,153,1,4 +BRDA:1837,154,0,2 +BRDA:1837,154,1,0 +BRF:320 +BRH:225 +end_of_record +TN: +SF:packages/k8s/src/k8s/utils/index.ts +FN:35,prepareJobScript +FN:40,(anonymous_1) +FN:59,writeRunScript +FN:94,writeContainerStepScript +FN:129,scriptEnv +FN:161,generateContainerName +FN:180,mergeContainerWithOptions +FN:208,mergePodSpecWithOptions +FN:215,(anonymous_8) +FN:228,mergeObjectMeta +FN:258,readExtensionFromFile +FN:270,useKubeScheduler +FN:274,(anonymous_12) +FN:283,mergeLists +FN:292,fixArgs +FN:301,sleep +FN:302,(anonymous_16) +FN:305,listDirAllCommand +FN:315,formatError +FNF:19 +FNH:19 +FNDA:5,prepareJobScript +FNDA:5,(anonymous_1) +FNDA:16,writeRunScript +FNDA:3,writeContainerStepScript +FNDA:19,scriptEnv +FNDA:18,generateContainerName +FNDA:5,mergeContainerWithOptions +FNDA:2,mergePodSpecWithOptions +FNDA:1,(anonymous_8) +FNDA:6,mergeObjectMeta +FNDA:42,readExtensionFromFile +FNDA:3,useKubeScheduler +FNDA:7,(anonymous_12) +FNDA:6,mergeLists +FNDA:35,fixArgs +FNDA:1,sleep +FNDA:1,(anonymous_16) +FNDA:2,listDirAllCommand +FNDA:39,formatError +DA:10,7 +DA:11,7 +DA:13,7 +DA:14,7 +DA:16,7 +DA:17,7 +DA:18,7 +DA:20,7 +DA:39,5 +DA:40,5 +DA:43,5 +DA:50,5 +DA:51,5 +DA:52,5 +DA:53,5 +DA:66,16 +DA:67,16 +DA:70,2 +DA:71,2 +DA:74,16 +DA:76,16 +DA:85,16 +DA:86,16 +DA:87,16 +DA:88,16 +DA:101,3 +DA:103,3 +DA:104,3 +DA:105,1 +DA:108,1 +DA:119,3 +DA:120,3 +DA:121,3 +DA:122,3 +DA:123,3 +DA:130,19 +DA:131,7 +DA:133,12 +DA:134,12 +DA:135,14 +DA:141,3 +DA:145,11 +DA:154,9 +DA:155,0 +DA:158,9 +DA:162,18 +DA:163,18 +DA:165,18 +DA:166,2 +DA:169,16 +DA:184,5 +DA:185,9 +DA:186,2 +DA:187,0 +DA:189,2 +DA:190,7 +DA:191,1 +DA:192,1 +DA:193,6 +DA:194,2 +DA:195,2 +DA:196,4 +DA:197,1 +DA:198,1 +DA:199,3 +DA:200,2 +DA:201,2 +DA:203,1 +DA:212,2 +DA:213,5 +DA:214,2 +DA:216,1 +DA:219,3 +DA:220,1 +DA:221,1 +DA:223,2 +DA:232,6 +DA:233,2 +DA:237,4 +DA:238,3 +DA:239,3 +DA:240,1 +DA:242,3 +DA:246,4 +DA:247,3 +DA:248,3 +DA:249,1 +DA:253,3 +DA:259,42 +DA:260,42 +DA:261,38 +DA:263,4 +DA:264,4 +DA:265,1 +DA:267,1 +DA:271,3 +DA:274,7 +DA:275,7 +DA:276,7 +DA:277,7 +DA:278,7 +DA:279,7 +DA:280,7 +DA:284,6 +DA:285,6 +DA:286,1 +DA:288,5 +DA:289,5 +DA:295,35 +DA:296,8 +DA:298,27 +DA:302,1 +DA:306,2 +DA:316,39 +DA:317,2 +DA:323,37 +DA:325,39 +DA:326,5 +DA:327,5 +DA:328,5 +DA:329,5 +DA:335,32 +DA:336,27 +DA:339,5 +DA:344,3 +DA:345,3 +DA:346,1 +DA:348,2 +DA:349,2 +DA:351,1 +DA:357,2 +LF:131 +LH:129 +BRDA:67,0,0,2 +BRDA:67,0,1,14 +BRDA:70,1,0,1 +BRDA:70,1,1,1 +BRDA:82,2,0,11 +BRDA:82,2,1,3 +BRDA:104,3,0,1 +BRDA:104,3,1,2 +BRDA:116,4,0,1 +BRDA:116,4,1,0 +BRDA:130,5,0,7 +BRDA:130,5,1,12 +BRDA:130,6,0,19 +BRDA:130,6,1,14 +BRDA:135,7,0,3 +BRDA:135,7,1,11 +BRDA:136,8,0,14 +BRDA:136,8,1,12 +BRDA:136,8,2,12 +BRDA:136,8,3,12 +BRDA:154,9,0,0 +BRDA:154,9,1,9 +BRDA:165,10,0,2 +BRDA:165,10,1,16 +BRDA:185,11,0,2 +BRDA:185,11,1,7 +BRDA:186,12,0,0 +BRDA:186,12,1,2 +BRDA:190,13,0,1 +BRDA:190,13,1,6 +BRDA:193,14,0,2 +BRDA:193,14,1,4 +BRDA:196,15,0,1 +BRDA:196,15,1,3 +BRDA:196,16,0,4 +BRDA:196,16,1,1 +BRDA:199,17,0,2 +BRDA:199,17,1,1 +BRDA:199,18,0,3 +BRDA:199,18,1,2 +BRDA:213,19,0,2 +BRDA:213,19,1,3 +BRDA:219,20,0,1 +BRDA:219,20,1,2 +BRDA:219,21,0,3 +BRDA:219,21,1,1 +BRDA:232,22,0,2 +BRDA:232,22,1,4 +BRDA:232,23,0,6 +BRDA:232,23,1,5 +BRDA:237,24,0,3 +BRDA:237,24,1,1 +BRDA:239,25,0,1 +BRDA:239,25,1,2 +BRDA:246,26,0,3 +BRDA:246,26,1,1 +BRDA:248,27,0,1 +BRDA:248,27,1,2 +BRDA:260,28,0,38 +BRDA:260,28,1,4 +BRDA:264,29,0,1 +BRDA:264,29,1,3 +BRDA:264,30,0,4 +BRDA:264,30,1,2 +BRDA:284,31,0,6 +BRDA:284,31,1,1 +BRDA:285,32,0,1 +BRDA:285,32,1,5 +BRDA:295,33,0,8 +BRDA:295,33,1,27 +BRDA:295,34,0,35 +BRDA:295,34,1,30 +BRDA:295,34,2,8 +BRDA:316,35,0,2 +BRDA:316,35,1,37 +BRDA:316,36,0,39 +BRDA:316,36,1,38 +BRDA:323,37,0,37 +BRDA:323,37,1,33 +BRDA:325,38,0,5 +BRDA:325,38,1,34 +BRDA:325,39,0,39 +BRDA:325,39,1,5 +BRDA:328,40,0,5 +BRDA:328,40,1,0 +BRDA:329,41,0,1 +BRDA:329,41,1,4 +BRDA:329,42,0,5 +BRDA:329,42,1,2 +BRDA:335,43,0,27 +BRDA:335,43,1,5 +BRDA:339,44,0,3 +BRDA:339,44,1,2 +BRDA:345,45,0,1 +BRDA:345,45,1,2 +BRF:95 +BRH:91 +end_of_record +TN: +SF:packages/k8s/src/k8s/utils/npu-metrics.ts +FN:71,npuMetricsEnabled +FN:79,getNpuSampleIntervalSeconds +FN:96,getIdleThresholdPercent +FN:113,containerHasNpuRequest +FN:125,hasNpuRequest +FN:126,(anonymous_5) +FN:129,listNpuCardsCommand +FN:133,buildNpuSamplerScript +FN:187,buildNpuAggregateScript +FN:198,commandHasMarker +FN:202,appendExecCommand +FN:218,(anonymous_11) +FN:224,injectNpuMetrics +FN:269,maybeInjectNpuMetrics +FN:279,parseNpuAggregate +FN:324,isIdleRecord +FN:331,(anonymous_16) +FN:334,escapePromLabelValue +FN:338,formatPromLabels +FN:340,(anonymous_19) +FN:341,(anonymous_20) +FN:359,buildNpuJobMetricsBody +FN:385,(anonymous_22) +FN:401,buildNpuPushFailedBody +FN:408,buildPushgatewayPath +FN:418,withTimeout +FN:422,(anonymous_26) +FN:423,(anonymous_27) +FN:424,(anonymous_28) +FN:428,(anonymous_29) +FN:448,nodeRequest +FN:462,(anonymous_31) +FN:470,(anonymous_32) +FN:473,(anonymous_33) +FN:478,(anonymous_34) +FN:484,pushToPushgateway +FN:497,(anonymous_36) +FN:518,decodePushSecret +FN:522,(anonymous_38) +FN:545,readNpuPushConfig +FN:557,parseScaleSetSuffix +FN:565,extractClusterFromRunnerPod +FN:589,resolveNpuLabelsFromPod +FN:615,(anonymous_43) +FN:630,repoFromEnv +FN:637,(anonymous_45) +FN:644,collectNpuAggregateFromPod +FN:651,(anonymous_47) +FN:670,collectAndPushNpuMetrics +FN:681,(anonymous_49) +FN:716,collectAndPushForPod +FNF:51 +FNH:50 +FNDA:51,npuMetricsEnabled +FNDA:5,getNpuSampleIntervalSeconds +FNDA:9,getIdleThresholdPercent +FNDA:60,containerHasNpuRequest +FNDA:18,hasNpuRequest +FNDA:18,(anonymous_5) +FNDA:19,listNpuCardsCommand +FNDA:8,buildNpuSamplerScript +FNDA:11,buildNpuAggregateScript +FNDA:13,commandHasMarker +FNDA:10,appendExecCommand +FNDA:2,(anonymous_11) +FNDA:7,injectNpuMetrics +FNDA:39,maybeInjectNpuMetrics +FNDA:17,parseNpuAggregate +FNDA:14,isIdleRecord +FNDA:15,(anonymous_16) +FNDA:111,escapePromLabelValue +FNDA:8,formatPromLabels +FNDA:88,(anonymous_19) +FNDA:88,(anonymous_20) +FNDA:8,buildNpuJobMetricsBody +FNDA:88,(anonymous_22) +FNDA:3,buildNpuPushFailedBody +FNDA:7,buildPushgatewayPath +FNDA:3,withTimeout +FNDA:3,(anonymous_26) +FNDA:1,(anonymous_27) +FNDA:2,(anonymous_28) +FNDA:1,(anonymous_29) +FNDA:18,nodeRequest +FNDA:17,(anonymous_31) +FNDA:5,(anonymous_32) +FNDA:5,(anonymous_33) +FNDA:0,(anonymous_34) +FNDA:13,pushToPushgateway +FNDA:12,(anonymous_36) +FNDA:8,decodePushSecret +FNDA:18,(anonymous_38) +FNDA:5,readNpuPushConfig +FNDA:11,parseScaleSetSuffix +FNDA:10,extractClusterFromRunnerPod +FNDA:9,resolveNpuLabelsFromPod +FNDA:7,(anonymous_43) +FNDA:9,repoFromEnv +FNDA:5,(anonymous_45) +FNDA:12,collectNpuAggregateFromPod +FNDA:11,(anonymous_47) +FNDA:8,collectAndPushNpuMetrics +FNDA:16,(anonymous_49) +FNDA:8,collectAndPushForPod +DA:16,3 +DA:17,3 +DA:18,3 +DA:19,3 +DA:21,3 +DA:22,3 +DA:23,3 +DA:25,3 +DA:26,3 +DA:27,3 +DA:28,3 +DA:30,3 +DA:31,3 +DA:32,3 +DA:34,3 +DA:35,3 +DA:74,51 +DA:82,5 +DA:83,5 +DA:84,1 +DA:86,4 +DA:87,4 +DA:88,2 +DA:91,2 +DA:93,2 +DA:99,9 +DA:100,9 +DA:101,7 +DA:103,2 +DA:104,2 +DA:105,1 +DA:108,1 +DA:110,1 +DA:114,60 +DA:115,60 +DA:116,107 +DA:117,16 +DA:118,14 +DA:122,46 +DA:126,18 +DA:130,19 +DA:136,8 +DA:158,3 +DA:188,11 +DA:199,13 +DA:206,10 +DA:212,1 +DA:218,9 +DA:219,2 +DA:221,10 +DA:228,7 +DA:229,7 +DA:233,1 +DA:236,6 +DA:240,1 +DA:243,1 +DA:246,5 +DA:247,5 +DA:249,5 +DA:257,7 +DA:265,7 +DA:266,7 +DA:270,39 +DA:271,1 +DA:273,38 +DA:274,37 +DA:276,1 +DA:282,17 +DA:283,2 +DA:285,15 +DA:286,15 +DA:287,2 +DA:289,13 +DA:290,13 +DA:291,13 +DA:292,12 +DA:294,13 +DA:296,15 +DA:297,15 +DA:299,2 +DA:301,13 +DA:302,2 +DA:304,11 +DA:305,11 +DA:306,11 +DA:307,2 +DA:309,9 +DA:319,11 +DA:321,2 +DA:328,14 +DA:329,1 +DA:331,15 +DA:335,111 +DA:339,8 +DA:340,88 +DA:341,88 +DA:345,3 +DA:364,8 +DA:375,8 +DA:376,8 +DA:377,8 +DA:378,8 +DA:379,8 +DA:380,8 +DA:381,8 +DA:382,8 +DA:383,8 +DA:385,88 +DA:388,8 +DA:389,8 +DA:390,8 +DA:391,8 +DA:392,8 +DA:394,8 +DA:395,8 +DA:398,8 +DA:402,3 +DA:413,7 +DA:422,3 +DA:423,3 +DA:424,3 +DA:426,2 +DA:427,2 +DA:430,1 +DA:431,1 +DA:451,18 +DA:452,18 +DA:453,18 +DA:456,18 +DA:457,5 +DA:460,5 +DA:462,17 +DA:463,17 +DA:472,5 +DA:473,5 +DA:474,5 +DA:478,17 +DA:479,17 +DA:480,17 +DA:490,13 +DA:491,13 +DA:492,13 +DA:493,13 +DA:495,13 +DA:496,25 +DA:497,12 +DA:499,25 +DA:500,25 +DA:507,9 +DA:508,8 +DA:510,1 +DA:512,16 +DA:515,17 +DA:521,8 +DA:522,8 +DA:523,18 +DA:524,18 +DA:525,5 +DA:527,13 +DA:528,13 +DA:529,13 +DA:531,0 +DA:534,8 +DA:535,8 +DA:536,3 +DA:538,5 +DA:546,5 +DA:547,5 +DA:548,4 +DA:550,1 +DA:553,1 +DA:558,11 +DA:559,0 +DA:561,11 +DA:562,11 +DA:566,10 +DA:567,10 +DA:568,10 +DA:572,10 +DA:573,8 +DA:574,6 +DA:575,6 +DA:576,6 +DA:580,4 +DA:581,2 +DA:582,2 +DA:583,1 +DA:586,3 +DA:598,9 +DA:599,9 +DA:600,9 +DA:601,9 +DA:602,9 +DA:606,18 +DA:607,8 +DA:608,8 +DA:609,8 +DA:610,8 +DA:615,9 +DA:616,7 +DA:618,9 +DA:619,9 +DA:622,9 +DA:633,9 +DA:634,7 +DA:636,2 +DA:637,9 +DA:638,9 +DA:639,1 +DA:641,1 +DA:647,12 +DA:648,12 +DA:649,1 +DA:651,11 +DA:652,11 +DA:654,12 +DA:655,12 +DA:656,5 +DA:658,6 +DA:659,1 +DA:661,5 +DA:667,4 +DA:671,8 +DA:672,1 +DA:674,7 +DA:675,7 +DA:676,7 +DA:678,1 +DA:679,1 +DA:681,6 +DA:682,16 +DA:684,6 +DA:685,1 +DA:688,5 +DA:689,5 +DA:690,5 +DA:691,5 +DA:693,0 +DA:696,5 +DA:697,5 +DA:698,1 +DA:701,1 +DA:704,4 +DA:705,8 +DA:706,8 +DA:707,8 +DA:709,1 +DA:722,8 +DA:723,7 +DA:724,1 +DA:725,1 +DA:728,6 +DA:729,6 +DA:741,8 +DA:746,8 +DA:747,8 +DA:748,8 +DA:749,4 +DA:751,2 +DA:752,2 +DA:753,2 +LF:261 +LH:258 +BRDA:72,0,0,51 +BRDA:75,1,0,51 +BRDA:75,1,1,46 +BRDA:80,2,0,5 +BRDA:83,3,0,1 +BRDA:83,3,1,4 +BRDA:87,4,0,2 +BRDA:87,4,1,2 +BRDA:87,5,0,4 +BRDA:87,5,1,3 +BRDA:97,6,0,9 +BRDA:100,7,0,7 +BRDA:100,7,1,2 +BRDA:104,8,0,1 +BRDA:104,8,1,1 +BRDA:104,9,0,2 +BRDA:104,9,1,1 +BRDA:116,10,0,107 +BRDA:116,10,1,92 +BRDA:117,11,0,14 +BRDA:117,11,1,2 +BRDA:126,12,0,18 +BRDA:126,12,1,1 +BRDA:134,13,0,8 +BRDA:199,14,0,13 +BRDA:199,14,1,10 +BRDA:206,15,0,1 +BRDA:206,15,1,9 +BRDA:207,16,0,10 +BRDA:207,16,1,2 +BRDA:207,16,2,1 +BRDA:207,16,3,1 +BRDA:218,17,0,9 +BRDA:218,17,1,8 +BRDA:226,18,0,7 +BRDA:228,19,0,7 +BRDA:228,19,1,3 +BRDA:229,20,0,1 +BRDA:229,20,1,6 +BRDA:230,21,0,7 +BRDA:230,21,1,6 +BRDA:236,22,0,1 +BRDA:236,22,1,5 +BRDA:237,23,0,6 +BRDA:237,23,1,3 +BRDA:237,23,2,5 +BRDA:237,23,3,0 +BRDA:270,24,0,1 +BRDA:270,24,1,38 +BRDA:273,25,0,37 +BRDA:273,25,1,1 +BRDA:282,26,0,2 +BRDA:282,26,1,15 +BRDA:286,27,0,2 +BRDA:286,27,1,13 +BRDA:291,28,0,12 +BRDA:291,28,1,1 +BRDA:301,29,0,2 +BRDA:301,29,1,11 +BRDA:301,30,0,13 +BRDA:301,30,1,11 +BRDA:306,31,0,2 +BRDA:306,31,1,9 +BRDA:306,32,0,11 +BRDA:306,32,1,10 +BRDA:306,32,2,10 +BRDA:311,33,0,9 +BRDA:311,33,1,0 +BRDA:312,34,0,11 +BRDA:312,34,1,1 +BRDA:313,35,0,11 +BRDA:313,35,1,1 +BRDA:314,36,0,11 +BRDA:314,36,1,1 +BRDA:315,37,0,11 +BRDA:315,37,1,1 +BRDA:316,38,0,11 +BRDA:316,38,1,1 +BRDA:319,39,0,11 +BRDA:319,39,1,0 +BRDA:326,40,0,14 +BRDA:328,41,0,1 +BRDA:328,41,1,13 +BRDA:331,42,0,15 +BRDA:331,42,1,10 +BRDA:362,43,0,8 +BRDA:375,44,0,5 +BRDA:375,44,1,3 +BRDA:452,45,0,17 +BRDA:452,45,1,0 +BRDA:456,46,0,5 +BRDA:456,46,1,13 +BRDA:456,47,0,18 +BRDA:456,47,1,12 +BRDA:458,48,0,5 +BRDA:458,48,1,0 +BRDA:458,49,0,5 +BRDA:458,49,1,0 +BRDA:468,50,0,17 +BRDA:468,50,1,17 +BRDA:474,51,0,5 +BRDA:474,51,1,0 +BRDA:490,52,0,13 +BRDA:490,52,1,13 +BRDA:491,53,0,13 +BRDA:491,53,1,10 +BRDA:492,54,0,13 +BRDA:492,54,1,8 +BRDA:496,55,0,12 +BRDA:496,55,1,13 +BRDA:507,56,0,8 +BRDA:507,56,1,1 +BRDA:507,57,0,9 +BRDA:507,57,1,9 +BRDA:515,58,0,5 +BRDA:515,58,1,0 +BRDA:521,59,0,8 +BRDA:521,59,1,2 +BRDA:524,60,0,5 +BRDA:524,60,1,13 +BRDA:529,61,0,13 +BRDA:529,61,1,0 +BRDA:535,62,0,3 +BRDA:535,62,1,5 +BRDA:558,63,0,0 +BRDA:558,63,1,11 +BRDA:562,64,0,8 +BRDA:562,64,1,3 +BRDA:566,65,0,10 +BRDA:566,65,1,0 +BRDA:567,66,0,10 +BRDA:567,66,1,10 +BRDA:573,67,0,6 +BRDA:573,67,1,2 +BRDA:575,68,0,6 +BRDA:575,68,1,0 +BRDA:582,69,0,1 +BRDA:582,69,1,1 +BRDA:586,70,0,3 +BRDA:586,70,1,2 +BRDA:598,71,0,5 +BRDA:598,71,1,4 +BRDA:601,72,0,9 +BRDA:601,72,1,0 +BRDA:606,73,0,18 +BRDA:606,73,1,10 +BRDA:608,74,0,8 +BRDA:608,74,1,0 +BRDA:610,75,0,8 +BRDA:610,75,1,0 +BRDA:615,76,0,9 +BRDA:615,76,1,2 +BRDA:619,77,0,5 +BRDA:619,77,1,4 +BRDA:621,78,0,4 +BRDA:621,78,1,1 +BRDA:624,79,0,9 +BRDA:624,79,1,2 +BRDA:625,80,0,9 +BRDA:625,80,1,2 +BRDA:631,81,0,9 +BRDA:633,82,0,7 +BRDA:633,82,1,2 +BRDA:636,83,0,2 +BRDA:636,83,1,1 +BRDA:638,84,0,1 +BRDA:638,84,1,8 +BRDA:648,85,0,1 +BRDA:648,85,1,11 +BRDA:651,86,0,11 +BRDA:651,86,1,0 +BRDA:655,87,0,5 +BRDA:655,87,1,7 +BRDA:658,88,0,1 +BRDA:658,88,1,5 +BRDA:671,89,0,1 +BRDA:671,89,1,7 +BRDA:682,90,0,16 +BRDA:682,90,1,16 +BRDA:684,91,0,1 +BRDA:684,91,1,5 +BRDA:697,92,0,1 +BRDA:697,92,1,4 +BRDA:723,93,0,1 +BRDA:723,93,1,6 +BRDA:723,94,0,7 +BRDA:723,94,1,6 +BRDA:735,95,0,6 +BRDA:735,95,1,0 +BRF:189 +BRH:172 +end_of_record diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..6adc7567 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,129 @@ +const eslint = require('@eslint/js'); +const tseslint = require('@typescript-eslint/eslint-plugin'); +const tsparser = require('@typescript-eslint/parser'); +const globals = require('globals'); +const pluginJest = require('eslint-plugin-jest'); + +module.exports = [ + eslint.configs.recommended, + { + files: ['**/*.ts'], + languageOptions: { + parser: tsparser, + parserOptions: { + ecmaVersion: 2018, + sourceType: 'module', + project: ['./tsconfig.json', './packages/*/tsconfig.json'] + }, + globals: { + ...globals.node, + ...globals.es6 + } + }, + plugins: { + '@typescript-eslint': tseslint, + }, + rules: { + // Disabled rules from original config + 'eslint-comments/no-use': 'off', + 'import/no-namespace': 'off', + 'no-constant-condition': 'off', + 'no-unused-vars': 'off', + 'i18n-text/no-en': 'off', + 'camelcase': 'off', + 'semi': 'off', + 'no-shadow': 'off', + + // TypeScript ESLint rules + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + varsIgnorePattern: '^_' + } + ], + '@typescript-eslint/explicit-member-accessibility': ['error', { accessibility: 'no-public' }], + '@typescript-eslint/no-require-imports': 'error', + '@typescript-eslint/array-type': 'error', + '@typescript-eslint/await-thenable': 'error', + '@typescript-eslint/explicit-function-return-type': ['error', { allowExpressions: true }], + '@typescript-eslint/no-array-constructor': 'error', + '@typescript-eslint/no-empty-interface': 'error', + '@typescript-eslint/no-explicit-any': 'off', // Fixed: removed duplicate and kept only this one + '@typescript-eslint/no-extraneous-class': 'error', + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/no-for-in-array': 'error', + '@typescript-eslint/no-inferrable-types': 'error', + '@typescript-eslint/no-misused-new': 'error', + '@typescript-eslint/no-namespace': 'error', + '@typescript-eslint/no-non-null-assertion': 'warn', + '@typescript-eslint/no-unnecessary-qualifier': 'error', + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + '@typescript-eslint/no-useless-constructor': 'error', + '@typescript-eslint/no-var-requires': 'error', + '@typescript-eslint/prefer-for-of': 'warn', + '@typescript-eslint/prefer-function-type': 'warn', + '@typescript-eslint/prefer-includes': 'error', + '@typescript-eslint/prefer-string-starts-ends-with': 'error', + '@typescript-eslint/promise-function-async': 'error', + '@typescript-eslint/require-array-sort-compare': 'error', + '@typescript-eslint/restrict-plus-operands': 'error', + '@typescript-eslint/unbound-method': 'error', + '@typescript-eslint/no-shadow': ['error'] + } + }, + { + // Test files configuration - Fixed file pattern to match .ts files + files: ['**/*test*.ts', '**/*spec*.ts', '**/tests/**/*.ts'], + languageOptions: { + parser: tsparser, + parserOptions: { + ecmaVersion: 2018, + sourceType: 'module', + project: ['./tsconfig.json', './packages/*/tsconfig.json'] + }, + globals: { + ...globals.node, + ...globals.es6, + // Fixed Jest globals + describe: 'readonly', + it: 'readonly', + test: 'readonly', + expect: 'readonly', + beforeEach: 'readonly', + afterEach: 'readonly', + beforeAll: 'readonly', + afterAll: 'readonly', + jest: 'readonly' + } + }, + plugins: { + '@typescript-eslint': tseslint, + jest: pluginJest + }, + rules: { + // Disable no-undef for test files since Jest globals are handled above + 'no-undef': 'off', + // Relax some rules for test files + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-function-return-type': 'off' + } + }, + { + files: ['**/jest.config.js', '**/jest.setup.js'], + languageOptions: { + globals: { + ...globals.node, + jest: 'readonly', + module: 'writable' + } + }, + rules: { + '@typescript-eslint/no-require-imports': 'off', + '@typescript-eslint/no-var-requires': 'off', + 'import/no-commonjs': 'off' + } + } +]; \ No newline at end of file diff --git a/examples/extension.yaml b/examples/extension.yaml index 15bb48fa..310a63a2 100644 --- a/examples/extension.yaml +++ b/examples/extension.yaml @@ -4,9 +4,6 @@ metadata: labels: labeled-by: "extension" spec: - securityContext: - runAsUser: 1000 - runAsGroup: 3000 restartPolicy: Never containers: - name: $job # overwrites job container diff --git a/package-lock.json b/package-lock.json index 97c0b89d..acb5be3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,1455 +1,1552 @@ { "name": "hooks", - "version": "0.7.0", - "lockfileVersion": 2, + "version": "0.8.1", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "hooks", - "version": "0.7.0", + "version": "0.8.1", "license": "MIT", + "dependencies": { + "eslint-plugin-jest": "^29.0.1" + }, "devDependencies": { - "@types/jest": "^27.5.1", - "@types/node": "^17.0.23", - "@typescript-eslint/parser": "^5.18.0", - "eslint": "^8.12.0", - "eslint-plugin-github": "^4.3.6", - "prettier": "^2.6.2", - "typescript": "^4.6.3" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "@eslint/js": "^9.31.0", + "@types/jest": "^30.0.0", + "@types/node": "^24.0.14", + "@typescript-eslint/eslint-plugin": "^8.37.0", + "@typescript-eslint/parser": "^8.37.0", + "@vitest/coverage-v8": "^4.1.10", + "eslint": "^9.31.0", + "eslint-plugin-github": "^6.0.0", + "globals": "^15.12.0", + "prettier": "^3.6.2", + "typescript": "^5.8.3", + "vitest": "^4.1.10" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.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" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, + "license": "MIT", "engines": { - "node": ">=10.10.0" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">= 8" + "node": ">=6.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/@types/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ==", + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz", - "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==", - "dev": true + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.26.0.tgz", - "integrity": "sha512-oGCmo0PqnRZZndr+KwvvAUvD3kNE4AfyoGCwOZpoCncSh4MVD06JTE8XQa2u9u+NX5CsyZMBTEc2C72zx38eYA==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.26.0", - "@typescript-eslint/type-utils": "5.26.0", - "@typescript-eslint/utils": "5.26.0", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.26.0.tgz", - "integrity": "sha512-n/IzU87ttzIdnAH5vQ4BBDnLPly7rC5VnjN3m0xBG82HK6rhRxnCb3w/GyWbNDghPd+NktJqB/wl6+YkzZ5T5Q==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.0.tgz", + "integrity": "sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/scope-manager": "5.26.0", - "@typescript-eslint/types": "5.26.0", - "@typescript-eslint/typescript-estree": "5.26.0", - "debug": "^4.3.4" + "@eslint/core": "^0.16.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.40 || 9" }, "peerDependenciesMeta": { - "typescript": { + "eslint": { "optional": true } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.26.0.tgz", - "integrity": "sha512-gVzTJUESuTwiju/7NiTb4c5oqod8xt5GhMbExKsCTp6adU3mya6AGJ4Pl9xC7x2DX9UYFsjImC0mA62BCY22Iw==", + "node_modules/@eslint/compat/node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/types": "5.26.0", - "@typescript-eslint/visitor-keys": "5.26.0" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.26.0.tgz", - "integrity": "sha512-7ccbUVWGLmcRDSA1+ADkDBl5fP87EJt0fnijsMFTVHXKGduYMgienC/i3QwoVhDADUAPoytgjbZbCOMj4TY55A==", - "dev": true, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/utils": "5.26.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": "*" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.26.0.tgz", - "integrity": "sha512-8794JZFE1RN4XaExLWLI2oSXsVImNkl79PzTOOWt9h0UHROwJedNOD2IJyfL0NbddFllcktGIO2aOu10avQQyA==", - "dev": true, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.26.0.tgz", - "integrity": "sha512-EyGpw6eQDsfD6jIqmXP3rU5oHScZ51tL/cZgFbFBvWuCwrIptl+oueUZzSmLtxFuSOQ9vDcJIs+279gnJkfd1w==", - "dev": true, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.26.0", - "@typescript-eslint/visitor-keys": "5.26.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "license": "MIT", + "engines": { + "node": ">=18" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.26.0.tgz", - "integrity": "sha512-PJFwcTq2Pt4AMOKfe3zQOdez6InIDOjUJJD3v3LyEtxHGVVRK3Vo7Dd923t/4M9hSH2q2CLvcTdxlLPjcIk3eg==", - "dev": true, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.26.0", - "@typescript-eslint/types": "5.26.0", - "@typescript-eslint/typescript-estree": "5.26.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "url": "https://eslint.org/donate" } }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "license": "Apache-2.0", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" }, "engines": { - "node": ">=8.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/@github/browserslist-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@github/browserslist-config/-/browserslist-config-1.0.0.tgz", + "integrity": "sha512-gIhjdJp/c2beaIWWIlsXdqXVRUz3r2BxBCpfz/F3JXHvSAQ1paMYjLH+maEATtENg+k5eLV7gA+9yPp762ieuw==", "dev": true, + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "license": "Apache-2.0", "engines": { - "node": ">=4.0" + "node": ">=18.18.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.26.0.tgz", - "integrity": "sha512-wei+ffqHanYDOQgg/fS6Hcar6wAWv0CUPQ3TZzOWd2BLfgP539rb49bwua8WRAs7R6kOSLn82rfEu2ro6Llt8Q==", - "dev": true, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/types": "5.26.0", - "eslint-visitor-keys": "^3.3.0" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "license": "Apache-2.0", "engines": { - "node": ">=0.4.0" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, + "license": "MIT", "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" + "@jest/get-type": "30.1.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@types/node": "*", + "jest-regex-util": "30.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" + "@sinclair/typebox": "^0.34.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "engines": { + "node": ">=6.0.0" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "@tybys/wasm-util": "^0.10.3" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001342", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001342.tgz", - "integrity": "sha512-bn6sOCu7L7jcbBbyNhLg0qzXdJ/PMbybZTH/BA6Roet9wxYRm6Tr9D0s0uhLkOZ6MSG+QU6txUgdpr3MXIVqjA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 8" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { - "node": ">=7.0.0" + "node": ">= 8" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/pkgr" } }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.138", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.138.tgz", - "integrity": "sha512-IOyp2Seq3w4QLln+yZWcMF3VXhhduz4bwg9gfI+CnP5TkzwNXQ8FCZuwwPsnes73AfWdf5J2n2OXdUwDUspDPQ==", - "dev": true - }, - "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "has": "^1.0.3" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/eslint": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", - "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "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.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "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.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ms": "^2.1.1" + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" }, "engines": { - "node": ">=4" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ms": "^2.1.1" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/eslint-plugin-escompat": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-escompat/-/eslint-plugin-escompat-3.1.0.tgz", - "integrity": "sha512-Fon3eRv8fOQPZTjT3h8Ga85Xx7Eg+CNZBL7OIYSM2f+p3W4oXTxiSnFUbNDrayRBK3CQjG2dwR+iYeKDDSkXyA==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "browserslist": "^4.12.0" - }, - "peerDependencies": { - "eslint": ">=5.14.1" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" - }, - "engines": { - "node": ">=6.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } + "license": "MIT" }, - "node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, - "engines": { - "node": ">=0.8.0" - } + "license": "MIT" }, - "node_modules/eslint-plugin-filenames": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", - "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", + "node_modules/@sinclair/typebox": { + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "lodash.camelcase": "4.3.0", - "lodash.kebabcase": "4.1.1", - "lodash.snakecase": "4.1.1", - "lodash.upperfirst": "4.3.1" - }, - "peerDependencies": { - "eslint": "*" + "tslib": "^2.4.0" } }, - "node_modules/eslint-plugin-github": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.3.6.tgz", - "integrity": "sha512-W4l9CV1DdSaWYZXWiuH/v0bh3c55iFyyhw2EgIwdAeRxogn7svsI5MLBRA9YZ0cdQyekWMZUfAHEeFhDpOyzWg==", + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "^5.1.0", - "@typescript-eslint/parser": "^5.1.0", - "eslint-config-prettier": ">=8.0.0", - "eslint-plugin-escompat": "^3.1.0", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-filenames": "^1.3.2", - "eslint-plugin-i18n-text": "^1.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-no-only-tests": "^2.6.0", - "eslint-plugin-prettier": "^4.0.0", - "eslint-rule-documentation": ">=1.0.0", - "prettier": "^2.2.1", - "svg-element-attributes": "^1.3.1" - }, - "bin": { - "eslint-ignore-errors": "bin/eslint-ignore-errors.js" - }, - "peerDependencies": { - "eslint": "^8.0.1" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "node_modules/eslint-plugin-i18n-text": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz", - "integrity": "sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA==", + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, - "peerDependencies": { - "eslint": ">=5.0.0" - } + "license": "MIT" }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", "dev": true, + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" + "expect": "^30.0.0", + "pretty-format": "^30.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" }, - "node_modules/eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, - "engines": { - "node": ">=4.0.0" - } + "license": "MIT" }, - "node_modules/eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "node_modules/@types/node": { + "version": "24.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.2.tgz", + "integrity": "sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==", "dev": true, + "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } + "undici-types": "~7.13.0" } }, - "node_modules/eslint-rule-documentation": { - "version": "1.0.23", - "resolved": "https://registry.npmjs.org/eslint-rule-documentation/-/eslint-rule-documentation-1.0.23.tgz", - "integrity": "sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw==", + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, - "engines": { - "node": ">=4.0.0" - } + "license": "MIT" }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@types/yargs-parser": "*" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", + "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", + "devOptional": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/type-utils": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": ">=5" + "@typescript-eslint/parser": "^8.45.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, + "node_modules/@typescript-eslint/parser": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", + "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, + "node_modules/@typescript-eslint/project-service": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", + "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.45.0", + "@typescript-eslint/types": "^8.45.0", + "debug": "^4.3.4" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", - "dev": true, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", + "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "license": "MIT", "dependencies": { - "acorn": "^8.7.1", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", + "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "license": "MIT", "engines": { - "node": ">=0.10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", + "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", + "devOptional": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": ">=4.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, + "node_modules/@typescript-eslint/types": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", + "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "license": "MIT", "engines": { - "node": ">=4.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", + "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.45.0", + "@typescript-eslint/tsconfig-utils": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, + "node_modules/@typescript-eslint/utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", + "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", + "license": "MIT", "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" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0" }, "engines": { - "node": ">=8.6.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", + "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "@typescript-eslint/types": "8.45.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": ">= 6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/@vitest/coverage-v8": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz", + "integrity": "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==", "dev": true, + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.1.10", + "ast-v8-to-istanbul": "^1.0.0", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "std-env": "^4.0.0-rc.1", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.1.10", + "vitest": "4.1.10" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/@vitest/expect": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/@vitest/mocker": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", + "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", "dev": true, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "@vitest/spy": "4.1.10", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "node_modules/@vitest/pretty-format": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", + "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^2.0.0" + "tinyrainbow": "^3.1.0" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "node_modules/@vitest/runner": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", + "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "@vitest/utils": "4.1.10", + "pathe": "^2.0.3" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "node_modules/@vitest/snapshot": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", + "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" + "@vitest/pretty-format": "4.1.10", + "@vitest/utils": "4.1.10", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/vitest" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/@vitest/spy": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", "dev": true, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/vitest" } }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "node_modules/@vitest/utils": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", + "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "@vitest/pretty-format": "4.1.10", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/vitest" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">= 0.4" + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "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" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "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" + "color-convert": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, + "license": "Apache-2.0", "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" } }, - "node_modules/globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, + "license": "MIT", "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" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, "engines": { "node": ">= 0.4" }, @@ -1457,13 +1554,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -1472,90 +1576,170 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=12" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ast-v8-to-istanbul": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.5.tgz", + "integrity": "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==", "dev": true, + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", "dev": true, + "license": "MPL-2.0", "engines": { - "node": ">=0.8.19" + "node": ">=4" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "node_modules/baseline-browser-mapping": { + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.10.tgz", + "integrity": "sha512-uLfgBi+7IBNay8ECBO2mVMGZAc1VgZWEChxm4lv+TobGdG82LnXMjuNGo/BSSZZL4UmkWhxEHP2f5ziLNwGWMA==", "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "fill-range": "^7.1.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -1564,94 +1748,171 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001747", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001747.tgz", + "integrity": "sha512-mzFa2DGIhuc5490Nd/G31xN1pnBnYMadtkyTjefPI7wzypqgCEpeWu9bJr0OnDsyKrW75zA9ZAt7pbQFmwLsQg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/ci-info": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "engines": { - "node": ">= 0.4" + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 8" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true, - "engines": { - "node": ">=0.12.0" - } + "license": "BSD-2-Clause" }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1660,56 +1921,75 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "ms": "^2.1.3" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -1718,2813 +1998,4059 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "esutils": "^2.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=0.10.0" } }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 0.4" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "node_modules/electron-to-chromium": { + "version": "1.5.230", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.230.tgz", + "integrity": "sha512-A6A6Fd3+gMdaed9wX83CvHYJb4UuapPD5X5SLq72VZJzxHSY0/LUweGXRWmQlh2ln7KV7iw7jnwXK7dlPoOnHQ==", + "dev": true, + "license": "ISC" }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, + "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" } }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "node_modules/lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=", - "dev": true - }, - "node_modules/lodash.upperfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=", - "dev": true + "node_modules/es-module-lexer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "dev": true, + "license": "MIT" }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "es-errors": "^1.3.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, "engines": { - "node": ">= 8" + "node": ">= 0.4" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "hasown": "^2.0.2" }, "engines": { - "node": ">=8.6" + "node": ">= 0.4" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", - "dev": true - }, - "node_modules/object-inspect": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", - "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==", - "dev": true, + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, + "node_modules/eslint": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.36.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, - "dependencies": { - "wrappy": "1" + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" + "ms": "^2.1.1" } }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^1.1.0" + "debug": "^3.2.7" }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "engines": { - "node": ">=4" + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/eslint-plugin-escompat": { + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-escompat/-/eslint-plugin-escompat-3.11.4.tgz", + "integrity": "sha512-j0ywwNnIufshOzgAu+PfIig1c7VRClKSNKzpniMT2vXQ4leL5q+e/SpMFQU0nrdL2WFFM44XmhSuwmxb3G0CJg==", "dev": true, + "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "browserslist": "^4.23.1" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "eslint": ">=5.14.1" } }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "node_modules/eslint-plugin-eslint-comments": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", + "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5", + "ignore": "^5.0.5" + }, "engines": { - "node": ">=4" + "node": ">=6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/eslint-plugin-eslint-comments/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/eslint-plugin-filenames": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", + "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "lodash.camelcase": "4.3.0", + "lodash.kebabcase": "4.1.1", + "lodash.snakecase": "4.1.1", + "lodash.upperfirst": "4.3.1" + }, + "peerDependencies": { + "eslint": "*" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "node_modules/eslint-plugin-github": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-6.0.0.tgz", + "integrity": "sha512-J8MvUoiR/TU/Y9NnEmg1AnbvMUj9R6IO260z47zymMLLvso7B4c80IKjd8diqmqtSmeXXlbIus4i0SvK84flag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/compat": "^1.2.3", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.14.0", + "@github/browserslist-config": "^1.0.0", + "@typescript-eslint/eslint-plugin": "^8.0.0", + "@typescript-eslint/parser": "^8.0.0", + "aria-query": "^5.3.0", + "eslint-config-prettier": ">=8.0.0", + "eslint-plugin-escompat": "^3.11.3", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-filenames": "^1.3.2", + "eslint-plugin-i18n-text": "^1.0.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-no-only-tests": "^3.0.0", + "eslint-plugin-prettier": "^5.2.1", + "eslint-rule-documentation": ">=1.0.0", + "globals": "^16.0.0", + "jsx-ast-utils": "^3.3.2", + "prettier": "^3.0.0", + "svg-element-attributes": "^1.3.1", + "typescript": "^5.7.3", + "typescript-eslint": "^8.14.0" + }, + "bin": { + "eslint-ignore-errors": "bin/eslint-ignore-errors.js" + }, + "peerDependencies": { + "eslint": "^8 || ^9" + } }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/eslint-plugin-github/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/eslint-plugin-i18n-text": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz", + "integrity": "sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA==", "dev": true, - "engines": { - "node": ">= 0.8.0" + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" } }, - "node_modules/prettier": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", - "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=4" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "ms": "^2.1.1" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "engines": { - "node": ">=10" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": "*" } }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=6" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "node_modules/eslint-plugin-jest": { + "version": "29.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.0.1.tgz", + "integrity": "sha512-EE44T0OSMCeXhDrrdsbKAhprobKkPtJTbQz5yEktysNpHeDZTAL1SfDTNKmcFfJkY6yrQLtTKZALrD3j/Gpmiw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.0.0" + }, + "engines": { + "node": "^20.12.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true }, - { - "type": "consulting", - "url": "https://feross.org/support" + "jest": { + "optional": true } - ] - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + } }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=4.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/eslint-plugin-no-only-tests": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz", + "integrity": "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==", "dev": true, + "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=5.0.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true }, - { - "type": "consulting", - "url": "https://feross.org/support" + "eslint-config-prettier": { + "optional": true } - ], - "dependencies": { - "queue-microtask": "^1.2.2" } }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/eslint-rule-documentation": { + "version": "1.0.23", + "resolved": "https://registry.npmjs.org/eslint-rule-documentation/-/eslint-rule-documentation-1.0.23.tgz", + "integrity": "sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=4.0.0" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "license": "BSD-2-Clause", "dependencies": { - "shebang-regex": "^3.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { - "ansi-regex": "^5.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "license": "BSD-3-Clause", "dependencies": { - "has-flag": "^4.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=8" + "node": ">=0.10" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-element-attributes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/svg-element-attributes/-/svg-element-attributes-1.3.1.tgz", - "integrity": "sha512-Bh05dSOnJBf3miNMqpsormfNtfidA/GxQVakhtn0T4DECWKeXQRQUceYjJ+OxYiiLdGe4Jo9iFV8wICFapFeIA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=4.0" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", "engines": { - "node": ">=8.0" + "node": ">=4.0" } }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "@types/estree": "^1.0.0" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "node": ">=0.10.0" } }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.0.0" } }, - "node_modules/typescript": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", - "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "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.8" }, "engines": { - "node": ">=4.2.0" + "node": ">=8.6.0" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "is-glob": "^4.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 6" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", "dependencies": { - "punycode": "^2.1.0" + "reusify": "^1.0.4" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "flat-cache": "^4.0.0" }, - "bin": { - "node-which": "bin/node-which" + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", "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" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=16" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - }, - "dependencies": { - "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.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" + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@types/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "requires": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/node": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz", - "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.26.0.tgz", - "integrity": "sha512-oGCmo0PqnRZZndr+KwvvAUvD3kNE4AfyoGCwOZpoCncSh4MVD06JTE8XQa2u9u+NX5CsyZMBTEc2C72zx38eYA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.26.0", - "@typescript-eslint/type-utils": "5.26.0", - "@typescript-eslint/utils": "5.26.0", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "@typescript-eslint/parser": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.26.0.tgz", - "integrity": "sha512-n/IzU87ttzIdnAH5vQ4BBDnLPly7rC5VnjN3m0xBG82HK6rhRxnCb3w/GyWbNDghPd+NktJqB/wl6+YkzZ5T5Q==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.26.0", - "@typescript-eslint/types": "5.26.0", - "@typescript-eslint/typescript-estree": "5.26.0", - "debug": "^4.3.4" + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@typescript-eslint/scope-manager": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.26.0.tgz", - "integrity": "sha512-gVzTJUESuTwiju/7NiTb4c5oqod8xt5GhMbExKsCTp6adU3mya6AGJ4Pl9xC7x2DX9UYFsjImC0mA62BCY22Iw==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, - "requires": { - "@typescript-eslint/types": "5.26.0", - "@typescript-eslint/visitor-keys": "5.26.0" + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "@typescript-eslint/type-utils": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.26.0.tgz", - "integrity": "sha512-7ccbUVWGLmcRDSA1+ADkDBl5fP87EJt0fnijsMFTVHXKGduYMgienC/i3QwoVhDADUAPoytgjbZbCOMj4TY55A==", + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, - "requires": { - "@typescript-eslint/utils": "5.26.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@typescript-eslint/types": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.26.0.tgz", - "integrity": "sha512-8794JZFE1RN4XaExLWLI2oSXsVImNkl79PzTOOWt9h0UHROwJedNOD2IJyfL0NbddFllcktGIO2aOu10avQQyA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.26.0.tgz", - "integrity": "sha512-EyGpw6eQDsfD6jIqmXP3rU5oHScZ51tL/cZgFbFBvWuCwrIptl+oueUZzSmLtxFuSOQ9vDcJIs+279gnJkfd1w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.26.0", - "@typescript-eslint/visitor-keys": "5.26.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": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.26.0.tgz", - "integrity": "sha512-PJFwcTq2Pt4AMOKfe3zQOdez6InIDOjUJJD3v3LyEtxHGVVRK3Vo7Dd923t/4M9hSH2q2CLvcTdxlLPjcIk3eg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.26.0", - "@typescript-eslint/types": "5.26.0", - "@typescript-eslint/typescript-estree": "5.26.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "@typescript-eslint/visitor-keys": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.26.0.tgz", - "integrity": "sha512-wei+ffqHanYDOQgg/fS6Hcar6wAWv0CUPQ3TZzOWd2BLfgP539rb49bwua8WRAs7R6kOSLn82rfEu2ro6Llt8Q==", + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", "dev": true, - "requires": { - "@typescript-eslint/types": "5.26.0", - "eslint-visitor-keys": "^3.3.0" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, - "requires": {} + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "license": "ISC" }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "devOptional": true, + "license": "MIT" }, - "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "balanced-match": { + "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, - "requires": { - "fill-range": "^7.1.1" + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "call-bind": { + "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001342", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001342.tgz", - "integrity": "sha512-bn6sOCu7L7jcbBbyNhLg0qzXdJ/PMbybZTH/BA6Roet9wxYRm6Tr9D0s0uhLkOZ6MSG+QU6txUgdpr3MXIVqjA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "license": "MIT" }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "deep-is": { + "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" } }, - "diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, - "requires": { - "path-type": "^4.0.0" + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "electron-to-chromium": { - "version": "1.4.138", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.138.tgz", - "integrity": "sha512-IOyp2Seq3w4QLln+yZWcMF3VXhhduz4bwg9gfI+CnP5TkzwNXQ8FCZuwwPsnes73AfWdf5J2n2OXdUwDUspDPQ==", - "dev": true - }, - "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, - "requires": { - "has": "^1.0.3" + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", - "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "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.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "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.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, - "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, + "license": "MIT", "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "eslint-plugin-escompat": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-escompat/-/eslint-plugin-escompat-3.1.0.tgz", - "integrity": "sha512-Fon3eRv8fOQPZTjT3h8Ga85Xx7Eg+CNZBL7OIYSM2f+p3W4oXTxiSnFUbNDrayRBK3CQjG2dwR+iYeKDDSkXyA==", + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, - "requires": { - "browserslist": "^4.12.0" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" - }, + "license": "MIT", "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "eslint-plugin-filenames": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", - "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", - "dev": true, - "requires": { - "lodash.camelcase": "4.3.0", - "lodash.kebabcase": "4.1.1", - "lodash.snakecase": "4.1.1", - "lodash.upperfirst": "4.3.1" + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "eslint-plugin-github": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.3.6.tgz", - "integrity": "sha512-W4l9CV1DdSaWYZXWiuH/v0bh3c55iFyyhw2EgIwdAeRxogn7svsI5MLBRA9YZ0cdQyekWMZUfAHEeFhDpOyzWg==", + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "^5.1.0", - "@typescript-eslint/parser": "^5.1.0", - "eslint-config-prettier": ">=8.0.0", - "eslint-plugin-escompat": "^3.1.0", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-filenames": "^1.3.2", - "eslint-plugin-i18n-text": "^1.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-no-only-tests": "^2.6.0", - "eslint-plugin-prettier": "^4.0.0", - "eslint-rule-documentation": ">=1.0.0", - "prettier": "^2.2.1", - "svg-element-attributes": "^1.3.1" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "eslint-plugin-i18n-text": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz", - "integrity": "sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA==", + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, - "requires": {} + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", - "dev": true - }, - "eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "eslint-rule-documentation": { - "version": "1.0.23", - "resolved": "https://registry.npmjs.org/eslint-rule-documentation/-/eslint-rule-documentation-1.0.23.tgz", - "integrity": "sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw==", - "dev": true - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", - "dev": true, - "requires": { - "acorn": "^8.7.1", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" } }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, - "requires": { - "estraverse": "^5.1.0" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, - "requires": { - "estraverse": "^5.2.0" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { + "node_modules/is-set": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, - "requires": { - "@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" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, - "requires": { - "reusify": "^1.0.4" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, - "requires": { - "flat-cache": "^3.0.4" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, - "requires": { - "to-regex-range": "^5.0.1" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, - "requires": { - "locate-path": "^2.0.0" + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { + "node_modules/is-weakref": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" } }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, - "requires": { - "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" + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, - "requires": { - "is-glob": "^4.0.3" + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "node_modules/jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, - "requires": { - "type-fest": "^0.20.2" + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/jest-message-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, - "requires": { - "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" + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/jest-mock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, - "requires": { - "function-bind": "^1.1.1" + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, - "requires": { - "has-symbols": "^1.0.2" + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT" }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, - "requires": { - "has-bigints": "^1.0.1" + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" } }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" } }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", "dev": true, - "requires": { - "has": "^1.0.3" - } + "license": "CC0-1.0" }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "call-bind": "^1.0.2" + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "has-symbols": "^1.0.2" + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "call-bind": "^1.0.2" + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true - }, - "jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "argparse": "^2.0.1" + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "minimist": "^1.2.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "lodash.camelcase": { + "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" }, - "lodash.kebabcase": { + "node_modules/lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", - "dev": true + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true, + "license": "MIT" }, - "lodash.merge": { + "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "license": "MIT" }, - "lodash.snakecase": { + "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=", - "dev": true + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true, + "license": "MIT" }, - "lodash.upperfirst": { + "node_modules/lodash.upperfirst": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=", - "dev": true + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true, + "license": "MIT" }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, - "requires": { - "yallist": "^4.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "merge2": { + "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "license": "MIT", + "engines": { + "node": ">= 8" + } }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } }, - "natural-compare": { + "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "license": "MIT" }, - "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", - "dev": true + "node_modules/node-releases": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "dev": true, + "license": "MIT" }, - "object-inspect": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", - "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==", - "dev": true + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "object-keys": { + "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, - "requires": { - "wrappy": "1" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", "dev": true, - "requires": { + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", + "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, - "requires": { - "p-try": "^1.0.0" + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "parent-module": { + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", + "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } }, - "prelude-ls": { + "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } }, - "prettier": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", - "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", - "dev": true + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } }, - "prettier-linter-helpers": { + "node_modules/prettier-linter-helpers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, + "license": "MIT", "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, - "requires": { - "is-core-module": "^2.8.1", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", "dev": true, - "requires": { - "glob": "^7.1.3" + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" } }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { "queue-microtask": "^1.2.2" } }, - "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, - "requires": { - "lru-cache": "^6.0.0" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, - "requires": { - "shebang-regex": "^3.0.0" + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "requires": { - "ansi-regex": "^5.0.1" + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, - "requires": { - "has-flag": "^4.0.0" + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svg-element-attributes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/svg-element-attributes/-/svg-element-attributes-1.3.1.tgz", - "integrity": "sha512-Bh05dSOnJBf3miNMqpsormfNtfidA/GxQVakhtn0T4DECWKeXQRQUceYjJ+OxYiiLdGe4Jo9iFV8wICFapFeIA==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, - "requires": { - "tslib": "^1.8.1" + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, - "requires": { - "prelude-ls": "^1.2.1" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", - "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", - "dev": true - }, - "unbox-primitive": { + "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, - "requires": { + "license": "ISC" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-element-attributes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/svg-element-attributes/-/svg-element-attributes-1.3.1.tgz", + "integrity": "sha512-Bh05dSOnJBf3miNMqpsormfNtfidA/GxQVakhtn0T4DECWKeXQRQUceYjJ+OxYiiLdGe4Jo9iFV8wICFapFeIA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.45.0.tgz", + "integrity": "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.45.0", + "@typescript-eslint/parser": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", + "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { "punycode": "^2.1.0" } }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "node_modules/vite": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", + "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.17", + "rolldown": "~1.1.5", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } }, - "which": { + "node_modules/vitest": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", + "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.10", + "@vitest/mocker": "4.1.10", + "@vitest/pretty-format": "4.1.10", + "@vitest/runner": "4.1.10", + "@vitest/snapshot": "4.1.10", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.10", + "@vitest/browser-preview": "4.1.10", + "@vitest/browser-webdriverio": "4.1.10", + "@vitest/coverage-istanbul": "4.1.10", + "@vitest/coverage-v8": "4.1.10", + "@vitest/ui": "4.1.10", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, - "requires": { - "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" + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "wrappy": { + "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 56a725a3..a5fa0bf5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hooks", - "version": "0.7.0", + "version": "0.8.1", "description": "Three projects are included - k8s: a kubernetes hook implementation that spins up pods dynamically to run a job - docker: A hook implementation of the runner's docker implementation - A hook lib, which contains shared typescript definitions and utilities that the other packages consume", "main": "", "directories": { @@ -8,10 +8,12 @@ }, "scripts": { "test": "npm run test --prefix packages/docker && npm run test --prefix packages/k8s", + "test:coverage": "vitest run --coverage", "bootstrap": "npm install --prefix packages/hooklib && npm install --prefix packages/k8s && npm install --prefix packages/docker", "format": "prettier --write '**/*.ts'", "format-check": "prettier --check '**/*.ts'", "lint": "eslint packages/**/*.ts", + "lint:fix": "eslint packages/**/*.ts --fix", "build-all": "npm run build --prefix packages/hooklib && npm run build --prefix packages/k8s && npm run build --prefix packages/docker" }, "repository": { @@ -25,12 +27,20 @@ }, "homepage": "https://github.com/actions/runner-container-hooks#readme", "devDependencies": { - "@types/jest": "^27.5.1", - "@types/node": "^17.0.23", - "@typescript-eslint/parser": "^5.18.0", - "eslint": "^8.12.0", - "eslint-plugin-github": "^4.3.6", - "prettier": "^2.6.2", - "typescript": "^4.6.3" + "@eslint/js": "^9.31.0", + "@types/jest": "^30.0.0", + "@types/node": "^24.0.14", + "@typescript-eslint/eslint-plugin": "^8.37.0", + "@typescript-eslint/parser": "^8.37.0", + "@vitest/coverage-v8": "^4.1.10", + "eslint": "^9.31.0", + "eslint-plugin-github": "^6.0.0", + "globals": "^15.12.0", + "prettier": "^3.6.2", + "typescript": "^5.8.3", + "vitest": "^4.1.10" + }, + "dependencies": { + "eslint-plugin-jest": "^29.0.1" } } diff --git a/packages/docker/jest.config.js b/packages/docker/jest.config.js index d5faddca..1db6c963 100644 --- a/packages/docker/jest.config.js +++ b/packages/docker/jest.config.js @@ -1,13 +1,26 @@ -// eslint-disable-next-line import/no-commonjs module.exports = { clearMocks: true, + preset: 'ts-jest', moduleFileExtensions: ['js', 'ts'], testEnvironment: 'node', testMatch: ['**/*-test.ts'], testRunner: 'jest-circus/runner', + verbose: true, transform: { - '^.+\\.ts$': 'ts-jest' + '^.+\\.ts$': [ + 'ts-jest', + { + tsconfig: 'tsconfig.test.json' + } + ], + // Transform ESM modules to CommonJS + '^.+\\.(js|mjs)$': ['babel-jest', { + presets: [['@babel/preset-env', { targets: { node: 'current' } }]] + }] }, - setupFilesAfterEnv: ['./jest.setup.js'], - verbose: true + transformIgnorePatterns: [ + // Transform these ESM packages + 'node_modules/(?!(shlex|@kubernetes/client-node|openid-client|oauth4webapi|jose|uuid)/)' + ], + setupFilesAfterEnv: ['./jest.setup.js'] } diff --git a/packages/docker/package-lock.json b/packages/docker/package-lock.json index 5916f71c..99e446fe 100644 --- a/packages/docker/package-lock.json +++ b/packages/docker/package-lock.json @@ -1,7 +1,7 @@ { "name": "dockerhooks", "version": "0.1.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9,239 +9,196 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@actions/core": "^1.9.1", - "@actions/exec": "^1.1.1", + "@actions/core": "^2.0.2", + "@actions/exec": "^2.0.0", "hooklib": "file:../hooklib", - "shlex": "^2.1.2", - "uuid": "^8.3.2" + "shlex": "^3.0.0", + "uuid": "^14.0.0" }, "devDependencies": { - "@types/jest": "^27.4.1", - "@types/node": "^17.0.23", - "@typescript-eslint/parser": "^5.18.0", - "@vercel/ncc": "^0.33.4", - "jest": "^27.5.1", - "ts-jest": "^27.1.4", - "ts-node": "^10.7.0", - "tsconfig-paths": "^3.14.1", - "typescript": "^4.6.3" - } - }, - "../hooklib": { - "version": "0.1.0", - "license": "MIT", - "dependencies": { - "@actions/core": "^1.9.1" - }, - "devDependencies": { - "@types/node": "^17.0.23", - "@typescript-eslint/parser": "^5.18.0", - "@zeit/ncc": "^0.22.3", - "eslint": "^8.12.0", - "eslint-plugin-github": "^4.3.6", - "prettier": "^2.6.2", - "typescript": "^4.6.3" + "@babel/core": "^7.29.0", + "@babel/preset-env": "^7.29.5", + "@types/jest": "^30.0.0", + "@types/node": "^24.0.14", + "@typescript-eslint/parser": "^8.59.4", + "@vercel/ncc": "^0.38.3", + "jest": "^30.4.2", + "ts-jest": "^29.4.9", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.8.3" } }, "node_modules/@actions/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz", - "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-2.0.3.tgz", + "integrity": "sha512-Od9Thc3T1mQJYddvVPM4QGiLUewdh+3txmDYHHxoNdkqysR1MbCT+rFOtNUxYAz+7+6RIsqipVahY2GJqGPyxA==", + "license": "MIT", "dependencies": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" + "@actions/exec": "^2.0.0", + "@actions/http-client": "^3.0.2" } }, "node_modules/@actions/exec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", - "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-2.0.0.tgz", + "integrity": "sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw==", + "license": "MIT", "dependencies": { - "@actions/io": "^1.0.1" + "@actions/io": "^2.0.0" } }, "node_modules/@actions/http-client": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", - "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.2.tgz", + "integrity": "sha512-JP38FYYpyqvUsz+Igqlc/JG6YO9PaKuvqjM3iGvaLqFnJ7TFmcLyy2IDrY0bI0qCQug8E9K+elv5ZNfw62ZJzA==", + "license": "MIT", "dependencies": { - "tunnel": "^0.0.6" + "tunnel": "^0.0.6", + "undici": "^6.23.0" } }, "node_modules/@actions/io": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.2.tgz", - "integrity": "sha512-d+RwPlMp+2qmBfeLYPLXuSRykDIFEwdTA0MMxzS9kh4kvP1ftrc/9fzy6pX6qAjthdXruHQ6/6kjT/DNo5ALuw==" - }, - "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" - }, - "engines": { - "node": ">=6.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-2.0.0.tgz", + "integrity": "sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==", + "license": "MIT" }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/types": "^7.29.7" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" } }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" + "@babel/helper-annotate-as-pure": "^7.29.7", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -250,249 +207,339 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-wrap-function": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.17.0" + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "node_modules/@babel/helper-wrap-function": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-async-generators": { @@ -500,6 +547,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -512,6 +560,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -524,6 +573,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -531,11 +581,60 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -548,6 +647,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -555,11 +655,28 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -572,6 +689,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -584,6 +702,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -596,6 +715,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -608,6 +728,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -620,6 +741,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -627,11 +749,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { + "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -642,13 +765,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -657,6672 +781,3626 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@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.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, "engines": { - "node": ">= 12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", "dev": true, + "license": "MIT", "dependencies": { - "@cspotcode/source-map-consumer": "0.8.0" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=10.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true, - "peer": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", "dev": true, + "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", "dev": true, + "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/template": "^7.29.7" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", "dev": true, + "license": "MIT", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", "dev": true, + "license": "MIT", "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", + "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", "dev": true, + "license": "MIT", "dependencies": { - "type-detect": "4.0.8" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", "dev": true, + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", + "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.3.0" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "*" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/jest": { - "version": "27.4.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", - "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", + "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==", "dev": true, + "license": "MIT", "dependencies": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "node_modules/@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", - "integrity": "sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.19.0.tgz", - "integrity": "sha512-yhktJjMCJX8BSBczh1F/uY8wGRYrBeyn84kH6oyqdIJwTGKmzX5Qiq49LRQ0Jh0LXnWijEziSo6BRqny8nqLVQ==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.19.0", - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/typescript-estree": "5.19.0", - "debug": "^4.3.2" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.19.0.tgz", - "integrity": "sha512-Fz+VrjLmwq5fbQn5W7cIJZ066HxLMKvDEmf4eu1tZ8O956aoX45jAuBB76miAECMTODyUxH61AQM7q4/GOMQ5g==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/visitor-keys": "5.19.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.19.0.tgz", - "integrity": "sha512-zR1ithF4Iyq1wLwkDcT+qFnhs8L5VUtjgac212ftiOP/ZZUOCuuF2DeGiZZGQXGoHA50OreZqLH5NjDcDqn34w==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.19.0.tgz", - "integrity": "sha512-dRPuD4ocXdaE1BM/dNR21elSEUPKaWgowCA0bqJ6YbYkvtrPVEvZ+zqcX5a8ECYn3q5iBSSUcBBD42ubaOp0Hw==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/visitor-keys": "5.19.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.19.0.tgz", - "integrity": "sha512-Ym7zZoMDZcAKWsULi2s7UMLREdVQdScPQ/fKWMYefarCztWlHPFVJo8racf8R0Gc8FAEJ2eD4of8As1oFtnQlQ==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.19.0", - "eslint-visitor-keys": "^3.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vercel/ncc": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.33.4.tgz", - "integrity": "sha512-ln18hs7dMffelP47tpkaR+V5Tj6coykNyxJrlcmCormPqRQjB/Gv4cu2FfBG+PMzIfdZp2CLDsrrB1NPU22Qhg==", - "dev": true, - "bin": { - "ncc": "dist/ncc/cli.js" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "node_modules/@babel/preset-env": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", + "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "@babel/compat-data": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.29.7", + "@babel/plugin-syntax-import-attributes": "^7.29.7", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.29.7", + "@babel/plugin-transform-async-generator-functions": "^7.29.7", + "@babel/plugin-transform-async-to-generator": "^7.29.7", + "@babel/plugin-transform-block-scoped-functions": "^7.29.7", + "@babel/plugin-transform-block-scoping": "^7.29.7", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-class-static-block": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", + "@babel/plugin-transform-computed-properties": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-dotall-regex": "^7.29.7", + "@babel/plugin-transform-duplicate-keys": "^7.29.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-dynamic-import": "^7.29.7", + "@babel/plugin-transform-explicit-resource-management": "^7.29.7", + "@babel/plugin-transform-exponentiation-operator": "^7.29.7", + "@babel/plugin-transform-export-namespace-from": "^7.29.7", + "@babel/plugin-transform-for-of": "^7.29.7", + "@babel/plugin-transform-function-name": "^7.29.7", + "@babel/plugin-transform-json-strings": "^7.29.7", + "@babel/plugin-transform-literals": "^7.29.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-modules-amd": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-modules-systemjs": "^7.29.7", + "@babel/plugin-transform-modules-umd": "^7.29.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-new-target": "^7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", + "@babel/plugin-transform-numeric-separator": "^7.29.7", + "@babel/plugin-transform-object-rest-spread": "^7.29.7", + "@babel/plugin-transform-object-super": "^7.29.7", + "@babel/plugin-transform-optional-catch-binding": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/plugin-transform-private-methods": "^7.29.7", + "@babel/plugin-transform-private-property-in-object": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-regenerator": "^7.29.7", + "@babel/plugin-transform-regexp-modifiers": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/plugin-transform-spread": "^7.29.7", + "@babel/plugin-transform-sticky-regex": "^7.29.7", + "@babel/plugin-transform-template-literals": "^7.29.7", + "@babel/plugin-transform-typeof-symbol": "^7.29.7", + "@babel/plugin-transform-unicode-escapes": "^7.29.7", + "@babel/plugin-transform-unicode-property-regex": "^7.29.7", + "@babel/plugin-transform-unicode-regex": "^7.29.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" }, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peer": true, + "node": ">=6.9.0" + }, "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, - "engines": { - "node": ">=0.4.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "4" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">= 6.0.0" + "node": ">=6.9.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, - "peer": true, + "license": "MIT", "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" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "dev": true, - "peer": true + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@babel/core": "^7.8.0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", + "peer": true, "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "*" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "dev": true, + "license": "Apache-2.0", + "peer": true, "dependencies": { - "fill-range": "^7.1.1" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], + "license": "MIT", + "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", + "peer": true, "dependencies": { - "node-int64": "^0.4.0" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@eslint/js": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, + "license": "Apache-2.0", + "peer": true, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001328", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001328.tgz", - "integrity": "sha512-Ue55jHkR/s4r00FLNiX+hGMMuwml/QGqqzVeMQ5thUewznU2EdULFvI3JR7JJid6OrjJNfFvHY2G2dIjmRaDDQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "dev": true, + "license": "Apache-2.0", + "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, + "license": "Apache-2.0", + "peer": true, "engines": { - "node": ">=10" + "node": ">=18.18.0" } }, - "node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, + "license": "Apache-2.0", + "peer": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", + "peer": true, "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { - "color-name": "~1.1.4" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { - "delayed-stream": "~1.0.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.1" + "sprintf-js": "~1.0.2" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { - "cssom": "~0.3.6" + "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "node_modules/@jest/console": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.4.1.tgz", + "integrity": "sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==", "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "node_modules/@jest/core": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.4.2.tgz", + "integrity": "sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.4.1", + "@jest/pattern": "30.4.0", + "@jest/reporters": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.4.1", + "jest-config": "30.4.2", + "jest-haste-map": "30.4.1", + "jest-message-util": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-resolve-dependencies": "30.4.2", + "jest-runner": "30.4.2", + "jest-runtime": "30.4.2", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "jest-watcher": "30.4.1", + "pretty-format": "30.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=0.3.1" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "node_modules/@jest/diff-sequences": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz", + "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==", "dev": true, + "license": "MIT", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/@jest/environment": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.4.1.tgz", + "integrity": "sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==", "dev": true, + "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "@jest/fake-timers": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-mock": "30.4.1" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/@jest/expect": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.4.1.tgz", + "integrity": "sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "expect": "30.4.1", + "jest-snapshot": "30.4.1" }, "engines": { - "node": ">=6.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "node_modules/@jest/expect-utils": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.4.1.tgz", + "integrity": "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==", "dev": true, + "license": "MIT", "dependencies": { - "webidl-conversions": "^5.0.0" + "@jest/get-type": "30.1.0" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "node_modules/@jest/fake-timers": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.4.1.tgz", + "integrity": "sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@sinonjs/fake-timers": "^15.4.0", + "@types/node": "*", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.107", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.107.tgz", - "integrity": "sha512-Huen6taaVrUrSy8o7mGStByba8PfOWWluHNxSHGBrCgEdFVLtvdQDBr9LBCF9Uci8SYxh28QNNMO0oC17wbGAg==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/@jest/globals": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.4.1.tgz", + "integrity": "sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==", "dev": true, + "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, + "@jest/environment": "30.4.1", + "@jest/expect": "30.4.1", + "@jest/types": "30.4.1", + "jest-mock": "30.4.1" + }, "engines": { - "node": ">=6" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", "dev": true, - "peer": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "node_modules/@jest/reporters": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.4.1.tgz", + "integrity": "sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==", "dev": true, + "license": "MIT", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", + "jest-worker": "30.4.1", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": ">=6.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, - "optionalDependencies": { - "source-map": "~0.6.1" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": ">= 0.8.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/@jest/snapshot-utils": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.4.1.tgz", + "integrity": "sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==", "dev": true, + "license": "MIT", "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "@jest/types": "30.4.1", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" }, "engines": { - "node": ">= 0.8.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, "engines": { - "node": ">= 0.8.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "node_modules/@jest/test-result": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.4.1.tgz", + "integrity": "sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2" + "@jest/console": "30.4.1", + "@jest/types": "30.4.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, "engines": { - "node": ">= 0.8.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", - "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", + "node_modules/@jest/test-sequencer": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.4.1.tgz", + "integrity": "sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "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.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" + "@jest/test-result": "30.4.1", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "slash": "^3.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "node_modules/@jest/transform": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.4.1.tgz", + "integrity": "sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@babel/core": "^7.27.4", + "@jest/types": "30.4.1", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-util": "30.4.1", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/@jest/types": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, - "peer": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "peer": true, - "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - }, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.0.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, - "peer": true, + "license": "MIT", + "optional": true, "dependencies": { - "estraverse": "^5.2.0" + "@tybys/wasm-util": "^0.10.3" }, - "engines": { - "node": ">=4.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=4.0" + "node": ">=14" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/@pkgr/core": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true, - "engines": { - "node": ">= 0.8.0" + "type-detect": "4.0.8" } }, - "node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "node_modules/@sinonjs/fake-timers": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", + "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "@sinonjs/commons": "^3.0.1" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true, - "peer": true + "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true, - "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" - }, - "engines": { - "node": ">=8.6.0" - } + "license": "MIT" }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "license": "MIT" }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "reusify": "^1.0.4" + "tslib": "^2.4.0" } }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { - "bser": "2.1.1" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "@babel/types": "^7.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "@babel/types": "^7.28.2" } }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, + "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/@types/node": { + "version": "24.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.2.tgz", + "integrity": "sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==", "dev": true, - "engines": { - "node": ">=6.9.0" + "license": "MIT", + "dependencies": { + "undici-types": "~7.13.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } + "license": "MIT" }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, - "engines": { - "node": ">=8.0.0" + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.63.0.tgz", + "integrity": "sha512-gwh4gvvlaVDKKxyfxMG+Gnu1u9X0OQBwyGLkbwB65dIzBKnxeRiJlNFqlI3zwVhNXJIs6qV7mlFCn/BIajlVig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.63.0", + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/typescript-estree": "8.63.0", + "@typescript-eslint/visitor-keys": "8.63.0", + "debug": "^4.4.3" + }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.63.0.tgz", + "integrity": "sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ==", "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@typescript-eslint/tsconfig-utils": "^8.63.0", + "@typescript-eslint/types": "^8.63.0", + "debug": "^4.4.3" }, "engines": { - "node": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.63.0.tgz", + "integrity": "sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/visitor-keys": "8.63.0" }, "engines": { - "node": ">=10.13.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.63.0.tgz", + "integrity": "sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg==", "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/@typescript-eslint/types": { + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.63.0.tgz", + "integrity": "sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q==", "dev": true, - "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" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.63.0.tgz", + "integrity": "sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "@typescript-eslint/project-service": "8.63.0", + "@typescript-eslint/tsconfig-utils": "8.63.0", + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/visitor-keys": "8.63.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">= 0.4.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/hooklib": { - "resolved": "../hooklib", - "link": true - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.63.0.tgz", + "integrity": "sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw==", "dev": true, + "license": "MIT", "dependencies": { - "whatwg-encoding": "^1.0.5" + "@typescript-eslint/types": "8.63.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, + "license": "Apache-2.0", "engines": { - "node": ">= 6" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "peer": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "dev": true, - "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dev": true, - "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dev": true, - "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "dev": true, - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dev": true, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true, - "peer": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "peer": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "peer": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "peer": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shlex": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/shlex/-/shlex-2.1.2.tgz", - "integrity": "sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true, - "peer": true - }, - "node_modules/throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-jest": { - "version": "27.1.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz", - "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@types/jest": "^27.0.0", - "babel-jest": ">=27.0.0 <28", - "jest": "^27.0.0", - "typescript": ">=3.8 <5.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@types/jest": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-node": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", - "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.0", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true, - "peer": true - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", - "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@actions/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz", - "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", - "requires": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" - } - }, - "@actions/exec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", - "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", - "requires": { - "@actions/io": "^1.0.1" - } - }, - "@actions/http-client": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", - "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", - "requires": { - "tunnel": "^0.0.6" - } - }, - "@actions/io": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.2.tgz", - "integrity": "sha512-d+RwPlMp+2qmBfeLYPLXuSRykDIFEwdTA0MMxzS9kh4kvP1ftrc/9fzy6pX6qAjthdXruHQ6/6kjT/DNo5ALuw==" - }, - "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.0" - } - }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true - }, - "@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true - }, - "@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" - } - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@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.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true + "license": "ISC" }, - "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "dev": true, - "peer": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, - "peer": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true, - "peer": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - } - }, - "@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - } - }, - "@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - } - }, - "@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - } - }, - "@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "dev": true, - "requires": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - } - }, - "@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "type-detect": "4.0.8" - } + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", + "cpu": [ + "ppc64" + ], "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", + "cpu": [ + "riscv64" + ], "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "@types/jest": { - "version": "27.4.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", - "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", + "cpu": [ + "riscv64" + ], "dev": true, - "requires": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "@types/prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", - "integrity": "sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==", - "dev": true + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@types/yargs-parser": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] }, - "@typescript-eslint/parser": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.19.0.tgz", - "integrity": "sha512-yhktJjMCJX8BSBczh1F/uY8wGRYrBeyn84kH6oyqdIJwTGKmzX5Qiq49LRQ0Jh0LXnWijEziSo6BRqny8nqLVQ==", + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", + "cpu": [ + "wasm32" + ], "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.19.0", - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/typescript-estree": "5.19.0", - "debug": "^4.3.2" + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" } }, - "@typescript-eslint/scope-manager": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.19.0.tgz", - "integrity": "sha512-Fz+VrjLmwq5fbQn5W7cIJZ066HxLMKvDEmf4eu1tZ8O956aoX45jAuBB76miAECMTODyUxH61AQM7q4/GOMQ5g==", + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/visitor-keys": "5.19.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "@typescript-eslint/types": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.19.0.tgz", - "integrity": "sha512-zR1ithF4Iyq1wLwkDcT+qFnhs8L5VUtjgac212ftiOP/ZZUOCuuF2DeGiZZGQXGoHA50OreZqLH5NjDcDqn34w==", - "dev": true + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "@typescript-eslint/typescript-estree": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.19.0.tgz", - "integrity": "sha512-dRPuD4ocXdaE1BM/dNR21elSEUPKaWgowCA0bqJ6YbYkvtrPVEvZ+zqcX5a8ECYn3q5iBSSUcBBD42ubaOp0Hw==", + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "@typescript-eslint/types": "5.19.0", - "@typescript-eslint/visitor-keys": "5.19.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "@typescript-eslint/visitor-keys": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.19.0.tgz", - "integrity": "sha512-Ym7zZoMDZcAKWsULi2s7UMLREdVQdScPQ/fKWMYefarCztWlHPFVJo8racf8R0Gc8FAEJ2eD4of8As1oFtnQlQ==", + "node_modules/@vercel/ncc": { + "version": "0.38.4", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.4.tgz", + "integrity": "sha512-8LwjnlP39s08C08J5NstzriPvW1SP8Zfpp1BvC2sI35kPeZnHfxVkCwu4/+Wodgnd60UtT1n8K8zw+Mp7J9JmQ==", "dev": true, - "requires": { - "@typescript-eslint/types": "5.19.0", - "eslint-visitor-keys": "^3.0.0" + "license": "MIT", + "bin": { + "ncc": "dist/ncc/cli.js" } }, - "@vercel/ncc": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.33.4.tgz", - "integrity": "sha512-ln18hs7dMffelP47tpkaR+V5Tj6coykNyxJrlcmCormPqRQjB/Gv4cu2FfBG+PMzIfdZp2CLDsrrB1NPU22Qhg==", - "dev": true - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } + "engines": { + "node": ">=0.4.0" } }, - "acorn-jsx": { + "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peer": true, - "requires": {} - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, - "requires": { - "debug": "4" + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" } }, - "ajv": { + "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "peer": true, - "requires": { + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "ansi-escapes": { + "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "type-fest": "^0.21.3" }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0", + "peer": true + }, + "node_modules/babel-jest": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.4.1.tgz", + "integrity": "sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.4.1", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.4.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" } }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/babel-plugin-jest-hoist": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.4.0.tgz", + "integrity": "sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==", "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", "dev": true, - "peer": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dev": true, - "requires": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^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.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-top-level-await": "^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" } }, - "babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "node_modules/babel-preset-jest": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.4.0.tgz", + "integrity": "sha512-lBY4jxsNmCnSiu7kquw8ZC9F4+XLMOKypT3RnNHPvU2Kpd4W0xaPuLr5ZkRyOsvLYAY4yaW1ZwTW4xB7NIiZzg==", "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.4.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/baseline-browser-mapping": { + "version": "2.10.42", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", + "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==", "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "requires": { - "fill-range": "^7.1.1" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" } }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "node_modules/browserslist": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz", + "integrity": "sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.42", + "caniuse-lite": "^1.0.30001800", + "electron-to-chromium": "^1.5.387", + "node-releases": "^2.0.50", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "bs-logger": { + "node_modules/bs-logger": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" } }, - "bser": { + "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "requires": { + "license": "Apache-2.0", + "dependencies": { "node-int64": "^0.4.0" } }, - "buffer-from": { + "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, - "callsites": { + "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "camelcase": { + "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "caniuse-lite": { - "version": "1.0.30001328", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001328.tgz", - "integrity": "sha512-Ue55jHkR/s4r00FLNiX+hGMMuwml/QGqqzVeMQ5thUewznU2EdULFvI3JR7JJid6OrjJNfFvHY2G2dIjmRaDDQ==", - "dev": true + "node_modules/caniuse-lite": { + "version": "1.0.30001803", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", + "integrity": "sha512-g/uHREV2ZpK9qMalCsWaxmA6ol+DX8GYhuf3T40RKoP+oL7vhRJh8LNt73PCjpnR6l14FzfPrB5Yux4PKm2meg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" }, - "chalk": { + "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "char-regex": { + "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "co": { + "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" }, - "color-convert": { + "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } + "license": "MIT" }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "node_modules/core-js-compat": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "dev": true, - "requires": { - "safe-buffer": "~5.1.1" + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "create-require": { + "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, - "requires": { - "cssom": "~0.3.6" - }, + "license": "MIT", "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, - "requires": { - "ms": "2.1.2" + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } } }, - "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-is": { + "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true + "dev": true, + "license": "MIT", + "peer": true }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "detect-newline": { + "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "diff": { + "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "requires": { - "path-type": "^4.0.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, - "peer": true, - "requires": { - "esutils": "^2.0.2" - } + "license": "MIT" }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "node_modules/electron-to-chromium": { + "version": "1.5.388", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.388.tgz", + "integrity": "sha512-Pl/aJaqOOxYxda3vcx1IKSJimwYXHDkEnGn0F+kG2EE68dDtx2uCinaS+Vih8Z91B9t8CSAbiF/HKyWcnXjhzw==", "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "electron-to-chromium": { - "version": "1.4.107", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.107.tgz", - "integrity": "sha512-Huen6taaVrUrSy8o7mGStByba8PfOWWluHNxSHGBrCgEdFVLtvdQDBr9LBCF9Uci8SYxh28QNNMO0oC17wbGAg==", - "dev": true - }, - "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "is-arrayish": "^0.2.1" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "peer": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", - "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", + "node_modules/eslint": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, + "license": "MIT", "peer": true, - "requires": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.36.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, + "license": "BSD-2-Clause", "peer": true, - "requires": { + "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, + "license": "Apache-2.0", "peer": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "peer": true - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, + "license": "BSD-2-Clause", "peer": true, - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "esprima": { + "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "peer": true, - "requires": { + "dependencies": { "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "esrecurse": { + "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "peer": true, - "requires": { + "dependencies": { "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } }, - "esutils": { + "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "execa": { + "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", @@ -7332,1850 +4410,2667 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } }, - "expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "node_modules/expect": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.4.1.tgz", + "integrity": "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.4.1", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "fast-deep-equal": { + "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, + "license": "MIT", "peer": true }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, - "fast-levenshtein": { + "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, - "requires": { - "reusify": "^1.0.4" - } + "license": "MIT", + "peer": true }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "requires": { + "license": "Apache-2.0", + "dependencies": { "bser": "2.1.1" } }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "peer": true, - "requires": { - "flat-cache": "^3.0.4" + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" } }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "requires": { - "to-regex-range": "^5.0.1" + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "peer": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" } }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, + "license": "ISC", "peer": true }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, - "optional": true + "license": "ISC" }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "peer": true + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "gensync": { + "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "get-caller-file": { + "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "get-package-type": { + "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } }, - "get-stream": { + "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "peer": true, - "requires": { + "dependencies": { "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, - "peer": true, - "requires": { - "type-fest": "^0.20.2" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, - "requires": { - "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" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, - "requires": { - "function-bind": "^1.1.1" + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "has-flag": { + "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "hooklib": { - "version": "file:../hooklib", - "requires": { - "@actions/core": "^1.9.1", - "@types/node": "^17.0.23", - "@typescript-eslint/parser": "^5.18.0", - "@zeit/ncc": "^0.22.3", - "eslint": "^8.12.0", - "eslint-plugin-github": "^4.3.6", - "prettier": "^2.6.2", - "typescript": "^4.6.3" - } - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" + "node_modules/hooklib": { + "version": "0.1.0", + "resolved": "file:../hooklib", + "license": "MIT", + "dependencies": { + "@actions/core": "^2.0.2" } }, - "human-signals": { + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" } }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4" + } }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "peer": true, - "requires": { + "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, - "is-arrayish": { + "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, - "requires": { - "has": "^1.0.3" + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "is-generator-fn": { + "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "requires": { + "license": "MIT", + "peer": true, + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-stream": { + "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "engines": { + "node": ">=10" } }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "requires": { + "license": "BSD-3-Clause", + "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, - "requires": { + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" } }, - "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, - "requires": { + "license": "BSD-3-Clause", + "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "node_modules/jest": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.4.2.tgz", + "integrity": "sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ==", "dev": true, - "requires": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" + "license": "MIT", + "dependencies": { + "@jest/core": "30.4.2", + "@jest/types": "30.4.1", + "import-local": "^3.2.0", + "jest-cli": "30.4.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "node_modules/jest-changed-files": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.4.1.tgz", + "integrity": "sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.4.1", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "node_modules/jest-circus": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.4.2.tgz", + "integrity": "sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==", "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "license": "MIT", + "dependencies": { + "@jest/environment": "30.4.1", + "@jest/expect": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "chalk": "^4.0.0", + "chalk": "^4.1.2", "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.4.1", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-runtime": "30.4.2", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", + "p-limit": "^3.1.0", + "pretty-format": "30.4.1", + "pure-rand": "^7.0.0", "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "node_modules/jest-cli": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.4.2.tgz", + "integrity": "sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q==", "dev": true, - "requires": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - } - }, - "jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dev": true, - "requires": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", + "license": "MIT", + "dependencies": { + "@jest/core": "30.4.2", + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.4.2", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.4.2.tgz", + "integrity": "sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.4.0", + "@jest/test-sequencer": "30.4.1", + "@jest/types": "30.4.1", + "babel-jest": "30.4.1", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-circus": "30.4.2", + "jest-docblock": "30.4.0", + "jest-environment-node": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-runner": "30.4.2", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", + "pretty-format": "30.4.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "node_modules/jest-diff": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", + "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.4.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "node_modules/jest-docblock": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.4.0.tgz", + "integrity": "sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==", "dev": true, - "requires": { - "detect-newline": "^3.0.0" + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "node_modules/jest-each": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.4.1.tgz", + "integrity": "sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.4.1", + "chalk": "^4.1.2", + "jest-util": "30.4.1", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "node_modules/jest-environment-node": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.4.1.tgz", + "integrity": "sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==", "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", + "license": "MIT", + "dependencies": { + "@jest/environment": "30.4.1", + "@jest/fake-timers": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" + "jest-mock": "30.4.1", + "jest-util": "30.4.1", + "jest-validate": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "node_modules/jest-haste-map": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.4.1.tgz", + "integrity": "sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==", "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.4.0", + "jest-util": "30.4.1", + "jest-worker": "30.4.1", + "picomatch": "^4.0.3", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-haste-map/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true + "node_modules/jest-leak-detector": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.4.1.tgz", + "integrity": "sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } }, - "jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "node_modules/jest-matcher-utils": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz", + "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - } - }, - "jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dev": true, - "requires": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.4.1", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "node_modules/jest-message-util": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.4.1", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", + "picomatch": "^4.0.3", + "pretty-format": "30.4.1", "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-mock": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", + "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.4.1.tgz", + "integrity": "sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*" + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "node_modules/jest-resolve-dependencies": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.4.2.tgz", + "integrity": "sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ==", "dev": true, - "requires": {} + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.4.0", + "jest-snapshot": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } }, - "jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true + "node_modules/jest-runner": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.4.2.tgz", + "integrity": "sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.4.1", + "@jest/environment": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.4.0", + "jest-environment-node": "30.4.1", + "jest-haste-map": "30.4.1", + "jest-leak-detector": "30.4.1", + "jest-message-util": "30.4.1", + "jest-resolve": "30.4.1", + "jest-runtime": "30.4.2", + "jest-util": "30.4.1", + "jest-watcher": "30.4.1", + "jest-worker": "30.4.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } }, - "jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "node_modules/jest-runtime": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.4.2.tgz", + "integrity": "sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" + "license": "MIT", + "dependencies": { + "@jest/environment": "30.4.1", + "@jest/fake-timers": "30.4.1", + "@jest/globals": "30.4.1", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "node_modules/jest-snapshot": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.4.1.tgz", + "integrity": "sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.4.1", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.4.1", + "graceful-fs": "^4.2.11", + "jest-diff": "30.4.1", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", + "pretty-format": "30.4.1", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "node_modules/jest-util": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - } - }, - "jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - } - }, - "jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dev": true, - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "node_modules/jest-validate": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.4.1.tgz", + "integrity": "sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.4.1", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" + "license": "MIT", + "engines": { + "node": ">=10" }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "node_modules/jest-watcher": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.4.1.tgz", + "integrity": "sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw==", "dev": true, - "requires": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.4.1", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "node_modules/jest-worker": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.4.1.tgz", + "integrity": "sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.4.1", "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "supports-color": "^8.1.1" }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "js-tokens": { + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, - "js-yaml": { + "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "peer": true, - "requires": { + "dependencies": { "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" } }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, - "json-schema-traverse": { + "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, + "license": "MIT", "peer": true }, - "json-stable-stringify-without-jsonify": { + "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, + "license": "MIT", "peer": true }, - "json5": { + "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } }, - "leven": { + "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "levn": { + "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "peer": true, - "requires": { + "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "lines-and-columns": { + "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" }, - "lodash.memoize": { + "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" }, - "lodash.merge": { + "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, + "license": "MIT", "peer": true }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "requires": { - "yallist": "^4.0.0" + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" } }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "requires": { - "semver": "^6.0.0" - }, + "license": "MIT", "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "make-error": { + "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, - "makeerror": { + "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "requires": { + "license": "BSD-3-Clause", + "dependencies": { "tmpl": "1.0.5" } }, - "merge-stream": { + "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "dev": true, + "license": "MIT" }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "requires": { - "mime-db": "1.52.0" + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "requires": { - "brace-expansion": "^1.1.7" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } }, - "natural-compare": { + "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" }, - "node-int64": { + "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" }, - "node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", - "dev": true + "node_modules/node-releases": { + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", + "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "npm-run-path": { + "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "peer": true, - "requires": { + "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, - "parent-module": { + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "peer": true, - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "parse-json": { + "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, - "picomatch": { + "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "find-up": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "prelude-ls": { + "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "peer": true + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "node_modules/pretty-format": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, + "license": "MIT", "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } + "@jest/schemas": "30.4.1", + "ansi-styles": "^5.2.0", + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true + "node_modules/react-is-18": { + "name": "react-is", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "node_modules/react-is-19": { + "name": "react-is", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "dev": true, + "license": "MIT" }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, - "peer": true + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, - "requires": { - "is-core-module": "^2.8.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-cwd": { + "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "resolve-from": "^5.0.0" }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "peer": true - }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" + "engines": { + "node": ">=8" } }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "requires": { - "queue-microtask": "^1.2.2" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "requires": { - "xmlchars": "^2.2.0" + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" } }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "requires": { - "lru-cache": "^6.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shlex": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/shlex/-/shlex-2.1.2.tgz", - "integrity": "sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==" + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/shlex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shlex/-/shlex-3.0.0.tgz", + "integrity": "sha512-jHPXQQk9d/QXCvJuLPYMOYWez3c43sORAgcIEoV7bFv5AJSJRAOyw5lQO12PMfd385qiLRCaDt7OtEzgrIGZUA==", + "license": "MIT" }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "source-map": { + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "escape-string-regexp": "^2.0.0" }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "string-length": { + "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "string-width": { + "node_modules/string-width-cjs": { + "name": "string-width", "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "strip-ansi": { + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "strip-json-comments": { + "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "supports-color": { + "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "supports-preserve-symlinks-flag": { + "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "node_modules/synckit": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", + "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.3.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" } }, - "test-exclude": { + "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "peer": true + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "tmpl": { + "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, - "requires": { - "is-number": "^7.0.0" + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "node_modules/ts-jest": { + "version": "29.4.11", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.11.tgz", + "integrity": "sha512-IrFl7l9AuB/qrNw5quqvAv/hmKMb8dhWOH4jQOGo0Oq8tCeo1O86/iTFG1FaRimgUkF13l4PcepO8ATFT6Ns4g==", "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.9", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.8.0", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <7" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } } }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "node_modules/ts-jest/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, - "requires": { - "punycode": "^2.1.1" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "ts-jest": { - "version": "27.1.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz", - "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==", + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ts-node": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", - "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.7.0", + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -9186,328 +7081,587 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.0", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true } } }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } + "engines": { + "node": ">=6" } }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "requires": { - "tslib": "^1.8.1" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "tunnel": { + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } }, - "type-check": { + "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "peer": true, - "requires": { + "dependencies": { "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici": { + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", + "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", + "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, - "peer": true + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "node_modules/unrs-resolver": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.4" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, - "requires": { - "is-typedarray": "^1.0.0" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "dev": true - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - }, - "uri-js": { + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "peer": true, - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "node_modules/uuid": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" } }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, - "peer": true - }, - "v8-compile-cache-lib": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", - "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==", - "dev": true + "license": "MIT" }, - "v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" + "convert-source-map": "^2.0.0" }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" + "engines": { + "node": ">=10.12.0" } }, - "walker": { + "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "requires": { + "license": "Apache-2.0", + "dependencies": { "makeerror": "1.0.12" } }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "word-wrap": { + "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, - "wrap-ansi": { + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": {} + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "dev": true, - "requires": { - "cliui": "^7.0.2", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "yn": { + "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/packages/docker/package.json b/packages/docker/package.json index ea8ba849..2d620f76 100644 --- a/packages/docker/package.json +++ b/packages/docker/package.json @@ -13,21 +13,23 @@ "author": "", "license": "MIT", "dependencies": { - "@actions/core": "^1.9.1", - "@actions/exec": "^1.1.1", + "@actions/core": "^2.0.2", + "@actions/exec": "^2.0.0", "hooklib": "file:../hooklib", - "shlex": "^2.1.2", - "uuid": "^8.3.2" + "shlex": "^3.0.0", + "uuid": "^14.0.0" }, "devDependencies": { - "@types/jest": "^27.4.1", - "@types/node": "^17.0.23", - "@typescript-eslint/parser": "^5.18.0", - "@vercel/ncc": "^0.33.4", - "jest": "^27.5.1", - "ts-jest": "^27.1.4", - "ts-node": "^10.7.0", - "tsconfig-paths": "^3.14.1", - "typescript": "^4.6.3" + "@babel/core": "^7.29.0", + "@babel/preset-env": "^7.29.5", + "@types/jest": "^30.0.0", + "@types/node": "^24.0.14", + "@typescript-eslint/parser": "^8.59.4", + "@vercel/ncc": "^0.38.3", + "jest": "^30.4.2", + "ts-jest": "^29.4.9", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.8.3" } } diff --git a/packages/docker/src/dockerCommands/container.spec.ts b/packages/docker/src/dockerCommands/container.spec.ts new file mode 100644 index 00000000..5ec68d07 --- /dev/null +++ b/packages/docker/src/dockerCommands/container.spec.ts @@ -0,0 +1,54 @@ +vi.mock('../utils', () => ({ + runDockerCommand: vi.fn().mockResolvedValue('container-id-abc'), + RunDockerCommandOptions: {} +})) + +vi.mock('@actions/core', () => ({ + debug: vi.fn(), + info: vi.fn(), + warning: vi.fn(), + error: vi.fn() +})) + +import { createContainer } from './container' +import { runDockerCommand } from '../utils' + +describe('createContainer mount volumes', () => { + beforeEach(() => { + process.env.RUNNER_NAME = 'test-runner' + }) + + afterEach(() => { + vi.clearAllMocks() + delete process.env.RUNNER_NAME + }) + + it('appends :ro suffix for readOnly user mount volumes (lines 62-64)', async () => { + await createContainer( + { + image: 'ubuntu:latest', + userMountVolumes: [ + { + sourceVolumePath: '/src/ro', + targetVolumePath: '/mnt/ro', + readOnly: true + } + ], + systemMountVolumes: [ + { + sourceVolumePath: '/src/rw', + targetVolumePath: '/mnt/rw', + readOnly: false + } + ] + } as any, + 'test-container', + 'test-network' + ) + + const call = (runDockerCommand as any).mock.calls[0] + const dockerArgs: string[] = call[0] + expect(dockerArgs).toContain('-v=/src/ro:/mnt/ro:ro') + expect(dockerArgs).toContain('-v=/src/rw:/mnt/rw') + }) +}) diff --git a/packages/docker/src/dockerCommands/container.ts b/packages/docker/src/dockerCommands/container.ts index 807d77a0..99e30ace 100644 --- a/packages/docker/src/dockerCommands/container.ts +++ b/packages/docker/src/dockerCommands/container.ts @@ -59,7 +59,9 @@ export async function createContainer( ] for (const mountVolume of mountVolumes) { dockerArgs.push( - `-v=${mountVolume.sourceVolumePath}:${mountVolume.targetVolumePath}` + `-v=${mountVolume.sourceVolumePath}:${mountVolume.targetVolumePath}${ + mountVolume.readOnly ? ':ro' : '' + }` ) } if (args.entryPoint) { diff --git a/packages/docker/src/utils/index.spec.ts b/packages/docker/src/utils/index.spec.ts new file mode 100644 index 00000000..88e43966 --- /dev/null +++ b/packages/docker/src/utils/index.spec.ts @@ -0,0 +1,103 @@ +import { + optionsWithDockerEnvs, + sanitize, + fixArgs, + checkEnvironment +} from './index' + +describe('sanitize', () => { + it('strips non-alphanumeric chars except underscore', () => { + expect(sanitize('ubuntu:latest')).toBe('ubuntulatest') + }) + + it('returns same string for valid identifier', () => { + expect(sanitize('teststr8_one')).toBe('teststr8_one') + }) + + it('returns empty string for empty input', () => { + expect(sanitize('')).toBe('') + }) + + it('strips leading non-alpha chars', () => { + expect(sanitize('123abc')).toBe('abc') + }) +}) + +describe('fixArgs', () => { + it('splits quoted arguments', () => { + expect(fixArgs(['"Hello', 'World"'])).toStrictEqual(['Hello World']) + }) + + it('handles complex shell quoting', () => { + expect( + fixArgs([ + 'sh', + '-c', + `'[ $(cat /etc/*release* | grep -i -e "^ID=*alpine*" -c) != 0 ] || exit 1'` + ]) + ).toStrictEqual([ + 'sh', + '-c', + `[ $(cat /etc/*release* | grep -i -e "^ID=*alpine*" -c) != 0 ] || exit 1` + ]) + }) + + it('returns plain args unchanged', () => { + expect(fixArgs(['ls', '-la'])).toStrictEqual(['ls', '-la']) + }) +}) + +describe('optionsWithDockerEnvs', () => { + afterEach(() => { + delete process.env.DOCKER_HOST + delete process.env.DOCKER_NOTEXIST + }) + + it('injects known docker env vars into options', () => { + process.env.DOCKER_HOST = 'unix:///run/user/1001/docker.sock' + process.env.DOCKER_NOTEXIST = 'should-not-appear' + + for (const opt of [undefined, {}, { env: {} }]) { + const options = optionsWithDockerEnvs(opt as any) + expect(options?.env?.DOCKER_HOST).toBe(process.env.DOCKER_HOST) + expect(options?.env?.DOCKER_NOTEXIST).toBeUndefined() + } + }) + + it('preserves workingDir and input from original options', () => { + process.env.DOCKER_HOST = 'unix:///run/user/1001/docker.sock' + const opt = { workingDir: 'test', input: Buffer.from('test') } + const options = optionsWithDockerEnvs(opt) + expect(options?.workingDir).toBe('test') + expect(options?.input).toBe(opt.input) + }) + + it('overwrites DOCKER_HOST in provided env with process env value', () => { + process.env.DOCKER_HOST = 'unix:///run/user/1001/docker.sock' + const opt = { env: { DOCKER_HOST: 'unix://var/run/docker.sock' } } + const options = optionsWithDockerEnvs(opt) + expect(options?.env?.DOCKER_HOST).toBe(process.env.DOCKER_HOST) + }) +}) + +describe('checkEnvironment', () => { + const original = process.env.GITHUB_WORKSPACE + + afterEach(() => { + if (original === undefined) { + delete process.env.GITHUB_WORKSPACE + } else { + process.env.GITHUB_WORKSPACE = original + } + }) + + it('does not throw when GITHUB_WORKSPACE is set', () => { + process.env.GITHUB_WORKSPACE = '/home/runner/work/repo' + expect(() => checkEnvironment()).not.toThrow() + }) + + it('throws when GITHUB_WORKSPACE is not set', () => { + delete process.env.GITHUB_WORKSPACE + expect(() => checkEnvironment()).toThrow('GITHUB_WORKSPACE is not set') + }) +}) diff --git a/packages/docker/src/utils.ts b/packages/docker/src/utils/index.ts similarity index 98% rename from packages/docker/src/utils.ts rename to packages/docker/src/utils/index.ts index bdfe5c0f..ee6abc51 100644 --- a/packages/docker/src/utils.ts +++ b/packages/docker/src/utils/index.ts @@ -1,6 +1,5 @@ /* eslint-disable @typescript-eslint/no-var-requires */ /* eslint-disable @typescript-eslint/no-require-imports */ -/* eslint-disable import/no-commonjs */ import * as core from '@actions/core' import { env } from 'process' // Import this way otherwise typescript has errors diff --git a/packages/docker/tests/test-setup.ts b/packages/docker/tests/test-setup.ts index 2100797e..8394ded3 100644 --- a/packages/docker/tests/test-setup.ts +++ b/packages/docker/tests/test-setup.ts @@ -31,7 +31,7 @@ export default class TestSetup { private get allTestDirectories() { const resp = [this.testdir, this.runnerMockDir, this.runnerOutputDir] - for (const [key, value] of Object.entries(this.runnerMockSubdirs)) { + for (const [, value] of Object.entries(this.runnerMockSubdirs)) { resp.push(`${this.runnerMockDir}/${value}`) } @@ -42,12 +42,11 @@ export default class TestSetup { return resp } - public initialize(): void { + initialize(): void { env['GITHUB_WORKSPACE'] = this.workingDirectory env['RUNNER_NAME'] = 'test' - env[ - 'RUNNER_TEMP' - ] = `${this.runnerMockDir}/${this.runnerMockSubdirs.workTemp}` + env['RUNNER_TEMP'] = + `${this.runnerMockDir}/${this.runnerMockSubdirs.workTemp}` for (const dir of this.allTestDirectories) { fs.mkdirSync(dir, { recursive: true }) @@ -59,7 +58,7 @@ export default class TestSetup { ) } - public teardown(): void { + teardown(): void { fs.rmdirSync(this.testdir, { recursive: true }) } @@ -108,21 +107,21 @@ export default class TestSetup { ] } - public createOutputFile(name: string): string { + createOutputFile(name: string): string { let filePath = path.join(this.runnerOutputDir, name || `${uuidv4()}.json`) fs.writeFileSync(filePath, '') return filePath } - public get workingDirectory(): string { + get workingDirectory(): string { return `${this.runnerMockDir}/_work/${this.projectName}/${this.projectName}` } - public get containerWorkingDirectory(): string { + get containerWorkingDirectory(): string { return `/__w/${this.projectName}/${this.projectName}` } - public initializeDockerAction(): string { + initializeDockerAction(): string { const actionPath = `${this.testdir}/_actions/example-handle/example-repo/example-branch/mock-directory` fs.mkdirSync(actionPath, { recursive: true }) this.writeDockerfile(actionPath) @@ -147,7 +146,7 @@ echo "::set-output name=time::$time"` fs.chmodSync(entryPointPath, 0o755) } - public getPrepareJobDefinition(): HookData { + getPrepareJobDefinition(): HookData { const prepareJob = JSON.parse( fs.readFileSync( path.resolve(__dirname + '/../../../examples/prepare-job.json'), @@ -166,7 +165,7 @@ echo "::set-output name=time::$time"` return prepareJob } - public getRunScriptStepDefinition(): HookData { + getRunScriptStepDefinition(): HookData { const runScriptStep = JSON.parse( fs.readFileSync( path.resolve(__dirname + '/../../../examples/run-script-step.json'), @@ -178,7 +177,7 @@ echo "::set-output name=time::$time"` return runScriptStep } - public getRunContainerStepDefinition(): HookData { + getRunContainerStepDefinition(): HookData { const runContainerStep = JSON.parse( fs.readFileSync( path.resolve(__dirname + '/../../../examples/run-container-step.json'), diff --git a/packages/docker/tsconfig.json b/packages/docker/tsconfig.json index 063081c7..35c91695 100644 --- a/packages/docker/tsconfig.json +++ b/packages/docker/tsconfig.json @@ -3,9 +3,14 @@ "compilerOptions": { "baseUrl": "./", "outDir": "./lib", - "rootDir": "./src" + "rootDir": "./src", + "skipLibCheck": true, + "types": ["node"] }, "include": [ "./src" + ], + "exclude": [ + "src/**/*.spec.ts" ] - } \ No newline at end of file + } diff --git a/packages/docker/tsconfig.test.json b/packages/docker/tsconfig.test.json new file mode 100644 index 00000000..3accd4fe --- /dev/null +++ b/packages/docker/tsconfig.test.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "allowJs": true, + "types": ["node", "jest"] + }, + "extends": "./tsconfig.json" +} \ No newline at end of file diff --git a/packages/hooklib/package-lock.json b/packages/hooklib/package-lock.json index 1a51297c..e6e47ef0 100644 --- a/packages/hooklib/package-lock.json +++ b/packages/hooklib/package-lock.json @@ -1,7 +1,7 @@ { "name": "hooklib", "version": "0.1.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9,328 +9,586 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@actions/core": "^1.9.1" + "@actions/core": "^2.0.2" }, "devDependencies": { - "@types/node": "^17.0.23", - "@typescript-eslint/parser": "^5.18.0", + "@types/node": "^24.0.14", "@zeit/ncc": "^0.22.3", - "eslint": "^8.12.0", - "eslint-plugin-github": "^4.3.6", - "prettier": "^2.6.2", - "typescript": "^4.6.3" + "eslint": "^9.31.0", + "eslint-plugin-github": "^6.0.0", + "prettier": "^3.6.2", + "typescript": "^5.8.3" } }, "node_modules/@actions/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz", - "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-2.0.2.tgz", + "integrity": "sha512-Ast1V7yHbGAhplAsuVlnb/5J8Mtr/Zl6byPPL+Qjq3lmfIgWF1ak1iYfF/079cRERiuTALTXkSuEUdZeDCfGtA==", + "license": "MIT", + "dependencies": { + "@actions/exec": "^2.0.0", + "@actions/http-client": "^3.0.1" + } + }, + "node_modules/@actions/exec": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-2.0.0.tgz", + "integrity": "sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw==", + "license": "MIT", "dependencies": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" + "@actions/io": "^2.0.0" } }, "node_modules/@actions/http-client": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", - "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.1.tgz", + "integrity": "sha512-SbGS8c/vySbNO3kjFgSW77n83C4MQx/Yoe+b1hAdpuvfHxnkHzDq2pWljUpAA56Si1Gae/7zjeZsV0CYjmLo/w==", + "license": "MIT", + "dependencies": { + "tunnel": "^0.0.6", + "undici": "^5.28.5" + } + }, + "node_modules/@actions/io": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-2.0.0.tgz", + "integrity": "sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==", + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.1.tgz", + "integrity": "sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.40 || 9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "tunnel": "^0.0.6" + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=10.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@github/browserslist-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@github/browserslist-config/-/browserslist-config-1.0.0.tgz", + "integrity": "sha512-gIhjdJp/c2beaIWWIlsXdqXVRUz3r2BxBCpfz/F3JXHvSAQ1paMYjLH+maEATtENg+k5eLV7gA+9yPp762ieuw==", + "dev": true, + "license": "MIT" }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">= 8" + "node": ">=18.18.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 8" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "17.0.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz", - "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==", - "dev": true + "version": "24.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", + "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.20.0.tgz", - "integrity": "sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz", + "integrity": "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.20.0", - "@typescript-eslint/type-utils": "5.20.0", - "@typescript-eslint/utils": "5.20.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/type-utils": "8.53.0", + "@typescript-eslint/utils": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.53.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.20.0.tgz", - "integrity": "sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.0.tgz", + "integrity": "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.20.0", - "@typescript-eslint/types": "5.20.0", - "@typescript-eslint/typescript-estree": "5.20.0", - "debug": "^4.3.2" + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz", - "integrity": "sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz", + "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.20.0", - "@typescript-eslint/visitor-keys": "5.20.0" + "@typescript-eslint/tsconfig-utils": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "debug": "^4.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.20.0.tgz", - "integrity": "sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz", + "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "5.20.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, - "node_modules/@typescript-eslint/types": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz", - "integrity": "sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz", + "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz", - "integrity": "sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz", + "integrity": "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.20.0", - "@typescript-eslint/visitor-keys": "5.20.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/utils": "8.53.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.20.0.tgz", - "integrity": "sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==", + "node_modules/@typescript-eslint/types": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", + "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz", + "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.20.0", - "@typescript-eslint/types": "5.20.0", - "@typescript-eslint/typescript-estree": "5.20.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@typescript-eslint/project-service": "8.53.0", + "@typescript-eslint/tsconfig-utils": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/@typescript-eslint/utils": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz", + "integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==", "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0" + }, "engines": { - "node": ">=4.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz", - "integrity": "sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz", + "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.20.0", - "eslint-visitor-keys": "^3.0.0" + "@typescript-eslint/types": "8.53.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -343,15 +601,17 @@ "integrity": "sha512-jnCLpLXWuw/PAiJiVbLjA8WBC0IJQbFeUwF4I9M+23MvIxTxk5pD4Q8byQBSPmHQjz5aBoA7AKAElQxMpjrCLQ==", "deprecated": "@zeit/ncc is no longer maintained. Please use @vercel/ncc instead.", "dev": true, + "license": "MIT", "bin": { "ncc": "dist/ncc/cli.js" } }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -364,6 +624,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -373,6 +634,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -384,20 +646,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -412,19 +666,28 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, - "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -433,25 +696,43 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -460,38 +741,151 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", + "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -501,14 +895,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -518,13 +917,50 @@ } }, "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -535,14 +971,15 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", + "version": "1.0.30001764", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", + "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==", "dev": true, "funding": [ { @@ -552,14 +989,20 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -576,6 +1019,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -587,19 +1031,22 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -609,13 +1056,75 @@ "node": ">= 8" } }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -630,16 +1139,19 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/define-properties": { + "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -648,62 +1160,127 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/electron-to-chromium": { - "version": "1.4.114", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.114.tgz", - "integrity": "sha512-gRwLpVYWHGbERPU6o8pKfR168V6enWEXzZc6zQNNXbgJ7UJna+9qzAIHY94+9KOv71D/CH+QebLA9pChD2q8zA==", - "dev": true + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" }, "node_modules/es-abstract": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", - "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -712,24 +1289,78 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -739,10 +1370,11 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -752,6 +1384,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -760,77 +1393,91 @@ } }, "node_modules/eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", - "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -838,21 +1485,27 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/eslint-module-utils/node_modules/debug": { @@ -860,17 +1513,19 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-escompat": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-escompat/-/eslint-plugin-escompat-3.1.0.tgz", - "integrity": "sha512-Fon3eRv8fOQPZTjT3h8Ga85Xx7Eg+CNZBL7OIYSM2f+p3W4oXTxiSnFUbNDrayRBK3CQjG2dwR+iYeKDDSkXyA==", + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-escompat/-/eslint-plugin-escompat-3.11.4.tgz", + "integrity": "sha512-j0ywwNnIufshOzgAu+PfIig1c7VRClKSNKzpniMT2vXQ4leL5q+e/SpMFQU0nrdL2WFFM44XmhSuwmxb3G0CJg==", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.12.0" + "browserslist": "^4.23.1" }, "peerDependencies": { "eslint": ">=5.14.1" @@ -881,6 +1536,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5", "ignore": "^5.0.5" @@ -898,8 +1554,9 @@ "node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -909,6 +1566,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", "dev": true, + "license": "MIT", "dependencies": { "lodash.camelcase": "4.3.0", "lodash.kebabcase": "4.1.1", @@ -920,30 +1578,54 @@ } }, "node_modules/eslint-plugin-github": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.3.6.tgz", - "integrity": "sha512-W4l9CV1DdSaWYZXWiuH/v0bh3c55iFyyhw2EgIwdAeRxogn7svsI5MLBRA9YZ0cdQyekWMZUfAHEeFhDpOyzWg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-6.0.0.tgz", + "integrity": "sha512-J8MvUoiR/TU/Y9NnEmg1AnbvMUj9R6IO260z47zymMLLvso7B4c80IKjd8diqmqtSmeXXlbIus4i0SvK84flag==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "^5.1.0", - "@typescript-eslint/parser": "^5.1.0", + "@eslint/compat": "^1.2.3", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.14.0", + "@github/browserslist-config": "^1.0.0", + "@typescript-eslint/eslint-plugin": "^8.0.0", + "@typescript-eslint/parser": "^8.0.0", + "aria-query": "^5.3.0", "eslint-config-prettier": ">=8.0.0", - "eslint-plugin-escompat": "^3.1.0", + "eslint-plugin-escompat": "^3.11.3", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-i18n-text": "^1.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-no-only-tests": "^2.6.0", - "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-no-only-tests": "^3.0.0", + "eslint-plugin-prettier": "^5.2.1", "eslint-rule-documentation": ">=1.0.0", - "prettier": "^2.2.1", - "svg-element-attributes": "^1.3.1" + "globals": "^16.0.0", + "jsx-ast-utils": "^3.3.2", + "prettier": "^3.0.0", + "svg-element-attributes": "^1.3.1", + "typescript": "^5.7.3", + "typescript-eslint": "^8.14.0" }, "bin": { "eslint-ignore-errors": "bin/eslint-ignore-errors.js" }, "peerDependencies": { - "eslint": "^8.0.1" + "eslint": "^8 || ^9" + } + }, + "node_modules/eslint-plugin-github/node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-plugin-i18n-text": { @@ -951,89 +1633,131 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz", "integrity": "sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA==", "dev": true, + "license": "MIT", "peerDependencies": { "eslint": ">=5.0.0" } }, "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", "dev": true, + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz", + "integrity": "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4.0.0" + "node": ">=5.0.0" } }, "node_modules/eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", + "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", "dev": true, + "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" }, "engines": { - "node": ">=6.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" }, "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" }, "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, "eslint-config-prettier": { "optional": true } @@ -1044,78 +1768,65 @@ "resolved": "https://registry.npmjs.org/eslint-rule-documentation/-/eslint-rule-documentation-1.0.23.tgz", "integrity": "sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -1128,6 +1839,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -1140,6 +1852,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1149,6 +1862,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -1157,158 +1871,183 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, - "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" - }, - "engines": { - "node": ">=8.6.0" - } + "license": "MIT" }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } + "license": "Apache-2.0" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } + "license": "MIT" }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, + "license": "MIT", "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -1317,24 +2056,36 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/glob-parent": { @@ -1342,6 +2093,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -1350,57 +2102,57 @@ } }, "node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "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" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1410,27 +2162,46 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.1" + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1439,12 +2210,13 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -1453,20 +2225,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1481,62 +2268,91 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1546,10 +2362,11 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1558,24 +2375,48 @@ } }, "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1587,17 +2428,55 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1605,11 +2484,12 @@ "node": ">=0.10.0" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1617,22 +2497,28 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1642,14 +2528,30 @@ } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1658,24 +2560,30 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1685,12 +2593,31 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -1699,29 +2626,72 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -1729,23 +2699,33 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -1753,11 +2733,58 @@ "json5": "lib/cli.js" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -1767,80 +2794,64 @@ } }, "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" }, "node_modules/lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", - "dev": true + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=", - "dev": true + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true, + "license": "MIT" }, "node_modules/lodash.upperfirst": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", "dev": true, - "engines": { - "node": ">= 8" - } + "license": "MIT" }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">= 0.4" } }, "node_modules/minimatch": { @@ -1848,6 +2859,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1856,34 +2868,45 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", - "dev": true + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" }, "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1893,19 +2916,23 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -1915,15 +2942,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -1932,63 +2961,106 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, + "license": "MIT", "dependencies": { - "wrappy": "1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, + "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^1.0.0" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^1.1.0" + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parent-module": { @@ -1996,6 +3068,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -2004,21 +3077,13 @@ } }, "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/path-key": { @@ -2026,6 +3091,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2034,64 +3100,71 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", - "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", + "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", "dev": true, + "license": "MIT", "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -2100,59 +3173,76 @@ } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2162,66 +3252,72 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2229,11 +3325,61 @@ "node": ">=10" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -2246,109 +3392,168 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2356,71 +3561,130 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-element-attributes": { - "version": "1.3.1", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-element-attributes": { + "version": "1.3.1", "resolved": "https://registry.npmjs.org/svg-element-attributes/-/svg-element-attributes-1.3.1.tgz", "integrity": "sha512-Bh05dSOnJBf3miNMqpsormfNtfidA/GxQVakhtn0T4DECWKeXQRQUceYjJ+OxYiiLdGe4Jo9iFV8wICFapFeIA==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "@pkgr/core": "^0.2.9" }, "engines": { - "node": ">=8.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" } }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "license": "MIT", "engines": { "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } @@ -2430,6 +3694,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -2437,74 +3702,207 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.0.tgz", + "integrity": "sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.53.0", + "@typescript-eslint/parser": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/utils": "8.53.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -2516,1850 +3914,116 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, + "license": "MIT", "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" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrappy": { + "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - }, - "dependencies": { - "@actions/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz", - "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", - "requires": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" - } - }, - "@actions/http-client": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", - "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", - "requires": { - "tunnel": "^0.0.6" - } - }, - "@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/node": { - "version": "17.0.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz", - "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.20.0.tgz", - "integrity": "sha512-fapGzoxilCn3sBtC6NtXZX6+P/Hef7VDbyfGqTTpzYydwhlkevB+0vE0EnmHPVTVSy68GUncyJ/2PcrFBeCo5Q==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.20.0", - "@typescript-eslint/type-utils": "5.20.0", - "@typescript-eslint/utils": "5.20.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@typescript-eslint/parser": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.20.0.tgz", - "integrity": "sha512-UWKibrCZQCYvobmu3/N8TWbEeo/EPQbS41Ux1F9XqPzGuV7pfg6n50ZrFo6hryynD8qOTTfLHtHjjdQtxJ0h/w==", + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.20.0", - "@typescript-eslint/types": "5.20.0", - "@typescript-eslint/typescript-estree": "5.20.0", - "debug": "^4.3.2" + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "@typescript-eslint/scope-manager": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz", - "integrity": "sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "requires": { - "@typescript-eslint/types": "5.20.0", - "@typescript-eslint/visitor-keys": "5.20.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "@typescript-eslint/type-utils": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.20.0.tgz", - "integrity": "sha512-WxNrCwYB3N/m8ceyoGCgbLmuZwupvzN0rE8NBuwnl7APgjv24ZJIjkNzoFBXPRCGzLNkoU/WfanW0exvp/+3Iw==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "requires": { - "@typescript-eslint/utils": "5.20.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } - }, - "@typescript-eslint/types": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz", - "integrity": "sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz", - "integrity": "sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.20.0", - "@typescript-eslint/visitor-keys": "5.20.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.20.0.tgz", - "integrity": "sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.20.0", - "@typescript-eslint/types": "5.20.0", - "@typescript-eslint/typescript-estree": "5.20.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz", - "integrity": "sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.20.0", - "eslint-visitor-keys": "^3.0.0" - } - }, - "@zeit/ncc": { - "version": "0.22.3", - "resolved": "https://registry.npmjs.org/@zeit/ncc/-/ncc-0.22.3.tgz", - "integrity": "sha512-jnCLpLXWuw/PAiJiVbLjA8WBC0IJQbFeUwF4I9M+23MvIxTxk5pD4Q8byQBSPmHQjz5aBoA7AKAElQxMpjrCLQ==", - "dev": true - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "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-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "electron-to-chromium": { - "version": "1.4.114", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.114.tgz", - "integrity": "sha512-gRwLpVYWHGbERPU6o8pKfR168V6enWEXzZc6zQNNXbgJ7UJna+9qzAIHY94+9KOv71D/CH+QebLA9pChD2q8zA==", - "dev": true - }, - "es-abstract": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", - "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", - "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "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.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-escompat": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-escompat/-/eslint-plugin-escompat-3.1.0.tgz", - "integrity": "sha512-Fon3eRv8fOQPZTjT3h8Ga85Xx7Eg+CNZBL7OIYSM2f+p3W4oXTxiSnFUbNDrayRBK3CQjG2dwR+iYeKDDSkXyA==", - "dev": true, - "requires": { - "browserslist": "^4.12.0" - } - }, - "eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "eslint-plugin-filenames": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", - "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", - "dev": true, - "requires": { - "lodash.camelcase": "4.3.0", - "lodash.kebabcase": "4.1.1", - "lodash.snakecase": "4.1.1", - "lodash.upperfirst": "4.3.1" - } - }, - "eslint-plugin-github": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.3.6.tgz", - "integrity": "sha512-W4l9CV1DdSaWYZXWiuH/v0bh3c55iFyyhw2EgIwdAeRxogn7svsI5MLBRA9YZ0cdQyekWMZUfAHEeFhDpOyzWg==", - "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "^5.1.0", - "@typescript-eslint/parser": "^5.1.0", - "eslint-config-prettier": ">=8.0.0", - "eslint-plugin-escompat": "^3.1.0", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-filenames": "^1.3.2", - "eslint-plugin-i18n-text": "^1.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-no-only-tests": "^2.6.0", - "eslint-plugin-prettier": "^4.0.0", - "eslint-rule-documentation": ">=1.0.0", - "prettier": "^2.2.1", - "svg-element-attributes": "^1.3.1" - } - }, - "eslint-plugin-i18n-text": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz", - "integrity": "sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA==", - "dev": true, - "requires": {} - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", - "dev": true - }, - "eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-rule-documentation": { - "version": "1.0.23", - "resolved": "https://registry.npmjs.org/eslint-rule-documentation/-/eslint-rule-documentation-1.0.23.tgz", - "integrity": "sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw==", - "dev": true - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=", - "dev": true - }, - "lodash.upperfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", - "dev": true - }, - "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", - "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svg-element-attributes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/svg-element-attributes/-/svg-element-attributes-1.3.1.tgz", - "integrity": "sha512-Bh05dSOnJBf3miNMqpsormfNtfidA/GxQVakhtn0T4DECWKeXQRQUceYjJ+OxYiiLdGe4Jo9iFV8wICFapFeIA==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "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" - } - }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } } diff --git a/packages/hooklib/package.json b/packages/hooklib/package.json index 0414ae28..2715c4de 100644 --- a/packages/hooklib/package.json +++ b/packages/hooklib/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "description": "", "main": "lib/index.js", - "types": "index.d.ts", + "types": "lib/index.d.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "tsc", @@ -14,15 +14,14 @@ "author": "", "license": "MIT", "devDependencies": { - "@types/node": "^17.0.23", - "@typescript-eslint/parser": "^5.18.0", + "@types/node": "^24.0.14", "@zeit/ncc": "^0.22.3", - "eslint": "^8.12.0", - "eslint-plugin-github": "^4.3.6", - "prettier": "^2.6.2", - "typescript": "^4.6.3" + "eslint": "^9.31.0", + "eslint-plugin-github": "^6.0.0", + "prettier": "^3.6.2", + "typescript": "^5.8.3" }, "dependencies": { - "@actions/core": "^1.9.1" + "@actions/core": "^2.0.2" } } diff --git a/packages/hooklib/src/utils/index.spec.ts b/packages/hooklib/src/utils/index.spec.ts new file mode 100644 index 00000000..54ad31aa --- /dev/null +++ b/packages/hooklib/src/utils/index.spec.ts @@ -0,0 +1,55 @@ +import * as fs from 'fs' +import * as os from 'os' +import * as path from 'path' +import { writeToResponseFile } from './index' + +describe('writeToResponseFile', () => { + let tmpFile: string + + beforeEach(() => { + tmpFile = path.join(os.tmpdir(), `hooklib-test-${Date.now()}.json`) + fs.writeFileSync(tmpFile, '') + }) + + afterEach(() => { + if (fs.existsSync(tmpFile)) fs.unlinkSync(tmpFile) + }) + + it('appends string value with EOL', () => { + writeToResponseFile(tmpFile, 'hello') + expect(fs.readFileSync(tmpFile, 'utf8')).toBe(`hello${os.EOL}`) + }) + + it('appends JSON for object value', () => { + writeToResponseFile(tmpFile, { key: 'value' }) + expect(fs.readFileSync(tmpFile, 'utf8')).toBe(`{"key":"value"}${os.EOL}`) + }) + + it('appends empty string for null', () => { + writeToResponseFile(tmpFile, null) + expect(fs.readFileSync(tmpFile, 'utf8')).toBe(`${os.EOL}`) + }) + + it('appends empty string for undefined', () => { + writeToResponseFile(tmpFile, undefined) + expect(fs.readFileSync(tmpFile, 'utf8')).toBe(`${os.EOL}`) + }) + + it('throws if filePath is empty', () => { + expect(() => writeToResponseFile('', 'data')).toThrow('Expected file path') + }) + + it('throws if file does not exist', () => { + expect(() => + writeToResponseFile('/nonexistent/path/file.json', 'data') + ).toThrow('Missing file at path') + }) + + it('appends multiple writes sequentially', () => { + writeToResponseFile(tmpFile, 'first') + writeToResponseFile(tmpFile, 'second') + expect(fs.readFileSync(tmpFile, 'utf8')).toBe( + `first${os.EOL}second${os.EOL}` + ) + }) +}) diff --git a/packages/hooklib/src/utils.ts b/packages/hooklib/src/utils/index.ts similarity index 96% rename from packages/hooklib/src/utils.ts rename to packages/hooklib/src/utils/index.ts index 12b9c7cd..29cdab39 100644 --- a/packages/hooklib/src/utils.ts +++ b/packages/hooklib/src/utils/index.ts @@ -2,7 +2,7 @@ import * as events from 'events' import * as fs from 'fs' import * as os from 'os' import * as readline from 'readline' -import { HookData } from './interfaces' +import { HookData } from '../interfaces' export async function getInputFromStdin(): Promise { let input = '' diff --git a/packages/hooklib/tsconfig.json b/packages/hooklib/tsconfig.json index 063081c7..35c91695 100644 --- a/packages/hooklib/tsconfig.json +++ b/packages/hooklib/tsconfig.json @@ -3,9 +3,14 @@ "compilerOptions": { "baseUrl": "./", "outDir": "./lib", - "rootDir": "./src" + "rootDir": "./src", + "skipLibCheck": true, + "types": ["node"] }, "include": [ "./src" + ], + "exclude": [ + "src/**/*.spec.ts" ] - } \ No newline at end of file + } diff --git a/packages/k8s/README.md b/packages/k8s/README.md index dc35c347..81881e87 100644 --- a/packages/k8s/README.md +++ b/packages/k8s/README.md @@ -22,13 +22,20 @@ rules: - apiGroups: [""] resources: ["pods/log"] verbs: ["get", "list", "watch",] -- apiGroups: ["batch"] - resources: ["jobs"] - verbs: ["get", "list", "create", "delete"] - apiGroups: [""] resources: ["secrets"] verbs: ["get", "list", "create", "delete"] ``` +- (Optional, recommended) Granting `events` read access lets the hooks attach + recent `Warning` events (e.g. `FailedScheduling`, `FailedMount`) to the error + message when a pod fails to come online. This permission is **not required** — + if it is missing the hooks still work, they just omit the event section from + diagnostics. +``` +- apiGroups: [""] + resources: ["events"] + verbs: ["get", "list"] +``` - The `ACTIONS_RUNNER_POD_NAME` env should be set to the name of the pod - The `ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER` env should be set to true to prevent the runner from running any jobs outside of a container - The runner pod should map a persistent volume claim into the `_work` directory @@ -36,6 +43,14 @@ rules: - Some actions runner env's are expected to be set. These are set automatically by the runner. - `RUNNER_WORKSPACE` is expected to be set to the workspace of the runner - `GITHUB_WORKSPACE` is expected to be set to the workspace of the job +- Optional tuning env's + - `ACTIONS_RUNNER_K8S_UNRECOVERABLE_WAITING_REASONS` — comma-separated list of + extra container `waiting` reasons that should be treated as deterministic + terminal failures (fail fast instead of waiting for the timeout). These are + *added* to the built-ins (`ImagePullBackOff`, `ErrImagePull`, + `InvalidImageName`, `CreateContainerConfigError`, `CreateContainerError`); + the built-ins can never be removed. Use with care — only list reasons that + are truly unrecoverable for your workloads (e.g. `CrashLoopBackOff`). ## Limitations @@ -43,3 +58,5 @@ rules: - Building container actions from a dockerfile is not supported at this time - Container actions will not have access to the services network or job container network - Docker [create options](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idcontaineroptions) are not supported +- Container actions will have to specify the entrypoint, since the default entrypoint will be overridden to run the commands from the workflow. +- Container actions need to have the following binaries in their container image: `sh`, `env`, `tail`. diff --git a/packages/k8s/coverage/clover.xml b/packages/k8s/coverage/clover.xml new file mode 100644 index 00000000..396afafb --- /dev/null +++ b/packages/k8s/coverage/clover.xml @@ -0,0 +1,1680 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/k8s/coverage/coverage-final.json b/packages/k8s/coverage/coverage-final.json new file mode 100644 index 00000000..6563388c --- /dev/null +++ b/packages/k8s/coverage/coverage-final.json @@ -0,0 +1,12 @@ +{"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/hooks/cleanup-job.ts": {"path":"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/hooks/cleanup-job.ts","statementMap":{"0":{"start":{"line":11,"column":0},"end":{"line":11,"column":22}},"1":{"start":{"line":1,"column":0},"end":{"line":1,"column":37}},"2":{"start":{"line":2,"column":0},"end":{"line":2,"column":42}},"3":{"start":{"line":3,"column":0},"end":{"line":3,"column":48}},"4":{"start":{"line":4,"column":0},"end":{"line":4,"column":null}},"5":{"start":{"line":12,"column":6},"end":{"line":12,"column":23}},"6":{"start":{"line":14,"column":6},"end":{"line":14,"column":null}},"7":{"start":{"line":16,"column":6},"end":{"line":16,"column":null}},"8":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}}},"fnMap":{"0":{"name":"cleanupJob","decl":{"start":{"line":11,"column":22},"end":{"line":11,"column":32}},"loc":{"start":{"line":11,"column":32},"end":{"line":20,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"type":"switch","locations":[{"start":{"line":19,"column":2},"end":{"line":19,"column":null}}]},"1":{"loc":{"start":{"line":12,"column":6},"end":{"line":12,"column":23}},"type":"if","locations":[{"start":{"line":12,"column":6},"end":{"line":12,"column":23}},{"start":{},"end":{}}]}},"s":{"0":7,"1":7,"2":7,"3":7,"4":7,"5":21,"6":42,"7":0,"8":42},"f":{"0":21},"b":{"0":[21],"1":[0,21]}} +,"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/hooks/constants.ts": {"path":"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/hooks/constants.ts","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":3,"column":16}},"1":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"2":{"start":{"line":20,"column":0},"end":{"line":20,"column":16}},"3":{"start":{"line":27,"column":0},"end":{"line":27,"column":16}},"4":{"start":{"line":35,"column":0},"end":{"line":35,"column":16}},"5":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}},"6":{"start":{"line":4,"column":15},"end":{"line":4,"column":50}},"7":{"start":{"line":5,"column":2},"end":{"line":9,"column":3}},"8":{"start":{"line":6,"column":4},"end":{"line":8,"column":null}},"9":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"10":{"start":{"line":14,"column":2},"end":{"line":17,"column":null}},"11":{"start":{"line":21,"column":2},"end":{"line":24,"column":null}},"12":{"start":{"line":28,"column":15},"end":{"line":28,"column":52}},"13":{"start":{"line":29,"column":2},"end":{"line":31,"column":3}},"14":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"15":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"16":{"start":{"line":36,"column":2},"end":{"line":39,"column":null}},"17":{"start":{"line":42,"column":13},"end":{"line":42,"column":null}},"18":{"start":{"line":43,"column":13},"end":{"line":43,"column":null}},"19":{"start":{"line":44,"column":13},"end":{"line":44,"column":null}},"20":{"start":{"line":45,"column":13},"end":{"line":45,"column":null}},"21":{"start":{"line":46,"column":13},"end":{"line":46,"column":null}},"22":{"start":{"line":48,"column":0},"end":{"line":48,"column":13}},"23":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"24":{"start":{"line":54,"column":2},"end":{"line":56,"column":null}},"25":{"start":{"line":55,"column":4},"end":{"line":55,"column":null}},"26":{"start":{"line":58,"column":2},"end":{"line":60,"column":null}},"27":{"start":{"line":59,"column":4},"end":{"line":59,"column":null}},"28":{"start":{"line":62,"column":2},"end":{"line":64,"column":null}},"29":{"start":{"line":63,"column":4},"end":{"line":63,"column":null}},"30":{"start":{"line":65,"column":0},"end":{"line":65,"column":null}},"31":{"start":{"line":48,"column":13},"end":{"line":48,"column":32}}},"fnMap":{"0":{"name":"getRunnerPodName","decl":{"start":{"line":3,"column":16},"end":{"line":3,"column":32}},"loc":{"start":{"line":3,"column":32},"end":{"line":11,"column":1}}},"1":{"name":"getJobPodName","decl":{"start":{"line":13,"column":16},"end":{"line":13,"column":29}},"loc":{"start":{"line":13,"column":29},"end":{"line":18,"column":1}}},"2":{"name":"getStepPodName","decl":{"start":{"line":20,"column":16},"end":{"line":20,"column":30}},"loc":{"start":{"line":20,"column":30},"end":{"line":25,"column":1}}},"3":{"name":"getVolumeClaimName","decl":{"start":{"line":27,"column":16},"end":{"line":27,"column":34}},"loc":{"start":{"line":27,"column":34},"end":{"line":33,"column":1}}},"4":{"name":"getSecretName","decl":{"start":{"line":35,"column":16},"end":{"line":35,"column":29}},"loc":{"start":{"line":35,"column":29},"end":{"line":40,"column":1}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":48,"column":0},"end":{"line":48,"column":13}},"loc":{"start":{"line":48,"column":0},"end":{"line":65,"column":1}}},"6":{"name":"RunnerInstanceLabel","decl":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}},"loc":{"start":{"line":50,"column":2},"end":{"line":52,"column":3}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":54,"column":2},"end":{"line":54,"column":6}},"loc":{"start":{"line":54,"column":2},"end":{"line":56,"column":3}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":58,"column":2},"end":{"line":58,"column":6}},"loc":{"start":{"line":58,"column":2},"end":{"line":60,"column":3}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":62,"column":2},"end":{"line":62,"column":10}},"loc":{"start":{"line":62,"column":2},"end":{"line":64,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":2},"end":{"line":9,"column":3}},"type":"if","locations":[{"start":{"line":5,"column":2},"end":{"line":9,"column":3}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":29,"column":2},"end":{"line":31,"column":3}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":31,"column":3}},{"start":{},"end":{}}]}},"s":{"0":15,"1":15,"2":15,"3":15,"4":15,"5":15,"6":105,"7":105,"8":74,"9":31,"10":11,"11":17,"12":4,"13":4,"14":3,"15":1,"16":3,"17":15,"18":15,"19":15,"20":15,"21":15,"22":15,"23":67,"24":15,"25":4,"26":15,"27":3,"28":15,"29":1,"30":15,"31":15},"f":{"0":105,"1":11,"2":17,"3":4,"4":3,"5":15,"6":67,"7":4,"8":3,"9":1},"b":{"0":[74,31],"1":[3,1]}} +,"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/hooks/index.ts": {"path":"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/hooks/index.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":29}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":29}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":33}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":36}}},"fnMap":{},"branchMap":{},"s":{"0":7,"1":7,"2":7,"3":7},"f":{},"b":{}} +,"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/hooks/prepare-job.ts": {"path":"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/hooks/prepare-job.ts","statementMap":{"0":{"start":{"line":40,"column":0},"end":{"line":40,"column":22}},"1":{"start":{"line":299,"column":0},"end":{"line":299,"column":16}},"2":{"start":{"line":1,"column":0},"end":{"line":1,"column":37}},"3":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"4":{"start":{"line":10,"column":0},"end":{"line":10,"column":null}},"5":{"start":{"line":20,"column":0},"end":{"line":20,"column":null}},"6":{"start":{"line":32,"column":0},"end":{"line":32,"column":null}},"7":{"start":{"line":37,"column":0},"end":{"line":37,"column":64}},"8":{"start":{"line":38,"column":0},"end":{"line":38,"column":30}},"9":{"start":{"line":44,"column":2},"end":{"line":46,"column":3}},"10":{"start":{"line":45,"column":4},"end":{"line":45,"column":null}},"11":{"start":{"line":48,"column":2},"end":{"line":48,"column":null}},"12":{"start":{"line":50,"column":8},"end":{"line":50,"column":null}},"13":{"start":{"line":52,"column":6},"end":{"line":52,"column":null}},"14":{"start":{"line":53,"column":2},"end":{"line":61,"column":3}},"15":{"start":{"line":54,"column":4},"end":{"line":59,"column":null}},"16":{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},"17":{"start":{"line":63,"column":6},"end":{"line":63,"column":null}},"18":{"start":{"line":64,"column":6},"end":{"line":64,"column":null}},"19":{"start":{"line":65,"column":2},"end":{"line":89,"column":3}},"20":{"start":{"line":66,"column":10},"end":{"line":66,"column":null}},"21":{"start":{"line":67,"column":4},"end":{"line":70,"column":5}},"22":{"start":{"line":67,"column":15},"end":{"line":67,"column":20}},"23":{"start":{"line":68,"column":12},"end":{"line":68,"column":null}},"24":{"start":{"line":69,"column":6},"end":{"line":69,"column":null}},"25":{"start":{"line":72,"column":10},"end":{"line":72,"column":null}},"26":{"start":{"line":73,"column":4},"end":{"line":88,"column":null}},"27":{"start":{"line":74,"column":19},"end":{"line":74,"column":55}},"28":{"start":{"line":75,"column":20},"end":{"line":75,"column":46}},"29":{"start":{"line":76,"column":18},"end":{"line":76,"column":40}},"30":{"start":{"line":79,"column":6},"end":{"line":83,"column":7}},"31":{"start":{"line":80,"column":8},"end":{"line":80,"column":null}},"32":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"33":{"start":{"line":85,"column":6},"end":{"line":85,"column":null}},"34":{"start":{"line":86,"column":6},"end":{"line":86,"column":null}},"35":{"start":{"line":87,"column":6},"end":{"line":87,"column":null}},"36":{"start":{"line":91,"column":2},"end":{"line":93,"column":3}},"37":{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},"38":{"start":{"line":95,"column":6},"end":{"line":95,"column":null}},"39":{"start":{"line":97,"column":17},"end":{"line":103,"column":null}},"40":{"start":{"line":97,"column":4},"end":{"line":103,"column":null}},"41":{"start":{"line":105,"column":4},"end":{"line":105,"column":null}},"42":{"start":{"line":106,"column":4},"end":{"line":106,"column":null}},"43":{"start":{"line":113,"column":10},"end":{"line":113,"column":null}},"44":{"start":{"line":114,"column":8},"end":{"line":114,"column":null}},"45":{"start":{"line":121,"column":4},"end":{"line":148,"column":5}},"46":{"start":{"line":122,"column":12},"end":{"line":122,"column":null}},"47":{"start":{"line":125,"column":12},"end":{"line":125,"column":null}},"48":{"start":{"line":126,"column":12},"end":{"line":129,"column":null}},"49":{"start":{"line":130,"column":6},"end":{"line":145,"column":7}},"50":{"start":{"line":133,"column":14},"end":{"line":133,"column":null}},"51":{"start":{"line":134,"column":14},"end":{"line":134,"column":null}},"52":{"start":{"line":137,"column":8},"end":{"line":144,"column":9}},"53":{"start":{"line":138,"column":16},"end":{"line":138,"column":null}},"54":{"start":{"line":139,"column":10},"end":{"line":141,"column":11}},"55":{"start":{"line":140,"column":12},"end":{"line":140,"column":null}},"56":{"start":{"line":143,"column":10},"end":{"line":143,"column":null}},"57":{"start":{"line":149,"column":10},"end":{"line":158,"column":null}},"58":{"start":{"line":159,"column":4},"end":{"line":159,"column":null}},"59":{"start":{"line":162,"column":2},"end":{"line":164,"column":3}},"60":{"start":{"line":163,"column":4},"end":{"line":163,"column":null}},"61":{"start":{"line":165,"column":2},"end":{"line":167,"column":null}},"62":{"start":{"line":169,"column":8},"end":{"line":169,"column":null}},"63":{"start":{"line":170,"column":2},"end":{"line":172,"column":3}},"64":{"start":{"line":171,"column":4},"end":{"line":171,"column":null}},"65":{"start":{"line":173,"column":8},"end":{"line":173,"column":null}},"66":{"start":{"line":176,"column":2},"end":{"line":178,"column":3}},"67":{"start":{"line":177,"column":4},"end":{"line":177,"column":null}},"68":{"start":{"line":181,"column":4},"end":{"line":186,"column":null}},"69":{"start":{"line":188,"column":4},"end":{"line":188,"column":null}},"70":{"start":{"line":192,"column":10},"end":{"line":192,"column":null}},"71":{"start":{"line":193,"column":4},"end":{"line":193,"column":null}},"72":{"start":{"line":196,"column":2},"end":{"line":196,"column":null}},"73":{"start":{"line":198,"column":6},"end":{"line":198,"column":19}},"74":{"start":{"line":199,"column":4},"end":{"line":203,"column":null}},"75":{"start":{"line":205,"column":10},"end":{"line":205,"column":null}},"76":{"start":{"line":206,"column":4},"end":{"line":214,"column":5}},"77":{"start":{"line":206,"column":15},"end":{"line":206,"column":22}},"78":{"start":{"line":207,"column":6},"end":{"line":213,"column":null}},"79":{"start":{"line":215,"column":4},"end":{"line":215,"column":null}},"80":{"start":{"line":218,"column":2},"end":{"line":218,"column":null}},"81":{"start":{"line":220,"column":6},"end":{"line":220,"column":null}},"82":{"start":{"line":222,"column":15},"end":{"line":225,"column":null}},"83":{"start":{"line":222,"column":4},"end":{"line":225,"column":null}},"84":{"start":{"line":227,"column":10},"end":{"line":227,"column":null}},"85":{"start":{"line":228,"column":4},"end":{"line":228,"column":null}},"86":{"start":{"line":229,"column":4},"end":{"line":229,"column":null}},"87":{"start":{"line":231,"column":2},"end":{"line":231,"column":null}},"88":{"start":{"line":232,"column":2},"end":{"line":232,"column":null}},"89":{"start":{"line":242,"column":2},"end":{"line":244,"column":3}},"90":{"start":{"line":243,"column":4},"end":{"line":243,"column":null}},"91":{"start":{"line":245,"column":19},"end":{"line":251,"column":null}},"92":{"start":{"line":253,"column":24},"end":{"line":254,"column":null}},"93":{"start":{"line":254,"column":9},"end":{"line":254,"column":null}},"94":{"start":{"line":256,"column":2},"end":{"line":269,"column":3}},"95":{"start":{"line":257,"column":52},"end":{"line":257,"column":54}},"96":{"start":{"line":258,"column":4},"end":{"line":263,"column":5}},"97":{"start":{"line":259,"column":6},"end":{"line":262,"column":7}},"98":{"start":{"line":259,"column":25},"end":{"line":259,"column":38}},"99":{"start":{"line":259,"column":25},"end":{"line":259,"column":44}},"100":{"start":{"line":259,"column":21},"end":{"line":259,"column":25}},"101":{"start":{"line":260,"column":8},"end":{"line":261,"column":null}},"102":{"start":{"line":265,"column":4},"end":{"line":268,"column":null}},"103":{"start":{"line":271,"column":2},"end":{"line":294,"column":3}},"104":{"start":{"line":273,"column":6},"end":{"line":275,"column":71}},"105":{"start":{"line":275,"column":34},"end":{"line":275,"column":65}},"106":{"start":{"line":277,"column":4},"end":{"line":293,"column":null}},"107":{"start":{"line":278,"column":20},"end":{"line":278,"column":null}},"108":{"start":{"line":280,"column":39},"end":{"line":280,"column":41}},"109":{"start":{"line":281,"column":8},"end":{"line":287,"column":9}},"110":{"start":{"line":282,"column":10},"end":{"line":286,"column":11}},"111":{"start":{"line":282,"column":29},"end":{"line":282,"column":30}},"112":{"start":{"line":282,"column":29},"end":{"line":282,"column":36}},"113":{"start":{"line":282,"column":25},"end":{"line":282,"column":29}},"114":{"start":{"line":283,"column":12},"end":{"line":285,"column":13}},"115":{"start":{"line":284,"column":14},"end":{"line":284,"column":null}},"116":{"start":{"line":289,"column":8},"end":{"line":292,"column":null}},"117":{"start":{"line":296,"column":2},"end":{"line":296,"column":null}},"118":{"start":{"line":302,"column":2},"end":{"line":302,"column":null}},"119":{"start":{"line":305,"column":2},"end":{"line":308,"column":3}},"120":{"start":{"line":306,"column":4},"end":{"line":306,"column":null}},"121":{"start":{"line":307,"column":4},"end":{"line":307,"column":null}},"122":{"start":{"line":310,"column":23},"end":{"line":314,"column":null}},"123":{"start":{"line":315,"column":2},"end":{"line":317,"column":3}},"124":{"start":{"line":316,"column":4},"end":{"line":316,"column":null}},"125":{"start":{"line":319,"column":2},"end":{"line":321,"column":3}},"126":{"start":{"line":320,"column":4},"end":{"line":320,"column":null}},"127":{"start":{"line":323,"column":2},"end":{"line":325,"column":3}},"128":{"start":{"line":324,"column":4},"end":{"line":324,"column":null}},"129":{"start":{"line":327,"column":2},"end":{"line":327,"column":null}},"130":{"start":{"line":328,"column":2},"end":{"line":334,"column":3}},"131":{"start":{"line":328,"column":29},"end":{"line":328,"column":35}},"132":{"start":{"line":328,"column":29},"end":{"line":329,"column":null}},"133":{"start":{"line":328,"column":13},"end":{"line":328,"column":14}},"134":{"start":{"line":328,"column":17},"end":{"line":328,"column":19}},"135":{"start":{"line":328,"column":24},"end":{"line":328,"column":25}},"136":{"start":{"line":331,"column":4},"end":{"line":333,"column":5}},"137":{"start":{"line":332,"column":6},"end":{"line":332,"column":null}},"138":{"start":{"line":336,"column":2},"end":{"line":339,"column":null}},"139":{"start":{"line":341,"column":2},"end":{"line":346,"column":3}},"140":{"start":{"line":342,"column":4},"end":{"line":345,"column":null}},"141":{"start":{"line":348,"column":2},"end":{"line":348,"column":null}},"142":{"start":{"line":350,"column":2},"end":{"line":352,"column":3}},"143":{"start":{"line":351,"column":4},"end":{"line":351,"column":null}},"144":{"start":{"line":354,"column":15},"end":{"line":355,"column":null}},"145":{"start":{"line":355,"column":9},"end":{"line":355,"column":null}},"146":{"start":{"line":358,"column":2},"end":{"line":360,"column":3}},"147":{"start":{"line":359,"column":4},"end":{"line":359,"column":null}},"148":{"start":{"line":362,"column":2},"end":{"line":362,"column":null}}},"fnMap":{"0":{"name":"prepareJob","decl":{"start":{"line":40,"column":22},"end":{"line":40,"column":32}},"loc":{"start":{"line":42,"column":14},"end":{"line":233,"column":null}}},"1":{"name":"(anonymous_25)","decl":{"start":{"line":73,"column":33},"end":{"line":73,"column":40}},"loc":{"start":{"line":73,"column":40},"end":{"line":88,"column":5}}},"2":{"name":"generateResponseFile","decl":{"start":{"line":235,"column":9},"end":{"line":235,"column":29}},"loc":{"start":{"line":240,"column":25},"end":{"line":297,"column":1}}},"3":{"name":"(anonymous_27)","decl":{"start":{"line":254,"column":4},"end":{"line":254,"column":5}},"loc":{"start":{"line":254,"column":5},"end":{"line":254,"column":10}}},"4":{"name":"(anonymous_28)","decl":{"start":{"line":275,"column":29},"end":{"line":275,"column":30}},"loc":{"start":{"line":275,"column":30},"end":{"line":275,"column":55}}},"5":{"name":"(anonymous_29)","decl":{"start":{"line":278,"column":15},"end":{"line":278,"column":16}},"loc":{"start":{"line":278,"column":16},"end":{"line":278,"column":41}}},"6":{"name":"(anonymous_30)","decl":{"start":{"line":279,"column":11},"end":{"line":279,"column":12}},"loc":{"start":{"line":279,"column":12},"end":{"line":293,"column":7}}},"7":{"name":"createContainerSpec","decl":{"start":{"line":299,"column":16},"end":{"line":299,"column":35}},"loc":{"start":{"line":303,"column":35},"end":{"line":363,"column":1}}},"8":{"name":"(anonymous_32)","decl":{"start":{"line":355,"column":4},"end":{"line":355,"column":5}},"loc":{"start":{"line":355,"column":5},"end":{"line":355,"column":10}}}},"branchMap":{"0":{"loc":{"start":{"line":196,"column":2},"end":{"line":196,"column":null}},"type":"switch","locations":[{"start":{"line":196,"column":2},"end":{"line":196,"column":null}}]},"1":{"loc":{"start":{"line":44,"column":2},"end":{"line":46,"column":3}},"type":"if","locations":[{"start":{"line":44,"column":2},"end":{"line":46,"column":3}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":53,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":61,"column":3}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":53,"column":6},"end":{"line":53,"column":27}},"type":"cond-expr","locations":[{"start":{"line":53,"column":20},"end":{"line":53,"column":22}},{"start":{"line":53,"column":20},"end":{"line":53,"column":27}}]},"4":{"loc":{"start":{"line":53,"column":6},"end":{"line":53,"column":22}},"type":"binary-expr","locations":[{"start":{"line":53,"column":6},"end":{"line":53,"column":22}},{"start":{"line":53,"column":20},"end":{"line":53,"column":22}}]},"5":{"loc":{"start":{"line":65,"column":2},"end":{"line":89,"column":3}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":89,"column":3}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":65,"column":6},"end":{"line":65,"column":27}},"type":"cond-expr","locations":[{"start":{"line":65,"column":19},"end":{"line":65,"column":21}},{"start":{"line":65,"column":19},"end":{"line":65,"column":27}}]},"7":{"loc":{"start":{"line":65,"column":6},"end":{"line":65,"column":21}},"type":"binary-expr","locations":[{"start":{"line":65,"column":6},"end":{"line":65,"column":21}},{"start":{"line":65,"column":19},"end":{"line":65,"column":21}}]},"8":{"loc":{"start":{"line":69,"column":29},"end":{"line":69,"column":55}},"type":"binary-expr","locations":[{"start":{"line":69,"column":29},"end":{"line":69,"column":50}},{"start":{"line":69,"column":54},"end":{"line":69,"column":55}}]},"9":{"loc":{"start":{"line":75,"column":20},"end":{"line":75,"column":46}},"type":"binary-expr","locations":[{"start":{"line":75,"column":20},"end":{"line":75,"column":41}},{"start":{"line":75,"column":45},"end":{"line":75,"column":46}}]},"10":{"loc":{"start":{"line":76,"column":18},"end":{"line":76,"column":40}},"type":"binary-expr","locations":[{"start":{"line":76,"column":18},"end":{"line":76,"column":35}},{"start":{"line":76,"column":39},"end":{"line":76,"column":40}}]},"11":{"loc":{"start":{"line":79,"column":6},"end":{"line":83,"column":7}},"type":"if","locations":[{"start":{"line":79,"column":6},"end":{"line":83,"column":7}},{"start":{"line":81,"column":13},"end":{"line":83,"column":7}}]},"12":{"loc":{"start":{"line":91,"column":2},"end":{"line":93,"column":3}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":93,"column":3}},{"start":{},"end":{}}]},"13":{"loc":{"start":{"line":91,"column":6},"end":{"line":91,"column":39}},"type":"binary-expr","locations":[{"start":{"line":91,"column":6},"end":{"line":91,"column":16}},{"start":{"line":91,"column":20},"end":{"line":91,"column":39}}]},"14":{"loc":{"start":{"line":91,"column":21},"end":{"line":91,"column":37}},"type":"cond-expr","locations":[{"start":{"line":91,"column":29},"end":{"line":91,"column":31}},{"start":{"line":91,"column":21},"end":{"line":91,"column":37}}]},"15":{"loc":{"start":{"line":91,"column":21},"end":{"line":91,"column":31}},"type":"binary-expr","locations":[{"start":{"line":91,"column":21},"end":{"line":91,"column":31}},{"start":{"line":91,"column":21},"end":{"line":91,"column":31}}]},"16":{"loc":{"start":{"line":113,"column":16},"end":{"line":113,"column":64}},"type":"cond-expr","locations":[{"start":{"line":113,"column":39},"end":{"line":113,"column":50}},{"start":{"line":113,"column":53},"end":{"line":113,"column":64}}]},"17":{"loc":{"start":{"line":127,"column":8},"end":{"line":129,"column":38}},"type":"cond-expr","locations":[{"start":{"line":128,"column":12},"end":{"line":128,"column":44}},{"start":{"line":129,"column":12},"end":{"line":129,"column":38}}]},"18":{"loc":{"start":{"line":130,"column":6},"end":{"line":145,"column":7}},"type":"if","locations":[{"start":{"line":130,"column":6},"end":{"line":145,"column":7}},{"start":{},"end":{}}]},"19":{"loc":{"start":{"line":130,"column":10},"end":{"line":130,"column":67}},"type":"binary-expr","locations":[{"start":{"line":130,"column":10},"end":{"line":130,"column":26}},{"start":{"line":130,"column":30},"end":{"line":130,"column":44}},{"start":{"line":130,"column":48},"end":{"line":130,"column":67}}]},"20":{"loc":{"start":{"line":139,"column":10},"end":{"line":141,"column":11}},"type":"if","locations":[{"start":{"line":139,"column":10},"end":{"line":141,"column":11}},{"start":{},"end":{}}]},"21":{"loc":{"start":{"line":139,"column":21},"end":{"line":139,"column":36}},"type":"cond-expr","locations":[{"start":{"line":139,"column":27},"end":{"line":139,"column":29}},{"start":{"line":139,"column":21},"end":{"line":139,"column":36}}]},"22":{"loc":{"start":{"line":139,"column":21},"end":{"line":139,"column":29}},"type":"binary-expr","locations":[{"start":{"line":139,"column":21},"end":{"line":139,"column":29}},{"start":{"line":139,"column":21},"end":{"line":139,"column":29}}]},"23":{"loc":{"start":{"line":162,"column":2},"end":{"line":164,"column":3}},"type":"if","locations":[{"start":{"line":162,"column":2},"end":{"line":164,"column":3}},{"start":{},"end":{}}]},"24":{"loc":{"start":{"line":162,"column":7},"end":{"line":162,"column":33}},"type":"cond-expr","locations":[{"start":{"line":162,"column":27},"end":{"line":162,"column":29}},{"start":{"line":162,"column":27},"end":{"line":162,"column":33}}]},"25":{"loc":{"start":{"line":162,"column":7},"end":{"line":162,"column":29}},"type":"binary-expr","locations":[{"start":{"line":162,"column":7},"end":{"line":162,"column":29}},{"start":{"line":162,"column":27},"end":{"line":162,"column":29}}]},"26":{"loc":{"start":{"line":162,"column":7},"end":{"line":162,"column":27}},"type":"cond-expr","locations":[{"start":{"line":162,"column":17},"end":{"line":162,"column":19}},{"start":{"line":162,"column":7},"end":{"line":162,"column":27}}]},"27":{"loc":{"start":{"line":162,"column":7},"end":{"line":162,"column":19}},"type":"binary-expr","locations":[{"start":{"line":162,"column":7},"end":{"line":162,"column":19}},{"start":{"line":162,"column":7},"end":{"line":162,"column":19}}]},"28":{"loc":{"start":{"line":166,"column":54},"end":{"line":166,"column":80}},"type":"cond-expr","locations":[{"start":{"line":166,"column":74},"end":{"line":166,"column":76}},{"start":{"line":166,"column":74},"end":{"line":166,"column":80}}]},"29":{"loc":{"start":{"line":166,"column":54},"end":{"line":166,"column":76}},"type":"binary-expr","locations":[{"start":{"line":166,"column":54},"end":{"line":166,"column":76}},{"start":{"line":166,"column":74},"end":{"line":166,"column":76}}]},"30":{"loc":{"start":{"line":166,"column":54},"end":{"line":166,"column":74}},"type":"cond-expr","locations":[{"start":{"line":166,"column":64},"end":{"line":166,"column":66}},{"start":{"line":166,"column":54},"end":{"line":166,"column":74}}]},"31":{"loc":{"start":{"line":166,"column":54},"end":{"line":166,"column":66}},"type":"binary-expr","locations":[{"start":{"line":166,"column":54},"end":{"line":166,"column":66}},{"start":{"line":166,"column":54},"end":{"line":166,"column":66}}]},"32":{"loc":{"start":{"line":170,"column":2},"end":{"line":172,"column":3}},"type":"if","locations":[{"start":{"line":170,"column":2},"end":{"line":172,"column":3}},{"start":{},"end":{}}]},"33":{"loc":{"start":{"line":176,"column":2},"end":{"line":178,"column":3}},"type":"if","locations":[{"start":{"line":176,"column":2},"end":{"line":178,"column":3}},{"start":{},"end":{}}]},"34":{"loc":{"start":{"line":176,"column":6},"end":{"line":176,"column":46}},"type":"cond-expr","locations":[{"start":{"line":176,"column":38},"end":{"line":176,"column":40}},{"start":{"line":176,"column":38},"end":{"line":176,"column":46}}]},"35":{"loc":{"start":{"line":176,"column":6},"end":{"line":176,"column":40}},"type":"binary-expr","locations":[{"start":{"line":176,"column":6},"end":{"line":176,"column":40}},{"start":{"line":176,"column":38},"end":{"line":176,"column":40}}]},"36":{"loc":{"start":{"line":176,"column":6},"end":{"line":176,"column":38}},"type":"cond-expr","locations":[{"start":{"line":176,"column":20},"end":{"line":176,"column":22}},{"start":{"line":176,"column":20},"end":{"line":176,"column":38}}]},"37":{"loc":{"start":{"line":176,"column":6},"end":{"line":176,"column":22}},"type":"binary-expr","locations":[{"start":{"line":176,"column":6},"end":{"line":176,"column":22}},{"start":{"line":176,"column":20},"end":{"line":176,"column":22}}]},"38":{"loc":{"start":{"line":177,"column":37},"end":{"line":177,"column":74}},"type":"binary-expr","locations":[{"start":{"line":177,"column":37},"end":{"line":177,"column":68}},{"start":{"line":177,"column":72},"end":{"line":177,"column":74}}]},"39":{"loc":{"start":{"line":192,"column":19},"end":{"line":192,"column":67}},"type":"cond-expr","locations":[{"start":{"line":192,"column":42},"end":{"line":192,"column":53}},{"start":{"line":192,"column":56},"end":{"line":192,"column":67}}]},"40":{"loc":{"start":{"line":198,"column":6},"end":{"line":198,"column":19}},"type":"if","locations":[{"start":{"line":198,"column":6},"end":{"line":198,"column":19}},{"start":{},"end":{}}]},"41":{"loc":{"start":{"line":206,"column":22},"end":{"line":206,"column":61}},"type":"binary-expr","locations":[{"start":{"line":206,"column":22},"end":{"line":206,"column":55}},{"start":{"line":206,"column":59},"end":{"line":206,"column":61}}]},"42":{"loc":{"start":{"line":206,"column":22},"end":{"line":206,"column":55}},"type":"cond-expr","locations":[{"start":{"line":206,"column":37},"end":{"line":206,"column":39}},{"start":{"line":206,"column":37},"end":{"line":206,"column":55}}]},"43":{"loc":{"start":{"line":206,"column":22},"end":{"line":206,"column":39}},"type":"binary-expr","locations":[{"start":{"line":206,"column":22},"end":{"line":206,"column":39}},{"start":{"line":206,"column":37},"end":{"line":206,"column":39}}]},"44":{"loc":{"start":{"line":206,"column":22},"end":{"line":206,"column":37}},"type":"cond-expr","locations":[{"start":{"line":206,"column":26},"end":{"line":206,"column":28}},{"start":{"line":206,"column":22},"end":{"line":206,"column":37}}]},"45":{"loc":{"start":{"line":206,"column":22},"end":{"line":206,"column":28}},"type":"binary-expr","locations":[{"start":{"line":206,"column":22},"end":{"line":206,"column":28}},{"start":{"line":206,"column":22},"end":{"line":206,"column":28}}]},"46":{"loc":{"start":{"line":242,"column":2},"end":{"line":244,"column":3}},"type":"if","locations":[{"start":{"line":242,"column":2},"end":{"line":244,"column":3}},{"start":{},"end":{}}]},"47":{"loc":{"start":{"line":242,"column":7},"end":{"line":242,"column":28}},"type":"cond-expr","locations":[{"start":{"line":242,"column":22},"end":{"line":242,"column":24}},{"start":{"line":242,"column":22},"end":{"line":242,"column":28}}]},"48":{"loc":{"start":{"line":242,"column":7},"end":{"line":242,"column":24}},"type":"binary-expr","locations":[{"start":{"line":242,"column":7},"end":{"line":242,"column":24}},{"start":{"line":242,"column":22},"end":{"line":242,"column":24}}]},"49":{"loc":{"start":{"line":253,"column":24},"end":{"line":254,"column":null}},"type":"cond-expr","locations":[{"start":{"line":253,"column":47},"end":{"line":253,"column":49}},{"start":{"line":253,"column":47},"end":{"line":254,"column":null}}]},"50":{"loc":{"start":{"line":253,"column":24},"end":{"line":253,"column":49}},"type":"binary-expr","locations":[{"start":{"line":253,"column":24},"end":{"line":253,"column":49}},{"start":{"line":253,"column":47},"end":{"line":253,"column":49}}]},"51":{"loc":{"start":{"line":253,"column":24},"end":{"line":253,"column":47}},"type":"cond-expr","locations":[{"start":{"line":253,"column":35},"end":{"line":253,"column":37}},{"start":{"line":253,"column":35},"end":{"line":253,"column":47}}]},"52":{"loc":{"start":{"line":253,"column":24},"end":{"line":253,"column":37}},"type":"binary-expr","locations":[{"start":{"line":253,"column":24},"end":{"line":253,"column":37}},{"start":{"line":253,"column":35},"end":{"line":253,"column":37}}]},"53":{"loc":{"start":{"line":256,"column":2},"end":{"line":269,"column":3}},"type":"if","locations":[{"start":{"line":256,"column":2},"end":{"line":269,"column":3}},{"start":{},"end":{}}]},"54":{"loc":{"start":{"line":258,"column":4},"end":{"line":263,"column":5}},"type":"if","locations":[{"start":{"line":258,"column":4},"end":{"line":263,"column":5}},{"start":{},"end":{}}]},"55":{"loc":{"start":{"line":258,"column":8},"end":{"line":258,"column":28}},"type":"cond-expr","locations":[{"start":{"line":258,"column":21},"end":{"line":258,"column":23}},{"start":{"line":258,"column":8},"end":{"line":258,"column":28}}]},"56":{"loc":{"start":{"line":258,"column":8},"end":{"line":258,"column":23}},"type":"binary-expr","locations":[{"start":{"line":258,"column":8},"end":{"line":258,"column":23}},{"start":{"line":258,"column":8},"end":{"line":258,"column":23}}]},"57":{"loc":{"start":{"line":271,"column":2},"end":{"line":294,"column":3}},"type":"if","locations":[{"start":{"line":271,"column":2},"end":{"line":294,"column":3}},{"start":{},"end":{}}]},"58":{"loc":{"start":{"line":271,"column":6},"end":{"line":271,"column":27}},"type":"cond-expr","locations":[{"start":{"line":271,"column":19},"end":{"line":271,"column":21}},{"start":{"line":271,"column":19},"end":{"line":271,"column":27}}]},"59":{"loc":{"start":{"line":271,"column":6},"end":{"line":271,"column":21}},"type":"binary-expr","locations":[{"start":{"line":271,"column":6},"end":{"line":271,"column":21}},{"start":{"line":271,"column":19},"end":{"line":271,"column":21}}]},"60":{"loc":{"start":{"line":273,"column":6},"end":{"line":275,"column":71}},"type":"cond-expr","locations":[{"start":{"line":274,"column":10},"end":{"line":274,"column":22}},{"start":{"line":275,"column":10},"end":{"line":275,"column":71}}]},"61":{"loc":{"start":{"line":273,"column":6},"end":{"line":273,"column":41}},"type":"binary-expr","locations":[{"start":{"line":273,"column":6},"end":{"line":273,"column":18}},{"start":{"line":273,"column":22},"end":{"line":273,"column":41}}]},"62":{"loc":{"start":{"line":275,"column":10},"end":{"line":275,"column":71}},"type":"binary-expr","locations":[{"start":{"line":275,"column":10},"end":{"line":275,"column":65}},{"start":{"line":275,"column":69},"end":{"line":275,"column":71}}]},"63":{"loc":{"start":{"line":275,"column":10},"end":{"line":275,"column":65}},"type":"cond-expr","locations":[{"start":{"line":275,"column":23},"end":{"line":275,"column":25}},{"start":{"line":275,"column":23},"end":{"line":275,"column":65}}]},"64":{"loc":{"start":{"line":275,"column":10},"end":{"line":275,"column":25}},"type":"binary-expr","locations":[{"start":{"line":275,"column":10},"end":{"line":275,"column":25}},{"start":{"line":275,"column":23},"end":{"line":275,"column":25}}]},"65":{"loc":{"start":{"line":277,"column":35},"end":{"line":293,"column":8}},"type":"cond-expr","locations":[{"start":{"line":277,"column":59},"end":{"line":277,"column":null}},{"start":{"line":277,"column":59},"end":{"line":293,"column":8}}]},"66":{"loc":{"start":{"line":277,"column":35},"end":{"line":277,"column":null}},"type":"binary-expr","locations":[{"start":{"line":277,"column":35},"end":{"line":277,"column":null}},{"start":{"line":277,"column":59},"end":{"line":277,"column":null}}]},"67":{"loc":{"start":{"line":277,"column":35},"end":{"line":277,"column":59}},"type":"cond-expr","locations":[{"start":{"line":277,"column":47},"end":{"line":277,"column":49}},{"start":{"line":277,"column":47},"end":{"line":277,"column":59}}]},"68":{"loc":{"start":{"line":277,"column":35},"end":{"line":277,"column":49}},"type":"binary-expr","locations":[{"start":{"line":277,"column":35},"end":{"line":277,"column":49}},{"start":{"line":277,"column":47},"end":{"line":277,"column":49}}]},"69":{"loc":{"start":{"line":277,"column":35},"end":{"line":277,"column":47}},"type":"cond-expr","locations":[{"start":{"line":277,"column":41},"end":{"line":277,"column":43}},{"start":{"line":277,"column":35},"end":{"line":277,"column":47}}]},"70":{"loc":{"start":{"line":277,"column":35},"end":{"line":277,"column":43}},"type":"binary-expr","locations":[{"start":{"line":277,"column":35},"end":{"line":277,"column":43}},{"start":{"line":277,"column":35},"end":{"line":277,"column":43}}]},"71":{"loc":{"start":{"line":281,"column":8},"end":{"line":287,"column":9}},"type":"if","locations":[{"start":{"line":281,"column":8},"end":{"line":287,"column":9}},{"start":{},"end":{}}]},"72":{"loc":{"start":{"line":281,"column":12},"end":{"line":281,"column":27}},"type":"cond-expr","locations":[{"start":{"line":281,"column":19},"end":{"line":281,"column":21}},{"start":{"line":281,"column":19},"end":{"line":281,"column":27}}]},"73":{"loc":{"start":{"line":281,"column":12},"end":{"line":281,"column":21}},"type":"binary-expr","locations":[{"start":{"line":281,"column":12},"end":{"line":281,"column":21}},{"start":{"line":281,"column":19},"end":{"line":281,"column":21}}]},"74":{"loc":{"start":{"line":283,"column":12},"end":{"line":285,"column":13}},"type":"if","locations":[{"start":{"line":283,"column":12},"end":{"line":285,"column":13}},{"start":{},"end":{}}]},"75":{"loc":{"start":{"line":283,"column":16},"end":{"line":283,"column":51}},"type":"binary-expr","locations":[{"start":{"line":283,"column":16},"end":{"line":283,"column":34}},{"start":{"line":283,"column":38},"end":{"line":283,"column":51}}]},"76":{"loc":{"start":{"line":302,"column":2},"end":{"line":302,"column":null}},"type":"if","locations":[{"start":{"line":302,"column":2},"end":{"line":302,"column":null}},{"start":{},"end":{}}]},"77":{"loc":{"start":{"line":305,"column":2},"end":{"line":308,"column":3}},"type":"if","locations":[{"start":{"line":305,"column":2},"end":{"line":308,"column":3}},{"start":{},"end":{}}]},"78":{"loc":{"start":{"line":305,"column":6},"end":{"line":305,"column":43}},"type":"binary-expr","locations":[{"start":{"line":305,"column":6},"end":{"line":305,"column":27}},{"start":{"line":305,"column":31},"end":{"line":305,"column":43}}]},"79":{"loc":{"start":{"line":315,"column":2},"end":{"line":317,"column":3}},"type":"if","locations":[{"start":{"line":315,"column":2},"end":{"line":317,"column":3}},{"start":{},"end":{}}]},"80":{"loc":{"start":{"line":319,"column":2},"end":{"line":321,"column":3}},"type":"if","locations":[{"start":{"line":319,"column":2},"end":{"line":321,"column":3}},{"start":{},"end":{}}]},"81":{"loc":{"start":{"line":323,"column":2},"end":{"line":325,"column":3}},"type":"if","locations":[{"start":{"line":323,"column":2},"end":{"line":325,"column":3}},{"start":{},"end":{}}]},"82":{"loc":{"start":{"line":323,"column":6},"end":{"line":323,"column":69}},"type":"binary-expr","locations":[{"start":{"line":323,"column":6},"end":{"line":323,"column":30}},{"start":{"line":323,"column":34},"end":{"line":323,"column":69}}]},"83":{"loc":{"start":{"line":329,"column":4},"end":{"line":329,"column":43}},"type":"binary-expr","locations":[{"start":{"line":329,"column":4},"end":{"line":329,"column":37}},{"start":{"line":329,"column":41},"end":{"line":329,"column":43}}]},"84":{"loc":{"start":{"line":331,"column":4},"end":{"line":333,"column":5}},"type":"if","locations":[{"start":{"line":331,"column":4},"end":{"line":333,"column":5}},{"start":{},"end":{}}]},"85":{"loc":{"start":{"line":331,"column":8},"end":{"line":331,"column":31}},"type":"binary-expr","locations":[{"start":{"line":331,"column":8},"end":{"line":331,"column":13}},{"start":{"line":331,"column":17},"end":{"line":331,"column":31}}]},"86":{"loc":{"start":{"line":341,"column":2},"end":{"line":346,"column":3}},"type":"if","locations":[{"start":{"line":341,"column":2},"end":{"line":346,"column":3}},{"start":{},"end":{}}]},"87":{"loc":{"start":{"line":341,"column":17},"end":{"line":341,"column":56}},"type":"binary-expr","locations":[{"start":{"line":341,"column":17},"end":{"line":341,"column":50}},{"start":{"line":341,"column":54},"end":{"line":341,"column":56}}]},"88":{"loc":{"start":{"line":350,"column":2},"end":{"line":352,"column":3}},"type":"if","locations":[{"start":{"line":350,"column":2},"end":{"line":352,"column":3}},{"start":{},"end":{}}]},"89":{"loc":{"start":{"line":354,"column":15},"end":{"line":355,"column":null}},"type":"cond-expr","locations":[{"start":{"line":354,"column":41},"end":{"line":354,"column":43}},{"start":{"line":354,"column":41},"end":{"line":355,"column":null}}]},"90":{"loc":{"start":{"line":354,"column":15},"end":{"line":354,"column":43}},"type":"binary-expr","locations":[{"start":{"line":354,"column":15},"end":{"line":354,"column":43}},{"start":{"line":354,"column":41},"end":{"line":354,"column":43}}]},"91":{"loc":{"start":{"line":354,"column":15},"end":{"line":354,"column":41}},"type":"cond-expr","locations":[{"start":{"line":354,"column":29},"end":{"line":354,"column":31}},{"start":{"line":354,"column":29},"end":{"line":354,"column":41}}]},"92":{"loc":{"start":{"line":354,"column":15},"end":{"line":354,"column":31}},"type":"binary-expr","locations":[{"start":{"line":354,"column":15},"end":{"line":354,"column":31}},{"start":{"line":354,"column":29},"end":{"line":354,"column":31}}]},"93":{"loc":{"start":{"line":358,"column":2},"end":{"line":360,"column":3}},"type":"if","locations":[{"start":{"line":358,"column":2},"end":{"line":360,"column":3}},{"start":{},"end":{}}]}},"s":{"0":8,"1":8,"2":8,"3":8,"4":8,"5":8,"6":8,"7":8,"8":8,"9":10,"10":1,"11":18,"12":9,"13":9,"14":9,"15":8,"16":8,"17":9,"18":9,"19":9,"20":1,"21":1,"22":2,"23":2,"24":2,"25":1,"26":1,"27":2,"28":2,"29":2,"30":2,"31":2,"32":0,"33":2,"34":2,"35":2,"36":9,"37":1,"38":8,"39":8,"40":8,"41":4,"42":2,"43":2,"44":2,"45":2,"46":2,"47":2,"48":2,"49":2,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":0,"57":2,"58":2,"59":6,"60":0,"61":6,"62":6,"63":6,"64":1,"65":5,"66":5,"67":0,"68":10,"69":2,"70":1,"71":1,"72":8,"73":8,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":4,"81":4,"82":4,"83":4,"84":1,"85":1,"86":1,"87":3,"88":3,"89":3,"90":0,"91":3,"92":3,"93":1,"94":3,"95":1,"96":1,"97":1,"98":1,"99":1,"100":0,"101":0,"102":1,"103":3,"104":1,"105":0,"106":1,"107":3,"108":2,"109":2,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":2,"117":3,"118":29,"119":21,"120":1,"121":1,"122":21,"123":21,"124":1,"125":21,"126":18,"127":21,"128":10,"129":21,"130":21,"131":21,"132":21,"133":3,"134":3,"135":3,"136":3,"137":2,"138":21,"139":21,"140":20,"141":21,"142":21,"143":20,"144":1,"145":1,"146":1,"147":1,"148":1},"f":{"0":10,"1":2,"2":3,"3":1,"4":0,"5":3,"6":2,"7":21,"8":1},"b":{"0":[4],"1":[1,9],"2":[8,1],"3":[0,9],"4":[9,9],"5":[1,8],"6":[0,9],"7":[9,9],"8":[2,1],"9":[2,0],"10":[2,1],"11":[2,0],"12":[1,8],"13":[9,1],"14":[0,1],"15":[1,1],"16":[2,0],"17":[1,1],"18":[1,1],"19":[2,1,1],"20":[1,0],"21":[0,1],"22":[1,1],"23":[0,6],"24":[0,6],"25":[6,6],"26":[0,6],"27":[6,6],"28":[0,6],"29":[6,6],"30":[0,6],"31":[6,6],"32":[1,5],"33":[0,5],"34":[0,5],"35":[5,5],"36":[0,5],"37":[5,5],"38":[0,0],"39":[1,0],"40":[4,0],"41":[0,0],"42":[0,0],"43":[0,0],"44":[0,0],"45":[0,0],"46":[0,3],"47":[0,3],"48":[3,3],"49":[2,1],"50":[3,3],"51":[2,1],"52":[3,3],"53":[1,2],"54":[1,0],"55":[0,1],"56":[1,1],"57":[1,2],"58":[0,3],"59":[3,3],"60":[1,0],"61":[1,1],"62":[0,0],"63":[0,0],"64":[0,0],"65":[0,1],"66":[1,1],"67":[0,1],"68":[1,1],"69":[0,1],"70":[1,1],"71":[0,2],"72":[0,2],"73":[2,2],"74":[0,0],"75":[0,0],"76":[8,13],"77":[1,20],"78":[21,4],"79":[1,20],"80":[18,3],"81":[10,11],"82":[21,10],"83":[21,9],"84":[2,1],"85":[3,3],"86":[20,1],"87":[21,9],"88":[20,1],"89":[0,1],"90":[1,1],"91":[0,1],"92":[1,1],"93":[1,0]}} +,"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/hooks/run-container-step.ts": {"path":"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/hooks/run-container-step.ts","statementMap":{"0":{"start":{"line":36,"column":0},"end":{"line":36,"column":22}},"1":{"start":{"line":1,"column":0},"end":{"line":1,"column":37}},"2":{"start":{"line":2,"column":0},"end":{"line":2,"column":24}},"3":{"start":{"line":3,"column":0},"end":{"line":3,"column":46}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":30}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":null}},"6":{"start":{"line":19,"column":0},"end":{"line":19,"column":null}},"7":{"start":{"line":28,"column":0},"end":{"line":28,"column":null}},"8":{"start":{"line":34,"column":0},"end":{"line":34,"column":64}},"9":{"start":{"line":39,"column":2},"end":{"line":41,"column":3}},"10":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"11":{"start":{"line":43,"column":2},"end":{"line":47,"column":3}},"12":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"13":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"14":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}},"15":{"start":{"line":51,"column":2},"end":{"line":53,"column":3}},"16":{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},"17":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"18":{"start":{"line":57,"column":8},"end":{"line":57,"column":null}},"19":{"start":{"line":58,"column":2},"end":{"line":58,"column":null}},"20":{"start":{"line":62,"column":10},"end":{"line":62,"column":null}},"21":{"start":{"line":62,"column":4},"end":{"line":62,"column":null}},"22":{"start":{"line":64,"column":10},"end":{"line":64,"column":null}},"23":{"start":{"line":65,"column":4},"end":{"line":65,"column":null}},"24":{"start":{"line":66,"column":4},"end":{"line":66,"column":null}},"25":{"start":{"line":69,"column":2},"end":{"line":75,"column":3}},"26":{"start":{"line":70,"column":4},"end":{"line":74,"column":null}},"27":{"start":{"line":76,"column":8},"end":{"line":76,"column":null}},"28":{"start":{"line":79,"column":4},"end":{"line":84,"column":null}},"29":{"start":{"line":86,"column":10},"end":{"line":86,"column":null}},"30":{"start":{"line":87,"column":10},"end":{"line":87,"column":null}},"31":{"start":{"line":88,"column":4},"end":{"line":92,"column":5}},"32":{"start":{"line":89,"column":6},"end":{"line":91,"column":null}},"33":{"start":{"line":93,"column":10},"end":{"line":93,"column":null}},"34":{"start":{"line":94,"column":10},"end":{"line":94,"column":null}},"35":{"start":{"line":95,"column":10},"end":{"line":95,"column":null}},"36":{"start":{"line":96,"column":4},"end":{"line":98,"column":5}},"37":{"start":{"line":97,"column":6},"end":{"line":97,"column":null}},"38":{"start":{"line":99,"column":10},"end":{"line":99,"column":null}},"39":{"start":{"line":101,"column":4},"end":{"line":103,"column":null}},"40":{"start":{"line":104,"column":4},"end":{"line":104,"column":null}},"41":{"start":{"line":106,"column":10},"end":{"line":106,"column":42}},"42":{"start":{"line":114,"column":4},"end":{"line":114,"column":null}},"43":{"start":{"line":116,"column":4},"end":{"line":116,"column":null}},"44":{"start":{"line":119,"column":6},"end":{"line":119,"column":null}},"45":{"start":{"line":120,"column":31},"end":{"line":124,"column":null}},"46":{"start":{"line":120,"column":12},"end":{"line":120,"column":31}},"47":{"start":{"line":125,"column":6},"end":{"line":127,"column":7}},"48":{"start":{"line":126,"column":8},"end":{"line":126,"column":null}},"49":{"start":{"line":132,"column":29},"end":{"line":136,"column":null}},"50":{"start":{"line":132,"column":12},"end":{"line":136,"column":null}},"51":{"start":{"line":137,"column":6},"end":{"line":137,"column":null}},"52":{"start":{"line":139,"column":6},"end":{"line":139,"column":null}},"53":{"start":{"line":141,"column":6},"end":{"line":147,"column":7}},"54":{"start":{"line":146,"column":8},"end":{"line":146,"column":null}},"55":{"start":{"line":148,"column":12},"end":{"line":148,"column":null}},"56":{"start":{"line":149,"column":6},"end":{"line":149,"column":null}},"57":{"start":{"line":151,"column":6},"end":{"line":151,"column":null}},"58":{"start":{"line":155,"column":23},"end":{"line":155,"column":null}},"59":{"start":{"line":155,"column":12},"end":{"line":155,"column":null}},"60":{"start":{"line":156,"column":12},"end":{"line":156,"column":null}},"61":{"start":{"line":157,"column":10},"end":{"line":157,"column":26}},"62":{"start":{"line":158,"column":24},"end":{"line":158,"column":null}},"63":{"start":{"line":158,"column":14},"end":{"line":158,"column":null}},"64":{"start":{"line":159,"column":8},"end":{"line":161,"column":null}},"65":{"start":{"line":166,"column":4},"end":{"line":166,"column":null}},"66":{"start":{"line":167,"column":4},"end":{"line":167,"column":null}},"67":{"start":{"line":169,"column":4},"end":{"line":171,"column":null}},"68":{"start":{"line":170,"column":6},"end":{"line":170,"column":null}},"69":{"start":{"line":186,"column":8},"end":{"line":186,"column":null}},"70":{"start":{"line":187,"column":8},"end":{"line":187,"column":null}},"71":{"start":{"line":188,"column":8},"end":{"line":188,"column":null}},"72":{"start":{"line":191,"column":16},"end":{"line":191,"column":null}},"73":{"start":{"line":191,"column":10},"end":{"line":191,"column":null}},"74":{"start":{"line":192,"column":10},"end":{"line":194,"column":null}},"75":{"start":{"line":193,"column":11},"end":{"line":193,"column":null}},"76":{"start":{"line":195,"column":10},"end":{"line":195,"column":null}},"77":{"start":{"line":196,"column":4},"end":{"line":220,"column":5}},"78":{"start":{"line":197,"column":12},"end":{"line":197,"column":null}},"79":{"start":{"line":198,"column":12},"end":{"line":202,"column":null}},"80":{"start":{"line":203,"column":6},"end":{"line":216,"column":7}},"81":{"start":{"line":204,"column":14},"end":{"line":204,"column":null}},"82":{"start":{"line":205,"column":14},"end":{"line":205,"column":null}},"83":{"start":{"line":206,"column":8},"end":{"line":208,"column":null}},"84":{"start":{"line":210,"column":8},"end":{"line":212,"column":null}},"85":{"start":{"line":213,"column":8},"end":{"line":215,"column":null}},"86":{"start":{"line":219,"column":6},"end":{"line":219,"column":null}},"87":{"start":{"line":221,"column":4},"end":{"line":225,"column":5}},"88":{"start":{"line":222,"column":6},"end":{"line":224,"column":null}},"89":{"start":{"line":228,"column":4},"end":{"line":228,"column":null}},"90":{"start":{"line":231,"column":2},"end":{"line":237,"column":3}},"91":{"start":{"line":232,"column":10},"end":{"line":235,"column":null}},"92":{"start":{"line":234,"column":16},"end":{"line":234,"column":25}},"93":{"start":{"line":236,"column":4},"end":{"line":236,"column":null}},"94":{"start":{"line":239,"column":6},"end":{"line":239,"column":null}},"95":{"start":{"line":240,"column":2},"end":{"line":242,"column":3}},"96":{"start":{"line":241,"column":4},"end":{"line":241,"column":null}},"97":{"start":{"line":243,"column":2},"end":{"line":243,"column":null}},"98":{"start":{"line":250,"column":23},"end":{"line":250,"column":44}},"99":{"start":{"line":251,"column":2},"end":{"line":251,"column":null}},"100":{"start":{"line":252,"column":2},"end":{"line":252,"column":null}},"101":{"start":{"line":253,"column":2},"end":{"line":253,"column":null}},"102":{"start":{"line":254,"column":2},"end":{"line":254,"column":null}},"103":{"start":{"line":255,"column":2},"end":{"line":255,"column":null}},"104":{"start":{"line":257,"column":2},"end":{"line":257,"column":null}},"105":{"start":{"line":259,"column":2},"end":{"line":261,"column":3}},"106":{"start":{"line":260,"column":4},"end":{"line":260,"column":null}},"107":{"start":{"line":263,"column":15},"end":{"line":264,"column":null}},"108":{"start":{"line":264,"column":9},"end":{"line":264,"column":null}},"109":{"start":{"line":266,"column":2},"end":{"line":268,"column":3}},"110":{"start":{"line":267,"column":4},"end":{"line":267,"column":null}},"111":{"start":{"line":270,"column":2},"end":{"line":270,"column":null}}},"fnMap":{"0":{"name":"runContainerStep","decl":{"start":{"line":36,"column":22},"end":{"line":36,"column":38}},"loc":{"start":{"line":37,"column":37},"end":{"line":173,"column":null}}},"1":{"name":"(anonymous_25)","decl":{"start":{"line":169,"column":35},"end":{"line":169,"column":38}},"loc":{"start":{"line":169,"column":38},"end":{"line":171,"column":5}}},"2":{"name":"classifyScriptError","decl":{"start":{"line":181,"column":15},"end":{"line":181,"column":34}},"loc":{"start":{"line":184,"column":20},"end":{"line":244,"column":null}}},"3":{"name":"(anonymous_29)","decl":{"start":{"line":193,"column":6},"end":{"line":193,"column":7}},"loc":{"start":{"line":193,"column":7},"end":{"line":193,"column":12}}},"4":{"name":"(anonymous_30)","decl":{"start":{"line":234,"column":11},"end":{"line":234,"column":12}},"loc":{"start":{"line":234,"column":12},"end":{"line":234,"column":21}}},"5":{"name":"createContainerSpec","decl":{"start":{"line":246,"column":9},"end":{"line":246,"column":28}},"loc":{"start":{"line":248,"column":35},"end":{"line":271,"column":1}}},"6":{"name":"(anonymous_32)","decl":{"start":{"line":264,"column":4},"end":{"line":264,"column":5}},"loc":{"start":{"line":264,"column":5},"end":{"line":264,"column":10}}}},"branchMap":{"0":{"loc":{"start":{"line":169,"column":4},"end":{"line":171,"column":null}},"type":"switch","locations":[{"start":{"line":169,"column":4},"end":{"line":171,"column":null}}]},"1":{"loc":{"start":{"line":39,"column":2},"end":{"line":41,"column":3}},"type":"if","locations":[{"start":{"line":39,"column":2},"end":{"line":41,"column":3}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":43,"column":2},"end":{"line":47,"column":3}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":47,"column":3}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":49,"column":15},"end":{"line":49,"column":55}},"type":"binary-expr","locations":[{"start":{"line":49,"column":15},"end":{"line":49,"column":49}},{"start":{"line":49,"column":53},"end":{"line":49,"column":55}}]},"4":{"loc":{"start":{"line":51,"column":2},"end":{"line":53,"column":3}},"type":"if","locations":[{"start":{"line":51,"column":2},"end":{"line":53,"column":3}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":69,"column":2},"end":{"line":75,"column":3}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":75,"column":3}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":69,"column":7},"end":{"line":69,"column":25}},"type":"cond-expr","locations":[{"start":{"line":69,"column":19},"end":{"line":69,"column":21}},{"start":{"line":69,"column":19},"end":{"line":69,"column":25}}]},"7":{"loc":{"start":{"line":69,"column":7},"end":{"line":69,"column":21}},"type":"binary-expr","locations":[{"start":{"line":69,"column":7},"end":{"line":69,"column":21}},{"start":{"line":69,"column":19},"end":{"line":69,"column":21}}]},"8":{"loc":{"start":{"line":88,"column":4},"end":{"line":92,"column":5}},"type":"if","locations":[{"start":{"line":88,"column":4},"end":{"line":92,"column":5}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":88,"column":8},"end":{"line":88,"column":50}},"type":"binary-expr","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":27}},{"start":{"line":88,"column":31},"end":{"line":88,"column":50}}]},"10":{"loc":{"start":{"line":96,"column":4},"end":{"line":98,"column":5}},"type":"if","locations":[{"start":{"line":96,"column":4},"end":{"line":98,"column":5}},{"start":{},"end":{}}]},"11":{"loc":{"start":{"line":125,"column":6},"end":{"line":127,"column":7}},"type":"if","locations":[{"start":{"line":125,"column":6},"end":{"line":127,"column":7}},{"start":{},"end":{}}]},"12":{"loc":{"start":{"line":141,"column":6},"end":{"line":147,"column":7}},"type":"if","locations":[{"start":{"line":141,"column":6},"end":{"line":147,"column":7}},{"start":{},"end":{}}]},"13":{"loc":{"start":{"line":142,"column":8},"end":{"line":144,"column":62}},"type":"binary-expr","locations":[{"start":{"line":142,"column":8},"end":{"line":142,"column":28}},{"start":{"line":143,"column":9},"end":{"line":143,"column":47}},{"start":{"line":144,"column":10},"end":{"line":144,"column":61}}]},"14":{"loc":{"start":{"line":157,"column":10},"end":{"line":157,"column":26}},"type":"if","locations":[{"start":{"line":157,"column":10},"end":{"line":157,"column":26}},{"start":{},"end":{}}]},"15":{"loc":{"start":{"line":192,"column":15},"end":{"line":193,"column":null}},"type":"cond-expr","locations":[{"start":{"line":192,"column":44},"end":{"line":192,"column":46}},{"start":{"line":192,"column":44},"end":{"line":193,"column":null}}]},"16":{"loc":{"start":{"line":192,"column":15},"end":{"line":192,"column":46}},"type":"binary-expr","locations":[{"start":{"line":192,"column":15},"end":{"line":192,"column":46}},{"start":{"line":192,"column":44},"end":{"line":192,"column":46}}]},"17":{"loc":{"start":{"line":192,"column":15},"end":{"line":192,"column":44}},"type":"cond-expr","locations":[{"start":{"line":192,"column":25},"end":{"line":192,"column":27}},{"start":{"line":192,"column":25},"end":{"line":192,"column":44}}]},"18":{"loc":{"start":{"line":192,"column":15},"end":{"line":192,"column":27}},"type":"binary-expr","locations":[{"start":{"line":192,"column":15},"end":{"line":192,"column":27}},{"start":{"line":192,"column":25},"end":{"line":192,"column":27}}]},"19":{"loc":{"start":{"line":195,"column":17},"end":{"line":195,"column":38}},"type":"cond-expr","locations":[{"start":{"line":195,"column":26},"end":{"line":195,"column":28}},{"start":{"line":195,"column":26},"end":{"line":195,"column":38}}]},"20":{"loc":{"start":{"line":195,"column":17},"end":{"line":195,"column":28}},"type":"binary-expr","locations":[{"start":{"line":195,"column":17},"end":{"line":195,"column":28}},{"start":{"line":195,"column":26},"end":{"line":195,"column":28}}]},"21":{"loc":{"start":{"line":195,"column":17},"end":{"line":195,"column":26}},"type":"cond-expr","locations":[{"start":{"line":195,"column":19},"end":{"line":195,"column":21}},{"start":{"line":195,"column":17},"end":{"line":195,"column":26}}]},"22":{"loc":{"start":{"line":195,"column":17},"end":{"line":195,"column":21}},"type":"binary-expr","locations":[{"start":{"line":195,"column":17},"end":{"line":195,"column":21}},{"start":{"line":195,"column":17},"end":{"line":195,"column":21}}]},"23":{"loc":{"start":{"line":196,"column":4},"end":{"line":220,"column":5}},"type":"if","locations":[{"start":{"line":196,"column":4},"end":{"line":220,"column":5}},{"start":{"line":217,"column":11},"end":{"line":220,"column":5}}]},"24":{"loc":{"start":{"line":197,"column":21},"end":{"line":197,"column":47}},"type":"cond-expr","locations":[{"start":{"line":197,"column":32},"end":{"line":197,"column":36}},{"start":{"line":197,"column":36},"end":{"line":197,"column":47}}]},"25":{"loc":{"start":{"line":197,"column":21},"end":{"line":197,"column":36}},"type":"binary-expr","locations":[{"start":{"line":197,"column":21},"end":{"line":197,"column":36}},{"start":{"line":197,"column":32},"end":{"line":197,"column":36}}]},"26":{"loc":{"start":{"line":199,"column":8},"end":{"line":202,"column":57}},"type":"binary-expr","locations":[{"start":{"line":199,"column":8},"end":{"line":199,"column":30}},{"start":{"line":200,"column":8},"end":{"line":200,"column":26}},{"start":{"line":201,"column":8},"end":{"line":201,"column":45}},{"start":{"line":202,"column":9},"end":{"line":202,"column":30}},{"start":{"line":202,"column":34},"end":{"line":202,"column":56}}]},"27":{"loc":{"start":{"line":203,"column":6},"end":{"line":216,"column":7}},"type":"if","locations":[{"start":{"line":203,"column":6},"end":{"line":216,"column":7}},{"start":{"line":209,"column":13},"end":{"line":216,"column":7}}]},"28":{"loc":{"start":{"line":204,"column":23},"end":{"line":204,"column":66}},"type":"cond-expr","locations":[{"start":{"line":204,"column":38},"end":{"line":204,"column":61}},{"start":{"line":204,"column":64},"end":{"line":204,"column":66}}]},"29":{"loc":{"start":{"line":221,"column":4},"end":{"line":225,"column":5}},"type":"if","locations":[{"start":{"line":221,"column":4},"end":{"line":225,"column":5}},{"start":{},"end":{}}]},"30":{"loc":{"start":{"line":221,"column":8},"end":{"line":221,"column":26}},"type":"cond-expr","locations":[{"start":{"line":221,"column":17},"end":{"line":221,"column":19}},{"start":{"line":221,"column":17},"end":{"line":221,"column":26}}]},"31":{"loc":{"start":{"line":221,"column":8},"end":{"line":221,"column":19}},"type":"binary-expr","locations":[{"start":{"line":221,"column":8},"end":{"line":221,"column":19}},{"start":{"line":221,"column":17},"end":{"line":221,"column":19}}]},"32":{"loc":{"start":{"line":221,"column":8},"end":{"line":221,"column":17}},"type":"cond-expr","locations":[{"start":{"line":221,"column":10},"end":{"line":221,"column":12}},{"start":{"line":221,"column":8},"end":{"line":221,"column":17}}]},"33":{"loc":{"start":{"line":221,"column":8},"end":{"line":221,"column":12}},"type":"binary-expr","locations":[{"start":{"line":221,"column":8},"end":{"line":221,"column":12}},{"start":{"line":221,"column":8},"end":{"line":221,"column":12}}]},"34":{"loc":{"start":{"line":223,"column":58},"end":{"line":223,"column":94}},"type":"cond-expr","locations":[{"start":{"line":223,"column":81},"end":{"line":223,"column":85}},{"start":{"line":223,"column":85},"end":{"line":223,"column":94}}]},"35":{"loc":{"start":{"line":223,"column":58},"end":{"line":223,"column":85}},"type":"binary-expr","locations":[{"start":{"line":223,"column":58},"end":{"line":223,"column":85}},{"start":{"line":223,"column":81},"end":{"line":223,"column":85}}]},"36":{"loc":{"start":{"line":231,"column":2},"end":{"line":237,"column":3}},"type":"if","locations":[{"start":{"line":231,"column":2},"end":{"line":237,"column":3}},{"start":{},"end":{}}]},"37":{"loc":{"start":{"line":240,"column":2},"end":{"line":242,"column":3}},"type":"if","locations":[{"start":{"line":240,"column":2},"end":{"line":242,"column":3}},{"start":{},"end":{}}]},"38":{"loc":{"start":{"line":259,"column":2},"end":{"line":261,"column":3}},"type":"if","locations":[{"start":{"line":259,"column":2},"end":{"line":261,"column":3}},{"start":{},"end":{}}]},"39":{"loc":{"start":{"line":263,"column":15},"end":{"line":264,"column":null}},"type":"cond-expr","locations":[{"start":{"line":263,"column":41},"end":{"line":263,"column":43}},{"start":{"line":263,"column":41},"end":{"line":264,"column":null}}]},"40":{"loc":{"start":{"line":263,"column":15},"end":{"line":263,"column":43}},"type":"binary-expr","locations":[{"start":{"line":263,"column":15},"end":{"line":263,"column":43}},{"start":{"line":263,"column":41},"end":{"line":263,"column":43}}]},"41":{"loc":{"start":{"line":263,"column":15},"end":{"line":263,"column":41}},"type":"cond-expr","locations":[{"start":{"line":263,"column":29},"end":{"line":263,"column":31}},{"start":{"line":263,"column":29},"end":{"line":263,"column":41}}]},"42":{"loc":{"start":{"line":263,"column":15},"end":{"line":263,"column":31}},"type":"binary-expr","locations":[{"start":{"line":263,"column":15},"end":{"line":263,"column":31}},{"start":{"line":263,"column":29},"end":{"line":263,"column":31}}]},"43":{"loc":{"start":{"line":266,"column":2},"end":{"line":268,"column":3}},"type":"if","locations":[{"start":{"line":266,"column":2},"end":{"line":268,"column":3}},{"start":{},"end":{}}]}},"s":{"0":8,"1":8,"2":8,"3":8,"4":8,"5":8,"6":8,"7":8,"8":8,"9":16,"10":1,"11":15,"12":1,"13":14,"14":14,"15":14,"16":13,"17":14,"18":14,"19":14,"20":14,"21":0,"22":14,"23":14,"24":14,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":14,"99":14,"100":14,"101":14,"102":14,"103":14,"104":14,"105":14,"106":14,"107":0,"108":0,"109":0,"110":0,"111":0},"f":{"0":16,"1":0,"2":0,"3":0,"4":0,"5":14,"6":0},"b":{"0":[0],"1":[1,15],"2":[1,14],"3":[14,5],"4":[13,1],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0,0,0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0,0],"31":[0,0],"32":[0,0],"33":[0,0],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[14,0],"39":[0,0],"40":[0,0],"41":[0,0],"42":[0,0],"43":[0,0]}} +,"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/hooks/run-script-step.ts": {"path":"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/hooks/run-script-step.ts","statementMap":{"0":{"start":{"line":35,"column":0},"end":{"line":35,"column":22}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":24}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":null}},"4":{"start":{"line":11,"column":0},"end":{"line":11,"column":58}},"5":{"start":{"line":12,"column":0},"end":{"line":12,"column":48}},"6":{"start":{"line":13,"column":0},"end":{"line":13,"column":30}},"7":{"start":{"line":17,"column":14},"end":{"line":17,"column":28}},"8":{"start":{"line":18,"column":17},"end":{"line":21,"column":null}},"9":{"start":{"line":22,"column":29},"end":{"line":22,"column":31}},"10":{"start":{"line":23,"column":2},"end":{"line":29,"column":3}},"11":{"start":{"line":24,"column":24},"end":{"line":27,"column":17}},"12":{"start":{"line":26,"column":16},"end":{"line":26,"column":25}},"13":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"14":{"start":{"line":30,"column":15},"end":{"line":30,"column":65}},"15":{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},"16":{"start":{"line":31,"column":23},"end":{"line":31,"column":null}},"17":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"18":{"start":{"line":40,"column":2},"end":{"line":44,"column":3}},"19":{"start":{"line":41,"column":4},"end":{"line":43,"column":null}},"20":{"start":{"line":47,"column":10},"end":{"line":47,"column":63}},"21":{"start":{"line":48,"column":8},"end":{"line":48,"column":40}},"22":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"23":{"start":{"line":57,"column":8},"end":{"line":57,"column":null}},"24":{"start":{"line":58,"column":8},"end":{"line":58,"column":null}},"25":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"26":{"start":{"line":61,"column":2},"end":{"line":69,"column":null}},"27":{"start":{"line":70,"column":2},"end":{"line":70,"column":null}},"28":{"start":{"line":76,"column":8},"end":{"line":91,"column":null}},"29":{"start":{"line":94,"column":4},"end":{"line":98,"column":null}},"30":{"start":{"line":100,"column":10},"end":{"line":100,"column":null}},"31":{"start":{"line":101,"column":4},"end":{"line":101,"column":null}},"32":{"start":{"line":102,"column":4},"end":{"line":102,"column":null}},"33":{"start":{"line":106,"column":2},"end":{"line":106,"column":null}},"34":{"start":{"line":107,"column":2},"end":{"line":107,"column":null}},"35":{"start":{"line":109,"column":29},"end":{"line":113,"column":null}},"36":{"start":{"line":109,"column":10},"end":{"line":109,"column":29}},"37":{"start":{"line":114,"column":4},"end":{"line":116,"column":5}},"38":{"start":{"line":115,"column":6},"end":{"line":115,"column":null}},"39":{"start":{"line":118,"column":4},"end":{"line":118,"column":null}},"40":{"start":{"line":119,"column":4},"end":{"line":124,"column":5}},"41":{"start":{"line":123,"column":6},"end":{"line":123,"column":null}},"42":{"start":{"line":125,"column":10},"end":{"line":125,"column":null}},"43":{"start":{"line":126,"column":4},"end":{"line":126,"column":null}},"44":{"start":{"line":128,"column":4},"end":{"line":132,"column":5}},"45":{"start":{"line":129,"column":6},"end":{"line":129,"column":null}},"46":{"start":{"line":131,"column":6},"end":{"line":131,"column":null}},"47":{"start":{"line":136,"column":4},"end":{"line":138,"column":null}},"48":{"start":{"line":139,"column":4},"end":{"line":143,"column":null}},"49":{"start":{"line":145,"column":4},"end":{"line":145,"column":null}}},"fnMap":{"0":{"name":"formatScriptError","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":26}},"loc":{"start":{"line":16,"column":63},"end":{"line":33,"column":1}}},"1":{"name":"(anonymous_24)","decl":{"start":{"line":26,"column":11},"end":{"line":26,"column":12}},"loc":{"start":{"line":26,"column":12},"end":{"line":26,"column":21}}},"2":{"name":"runScriptStep","decl":{"start":{"line":35,"column":22},"end":{"line":35,"column":35}},"loc":{"start":{"line":37,"column":7},"end":{"line":147,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":23,"column":2},"end":{"line":29,"column":3}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":29,"column":3}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":40,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":40,"column":2},"end":{"line":44,"column":3}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":40,"column":7},"end":{"line":40,"column":20}},"type":"cond-expr","locations":[{"start":{"line":40,"column":12},"end":{"line":40,"column":14}},{"start":{"line":40,"column":7},"end":{"line":40,"column":20}}]},"4":{"loc":{"start":{"line":40,"column":7},"end":{"line":40,"column":14}},"type":"binary-expr","locations":[{"start":{"line":40,"column":7},"end":{"line":40,"column":14}},{"start":{"line":40,"column":7},"end":{"line":40,"column":14}}]},"5":{"loc":{"start":{"line":114,"column":4},"end":{"line":116,"column":5}},"type":"if","locations":[{"start":{"line":114,"column":4},"end":{"line":116,"column":5}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":119,"column":4},"end":{"line":124,"column":5}},"type":"if","locations":[{"start":{"line":119,"column":4},"end":{"line":124,"column":5}},{"start":{},"end":{}}]},"7":{"loc":{"start":{"line":120,"column":6},"end":{"line":121,"column":57}},"type":"binary-expr","locations":[{"start":{"line":120,"column":6},"end":{"line":120,"column":26}},{"start":{"line":121,"column":6},"end":{"line":121,"column":57}}]}},"s":{"0":7,"1":7,"2":7,"3":7,"4":7,"5":7,"6":7,"7":3,"8":3,"9":3,"10":3,"11":3,"12":7,"13":3,"14":3,"15":3,"16":3,"17":3,"18":7,"19":2,"20":5,"21":5,"22":5,"23":5,"24":5,"25":5,"26":10,"27":10,"28":5,"29":10,"30":0,"31":0,"32":0,"33":5,"34":5,"35":5,"36":5,"37":4,"38":3,"39":4,"40":4,"41":3,"42":1,"43":1,"44":5,"45":5,"46":0,"47":1,"48":2,"49":0},"f":{"0":3,"1":7,"2":7},"b":{"0":[3,0],"1":[3,0],"2":[2,5],"3":[0,7],"4":[7,7],"5":[3,1],"6":[3,1],"7":[4,4]}} +,"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/k8s/heartbeat.ts": {"path":"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/k8s/heartbeat.ts","statementMap":{"0":{"start":{"line":11,"column":0},"end":{"line":11,"column":16}},"1":{"start":{"line":1,"column":0},"end":{"line":1,"column":37}},"2":{"start":{"line":15,"column":17},"end":{"line":15,"column":49}},"3":{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},"4":{"start":{"line":19,"column":0},"end":{"line":19,"column":13}},"5":{"start":{"line":26,"column":21},"end":{"line":26,"column":41}},"6":{"start":{"line":27,"column":21},"end":{"line":27,"column":43}},"7":{"start":{"line":20,"column":10},"end":{"line":20,"column":null}},"8":{"start":{"line":21,"column":10},"end":{"line":21,"column":null}},"9":{"start":{"line":22,"column":10},"end":{"line":22,"column":null}},"10":{"start":{"line":30,"column":10},"end":{"line":37,"column":null}},"11":{"start":{"line":31,"column":16},"end":{"line":31,"column":26}},"12":{"start":{"line":32,"column":4},"end":{"line":35,"column":5}},"13":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"14":{"start":{"line":34,"column":6},"end":{"line":34,"column":null}},"15":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"16":{"start":{"line":39,"column":2},"end":{"line":51,"column":null}},"17":{"start":{"line":40,"column":4},"end":{"line":42,"column":5}},"18":{"start":{"line":41,"column":6},"end":{"line":41,"column":null}},"19":{"start":{"line":43,"column":4},"end":{"line":46,"column":5}},"20":{"start":{"line":44,"column":6},"end":{"line":44,"column":null}},"21":{"start":{"line":45,"column":6},"end":{"line":45,"column":null}},"22":{"start":{"line":47,"column":4},"end":{"line":50,"column":5}},"23":{"start":{"line":48,"column":6},"end":{"line":48,"column":null}},"24":{"start":{"line":49,"column":6},"end":{"line":49,"column":null}},"25":{"start":{"line":53,"column":2},"end":{"line":135,"column":null}},"26":{"start":{"line":53,"column":2},"end":{"line":53,"column":7}},"27":{"start":{"line":54,"column":4},"end":{"line":56,"column":null}},"28":{"start":{"line":57,"column":4},"end":{"line":57,"column":null}},"29":{"start":{"line":59,"column":29},"end":{"line":80,"column":5}},"30":{"start":{"line":60,"column":6},"end":{"line":63,"column":7}},"31":{"start":{"line":61,"column":8},"end":{"line":61,"column":null}},"32":{"start":{"line":62,"column":8},"end":{"line":62,"column":null}},"33":{"start":{"line":64,"column":6},"end":{"line":79,"column":null}},"34":{"start":{"line":65,"column":8},"end":{"line":67,"column":null}},"35":{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},"36":{"start":{"line":69,"column":8},"end":{"line":73,"column":9}},"37":{"start":{"line":70,"column":10},"end":{"line":70,"column":null}},"38":{"start":{"line":74,"column":8},"end":{"line":78,"column":null}},"39":{"start":{"line":84,"column":24},"end":{"line":84,"column":29}},"40":{"start":{"line":86,"column":4},"end":{"line":93,"column":null}},"41":{"start":{"line":87,"column":6},"end":{"line":89,"column":7}},"42":{"start":{"line":88,"column":8},"end":{"line":88,"column":null}},"43":{"start":{"line":90,"column":6},"end":{"line":92,"column":7}},"44":{"start":{"line":91,"column":8},"end":{"line":91,"column":null}},"45":{"start":{"line":95,"column":4},"end":{"line":98,"column":null}},"46":{"start":{"line":96,"column":6},"end":{"line":96,"column":null}},"47":{"start":{"line":97,"column":6},"end":{"line":97,"column":null}},"48":{"start":{"line":100,"column":4},"end":{"line":103,"column":null}},"49":{"start":{"line":101,"column":6},"end":{"line":101,"column":null}},"50":{"start":{"line":102,"column":6},"end":{"line":102,"column":null}},"51":{"start":{"line":106,"column":4},"end":{"line":134,"column":null}},"52":{"start":{"line":107,"column":6},"end":{"line":110,"column":7}},"53":{"start":{"line":109,"column":8},"end":{"line":109,"column":14}},"54":{"start":{"line":111,"column":6},"end":{"line":133,"column":7}},"55":{"start":{"line":112,"column":8},"end":{"line":124,"column":9}},"56":{"start":{"line":113,"column":10},"end":{"line":113,"column":null}},"57":{"start":{"line":114,"column":10},"end":{"line":117,"column":11}},"58":{"start":{"line":115,"column":12},"end":{"line":115,"column":null}},"59":{"start":{"line":116,"column":12},"end":{"line":116,"column":null}},"60":{"start":{"line":118,"column":10},"end":{"line":120,"column":11}},"61":{"start":{"line":119,"column":12},"end":{"line":119,"column":null}},"62":{"start":{"line":122,"column":10},"end":{"line":122,"column":null}},"63":{"start":{"line":123,"column":10},"end":{"line":123,"column":null}},"64":{"start":{"line":127,"column":8},"end":{"line":131,"column":9}},"65":{"start":{"line":128,"column":10},"end":{"line":130,"column":null}},"66":{"start":{"line":132,"column":8},"end":{"line":132,"column":null}},"67":{"start":{"line":23,"column":26},"end":{"line":23,"column":null}},"68":{"start":{"line":136,"column":0},"end":{"line":136,"column":null}},"69":{"start":{"line":19,"column":13},"end":{"line":19,"column":31}}},"fnMap":{"0":{"name":"parsePositiveMsEnv","decl":{"start":{"line":11,"column":16},"end":{"line":11,"column":34}},"loc":{"start":{"line":13,"column":18},"end":{"line":17,"column":1}}},"1":{"name":"(anonymous_10)","decl":{"start":{"line":19,"column":0},"end":{"line":19,"column":13}},"loc":{"start":{"line":19,"column":0},"end":{"line":136,"column":null}}},"2":{"name":"WebSocketHeartbeat","decl":{"start":{"line":25,"column":2},"end":{"line":25,"column":null}},"loc":{"start":{"line":27,"column":43},"end":{"line":28,"column":6}}},"3":{"name":"(anonymous_12)","decl":{"start":{"line":30,"column":2},"end":{"line":30,"column":10}},"loc":{"start":{"line":30,"column":2},"end":{"line":37,"column":3}}},"4":{"name":"(anonymous_13)","decl":{"start":{"line":39,"column":2},"end":{"line":39,"column":6}},"loc":{"start":{"line":39,"column":2},"end":{"line":51,"column":3}}},"5":{"name":"(anonymous_14)","decl":{"start":{"line":53,"column":2},"end":{"line":53,"column":7}},"loc":{"start":{"line":53,"column":60},"end":{"line":135,"column":3}}},"6":{"name":"(anonymous_15)","decl":{"start":{"line":59,"column":29},"end":{"line":59,"column":null}},"loc":{"start":{"line":59,"column":29},"end":{"line":80,"column":5}}},"7":{"name":"(anonymous_16)","decl":{"start":{"line":64,"column":36},"end":{"line":64,"column":null}},"loc":{"start":{"line":64,"column":36},"end":{"line":79,"column":7}}},"8":{"name":"(anonymous_17)","decl":{"start":{"line":86,"column":18},"end":{"line":86,"column":null}},"loc":{"start":{"line":86,"column":18},"end":{"line":93,"column":5}}},"9":{"name":"(anonymous_18)","decl":{"start":{"line":95,"column":19},"end":{"line":95,"column":20}},"loc":{"start":{"line":95,"column":30},"end":{"line":98,"column":5}}},"10":{"name":"(anonymous_19)","decl":{"start":{"line":100,"column":19},"end":{"line":100,"column":null}},"loc":{"start":{"line":100,"column":19},"end":{"line":103,"column":5}}},"11":{"name":"(anonymous_20)","decl":{"start":{"line":106,"column":36},"end":{"line":106,"column":null}},"loc":{"start":{"line":106,"column":36},"end":{"line":134,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":33},"end":{"line":15,"column":44}},"type":"cond-expr","locations":[{"start":{"line":15,"column":33},"end":{"line":15,"column":38}},{"start":{"line":15,"column":42},"end":{"line":15,"column":44}}]},"1":{"loc":{"start":{"line":15,"column":33},"end":{"line":15,"column":42}},"type":"binary-expr","locations":[{"start":{"line":15,"column":33},"end":{"line":15,"column":42}},{"start":{"line":15,"column":33},"end":{"line":15,"column":42}}]},"2":{"loc":{"start":{"line":16,"column":9},"end":{"line":16,"column":66}},"type":"cond-expr","locations":[{"start":{"line":16,"column":49},"end":{"line":16,"column":55}},{"start":{"line":16,"column":58},"end":{"line":16,"column":66}}]},"3":{"loc":{"start":{"line":16,"column":9},"end":{"line":16,"column":46}},"type":"binary-expr","locations":[{"start":{"line":16,"column":9},"end":{"line":16,"column":32}},{"start":{"line":16,"column":36},"end":{"line":16,"column":46}}]},"4":{"loc":{"start":{"line":32,"column":4},"end":{"line":35,"column":5}},"type":"if","locations":[{"start":{"line":32,"column":4},"end":{"line":35,"column":5}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":5}},"type":"if","locations":[{"start":{"line":40,"column":4},"end":{"line":42,"column":5}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":43,"column":4},"end":{"line":46,"column":5}},"type":"if","locations":[{"start":{"line":43,"column":4},"end":{"line":46,"column":5}},{"start":{},"end":{}}]},"7":{"loc":{"start":{"line":47,"column":4},"end":{"line":50,"column":5}},"type":"if","locations":[{"start":{"line":47,"column":4},"end":{"line":50,"column":5}},{"start":{},"end":{}}]},"8":{"loc":{"start":{"line":60,"column":6},"end":{"line":63,"column":7}},"type":"if","locations":[{"start":{"line":60,"column":6},"end":{"line":63,"column":7}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":87,"column":6},"end":{"line":89,"column":7}},"type":"if","locations":[{"start":{"line":87,"column":6},"end":{"line":89,"column":7}},{"start":{},"end":{}}]},"10":{"loc":{"start":{"line":90,"column":6},"end":{"line":92,"column":7}},"type":"if","locations":[{"start":{"line":90,"column":6},"end":{"line":92,"column":7}},{"start":{},"end":{}}]},"11":{"loc":{"start":{"line":107,"column":6},"end":{"line":110,"column":7}},"type":"if","locations":[{"start":{"line":107,"column":6},"end":{"line":110,"column":7}},{"start":{},"end":{}}]},"12":{"loc":{"start":{"line":111,"column":6},"end":{"line":133,"column":7}},"type":"if","locations":[{"start":{"line":111,"column":6},"end":{"line":133,"column":7}},{"start":{"line":125,"column":13},"end":{"line":133,"column":7}}]},"13":{"loc":{"start":{"line":114,"column":10},"end":{"line":117,"column":11}},"type":"if","locations":[{"start":{"line":114,"column":10},"end":{"line":117,"column":11}},{"start":{},"end":{}}]},"14":{"loc":{"start":{"line":118,"column":10},"end":{"line":120,"column":11}},"type":"if","locations":[{"start":{"line":118,"column":10},"end":{"line":120,"column":11}},{"start":{},"end":{}}]},"15":{"loc":{"start":{"line":127,"column":8},"end":{"line":131,"column":9}},"type":"if","locations":[{"start":{"line":127,"column":8},"end":{"line":131,"column":9}},{"start":{},"end":{}}]}},"s":{"0":14,"1":14,"2":8,"3":8,"4":14,"5":8,"6":8,"7":8,"8":8,"9":8,"10":14,"11":22,"12":22,"13":0,"14":0,"15":22,"16":14,"17":8,"18":0,"19":8,"20":8,"21":8,"22":8,"23":4,"24":4,"25":14,"26":8,"27":8,"28":8,"29":8,"30":5,"31":1,"32":1,"33":5,"34":1,"35":1,"36":1,"37":1,"38":1,"39":8,"40":8,"41":1,"42":0,"43":1,"44":1,"45":8,"46":0,"47":0,"48":8,"49":1,"50":1,"51":8,"52":29,"53":16,"54":13,"55":12,"56":12,"57":12,"58":4,"59":4,"60":12,"61":0,"62":0,"63":0,"64":1,"65":0,"66":1,"67":14,"68":14,"69":14},"f":{"0":8,"1":14,"2":8,"3":22,"4":8,"5":8,"6":5,"7":1,"8":1,"9":0,"10":1,"11":29},"b":{"0":[7,1],"1":[8,8],"2":[2,6],"3":[8,4],"4":[0,22],"5":[0,8],"6":[8,0],"7":[4,4],"8":[1,4],"9":[0,1],"10":[1,0],"11":[16,13],"12":[12,1],"13":[4,8],"14":[0,12],"15":[0,1]}} +,"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/k8s/index.ts": {"path":"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/k8s/index.ts","statementMap":{"0":{"start":{"line":69,"column":0},"end":{"line":69,"column":22}},"1":{"start":{"line":189,"column":0},"end":{"line":189,"column":22}},"2":{"start":{"line":242,"column":0},"end":{"line":242,"column":22}},"3":{"start":{"line":250,"column":0},"end":{"line":250,"column":22}},"4":{"start":{"line":379,"column":0},"end":{"line":379,"column":22}},"5":{"start":{"line":503,"column":0},"end":{"line":503,"column":22}},"6":{"start":{"line":565,"column":0},"end":{"line":565,"column":22}},"7":{"start":{"line":599,"column":0},"end":{"line":599,"column":22}},"8":{"start":{"line":720,"column":0},"end":{"line":720,"column":22}},"9":{"start":{"line":859,"column":0},"end":{"line":859,"column":22}},"10":{"start":{"line":873,"column":0},"end":{"line":873,"column":22}},"11":{"start":{"line":914,"column":0},"end":{"line":914,"column":22}},"12":{"start":{"line":942,"column":0},"end":{"line":942,"column":22}},"13":{"start":{"line":949,"column":0},"end":{"line":949,"column":22}},"14":{"start":{"line":1052,"column":0},"end":{"line":1052,"column":16}},"15":{"start":{"line":1070,"column":0},"end":{"line":1070,"column":16}},"16":{"start":{"line":1085,"column":0},"end":{"line":1085,"column":16}},"17":{"start":{"line":1107,"column":0},"end":{"line":1107,"column":16}},"18":{"start":{"line":1123,"column":0},"end":{"line":1123,"column":16}},"19":{"start":{"line":1165,"column":0},"end":{"line":1165,"column":16}},"20":{"start":{"line":1184,"column":0},"end":{"line":1184,"column":16}},"21":{"start":{"line":1211,"column":0},"end":{"line":1211,"column":16}},"22":{"start":{"line":1266,"column":0},"end":{"line":1266,"column":22}},"23":{"start":{"line":1331,"column":0},"end":{"line":1331,"column":22}},"24":{"start":{"line":1459,"column":0},"end":{"line":1459,"column":16}},"25":{"start":{"line":1469,"column":0},"end":{"line":1469,"column":22}},"26":{"start":{"line":1496,"column":0},"end":{"line":1496,"column":22}},"27":{"start":{"line":1576,"column":0},"end":{"line":1576,"column":16}},"28":{"start":{"line":1610,"column":0},"end":{"line":1610,"column":16}},"29":{"start":{"line":1628,"column":0},"end":{"line":1628,"column":22}},"30":{"start":{"line":1653,"column":0},"end":{"line":1653,"column":22}},"31":{"start":{"line":1669,"column":0},"end":{"line":1669,"column":22}},"32":{"start":{"line":1679,"column":0},"end":{"line":1679,"column":22}},"33":{"start":{"line":1700,"column":0},"end":{"line":1700,"column":22}},"34":{"start":{"line":1722,"column":0},"end":{"line":1722,"column":16}},"35":{"start":{"line":1776,"column":0},"end":{"line":1776,"column":16}},"36":{"start":{"line":1818,"column":0},"end":{"line":1818,"column":22}},"37":{"start":{"line":1825,"column":0},"end":{"line":1825,"column":22}},"38":{"start":{"line":1832,"column":0},"end":{"line":1832,"column":22}},"39":{"start":{"line":1,"column":0},"end":{"line":1,"column":37}},"40":{"start":{"line":2,"column":0},"end":{"line":2,"column":24}},"41":{"start":{"line":3,"column":0},"end":{"line":3,"column":28}},"42":{"start":{"line":4,"column":0},"end":{"line":4,"column":37}},"43":{"start":{"line":5,"column":0},"end":{"line":5,"column":46}},"44":{"start":{"line":6,"column":0},"end":{"line":6,"column":24}},"45":{"start":{"line":7,"column":0},"end":{"line":7,"column":32}},"46":{"start":{"line":8,"column":0},"end":{"line":8,"column":53}},"47":{"start":{"line":9,"column":0},"end":{"line":9,"column":35}},"48":{"start":{"line":11,"column":0},"end":{"line":11,"column":null}},"49":{"start":{"line":16,"column":0},"end":{"line":16,"column":null}},"50":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"51":{"start":{"line":29,"column":0},"end":{"line":29,"column":68}},"52":{"start":{"line":32,"column":11},"end":{"line":32,"column":31}},"53":{"start":{"line":34,"column":0},"end":{"line":34,"column":null}},"54":{"start":{"line":36,"column":15},"end":{"line":36,"column":46}},"55":{"start":{"line":37,"column":22},"end":{"line":37,"column":54}},"56":{"start":{"line":38,"column":30},"end":{"line":38,"column":70}},"57":{"start":{"line":40,"column":42},"end":{"line":40,"column":49}},"58":{"start":{"line":42,"column":13},"end":{"line":67,"column":null}},"59":{"start":{"line":76,"column":8},"end":{"line":76,"column":null}},"60":{"start":{"line":77,"column":2},"end":{"line":79,"column":3}},"61":{"start":{"line":78,"column":4},"end":{"line":78,"column":null}},"62":{"start":{"line":80,"column":2},"end":{"line":82,"column":3}},"63":{"start":{"line":81,"column":4},"end":{"line":81,"column":32}},"64":{"start":{"line":84,"column":8},"end":{"line":84,"column":null}},"65":{"start":{"line":86,"column":2},"end":{"line":86,"column":null}},"66":{"start":{"line":87,"column":2},"end":{"line":87,"column":null}},"67":{"start":{"line":89,"column":2},"end":{"line":89,"column":null}},"68":{"start":{"line":90,"column":2},"end":{"line":90,"column":null}},"69":{"start":{"line":92,"column":8},"end":{"line":92,"column":null}},"70":{"start":{"line":93,"column":2},"end":{"line":95,"column":null}},"71":{"start":{"line":96,"column":2},"end":{"line":96,"column":null}},"72":{"start":{"line":98,"column":2},"end":{"line":98,"column":null}},"73":{"start":{"line":99,"column":2},"end":{"line":99,"column":null}},"74":{"start":{"line":100,"column":2},"end":{"line":102,"column":null}},"75":{"start":{"line":106,"column":8},"end":{"line":106,"column":null}},"76":{"start":{"line":107,"column":8},"end":{"line":107,"column":null}},"77":{"start":{"line":109,"column":8},"end":{"line":114,"column":null}},"78":{"start":{"line":116,"column":2},"end":{"line":118,"column":3}},"79":{"start":{"line":117,"column":4},"end":{"line":117,"column":null}},"80":{"start":{"line":120,"column":2},"end":{"line":146,"column":null}},"81":{"start":{"line":148,"column":2},"end":{"line":148,"column":null}},"82":{"start":{"line":150,"column":2},"end":{"line":163,"column":null}},"83":{"start":{"line":165,"column":6},"end":{"line":165,"column":14}},"84":{"start":{"line":166,"column":19},"end":{"line":166,"column":null}},"85":{"start":{"line":166,"column":10},"end":{"line":166,"column":null}},"86":{"start":{"line":167,"column":4},"end":{"line":169,"column":5}},"87":{"start":{"line":168,"column":6},"end":{"line":168,"column":null}},"88":{"start":{"line":170,"column":10},"end":{"line":170,"column":null}},"89":{"start":{"line":171,"column":4},"end":{"line":171,"column":null}},"90":{"start":{"line":172,"column":4},"end":{"line":172,"column":null}},"91":{"start":{"line":175,"column":2},"end":{"line":177,"column":3}},"92":{"start":{"line":176,"column":4},"end":{"line":176,"column":null}},"93":{"start":{"line":179,"column":2},"end":{"line":181,"column":3}},"94":{"start":{"line":180,"column":4},"end":{"line":180,"column":null}},"95":{"start":{"line":183,"column":9},"end":{"line":186,"column":null}},"96":{"start":{"line":183,"column":2},"end":{"line":186,"column":null}},"97":{"start":{"line":194,"column":8},"end":{"line":194,"column":null}},"98":{"start":{"line":196,"column":2},"end":{"line":196,"column":null}},"99":{"start":{"line":197,"column":2},"end":{"line":197,"column":null}},"100":{"start":{"line":199,"column":2},"end":{"line":199,"column":null}},"101":{"start":{"line":200,"column":2},"end":{"line":200,"column":null}},"102":{"start":{"line":202,"column":8},"end":{"line":202,"column":null}},"103":{"start":{"line":203,"column":2},"end":{"line":205,"column":null}},"104":{"start":{"line":206,"column":2},"end":{"line":206,"column":null}},"105":{"start":{"line":208,"column":2},"end":{"line":208,"column":null}},"106":{"start":{"line":209,"column":2},"end":{"line":209,"column":null}},"107":{"start":{"line":211,"column":2},"end":{"line":211,"column":null}},"108":{"start":{"line":213,"column":2},"end":{"line":226,"column":null}},"109":{"start":{"line":228,"column":2},"end":{"line":230,"column":3}},"110":{"start":{"line":229,"column":4},"end":{"line":229,"column":null}},"111":{"start":{"line":232,"column":2},"end":{"line":234,"column":3}},"112":{"start":{"line":233,"column":4},"end":{"line":233,"column":null}},"113":{"start":{"line":236,"column":9},"end":{"line":239,"column":null}},"114":{"start":{"line":236,"column":2},"end":{"line":239,"column":null}},"115":{"start":{"line":243,"column":2},"end":{"line":247,"column":null}},"116":{"start":{"line":256,"column":8},"end":{"line":256,"column":null}},"117":{"start":{"line":257,"column":2},"end":{"line":259,"column":null}},"118":{"start":{"line":261,"column":2},"end":{"line":261,"column":null}},"119":{"start":{"line":263,"column":8},"end":{"line":263,"column":null}},"120":{"start":{"line":264,"column":8},"end":{"line":267,"column":null}},"121":{"start":{"line":268,"column":8},"end":{"line":271,"column":null}},"122":{"start":{"line":272,"column":2},"end":{"line":274,"column":null}},"123":{"start":{"line":276,"column":8},"end":{"line":276,"column":null}},"124":{"start":{"line":278,"column":2},"end":{"line":371,"column":null}},"125":{"start":{"line":279,"column":4},"end":{"line":279,"column":null}},"126":{"start":{"line":280,"column":40},"end":{"line":280,"column":44}},"127":{"start":{"line":282,"column":4},"end":{"line":370,"column":null}},"128":{"start":{"line":292,"column":18},"end":{"line":335,"column":null}},"129":{"start":{"line":293,"column":10},"end":{"line":295,"column":null}},"130":{"start":{"line":297,"column":10},"end":{"line":297,"column":null}},"131":{"start":{"line":300,"column":16},"end":{"line":322,"column":null}},"132":{"start":{"line":300,"column":33},"end":{"line":322,"column":null}},"133":{"start":{"line":301,"column":18},"end":{"line":301,"column":null}},"134":{"start":{"line":302,"column":12},"end":{"line":321,"column":13}},"135":{"start":{"line":306,"column":14},"end":{"line":320,"column":null}},"136":{"start":{"line":307,"column":37},"end":{"line":312,"column":24}},"137":{"start":{"line":308,"column":18},"end":{"line":310,"column":null}},"138":{"start":{"line":311,"column":18},"end":{"line":311,"column":null}},"139":{"start":{"line":314,"column":16},"end":{"line":318,"column":null}},"140":{"start":{"line":315,"column":18},"end":{"line":315,"column":null}},"141":{"start":{"line":316,"column":18},"end":{"line":316,"column":null}},"142":{"start":{"line":317,"column":18},"end":{"line":317,"column":null}},"143":{"start":{"line":319,"column":16},"end":{"line":319,"column":null}},"144":{"start":{"line":324,"column":14},"end":{"line":324,"column":18}},"145":{"start":{"line":325,"column":12},"end":{"line":325,"column":null}},"146":{"start":{"line":326,"column":12},"end":{"line":326,"column":null}},"147":{"start":{"line":327,"column":12},"end":{"line":327,"column":null}},"148":{"start":{"line":329,"column":12},"end":{"line":331,"column":null}},"149":{"start":{"line":332,"column":12},"end":{"line":332,"column":null}},"150":{"start":{"line":333,"column":12},"end":{"line":333,"column":null}},"151":{"start":{"line":338,"column":8},"end":{"line":338,"column":null}},"152":{"start":{"line":339,"column":8},"end":{"line":339,"column":null}},"153":{"start":{"line":340,"column":8},"end":{"line":344,"column":9}},"154":{"start":{"line":341,"column":10},"end":{"line":341,"column":null}},"155":{"start":{"line":343,"column":10},"end":{"line":343,"column":null}},"156":{"start":{"line":346,"column":20},"end":{"line":370,"column":8}},"157":{"start":{"line":347,"column":8},"end":{"line":347,"column":null}},"158":{"start":{"line":348,"column":8},"end":{"line":348,"column":null}},"159":{"start":{"line":351,"column":14},"end":{"line":351,"column":null}},"160":{"start":{"line":352,"column":12},"end":{"line":352,"column":18}},"161":{"start":{"line":353,"column":10},"end":{"line":366,"column":null}},"162":{"start":{"line":354,"column":33},"end":{"line":359,"column":20}},"163":{"start":{"line":355,"column":14},"end":{"line":357,"column":null}},"164":{"start":{"line":358,"column":14},"end":{"line":358,"column":null}},"165":{"start":{"line":361,"column":12},"end":{"line":364,"column":null}},"166":{"start":{"line":362,"column":14},"end":{"line":362,"column":null}},"167":{"start":{"line":363,"column":14},"end":{"line":363,"column":null}},"168":{"start":{"line":365,"column":12},"end":{"line":365,"column":null}},"169":{"start":{"line":369,"column":8},"end":{"line":369,"column":null}},"170":{"start":{"line":383,"column":2},"end":{"line":383,"column":null}},"171":{"start":{"line":386,"column":8},"end":{"line":386,"column":null}},"172":{"start":{"line":387,"column":2},"end":{"line":387,"column":null}},"173":{"start":{"line":390,"column":8},"end":{"line":390,"column":null}},"174":{"start":{"line":391,"column":8},"end":{"line":395,"column":null}},"175":{"start":{"line":392,"column":4},"end":{"line":392,"column":33}},"176":{"start":{"line":392,"column":27},"end":{"line":392,"column":33}},"177":{"start":{"line":393,"column":4},"end":{"line":393,"column":null}},"178":{"start":{"line":394,"column":4},"end":{"line":394,"column":null}},"179":{"start":{"line":394,"column":35},"end":{"line":394,"column":null}},"180":{"start":{"line":398,"column":6},"end":{"line":398,"column":null}},"181":{"start":{"line":399,"column":8},"end":{"line":404,"column":null}},"182":{"start":{"line":400,"column":4},"end":{"line":400,"column":null}},"183":{"start":{"line":401,"column":18},"end":{"line":401,"column":43}},"184":{"start":{"line":402,"column":4},"end":{"line":402,"column":null}},"185":{"start":{"line":403,"column":4},"end":{"line":403,"column":null}},"186":{"start":{"line":403,"column":23},"end":{"line":403,"column":28}},"187":{"start":{"line":403,"column":19},"end":{"line":403,"column":23}},"188":{"start":{"line":403,"column":30},"end":{"line":403,"column":null}},"189":{"start":{"line":406,"column":6},"end":{"line":406,"column":null}},"190":{"start":{"line":407,"column":8},"end":{"line":412,"column":null}},"191":{"start":{"line":408,"column":4},"end":{"line":408,"column":null}},"192":{"start":{"line":409,"column":18},"end":{"line":409,"column":43}},"193":{"start":{"line":410,"column":4},"end":{"line":410,"column":null}},"194":{"start":{"line":411,"column":4},"end":{"line":411,"column":null}},"195":{"start":{"line":411,"column":23},"end":{"line":411,"column":28}},"196":{"start":{"line":411,"column":19},"end":{"line":411,"column":23}},"197":{"start":{"line":411,"column":30},"end":{"line":411,"column":null}},"198":{"start":{"line":414,"column":8},"end":{"line":423,"column":null}},"199":{"start":{"line":415,"column":4},"end":{"line":418,"column":5}},"200":{"start":{"line":416,"column":6},"end":{"line":416,"column":null}},"201":{"start":{"line":417,"column":6},"end":{"line":417,"column":null}},"202":{"start":{"line":419,"column":4},"end":{"line":422,"column":5}},"203":{"start":{"line":420,"column":6},"end":{"line":420,"column":null}},"204":{"start":{"line":421,"column":6},"end":{"line":421,"column":null}},"205":{"start":{"line":425,"column":8},"end":{"line":435,"column":null}},"206":{"start":{"line":427,"column":6},"end":{"line":433,"column":7}},"207":{"start":{"line":428,"column":8},"end":{"line":428,"column":null}},"208":{"start":{"line":429,"column":8},"end":{"line":429,"column":null}},"209":{"start":{"line":430,"column":8},"end":{"line":430,"column":null}},"210":{"start":{"line":432,"column":8},"end":{"line":432,"column":null}},"211":{"start":{"line":436,"column":8},"end":{"line":446,"column":null}},"212":{"start":{"line":438,"column":6},"end":{"line":444,"column":7}},"213":{"start":{"line":439,"column":8},"end":{"line":439,"column":null}},"214":{"start":{"line":440,"column":8},"end":{"line":440,"column":null}},"215":{"start":{"line":441,"column":8},"end":{"line":441,"column":null}},"216":{"start":{"line":443,"column":8},"end":{"line":443,"column":null}},"217":{"start":{"line":451,"column":8},"end":{"line":454,"column":null}},"218":{"start":{"line":452,"column":14},"end":{"line":452,"column":49}},"219":{"start":{"line":453,"column":4},"end":{"line":453,"column":null}},"220":{"start":{"line":456,"column":9},"end":{"line":500,"column":null}},"221":{"start":{"line":457,"column":4},"end":{"line":499,"column":null}},"222":{"start":{"line":468,"column":10},"end":{"line":468,"column":null}},"223":{"start":{"line":469,"column":10},"end":{"line":469,"column":null}},"224":{"start":{"line":470,"column":10},"end":{"line":482,"column":11}},"225":{"start":{"line":471,"column":12},"end":{"line":471,"column":null}},"226":{"start":{"line":476,"column":25},"end":{"line":476,"column":53}},"227":{"start":{"line":477,"column":12},"end":{"line":481,"column":13}},"228":{"start":{"line":478,"column":14},"end":{"line":478,"column":null}},"229":{"start":{"line":480,"column":14},"end":{"line":480,"column":null}},"230":{"start":{"line":491,"column":8},"end":{"line":491,"column":null}},"231":{"start":{"line":492,"column":23},"end":{"line":492,"column":65}},"232":{"start":{"line":493,"column":21},"end":{"line":493,"column":42}},"233":{"start":{"line":494,"column":8},"end":{"line":498,"column":9}},"234":{"start":{"line":495,"column":10},"end":{"line":495,"column":null}},"235":{"start":{"line":497,"column":10},"end":{"line":497,"column":null}},"236":{"start":{"line":456,"column":2},"end":{"line":500,"column":null}},"237":{"start":{"line":508,"column":8},"end":{"line":508,"column":null}},"238":{"start":{"line":510,"column":6},"end":{"line":510,"column":null}},"239":{"start":{"line":511,"column":8},"end":{"line":520,"column":null}},"240":{"start":{"line":513,"column":6},"end":{"line":518,"column":7}},"241":{"start":{"line":514,"column":8},"end":{"line":514,"column":null}},"242":{"start":{"line":515,"column":8},"end":{"line":515,"column":null}},"243":{"start":{"line":517,"column":8},"end":{"line":517,"column":null}},"244":{"start":{"line":522,"column":2},"end":{"line":549,"column":null}},"245":{"start":{"line":523,"column":4},"end":{"line":548,"column":null}},"246":{"start":{"line":534,"column":10},"end":{"line":534,"column":null}},"247":{"start":{"line":535,"column":10},"end":{"line":545,"column":11}},"248":{"start":{"line":536,"column":12},"end":{"line":536,"column":null}},"249":{"start":{"line":538,"column":12},"end":{"line":543,"column":null}},"250":{"start":{"line":544,"column":12},"end":{"line":544,"column":null}},"251":{"start":{"line":548,"column":18},"end":{"line":548,"column":28}},"252":{"start":{"line":551,"column":2},"end":{"line":551,"column":null}},"253":{"start":{"line":554,"column":8},"end":{"line":557,"column":null}},"254":{"start":{"line":556,"column":20},"end":{"line":556,"column":36}},"255":{"start":{"line":558,"column":8},"end":{"line":558,"column":null}},"256":{"start":{"line":560,"column":8},"end":{"line":560,"column":null}},"257":{"start":{"line":561,"column":2},"end":{"line":561,"column":null}},"258":{"start":{"line":562,"column":2},"end":{"line":562,"column":null}},"259":{"start":{"line":568,"column":9},"end":{"line":596,"column":null}},"260":{"start":{"line":570,"column":20},"end":{"line":572,"column":8}},"261":{"start":{"line":574,"column":19},"end":{"line":574,"column":21}},"262":{"start":{"line":575,"column":6},"end":{"line":577,"column":null}},"263":{"start":{"line":576,"column":8},"end":{"line":576,"column":null}},"264":{"start":{"line":578,"column":6},"end":{"line":578,"column":null}},"265":{"start":{"line":579,"column":6},"end":{"line":594,"column":null}},"266":{"start":{"line":580,"column":8},"end":{"line":593,"column":9}},"267":{"start":{"line":582,"column":24},"end":{"line":585,"column":19}},"268":{"start":{"line":584,"column":28},"end":{"line":584,"column":44}},"269":{"start":{"line":586,"column":31},"end":{"line":586,"column":54}},"270":{"start":{"line":588,"column":23},"end":{"line":588,"column":43}},"271":{"start":{"line":589,"column":10},"end":{"line":589,"column":null}},"272":{"start":{"line":590,"column":10},"end":{"line":590,"column":null}},"273":{"start":{"line":592,"column":10},"end":{"line":592,"column":null}},"274":{"start":{"line":568,"column":2},"end":{"line":596,"column":null}},"275":{"start":{"line":604,"column":2},"end":{"line":604,"column":null}},"276":{"start":{"line":606,"column":6},"end":{"line":606,"column":null}},"277":{"start":{"line":609,"column":12},"end":{"line":609,"column":null}},"278":{"start":{"line":612,"column":12},"end":{"line":619,"column":null}},"279":{"start":{"line":620,"column":12},"end":{"line":620,"column":null}},"280":{"start":{"line":621,"column":12},"end":{"line":621,"column":null}},"281":{"start":{"line":622,"column":6},"end":{"line":645,"column":null}},"282":{"start":{"line":623,"column":8},"end":{"line":644,"column":null}},"283":{"start":{"line":633,"column":24},"end":{"line":642,"column":null}},"284":{"start":{"line":634,"column":14},"end":{"line":640,"column":15}},"285":{"start":{"line":635,"column":16},"end":{"line":639,"column":null}},"286":{"start":{"line":641,"column":14},"end":{"line":641,"column":null}},"287":{"start":{"line":644,"column":22},"end":{"line":644,"column":32}},"288":{"start":{"line":648,"column":6},"end":{"line":648,"column":null}},"289":{"start":{"line":649,"column":6},"end":{"line":649,"column":null}},"290":{"start":{"line":650,"column":6},"end":{"line":654,"column":7}},"291":{"start":{"line":651,"column":8},"end":{"line":653,"column":null}},"292":{"start":{"line":655,"column":6},"end":{"line":655,"column":null}},"293":{"start":{"line":607,"column":9},"end":{"line":607,"column":null}},"294":{"start":{"line":607,"column":13},"end":{"line":607,"column":null}},"295":{"start":{"line":659,"column":6},"end":{"line":659,"column":null}},"296":{"start":{"line":660,"column":8},"end":{"line":660,"column":null}},"297":{"start":{"line":664,"column":8},"end":{"line":668,"column":null}},"298":{"start":{"line":663,"column":12},"end":{"line":663,"column":null}},"299":{"start":{"line":671,"column":8},"end":{"line":675,"column":null}},"300":{"start":{"line":670,"column":12},"end":{"line":670,"column":null}},"301":{"start":{"line":677,"column":10},"end":{"line":677,"column":13}},"302":{"start":{"line":678,"column":8},"end":{"line":680,"column":null}},"303":{"start":{"line":681,"column":8},"end":{"line":683,"column":null}},"304":{"start":{"line":684,"column":14},"end":{"line":686,"column":null}},"305":{"start":{"line":685,"column":29},"end":{"line":685,"column":71}},"306":{"start":{"line":687,"column":14},"end":{"line":689,"column":null}},"307":{"start":{"line":688,"column":28},"end":{"line":688,"column":70}},"308":{"start":{"line":690,"column":14},"end":{"line":692,"column":null}},"309":{"start":{"line":691,"column":15},"end":{"line":691,"column":null}},"310":{"start":{"line":693,"column":14},"end":{"line":695,"column":null}},"311":{"start":{"line":694,"column":15},"end":{"line":694,"column":null}},"312":{"start":{"line":696,"column":14},"end":{"line":704,"column":null}},"313":{"start":{"line":698,"column":25},"end":{"line":698,"column":47}},"314":{"start":{"line":699,"column":12},"end":{"line":699,"column":null}},"315":{"start":{"line":702,"column":25},"end":{"line":702,"column":47}},"316":{"start":{"line":703,"column":12},"end":{"line":703,"column":null}},"317":{"start":{"line":705,"column":8},"end":{"line":705,"column":null}},"318":{"start":{"line":706,"column":8},"end":{"line":706,"column":null}},"319":{"start":{"line":707,"column":8},"end":{"line":707,"column":null}},"320":{"start":{"line":708,"column":8},"end":{"line":708,"column":null}},"321":{"start":{"line":714,"column":6},"end":{"line":714,"column":null}},"322":{"start":{"line":715,"column":6},"end":{"line":715,"column":null}},"323":{"start":{"line":661,"column":11},"end":{"line":661,"column":18}},"324":{"start":{"line":661,"column":18},"end":{"line":661,"column":32}},"325":{"start":{"line":661,"column":30},"end":{"line":661,"column":32}},"326":{"start":{"line":661,"column":11},"end":{"line":661,"column":15}},"327":{"start":{"line":661,"column":32},"end":{"line":661,"column":null}},"328":{"start":{"line":725,"column":8},"end":{"line":725,"column":null}},"329":{"start":{"line":726,"column":2},"end":{"line":728,"column":null}},"330":{"start":{"line":734,"column":2},"end":{"line":736,"column":3}},"331":{"start":{"line":735,"column":4},"end":{"line":735,"column":null}},"332":{"start":{"line":738,"column":6},"end":{"line":738,"column":null}},"333":{"start":{"line":742,"column":12},"end":{"line":742,"column":null}},"334":{"start":{"line":743,"column":12},"end":{"line":743,"column":null}},"335":{"start":{"line":744,"column":12},"end":{"line":744,"column":null}},"336":{"start":{"line":745,"column":12},"end":{"line":752,"column":null}},"337":{"start":{"line":753,"column":12},"end":{"line":753,"column":null}},"338":{"start":{"line":754,"column":12},"end":{"line":754,"column":null}},"339":{"start":{"line":756,"column":6},"end":{"line":784,"column":null}},"340":{"start":{"line":761,"column":8},"end":{"line":761,"column":null}},"341":{"start":{"line":762,"column":8},"end":{"line":762,"column":null}},"342":{"start":{"line":763,"column":8},"end":{"line":783,"column":null}},"343":{"start":{"line":773,"column":35},"end":{"line":781,"column":null}},"344":{"start":{"line":774,"column":14},"end":{"line":780,"column":15}},"345":{"start":{"line":775,"column":16},"end":{"line":779,"column":null}},"346":{"start":{"line":783,"column":22},"end":{"line":783,"column":32}},"347":{"start":{"line":787,"column":6},"end":{"line":787,"column":null}},"348":{"start":{"line":788,"column":6},"end":{"line":788,"column":null}},"349":{"start":{"line":789,"column":6},"end":{"line":793,"column":7}},"350":{"start":{"line":790,"column":8},"end":{"line":792,"column":null}},"351":{"start":{"line":794,"column":6},"end":{"line":794,"column":null}},"352":{"start":{"line":739,"column":9},"end":{"line":739,"column":null}},"353":{"start":{"line":739,"column":13},"end":{"line":739,"column":null}},"354":{"start":{"line":798,"column":6},"end":{"line":798,"column":null}},"355":{"start":{"line":799,"column":8},"end":{"line":799,"column":null}},"356":{"start":{"line":803,"column":8},"end":{"line":807,"column":null}},"357":{"start":{"line":802,"column":12},"end":{"line":802,"column":null}},"358":{"start":{"line":810,"column":8},"end":{"line":814,"column":null}},"359":{"start":{"line":809,"column":12},"end":{"line":809,"column":null}},"360":{"start":{"line":816,"column":10},"end":{"line":816,"column":13}},"361":{"start":{"line":817,"column":8},"end":{"line":819,"column":null}},"362":{"start":{"line":820,"column":8},"end":{"line":822,"column":null}},"363":{"start":{"line":823,"column":14},"end":{"line":825,"column":null}},"364":{"start":{"line":824,"column":29},"end":{"line":824,"column":71}},"365":{"start":{"line":826,"column":14},"end":{"line":828,"column":null}},"366":{"start":{"line":827,"column":28},"end":{"line":827,"column":70}},"367":{"start":{"line":829,"column":14},"end":{"line":831,"column":null}},"368":{"start":{"line":830,"column":15},"end":{"line":830,"column":null}},"369":{"start":{"line":832,"column":14},"end":{"line":834,"column":null}},"370":{"start":{"line":833,"column":15},"end":{"line":833,"column":null}},"371":{"start":{"line":835,"column":14},"end":{"line":843,"column":null}},"372":{"start":{"line":837,"column":25},"end":{"line":837,"column":47}},"373":{"start":{"line":838,"column":12},"end":{"line":838,"column":null}},"374":{"start":{"line":841,"column":25},"end":{"line":841,"column":47}},"375":{"start":{"line":842,"column":12},"end":{"line":842,"column":null}},"376":{"start":{"line":844,"column":8},"end":{"line":844,"column":null}},"377":{"start":{"line":845,"column":8},"end":{"line":845,"column":null}},"378":{"start":{"line":846,"column":8},"end":{"line":846,"column":null}},"379":{"start":{"line":847,"column":8},"end":{"line":847,"column":null}},"380":{"start":{"line":853,"column":6},"end":{"line":853,"column":null}},"381":{"start":{"line":854,"column":6},"end":{"line":854,"column":null}},"382":{"start":{"line":800,"column":11},"end":{"line":800,"column":18}},"383":{"start":{"line":800,"column":18},"end":{"line":800,"column":32}},"384":{"start":{"line":800,"column":30},"end":{"line":800,"column":32}},"385":{"start":{"line":800,"column":11},"end":{"line":800,"column":15}},"386":{"start":{"line":800,"column":32},"end":{"line":800,"column":null}},"387":{"start":{"line":860,"column":8},"end":{"line":860,"column":null}},"388":{"start":{"line":861,"column":9},"end":{"line":861,"column":null}},"389":{"start":{"line":861,"column":13},"end":{"line":861,"column":null}},"390":{"start":{"line":863,"column":10},"end":{"line":863,"column":41}},"391":{"start":{"line":863,"column":6},"end":{"line":865,"column":7}},"392":{"start":{"line":864,"column":8},"end":{"line":864,"column":14}},"393":{"start":{"line":867,"column":6},"end":{"line":867,"column":null}},"394":{"start":{"line":869,"column":4},"end":{"line":869,"column":null}},"395":{"start":{"line":876,"column":8},"end":{"line":886,"column":null}},"396":{"start":{"line":888,"column":8},"end":{"line":888,"column":null}},"397":{"start":{"line":890,"column":8},"end":{"line":890,"column":null}},"398":{"start":{"line":891,"column":8},"end":{"line":891,"column":null}},"399":{"start":{"line":892,"column":2},"end":{"line":892,"column":null}},"400":{"start":{"line":893,"column":2},"end":{"line":893,"column":null}},"401":{"start":{"line":894,"column":2},"end":{"line":894,"column":null}},"402":{"start":{"line":895,"column":2},"end":{"line":895,"column":null}},"403":{"start":{"line":896,"column":2},"end":{"line":896,"column":null}},"404":{"start":{"line":897,"column":2},"end":{"line":899,"column":null}},"405":{"start":{"line":900,"column":2},"end":{"line":900,"column":null}},"406":{"start":{"line":901,"column":2},"end":{"line":901,"column":null}},"407":{"start":{"line":902,"column":2},"end":{"line":906,"column":null}},"408":{"start":{"line":908,"column":9},"end":{"line":911,"column":null}},"409":{"start":{"line":908,"column":2},"end":{"line":911,"column":null}},"410":{"start":{"line":917,"column":8},"end":{"line":917,"column":null}},"411":{"start":{"line":919,"column":8},"end":{"line":919,"column":null}},"412":{"start":{"line":920,"column":8},"end":{"line":920,"column":null}},"413":{"start":{"line":921,"column":2},"end":{"line":921,"column":null}},"414":{"start":{"line":922,"column":2},"end":{"line":922,"column":null}},"415":{"start":{"line":923,"column":2},"end":{"line":923,"column":null}},"416":{"start":{"line":924,"column":2},"end":{"line":924,"column":null}},"417":{"start":{"line":926,"column":2},"end":{"line":928,"column":null}},"418":{"start":{"line":929,"column":2},"end":{"line":929,"column":null}},"419":{"start":{"line":930,"column":2},"end":{"line":930,"column":null}},"420":{"start":{"line":931,"column":2},"end":{"line":933,"column":3}},"421":{"start":{"line":931,"column":13},"end":{"line":931,"column":25}},"422":{"start":{"line":932,"column":4},"end":{"line":932,"column":null}},"423":{"start":{"line":935,"column":2},"end":{"line":938,"column":null}},"424":{"start":{"line":939,"column":2},"end":{"line":939,"column":null}},"425":{"start":{"line":943,"column":2},"end":{"line":946,"column":null}},"426":{"start":{"line":950,"column":21},"end":{"line":953,"column":null}},"427":{"start":{"line":950,"column":8},"end":{"line":953,"column":null}},"428":{"start":{"line":954,"column":2},"end":{"line":956,"column":3}},"429":{"start":{"line":955,"column":4},"end":{"line":955,"column":10}},"430":{"start":{"line":958,"column":2},"end":{"line":963,"column":null}},"431":{"start":{"line":960,"column":18},"end":{"line":961,"column":null}},"432":{"start":{"line":961,"column":8},"end":{"line":961,"column":33}},"433":{"start":{"line":961,"column":34},"end":{"line":961,"column":75}},"434":{"start":{"line":961,"column":33},"end":{"line":961,"column":null}},"435":{"start":{"line":961,"column":8},"end":{"line":961,"column":14}},"436":{"start":{"line":966,"column":13},"end":{"line":981,"column":null}},"437":{"start":{"line":1001,"column":13},"end":{"line":1005,"column":null}},"438":{"start":{"line":1024,"column":13},"end":{"line":1036,"column":null}},"439":{"start":{"line":1038,"column":13},"end":{"line":1042,"column":null}},"440":{"start":{"line":1046,"column":30},"end":{"line":1046,"column":32}},"441":{"start":{"line":1053,"column":16},"end":{"line":1053,"column":79}},"442":{"start":{"line":1054,"column":2},"end":{"line":1056,"column":3}},"443":{"start":{"line":1055,"column":4},"end":{"line":1055,"column":null}},"444":{"start":{"line":1057,"column":18},"end":{"line":1057,"column":56}},"445":{"start":{"line":1058,"column":2},"end":{"line":1063,"column":3}},"446":{"start":{"line":1058,"column":23},"end":{"line":1058,"column":28}},"447":{"start":{"line":1058,"column":23},"end":{"line":1058,"column":39}},"448":{"start":{"line":1058,"column":19},"end":{"line":1058,"column":23}},"449":{"start":{"line":1059,"column":20},"end":{"line":1059,"column":33}},"450":{"start":{"line":1060,"column":4},"end":{"line":1062,"column":5}},"451":{"start":{"line":1061,"column":6},"end":{"line":1061,"column":null}},"452":{"start":{"line":1064,"column":2},"end":{"line":1064,"column":null}},"453":{"start":{"line":1071,"column":16},"end":{"line":1071,"column":77}},"454":{"start":{"line":1072,"column":2},"end":{"line":1074,"column":3}},"455":{"start":{"line":1073,"column":4},"end":{"line":1073,"column":null}},"456":{"start":{"line":1075,"column":18},"end":{"line":1075,"column":54}},"457":{"start":{"line":1076,"column":2},"end":{"line":1081,"column":3}},"458":{"start":{"line":1076,"column":23},"end":{"line":1076,"column":28}},"459":{"start":{"line":1076,"column":23},"end":{"line":1076,"column":39}},"460":{"start":{"line":1076,"column":19},"end":{"line":1076,"column":23}},"461":{"start":{"line":1077,"column":20},"end":{"line":1077,"column":33}},"462":{"start":{"line":1078,"column":4},"end":{"line":1080,"column":5}},"463":{"start":{"line":1079,"column":6},"end":{"line":1079,"column":null}},"464":{"start":{"line":1082,"column":2},"end":{"line":1082,"column":null}},"465":{"start":{"line":1087,"column":4},"end":{"line":1087,"column":70}},"466":{"start":{"line":1088,"column":2},"end":{"line":1090,"column":3}},"467":{"start":{"line":1089,"column":4},"end":{"line":1089,"column":null}},"468":{"start":{"line":1091,"column":18},"end":{"line":1091,"column":59}},"469":{"start":{"line":1092,"column":2},"end":{"line":1097,"column":3}},"470":{"start":{"line":1092,"column":23},"end":{"line":1092,"column":28}},"471":{"start":{"line":1092,"column":23},"end":{"line":1092,"column":39}},"472":{"start":{"line":1092,"column":19},"end":{"line":1092,"column":23}},"473":{"start":{"line":1093,"column":20},"end":{"line":1093,"column":33}},"474":{"start":{"line":1094,"column":4},"end":{"line":1096,"column":5}},"475":{"start":{"line":1095,"column":6},"end":{"line":1095,"column":null}},"476":{"start":{"line":1098,"column":2},"end":{"line":1098,"column":null}},"477":{"start":{"line":1110,"column":2},"end":{"line":1110,"column":null}},"478":{"start":{"line":1110,"column":16},"end":{"line":1110,"column":null}},"479":{"start":{"line":1111,"column":2},"end":{"line":1111,"column":null}},"480":{"start":{"line":1111,"column":52},"end":{"line":1111,"column":68}},"481":{"start":{"line":1124,"column":16},"end":{"line":1124,"column":79}},"482":{"start":{"line":1125,"column":2},"end":{"line":1125,"column":null}},"483":{"start":{"line":1125,"column":14},"end":{"line":1125,"column":null}},"484":{"start":{"line":1126,"column":2},"end":{"line":1128,"column":3}},"485":{"start":{"line":1127,"column":4},"end":{"line":1127,"column":null}},"486":{"start":{"line":1129,"column":16},"end":{"line":1129,"column":63}},"487":{"start":{"line":1130,"column":2},"end":{"line":1140,"column":3}},"488":{"start":{"line":1130,"column":20},"end":{"line":1130,"column":25}},"489":{"start":{"line":1130,"column":20},"end":{"line":1130,"column":36}},"490":{"start":{"line":1130,"column":16},"end":{"line":1130,"column":20}},"491":{"start":{"line":1131,"column":20},"end":{"line":1131,"column":30}},"492":{"start":{"line":1132,"column":4},"end":{"line":1132,"column":26}},"493":{"start":{"line":1132,"column":18},"end":{"line":1132,"column":26}},"494":{"start":{"line":1133,"column":4},"end":{"line":1139,"column":5}},"495":{"start":{"line":1134,"column":6},"end":{"line":1134,"column":null}},"496":{"start":{"line":1136,"column":6},"end":{"line":1138,"column":null}},"497":{"start":{"line":1141,"column":2},"end":{"line":1141,"column":null}},"498":{"start":{"line":1142,"column":2},"end":{"line":1142,"column":null}},"499":{"start":{"line":1143,"column":2},"end":{"line":1143,"column":null}},"500":{"start":{"line":1147,"column":2},"end":{"line":1162,"column":3}},"501":{"start":{"line":1149,"column":6},"end":{"line":1155,"column":null}},"502":{"start":{"line":1157,"column":6},"end":{"line":1157,"column":null}},"503":{"start":{"line":1159,"column":6},"end":{"line":1159,"column":null}},"504":{"start":{"line":1161,"column":6},"end":{"line":1161,"column":null}},"505":{"start":{"line":1166,"column":27},"end":{"line":1166,"column":29}},"506":{"start":{"line":1167,"column":31},"end":{"line":1167,"column":63}},"507":{"start":{"line":1168,"column":19},"end":{"line":1170,"column":null}},"508":{"start":{"line":1172,"column":2},"end":{"line":1180,"column":3}},"509":{"start":{"line":1172,"column":19},"end":{"line":1172,"column":30}},"510":{"start":{"line":1172,"column":15},"end":{"line":1172,"column":19}},"511":{"start":{"line":1173,"column":20},"end":{"line":1173,"column":37}},"512":{"start":{"line":1174,"column":4},"end":{"line":1179,"column":5}},"513":{"start":{"line":1175,"column":21},"end":{"line":1175,"column":68}},"514":{"start":{"line":1176,"column":21},"end":{"line":1176,"column":70}},"515":{"start":{"line":1177,"column":19},"end":{"line":1177,"column":62}},"516":{"start":{"line":1178,"column":6},"end":{"line":1178,"column":null}},"517":{"start":{"line":1181,"column":2},"end":{"line":1181,"column":null}},"518":{"start":{"line":1188,"column":2},"end":{"line":1190,"column":3}},"519":{"start":{"line":1189,"column":4},"end":{"line":1189,"column":null}},"520":{"start":{"line":1191,"column":2},"end":{"line":1193,"column":3}},"521":{"start":{"line":1192,"column":4},"end":{"line":1192,"column":null}},"522":{"start":{"line":1194,"column":2},"end":{"line":1207,"column":3}},"523":{"start":{"line":1195,"column":4},"end":{"line":1206,"column":5}},"524":{"start":{"line":1197,"column":8},"end":{"line":1197,"column":null}},"525":{"start":{"line":1199,"column":8},"end":{"line":1199,"column":null}},"526":{"start":{"line":1201,"column":8},"end":{"line":1201,"column":null}},"527":{"start":{"line":1203,"column":8},"end":{"line":1203,"column":null}},"528":{"start":{"line":1205,"column":8},"end":{"line":1205,"column":null}},"529":{"start":{"line":1208,"column":2},"end":{"line":1208,"column":null}},"530":{"start":{"line":1212,"column":27},"end":{"line":1212,"column":29}},"531":{"start":{"line":1213,"column":31},"end":{"line":1213,"column":66}},"532":{"start":{"line":1214,"column":19},"end":{"line":1216,"column":null}},"533":{"start":{"line":1218,"column":2},"end":{"line":1226,"column":3}},"534":{"start":{"line":1218,"column":19},"end":{"line":1218,"column":30}},"535":{"start":{"line":1218,"column":15},"end":{"line":1218,"column":19}},"536":{"start":{"line":1219,"column":23},"end":{"line":1219,"column":43}},"537":{"start":{"line":1220,"column":4},"end":{"line":1225,"column":5}},"538":{"start":{"line":1221,"column":21},"end":{"line":1221,"column":106}},"539":{"start":{"line":1222,"column":21},"end":{"line":1222,"column":76}},"540":{"start":{"line":1223,"column":19},"end":{"line":1223,"column":89}},"541":{"start":{"line":1224,"column":6},"end":{"line":1224,"column":null}},"542":{"start":{"line":1227,"column":2},"end":{"line":1227,"column":null}},"543":{"start":{"line":1231,"column":2},"end":{"line":1255,"column":3}},"544":{"start":{"line":1233,"column":6},"end":{"line":1238,"column":null}},"545":{"start":{"line":1240,"column":6},"end":{"line":1245,"column":null}},"546":{"start":{"line":1247,"column":6},"end":{"line":1252,"column":null}},"547":{"start":{"line":1254,"column":6},"end":{"line":1254,"column":null}},"548":{"start":{"line":1267,"column":8},"end":{"line":1267,"column":null}},"549":{"start":{"line":1268,"column":2},"end":{"line":1270,"column":3}},"550":{"start":{"line":1269,"column":4},"end":{"line":1269,"column":null}},"551":{"start":{"line":1274,"column":19},"end":{"line":1277,"column":null}},"552":{"start":{"line":1274,"column":10},"end":{"line":1277,"column":null}},"553":{"start":{"line":1278,"column":4},"end":{"line":1278,"column":null}},"554":{"start":{"line":1280,"column":4},"end":{"line":1284,"column":null}},"555":{"start":{"line":1285,"column":4},"end":{"line":1285,"column":null}},"556":{"start":{"line":1288,"column":8},"end":{"line":1288,"column":null}},"557":{"start":{"line":1289,"column":8},"end":{"line":1289,"column":null}},"558":{"start":{"line":1290,"column":2},"end":{"line":1321,"column":3}},"559":{"start":{"line":1290,"column":13},"end":{"line":1290,"column":18}},"560":{"start":{"line":1291,"column":4},"end":{"line":1297,"column":5}},"561":{"start":{"line":1296,"column":6},"end":{"line":1296,"column":14}},"562":{"start":{"line":1301,"column":4},"end":{"line":1311,"column":5}},"563":{"start":{"line":1305,"column":6},"end":{"line":1309,"column":null}},"564":{"start":{"line":1310,"column":6},"end":{"line":1310,"column":14}},"565":{"start":{"line":1312,"column":4},"end":{"line":1314,"column":5}},"566":{"start":{"line":1313,"column":6},"end":{"line":1313,"column":14}},"567":{"start":{"line":1315,"column":4},"end":{"line":1315,"column":null}},"568":{"start":{"line":1316,"column":10},"end":{"line":1316,"column":null}},"569":{"start":{"line":1317,"column":10},"end":{"line":1317,"column":null}},"570":{"start":{"line":1318,"column":10},"end":{"line":1318,"column":null}},"571":{"start":{"line":1319,"column":10},"end":{"line":1319,"column":null}},"572":{"start":{"line":1320,"column":4},"end":{"line":1320,"column":null}},"573":{"start":{"line":1322,"column":2},"end":{"line":1322,"column":null}},"574":{"start":{"line":1334,"column":10},"end":{"line":1334,"column":null}},"575":{"start":{"line":1334,"column":4},"end":{"line":1334,"column":null}},"576":{"start":{"line":1336,"column":4},"end":{"line":1338,"column":null}},"577":{"start":{"line":1341,"column":8},"end":{"line":1341,"column":null}},"578":{"start":{"line":1342,"column":8},"end":{"line":1342,"column":null}},"579":{"start":{"line":1345,"column":8},"end":{"line":1345,"column":null}},"580":{"start":{"line":1346,"column":8},"end":{"line":1348,"column":null}},"581":{"start":{"line":1349,"column":2},"end":{"line":1349,"column":null}},"582":{"start":{"line":1350,"column":2},"end":{"line":1352,"column":3}},"583":{"start":{"line":1351,"column":4},"end":{"line":1351,"column":null}},"584":{"start":{"line":1355,"column":2},"end":{"line":1361,"column":3}},"585":{"start":{"line":1355,"column":13},"end":{"line":1355,"column":21}},"586":{"start":{"line":1356,"column":4},"end":{"line":1360,"column":5}},"587":{"start":{"line":1357,"column":12},"end":{"line":1357,"column":null}},"588":{"start":{"line":1358,"column":12},"end":{"line":1358,"column":null}},"589":{"start":{"line":1359,"column":6},"end":{"line":1359,"column":null}},"590":{"start":{"line":1362,"column":2},"end":{"line":1362,"column":null}},"591":{"start":{"line":1365,"column":8},"end":{"line":1365,"column":null}},"592":{"start":{"line":1366,"column":8},"end":{"line":1369,"column":null}},"593":{"start":{"line":1370,"column":8},"end":{"line":1370,"column":null}},"594":{"start":{"line":1371,"column":2},"end":{"line":1392,"column":3}},"595":{"start":{"line":1371,"column":13},"end":{"line":1371,"column":19}},"596":{"start":{"line":1372,"column":10},"end":{"line":1372,"column":null}},"597":{"start":{"line":1373,"column":4},"end":{"line":1382,"column":5}},"598":{"start":{"line":1376,"column":6},"end":{"line":1381,"column":7}},"599":{"start":{"line":1377,"column":14},"end":{"line":1377,"column":null}},"600":{"start":{"line":1378,"column":8},"end":{"line":1380,"column":null}},"601":{"start":{"line":1383,"column":10},"end":{"line":1383,"column":null}},"602":{"start":{"line":1385,"column":4},"end":{"line":1391,"column":5}},"603":{"start":{"line":1386,"column":12},"end":{"line":1386,"column":null}},"604":{"start":{"line":1387,"column":12},"end":{"line":1387,"column":null}},"605":{"start":{"line":1388,"column":6},"end":{"line":1390,"column":null}},"606":{"start":{"line":1393,"column":2},"end":{"line":1395,"column":3}},"607":{"start":{"line":1394,"column":4},"end":{"line":1394,"column":null}},"608":{"start":{"line":1398,"column":21},"end":{"line":1398,"column":null}},"609":{"start":{"line":1398,"column":8},"end":{"line":1398,"column":null}},"610":{"start":{"line":1399,"column":2},"end":{"line":1401,"column":3}},"611":{"start":{"line":1400,"column":4},"end":{"line":1400,"column":null}},"612":{"start":{"line":1403,"column":2},"end":{"line":1405,"column":3}},"613":{"start":{"line":1404,"column":4},"end":{"line":1404,"column":null}},"614":{"start":{"line":1406,"column":2},"end":{"line":1406,"column":null}},"615":{"start":{"line":1415,"column":19},"end":{"line":1418,"column":null}},"616":{"start":{"line":1415,"column":10},"end":{"line":1418,"column":null}},"617":{"start":{"line":1419,"column":4},"end":{"line":1419,"column":null}},"618":{"start":{"line":1421,"column":4},"end":{"line":1425,"column":null}},"619":{"start":{"line":1426,"column":4},"end":{"line":1426,"column":null}},"620":{"start":{"line":1429,"column":8},"end":{"line":1429,"column":null}},"621":{"start":{"line":1429,"column":37},"end":{"line":1429,"column":58}},"622":{"start":{"line":1430,"column":2},"end":{"line":1432,"column":3}},"623":{"start":{"line":1431,"column":4},"end":{"line":1431,"column":null}},"624":{"start":{"line":1434,"column":8},"end":{"line":1437,"column":null}},"625":{"start":{"line":1435,"column":14},"end":{"line":1435,"column":64}},"626":{"start":{"line":1436,"column":4},"end":{"line":1436,"column":null}},"627":{"start":{"line":1438,"column":2},"end":{"line":1438,"column":null}},"628":{"start":{"line":1438,"column":26},"end":{"line":1438,"column":54}},"629":{"start":{"line":1440,"column":8},"end":{"line":1440,"column":null}},"630":{"start":{"line":1441,"column":8},"end":{"line":1444,"column":null}},"631":{"start":{"line":1442,"column":18},"end":{"line":1442,"column":64}},"632":{"start":{"line":1443,"column":4},"end":{"line":1443,"column":null}},"633":{"start":{"line":1445,"column":2},"end":{"line":1449,"column":3}},"634":{"start":{"line":1446,"column":4},"end":{"line":1448,"column":null}},"635":{"start":{"line":1450,"column":2},"end":{"line":1450,"column":null}},"636":{"start":{"line":1460,"column":2},"end":{"line":1460,"column":null}},"637":{"start":{"line":1474,"column":8},"end":{"line":1474,"column":null}},"638":{"start":{"line":1476,"column":8},"end":{"line":1476,"column":null}},"639":{"start":{"line":1478,"column":22},"end":{"line":1478,"column":null}},"640":{"start":{"line":1478,"column":8},"end":{"line":1478,"column":null}},"641":{"start":{"line":1482,"column":8},"end":{"line":1487,"column":null}},"642":{"start":{"line":1484,"column":6},"end":{"line":1486,"column":null}},"643":{"start":{"line":1485,"column":13},"end":{"line":1485,"column":null}},"644":{"start":{"line":1488,"column":2},"end":{"line":1492,"column":null}},"645":{"start":{"line":1500,"column":2},"end":{"line":1500,"column":null}},"646":{"start":{"line":1502,"column":8},"end":{"line":1502,"column":null}},"647":{"start":{"line":1503,"column":6},"end":{"line":1503,"column":null}},"648":{"start":{"line":1504,"column":9},"end":{"line":1504,"column":null}},"649":{"start":{"line":1504,"column":13},"end":{"line":1504,"column":null}},"650":{"start":{"line":1505,"column":8},"end":{"line":1505,"column":null}},"651":{"start":{"line":1507,"column":12},"end":{"line":1507,"column":null}},"652":{"start":{"line":1507,"column":6},"end":{"line":1507,"column":null}},"653":{"start":{"line":1512,"column":6},"end":{"line":1516,"column":null}},"654":{"start":{"line":1518,"column":8},"end":{"line":1518,"column":null}},"655":{"start":{"line":1520,"column":8},"end":{"line":1524,"column":null}},"656":{"start":{"line":1526,"column":6},"end":{"line":1526,"column":14}},"657":{"start":{"line":1528,"column":4},"end":{"line":1528,"column":null}},"658":{"start":{"line":1529,"column":4},"end":{"line":1531,"column":5}},"659":{"start":{"line":1530,"column":6},"end":{"line":1530,"column":12}},"660":{"start":{"line":1538,"column":8},"end":{"line":1538,"column":9}},"661":{"start":{"line":1539,"column":21},"end":{"line":1539,"column":null}},"662":{"start":{"line":1539,"column":12},"end":{"line":1539,"column":null}},"663":{"start":{"line":1540,"column":22},"end":{"line":1540,"column":null}},"664":{"start":{"line":1540,"column":12},"end":{"line":1540,"column":null}},"665":{"start":{"line":1541,"column":6},"end":{"line":1545,"column":7}},"666":{"start":{"line":1542,"column":8},"end":{"line":1544,"column":null}},"667":{"start":{"line":1546,"column":6},"end":{"line":1548,"column":null}},"668":{"start":{"line":1554,"column":19},"end":{"line":1554,"column":null}},"669":{"start":{"line":1554,"column":10},"end":{"line":1554,"column":null}},"670":{"start":{"line":1555,"column":8},"end":{"line":1555,"column":14}},"671":{"start":{"line":1556,"column":22},"end":{"line":1556,"column":null}},"672":{"start":{"line":1556,"column":12},"end":{"line":1556,"column":null}},"673":{"start":{"line":1557,"column":6},"end":{"line":1559,"column":null}},"674":{"start":{"line":1563,"column":6},"end":{"line":1563,"column":null}},"675":{"start":{"line":1568,"column":22},"end":{"line":1568,"column":null}},"676":{"start":{"line":1568,"column":12},"end":{"line":1568,"column":null}},"677":{"start":{"line":1569,"column":6},"end":{"line":1571,"column":null}},"678":{"start":{"line":1578,"column":4},"end":{"line":1578,"column":61}},"679":{"start":{"line":1580,"column":2},"end":{"line":1582,"column":3}},"680":{"start":{"line":1581,"column":4},"end":{"line":1581,"column":null}},"681":{"start":{"line":1584,"column":25},"end":{"line":1584,"column":56}},"682":{"start":{"line":1585,"column":2},"end":{"line":1590,"column":3}},"683":{"start":{"line":1586,"column":4},"end":{"line":1588,"column":null}},"684":{"start":{"line":1589,"column":4},"end":{"line":1589,"column":null}},"685":{"start":{"line":1592,"column":2},"end":{"line":1592,"column":null}},"686":{"start":{"line":1596,"column":9},"end":{"line":1599,"column":null}},"687":{"start":{"line":1596,"column":2},"end":{"line":1599,"column":null}},"688":{"start":{"line":1602,"column":23},"end":{"line":1608,"column":2}},"689":{"start":{"line":1611,"column":2},"end":{"line":1613,"column":3}},"690":{"start":{"line":1612,"column":4},"end":{"line":1612,"column":null}},"691":{"start":{"line":1614,"column":2},"end":{"line":1614,"column":null}},"692":{"start":{"line":1618,"column":14},"end":{"line":1621,"column":null}},"693":{"start":{"line":1618,"column":8},"end":{"line":1621,"column":null}},"694":{"start":{"line":1622,"column":2},"end":{"line":1624,"column":3}},"695":{"start":{"line":1623,"column":4},"end":{"line":1623,"column":null}},"696":{"start":{"line":1625,"column":2},"end":{"line":1625,"column":null}},"697":{"start":{"line":1632,"column":8},"end":{"line":1632,"column":null}},"698":{"start":{"line":1633,"column":8},"end":{"line":1633,"column":null}},"699":{"start":{"line":1634,"column":2},"end":{"line":1637,"column":null}},"700":{"start":{"line":1636,"column":4},"end":{"line":1636,"column":null}},"701":{"start":{"line":1639,"column":2},"end":{"line":1643,"column":null}},"702":{"start":{"line":1644,"column":2},"end":{"line":1650,"column":null}},"703":{"start":{"line":1645,"column":4},"end":{"line":1645,"column":null}},"704":{"start":{"line":1645,"column":30},"end":{"line":1645,"column":44}},"705":{"start":{"line":1646,"column":4},"end":{"line":1649,"column":null}},"706":{"start":{"line":1647,"column":6},"end":{"line":1647,"column":null}},"707":{"start":{"line":1648,"column":6},"end":{"line":1648,"column":null}},"708":{"start":{"line":1654,"column":18},"end":{"line":1657,"column":null}},"709":{"start":{"line":1654,"column":8},"end":{"line":1657,"column":null}},"710":{"start":{"line":1658,"column":2},"end":{"line":1660,"column":3}},"711":{"start":{"line":1659,"column":4},"end":{"line":1659,"column":10}},"712":{"start":{"line":1662,"column":2},"end":{"line":1666,"column":null}},"713":{"start":{"line":1664,"column":15},"end":{"line":1664,"column":null}},"714":{"start":{"line":1664,"column":19},"end":{"line":1664,"column":41}},"715":{"start":{"line":1664,"column":42},"end":{"line":1664,"column":77}},"716":{"start":{"line":1664,"column":41},"end":{"line":1664,"column":null}},"717":{"start":{"line":1664,"column":19},"end":{"line":1664,"column":22}},"718":{"start":{"line":1672,"column":14},"end":{"line":1675,"column":null}},"719":{"start":{"line":1672,"column":8},"end":{"line":1675,"column":null}},"720":{"start":{"line":1676,"column":2},"end":{"line":1676,"column":null}},"721":{"start":{"line":1680,"column":8},"end":{"line":1680,"column":null}},"722":{"start":{"line":1681,"column":8},"end":{"line":1681,"column":null}},"723":{"start":{"line":1682,"column":2},"end":{"line":1695,"column":3}},"724":{"start":{"line":1682,"column":13},"end":{"line":1682,"column":25}},"725":{"start":{"line":1683,"column":4},"end":{"line":1694,"column":5}},"726":{"start":{"line":1683,"column":15},"end":{"line":1683,"column":23}},"727":{"start":{"line":1684,"column":6},"end":{"line":1684,"column":null}},"728":{"start":{"line":1685,"column":6},"end":{"line":1685,"column":null}},"729":{"start":{"line":1686,"column":6},"end":{"line":1686,"column":null}},"730":{"start":{"line":1687,"column":6},"end":{"line":1687,"column":null}},"731":{"start":{"line":1688,"column":6},"end":{"line":1688,"column":null}},"732":{"start":{"line":1689,"column":6},"end":{"line":1689,"column":null}},"733":{"start":{"line":1690,"column":6},"end":{"line":1690,"column":null}},"734":{"start":{"line":1691,"column":6},"end":{"line":1693,"column":null}},"735":{"start":{"line":1696,"column":20},"end":{"line":1696,"column":null}},"736":{"start":{"line":1696,"column":8},"end":{"line":1696,"column":null}},"737":{"start":{"line":1697,"column":2},"end":{"line":1697,"column":null}},"738":{"start":{"line":1697,"column":33},"end":{"line":1697,"column":54}},"739":{"start":{"line":1704,"column":6},"end":{"line":1704,"column":null}},"740":{"start":{"line":1706,"column":4},"end":{"line":1714,"column":null}},"741":{"start":{"line":1716,"column":4},"end":{"line":1716,"column":null}},"742":{"start":{"line":1719,"column":2},"end":{"line":1719,"column":null}},"743":{"start":{"line":1723,"column":2},"end":{"line":1725,"column":3}},"744":{"start":{"line":1724,"column":4},"end":{"line":1724,"column":null}},"745":{"start":{"line":1727,"column":18},"end":{"line":1727,"column":61}},"746":{"start":{"line":1727,"column":47},"end":{"line":1727,"column":61}},"747":{"start":{"line":1728,"column":2},"end":{"line":1730,"column":3}},"748":{"start":{"line":1729,"column":4},"end":{"line":1729,"column":null}},"749":{"start":{"line":1735,"column":4},"end":{"line":1735,"column":61}},"750":{"start":{"line":1736,"column":2},"end":{"line":1743,"column":3}},"751":{"start":{"line":1737,"column":15},"end":{"line":1737,"column":62}},"752":{"start":{"line":1738,"column":4},"end":{"line":1740,"column":5}},"753":{"start":{"line":1739,"column":6},"end":{"line":1739,"column":null}},"754":{"start":{"line":1745,"column":2},"end":{"line":1747,"column":null}},"755":{"start":{"line":1750,"column":0},"end":{"line":1750,"column":null}},"756":{"start":{"line":1753,"column":22},"end":{"line":1753,"column":48}},"757":{"start":{"line":1751,"column":10},"end":{"line":1751,"column":null}},"758":{"start":{"line":1752,"column":2},"end":{"line":1752,"column":null}},"759":{"start":{"line":1754,"column":4},"end":{"line":1756,"column":5}},"760":{"start":{"line":1755,"column":6},"end":{"line":1755,"column":null}},"761":{"start":{"line":1759,"column":8},"end":{"line":1773,"column":null}},"762":{"start":{"line":1760,"column":4},"end":{"line":1762,"column":null}},"763":{"start":{"line":1761,"column":6},"end":{"line":1761,"column":null}},"764":{"start":{"line":1763,"column":4},"end":{"line":1763,"column":null}},"765":{"start":{"line":1764,"column":4},"end":{"line":1766,"column":5}},"766":{"start":{"line":1765,"column":6},"end":{"line":1765,"column":null}},"767":{"start":{"line":1767,"column":4},"end":{"line":1769,"column":5}},"768":{"start":{"line":1768,"column":6},"end":{"line":1768,"column":null}},"769":{"start":{"line":1770,"column":4},"end":{"line":1772,"column":5}},"770":{"start":{"line":1771,"column":6},"end":{"line":1771,"column":null}},"771":{"start":{"line":1774,"column":0},"end":{"line":1774,"column":null}},"772":{"start":{"line":1779,"column":39},"end":{"line":1779,"column":41}},"773":{"start":{"line":1780,"column":2},"end":{"line":1782,"column":3}},"774":{"start":{"line":1781,"column":4},"end":{"line":1781,"column":null}},"775":{"start":{"line":1783,"column":2},"end":{"line":1814,"column":3}},"776":{"start":{"line":1783,"column":31},"end":{"line":1783,"column":40}},"777":{"start":{"line":1783,"column":31},"end":{"line":1783,"column":53}},"778":{"start":{"line":1783,"column":27},"end":{"line":1783,"column":31}},"779":{"start":{"line":1784,"column":27},"end":{"line":1784,"column":52}},"780":{"start":{"line":1785,"column":4},"end":{"line":1787,"column":5}},"781":{"start":{"line":1786,"column":6},"end":{"line":1786,"column":null}},"782":{"start":{"line":1789,"column":17},"end":{"line":1789,"column":42}},"783":{"start":{"line":1790,"column":4},"end":{"line":1791,"column":null}},"784":{"start":{"line":1793,"column":22},"end":{"line":1793,"column":50}},"785":{"start":{"line":1794,"column":4},"end":{"line":1796,"column":5}},"786":{"start":{"line":1795,"column":6},"end":{"line":1795,"column":null}},"787":{"start":{"line":1798,"column":22},"end":{"line":1804,"column":5}},"788":{"start":{"line":1799,"column":18},"end":{"line":1799,"column":27}},"789":{"start":{"line":1800,"column":6},"end":{"line":1802,"column":7}},"790":{"start":{"line":1801,"column":8},"end":{"line":1801,"column":null}},"791":{"start":{"line":1803,"column":6},"end":{"line":1803,"column":null}},"792":{"start":{"line":1806,"column":4},"end":{"line":1811,"column":5}},"793":{"start":{"line":1807,"column":6},"end":{"line":1807,"column":null}},"794":{"start":{"line":1809,"column":6},"end":{"line":1809,"column":null}},"795":{"start":{"line":1810,"column":6},"end":{"line":1810,"column":null}},"796":{"start":{"line":1813,"column":4},"end":{"line":1813,"column":null}},"797":{"start":{"line":1815,"column":2},"end":{"line":1815,"column":null}},"798":{"start":{"line":1819,"column":9},"end":{"line":1822,"column":null}},"799":{"start":{"line":1819,"column":2},"end":{"line":1822,"column":null}},"800":{"start":{"line":1826,"column":9},"end":{"line":1829,"column":null}},"801":{"start":{"line":1826,"column":2},"end":{"line":1829,"column":null}},"802":{"start":{"line":1833,"column":18},"end":{"line":1836,"column":null}},"803":{"start":{"line":1833,"column":8},"end":{"line":1836,"column":null}},"804":{"start":{"line":1837,"column":2},"end":{"line":1837,"column":null}}},"fnMap":{"0":{"name":"createJobPod","decl":{"start":{"line":69,"column":22},"end":{"line":69,"column":34}},"loc":{"start":{"line":74,"column":35},"end":{"line":187,"column":null}}},"1":{"name":"createContainerStepPod","decl":{"start":{"line":189,"column":22},"end":{"line":189,"column":44}},"loc":{"start":{"line":192,"column":35},"end":{"line":240,"column":null}}},"2":{"name":"deletePod","decl":{"start":{"line":242,"column":22},"end":{"line":242,"column":31}},"loc":{"start":{"line":242,"column":44},"end":{"line":248,"column":null}}},"3":{"name":"execPodStep","decl":{"start":{"line":250,"column":22},"end":{"line":250,"column":33}},"loc":{"start":{"line":254,"column":25},"end":{"line":372,"column":null}}},"4":{"name":"(anonymous_36)","decl":{"start":{"line":278,"column":29},"end":{"line":278,"column":30}},"loc":{"start":{"line":278,"column":45},"end":{"line":371,"column":3}}},"5":{"name":"(anonymous_37)","decl":{"start":{"line":292,"column":8},"end":{"line":292,"column":14}},"loc":{"start":{"line":292,"column":18},"end":{"line":335,"column":null}}},"6":{"name":"(anonymous_38)","decl":{"start":{"line":292,"column":18},"end":{"line":292,"column":null}},"loc":{"start":{"line":292,"column":18},"end":{"line":335,"column":null}}},"7":{"name":"(anonymous_40)","decl":{"start":{"line":300,"column":33},"end":{"line":300,"column":null}},"loc":{"start":{"line":300,"column":33},"end":{"line":322,"column":null}}},"8":{"name":"(anonymous_43)","decl":{"start":{"line":306,"column":39},"end":{"line":306,"column":51}},"loc":{"start":{"line":306,"column":51},"end":{"line":320,"column":15}}},"9":{"name":"(anonymous_44)","decl":{"start":{"line":307,"column":48},"end":{"line":307,"column":null}},"loc":{"start":{"line":307,"column":48},"end":{"line":312,"column":17}}},"10":{"name":"(anonymous_45)","decl":{"start":{"line":314,"column":37},"end":{"line":314,"column":null}},"loc":{"start":{"line":314,"column":37},"end":{"line":318,"column":17}}},"11":{"name":"(anonymous_46)","decl":{"start":{"line":337,"column":12},"end":{"line":337,"column":21}},"loc":{"start":{"line":337,"column":21},"end":{"line":345,"column":7}}},"12":{"name":"(anonymous_47)","decl":{"start":{"line":346,"column":13},"end":{"line":346,"column":19}},"loc":{"start":{"line":346,"column":20},"end":{"line":370,"column":8}}},"13":{"name":"(anonymous_48)","decl":{"start":{"line":346,"column":20},"end":{"line":346,"column":null}},"loc":{"start":{"line":346,"column":20},"end":{"line":370,"column":8}}},"14":{"name":"(anonymous_50)","decl":{"start":{"line":353,"column":34},"end":{"line":353,"column":46}},"loc":{"start":{"line":353,"column":46},"end":{"line":366,"column":11}}},"15":{"name":"(anonymous_51)","decl":{"start":{"line":354,"column":44},"end":{"line":354,"column":null}},"loc":{"start":{"line":354,"column":44},"end":{"line":359,"column":13}}},"16":{"name":"(anonymous_52)","decl":{"start":{"line":361,"column":33},"end":{"line":361,"column":null}},"loc":{"start":{"line":361,"column":33},"end":{"line":364,"column":13}}},"17":{"name":"execPodStepWithOutput","decl":{"start":{"line":379,"column":22},"end":{"line":379,"column":43}},"loc":{"start":{"line":379,"column":43},"end":{"line":501,"column":null}}},"18":{"name":"(anonymous_56)","decl":{"start":{"line":391,"column":15},"end":{"line":391,"column":16}},"loc":{"start":{"line":391,"column":28},"end":{"line":395,"column":3}}},"19":{"name":"(anonymous_57)","decl":{"start":{"line":399,"column":20},"end":{"line":399,"column":21}},"loc":{"start":{"line":399,"column":43},"end":{"line":404,"column":3}}},"20":{"name":"(anonymous_58)","decl":{"start":{"line":407,"column":20},"end":{"line":407,"column":21}},"loc":{"start":{"line":407,"column":43},"end":{"line":412,"column":3}}},"21":{"name":"(anonymous_59)","decl":{"start":{"line":414,"column":23},"end":{"line":414,"column":null}},"loc":{"start":{"line":414,"column":23},"end":{"line":423,"column":3}}},"22":{"name":"(anonymous_60)","decl":{"start":{"line":426,"column":9},"end":{"line":426,"column":10}},"loc":{"start":{"line":426,"column":42},"end":{"line":434,"column":5}}},"23":{"name":"(anonymous_61)","decl":{"start":{"line":437,"column":9},"end":{"line":437,"column":10}},"loc":{"start":{"line":437,"column":42},"end":{"line":445,"column":5}}},"24":{"name":"(anonymous_62)","decl":{"start":{"line":451,"column":24},"end":{"line":451,"column":25}},"loc":{"start":{"line":451,"column":48},"end":{"line":454,"column":3}}},"25":{"name":"(anonymous_63)","decl":{"start":{"line":456,"column":27},"end":{"line":456,"column":37}},"loc":{"start":{"line":456,"column":52},"end":{"line":500,"column":3}}},"26":{"name":"(anonymous_64)","decl":{"start":{"line":467,"column":8},"end":{"line":467,"column":12}},"loc":{"start":{"line":467,"column":12},"end":{"line":483,"column":9}}},"27":{"name":"(anonymous_65)","decl":{"start":{"line":485,"column":13},"end":{"line":485,"column":14}},"loc":{"start":{"line":485,"column":14},"end":{"line":499,"column":7}}},"28":{"name":"execCalculateOutputHashSorted","decl":{"start":{"line":503,"column":22},"end":{"line":503,"column":51}},"loc":{"start":{"line":506,"column":19},"end":{"line":563,"column":null}}},"29":{"name":"(anonymous_69)","decl":{"start":{"line":512,"column":9},"end":{"line":512,"column":10}},"loc":{"start":{"line":512,"column":25},"end":{"line":519,"column":5}}},"30":{"name":"(anonymous_70)","decl":{"start":{"line":522,"column":26},"end":{"line":522,"column":27}},"loc":{"start":{"line":522,"column":42},"end":{"line":549,"column":3}}},"31":{"name":"(anonymous_71)","decl":{"start":{"line":533,"column":8},"end":{"line":533,"column":12}},"loc":{"start":{"line":533,"column":12},"end":{"line":546,"column":9}}},"32":{"name":"(anonymous_72)","decl":{"start":{"line":548,"column":13},"end":{"line":548,"column":14}},"loc":{"start":{"line":548,"column":14},"end":{"line":548,"column":24}}},"33":{"name":"(anonymous_73)","decl":{"start":{"line":556,"column":12},"end":{"line":556,"column":16}},"loc":{"start":{"line":556,"column":16},"end":{"line":556,"column":24}}},"34":{"name":"localCalculateOutputHashSorted","decl":{"start":{"line":565,"column":22},"end":{"line":565,"column":52}},"loc":{"start":{"line":566,"column":20},"end":{"line":597,"column":null}}},"35":{"name":"(anonymous_77)","decl":{"start":{"line":569,"column":4},"end":{"line":569,"column":5}},"loc":{"start":{"line":569,"column":20},"end":{"line":595,"column":5}}},"36":{"name":"(anonymous_78)","decl":{"start":{"line":575,"column":30},"end":{"line":575,"column":35}},"loc":{"start":{"line":575,"column":35},"end":{"line":577,"column":7}}},"37":{"name":"(anonymous_79)","decl":{"start":{"line":579,"column":24},"end":{"line":579,"column":25}},"loc":{"start":{"line":579,"column":37},"end":{"line":594,"column":7}}},"38":{"name":"(anonymous_80)","decl":{"start":{"line":584,"column":20},"end":{"line":584,"column":24}},"loc":{"start":{"line":584,"column":24},"end":{"line":584,"column":32}}},"39":{"name":"execCpToPod","decl":{"start":{"line":599,"column":22},"end":{"line":599,"column":33}},"loc":{"start":{"line":602,"column":23},"end":{"line":718,"column":null}}},"40":{"name":"(anonymous_86)","decl":{"start":{"line":622,"column":24},"end":{"line":622,"column":25}},"loc":{"start":{"line":622,"column":40},"end":{"line":645,"column":7}}},"41":{"name":"(anonymous_87)","decl":{"start":{"line":633,"column":12},"end":{"line":633,"column":18}},"loc":{"start":{"line":633,"column":24},"end":{"line":642,"column":null}}},"42":{"name":"(anonymous_88)","decl":{"start":{"line":633,"column":24},"end":{"line":633,"column":null}},"loc":{"start":{"line":633,"column":24},"end":{"line":642,"column":null}}},"43":{"name":"(anonymous_90)","decl":{"start":{"line":644,"column":17},"end":{"line":644,"column":18}},"loc":{"start":{"line":644,"column":18},"end":{"line":644,"column":28}}},"44":{"name":"(anonymous_93)","decl":{"start":{"line":685,"column":24},"end":{"line":685,"column":25}},"loc":{"start":{"line":685,"column":25},"end":{"line":685,"column":30}}},"45":{"name":"(anonymous_94)","decl":{"start":{"line":688,"column":23},"end":{"line":688,"column":24}},"loc":{"start":{"line":688,"column":24},"end":{"line":688,"column":29}}},"46":{"name":"(anonymous_95)","decl":{"start":{"line":691,"column":10},"end":{"line":691,"column":11}},"loc":{"start":{"line":691,"column":11},"end":{"line":691,"column":16}}},"47":{"name":"(anonymous_96)","decl":{"start":{"line":694,"column":10},"end":{"line":694,"column":11}},"loc":{"start":{"line":694,"column":11},"end":{"line":694,"column":16}}},"48":{"name":"(anonymous_97)","decl":{"start":{"line":697,"column":18},"end":{"line":697,"column":19}},"loc":{"start":{"line":697,"column":19},"end":{"line":700,"column":11}}},"49":{"name":"(anonymous_98)","decl":{"start":{"line":701,"column":15},"end":{"line":701,"column":16}},"loc":{"start":{"line":701,"column":16},"end":{"line":704,"column":11}}},"50":{"name":"execCpFromPod","decl":{"start":{"line":720,"column":22},"end":{"line":720,"column":35}},"loc":{"start":{"line":723,"column":26},"end":{"line":857,"column":null}}},"51":{"name":"(anonymous_104)","decl":{"start":{"line":756,"column":24},"end":{"line":756,"column":25}},"loc":{"start":{"line":756,"column":40},"end":{"line":784,"column":7}}},"52":{"name":"(anonymous_105)","decl":{"start":{"line":773,"column":12},"end":{"line":773,"column":19}},"loc":{"start":{"line":773,"column":35},"end":{"line":781,"column":null}}},"53":{"name":"(anonymous_106)","decl":{"start":{"line":773,"column":35},"end":{"line":773,"column":null}},"loc":{"start":{"line":773,"column":35},"end":{"line":781,"column":null}}},"54":{"name":"(anonymous_108)","decl":{"start":{"line":783,"column":17},"end":{"line":783,"column":18}},"loc":{"start":{"line":783,"column":18},"end":{"line":783,"column":28}}},"55":{"name":"(anonymous_111)","decl":{"start":{"line":824,"column":24},"end":{"line":824,"column":25}},"loc":{"start":{"line":824,"column":25},"end":{"line":824,"column":30}}},"56":{"name":"(anonymous_112)","decl":{"start":{"line":827,"column":23},"end":{"line":827,"column":24}},"loc":{"start":{"line":827,"column":24},"end":{"line":827,"column":29}}},"57":{"name":"(anonymous_113)","decl":{"start":{"line":830,"column":10},"end":{"line":830,"column":11}},"loc":{"start":{"line":830,"column":11},"end":{"line":830,"column":16}}},"58":{"name":"(anonymous_114)","decl":{"start":{"line":833,"column":10},"end":{"line":833,"column":11}},"loc":{"start":{"line":833,"column":11},"end":{"line":833,"column":16}}},"59":{"name":"(anonymous_115)","decl":{"start":{"line":836,"column":18},"end":{"line":836,"column":19}},"loc":{"start":{"line":836,"column":19},"end":{"line":839,"column":11}}},"60":{"name":"(anonymous_116)","decl":{"start":{"line":840,"column":15},"end":{"line":840,"column":16}},"loc":{"start":{"line":840,"column":16},"end":{"line":843,"column":11}}},"61":{"name":"waitForJobToComplete","decl":{"start":{"line":859,"column":22},"end":{"line":859,"column":42}},"loc":{"start":{"line":859,"column":58},"end":{"line":871,"column":null}}},"62":{"name":"createDockerSecret","decl":{"start":{"line":873,"column":22},"end":{"line":873,"column":40}},"loc":{"start":{"line":874,"column":20},"end":{"line":912,"column":null}}},"63":{"name":"createSecretForEnvs","decl":{"start":{"line":914,"column":22},"end":{"line":914,"column":41}},"loc":{"start":{"line":916,"column":1},"end":{"line":940,"column":null}}},"64":{"name":"deleteSecret","decl":{"start":{"line":942,"column":22},"end":{"line":942,"column":34}},"loc":{"start":{"line":942,"column":47},"end":{"line":947,"column":null}}},"65":{"name":"pruneSecrets","decl":{"start":{"line":949,"column":22},"end":{"line":949,"column":34}},"loc":{"start":{"line":949,"column":34},"end":{"line":964,"column":null}}},"66":{"name":"(anonymous_132)","decl":{"start":{"line":960,"column":6},"end":{"line":960,"column":12}},"loc":{"start":{"line":960,"column":18},"end":{"line":961,"column":null}}},"67":{"name":"(anonymous_133)","decl":{"start":{"line":960,"column":18},"end":{"line":960,"column":null}},"loc":{"start":{"line":960,"column":18},"end":{"line":961,"column":null}}},"68":{"name":"getUnrecoverableWaitingReasons","decl":{"start":{"line":1052,"column":16},"end":{"line":1052,"column":46}},"loc":{"start":{"line":1052,"column":46},"end":{"line":1065,"column":1}}},"69":{"name":"getUnrecoverableEventReasons","decl":{"start":{"line":1070,"column":16},"end":{"line":1070,"column":44}},"loc":{"start":{"line":1070,"column":44},"end":{"line":1083,"column":1}}},"70":{"name":"getUnrecoverableTerminatedReasons","decl":{"start":{"line":1085,"column":16},"end":{"line":1085,"column":49}},"loc":{"start":{"line":1085,"column":49},"end":{"line":1099,"column":1}}},"71":{"name":"isPermanentSchedulingFailure","decl":{"start":{"line":1107,"column":16},"end":{"line":1107,"column":44}},"loc":{"start":{"line":1108,"column":29},"end":{"line":1112,"column":1}}},"72":{"name":"(anonymous_139)","decl":{"start":{"line":1111,"column":47},"end":{"line":1111,"column":48}},"loc":{"start":{"line":1111,"column":48},"end":{"line":1111,"column":53}}},"73":{"name":"getPermanentSchedulingPatterns","decl":{"start":{"line":1123,"column":16},"end":{"line":1123,"column":46}},"loc":{"start":{"line":1123,"column":46},"end":{"line":1144,"column":1}}},"74":{"name":"getWaitingReasonHint","decl":{"start":{"line":1146,"column":9},"end":{"line":1146,"column":29}},"loc":{"start":{"line":1146,"column":44},"end":{"line":1163,"column":1}}},"75":{"name":"getContainerErrors","decl":{"start":{"line":1165,"column":16},"end":{"line":1165,"column":34}},"loc":{"start":{"line":1165,"column":49},"end":{"line":1182,"column":1}}},"76":{"name":"getTerminatedReasonHint","decl":{"start":{"line":1184,"column":16},"end":{"line":1184,"column":39}},"loc":{"start":{"line":1186,"column":30},"end":{"line":1209,"column":1}}},"77":{"name":"getContainerTerminatedErrors","decl":{"start":{"line":1211,"column":16},"end":{"line":1211,"column":44}},"loc":{"start":{"line":1211,"column":59},"end":{"line":1228,"column":1}}},"78":{"name":"getEventReasonHint","decl":{"start":{"line":1230,"column":9},"end":{"line":1230,"column":27}},"loc":{"start":{"line":1230,"column":42},"end":{"line":1256,"column":1}}},"79":{"name":"getPodEventErrors","decl":{"start":{"line":1266,"column":22},"end":{"line":1266,"column":39}},"loc":{"start":{"line":1266,"column":55},"end":{"line":1323,"column":null}}},"80":{"name":"describePodFailure","decl":{"start":{"line":1331,"column":22},"end":{"line":1331,"column":40}},"loc":{"start":{"line":1331,"column":56},"end":{"line":1407,"column":null}}},"81":{"name":"describePodWarningEvents","decl":{"start":{"line":1412,"column":15},"end":{"line":1412,"column":39}},"loc":{"start":{"line":1412,"column":55},"end":{"line":1451,"column":null}}},"82":{"name":"(anonymous_155)","decl":{"start":{"line":1429,"column":32},"end":{"line":1429,"column":33}},"loc":{"start":{"line":1429,"column":33},"end":{"line":1429,"column":38}}},"83":{"name":"(anonymous_156)","decl":{"start":{"line":1434,"column":20},"end":{"line":1434,"column":21}},"loc":{"start":{"line":1434,"column":39},"end":{"line":1437,"column":3}}},"84":{"name":"(anonymous_157)","decl":{"start":{"line":1438,"column":16},"end":{"line":1438,"column":17}},"loc":{"start":{"line":1438,"column":21},"end":{"line":1438,"column":35}}},"85":{"name":"(anonymous_158)","decl":{"start":{"line":1441,"column":27},"end":{"line":1441,"column":28}},"loc":{"start":{"line":1441,"column":28},"end":{"line":1444,"column":3}}},"86":{"name":"getPodConditionErrors","decl":{"start":{"line":1459,"column":16},"end":{"line":1459,"column":37}},"loc":{"start":{"line":1459,"column":51},"end":{"line":1461,"column":1}}},"87":{"name":"checkUnrecoverableErrors","decl":{"start":{"line":1469,"column":22},"end":{"line":1469,"column":46}},"loc":{"start":{"line":1471,"column":17},"end":{"line":1494,"column":null}}},"88":{"name":"(anonymous_163)","decl":{"start":{"line":1483,"column":4},"end":{"line":1483,"column":5}},"loc":{"start":{"line":1483,"column":5},"end":{"line":1484,"column":7}}},"89":{"name":"(anonymous_164)","decl":{"start":{"line":1485,"column":8},"end":{"line":1485,"column":9}},"loc":{"start":{"line":1485,"column":9},"end":{"line":1485,"column":14}}},"90":{"name":"waitForPodPhases","decl":{"start":{"line":1496,"column":22},"end":{"line":1496,"column":38}},"loc":{"start":{"line":1496,"column":38},"end":{"line":1574,"column":null}}},"91":{"name":"getPrepareJobTimeoutSeconds","decl":{"start":{"line":1576,"column":16},"end":{"line":1576,"column":43}},"loc":{"start":{"line":1576,"column":43},"end":{"line":1593,"column":1}}},"92":{"name":"readPod","decl":{"start":{"line":1595,"column":15},"end":{"line":1595,"column":22}},"loc":{"start":{"line":1595,"column":38},"end":{"line":1600,"column":null}}},"93":{"name":"parsePodPhase","decl":{"start":{"line":1610,"column":16},"end":{"line":1610,"column":29}},"loc":{"start":{"line":1610,"column":44},"end":{"line":1615,"column":1}}},"94":{"name":"isJobSucceeded","decl":{"start":{"line":1617,"column":15},"end":{"line":1617,"column":29}},"loc":{"start":{"line":1617,"column":42},"end":{"line":1626,"column":null}}},"95":{"name":"getPodLogs","decl":{"start":{"line":1628,"column":22},"end":{"line":1628,"column":32}},"loc":{"start":{"line":1630,"column":23},"end":{"line":1651,"column":null}}},"96":{"name":"(anonymous_179)","decl":{"start":{"line":1634,"column":23},"end":{"line":1634,"column":28}},"loc":{"start":{"line":1634,"column":28},"end":{"line":1637,"column":3}}},"97":{"name":"(anonymous_180)","decl":{"start":{"line":1644,"column":20},"end":{"line":1644,"column":21}},"loc":{"start":{"line":1644,"column":36},"end":{"line":1650,"column":3}}},"98":{"name":"(anonymous_181)","decl":{"start":{"line":1645,"column":24},"end":{"line":1645,"column":30}},"loc":{"start":{"line":1645,"column":24},"end":{"line":1645,"column":37}}},"99":{"name":"(anonymous_182)","decl":{"start":{"line":1646,"column":26},"end":{"line":1646,"column":29}},"loc":{"start":{"line":1646,"column":29},"end":{"line":1649,"column":5}}},"100":{"name":"prunePods","decl":{"start":{"line":1653,"column":22},"end":{"line":1653,"column":31}},"loc":{"start":{"line":1653,"column":31},"end":{"line":1667,"column":null}}},"101":{"name":"(anonymous_186)","decl":{"start":{"line":1664,"column":6},"end":{"line":1664,"column":12}},"loc":{"start":{"line":1664,"column":15},"end":{"line":1664,"column":null}}},"102":{"name":"(anonymous_187)","decl":{"start":{"line":1664,"column":15},"end":{"line":1664,"column":19}},"loc":{"start":{"line":1664,"column":15},"end":{"line":1664,"column":null}}},"103":{"name":"getPodStatus","decl":{"start":{"line":1669,"column":22},"end":{"line":1669,"column":34}},"loc":{"start":{"line":1670,"column":14},"end":{"line":1677,"column":null}}},"104":{"name":"isAuthPermissionsOK","decl":{"start":{"line":1679,"column":22},"end":{"line":1679,"column":41}},"loc":{"start":{"line":1679,"column":41},"end":{"line":1698,"column":null}}},"105":{"name":"(anonymous_195)","decl":{"start":{"line":1697,"column":25},"end":{"line":1697,"column":29}},"loc":{"start":{"line":1697,"column":29},"end":{"line":1697,"column":54}}},"106":{"name":"isPodContainerAlpine","decl":{"start":{"line":1700,"column":22},"end":{"line":1700,"column":42}},"loc":{"start":{"line":1702,"column":23},"end":{"line":1720,"column":null}}},"107":{"name":"namespace","decl":{"start":{"line":1722,"column":16},"end":{"line":1722,"column":25}},"loc":{"start":{"line":1722,"column":25},"end":{"line":1748,"column":1}}},"108":{"name":"(anonymous_200)","decl":{"start":{"line":1727,"column":40},"end":{"line":1727,"column":43}},"loc":{"start":{"line":1727,"column":43},"end":{"line":1727,"column":50}}},"109":{"name":"(anonymous_201)","decl":{"start":{"line":1750,"column":0},"end":{"line":1750,"column":null}},"loc":{"start":{"line":1750,"column":0},"end":{"line":1774,"column":1}}},"110":{"name":"BackOffManager","decl":{"start":{"line":1753,"column":2},"end":{"line":1753,"column":22}},"loc":{"start":{"line":1753,"column":48},"end":{"line":1757,"column":3}}},"111":{"name":"(anonymous_203)","decl":{"start":{"line":1759,"column":2},"end":{"line":1759,"column":8}},"loc":{"start":{"line":1759,"column":2},"end":{"line":1773,"column":null}}},"112":{"name":"(anonymous_206)","decl":{"start":{"line":1760,"column":22},"end":{"line":1760,"column":29}},"loc":{"start":{"line":1760,"column":29},"end":{"line":1761,"column":16}}},"113":{"name":"containerPorts","decl":{"start":{"line":1776,"column":16},"end":{"line":1776,"column":30}},"loc":{"start":{"line":1777,"column":26},"end":{"line":1816,"column":1}}},"114":{"name":"(anonymous_208)","decl":{"start":{"line":1798,"column":22},"end":{"line":1798,"column":23}},"loc":{"start":{"line":1798,"column":32},"end":{"line":1804,"column":5}}},"115":{"name":"getPodByName","decl":{"start":{"line":1818,"column":22},"end":{"line":1818,"column":34}},"loc":{"start":{"line":1818,"column":39},"end":{"line":1823,"column":null}}},"116":{"name":"getSecretByName","decl":{"start":{"line":1825,"column":22},"end":{"line":1825,"column":37}},"loc":{"start":{"line":1825,"column":50},"end":{"line":1830,"column":null}}},"117":{"name":"listPodsByRunnerInstance","decl":{"start":{"line":1832,"column":22},"end":{"line":1832,"column":46}},"loc":{"start":{"line":1832,"column":46},"end":{"line":1838,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":183,"column":2},"end":{"line":186,"column":null}},"type":"switch","locations":[{"start":{"line":183,"column":2},"end":{"line":186,"column":null}}]},"1":{"loc":{"start":{"line":77,"column":2},"end":{"line":79,"column":3}},"type":"if","locations":[{"start":{"line":77,"column":2},"end":{"line":79,"column":3}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":80,"column":2},"end":{"line":82,"column":3}},"type":"if","locations":[{"start":{"line":80,"column":2},"end":{"line":82,"column":3}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":80,"column":6},"end":{"line":80,"column":22}},"type":"cond-expr","locations":[{"start":{"line":80,"column":14},"end":{"line":80,"column":16}},{"start":{"line":80,"column":6},"end":{"line":80,"column":22}}]},"4":{"loc":{"start":{"line":80,"column":6},"end":{"line":80,"column":16}},"type":"binary-expr","locations":[{"start":{"line":80,"column":6},"end":{"line":80,"column":16}},{"start":{"line":80,"column":6},"end":{"line":80,"column":16}}]},"5":{"loc":{"start":{"line":107,"column":25},"end":{"line":107,"column":78}},"type":"cond-expr","locations":[{"start":{"line":107,"column":72},"end":{"line":107,"column":76}},{"start":{"line":107,"column":76},"end":{"line":107,"column":78}}]},"6":{"loc":{"start":{"line":107,"column":25},"end":{"line":107,"column":76}},"type":"binary-expr","locations":[{"start":{"line":107,"column":25},"end":{"line":107,"column":76}},{"start":{"line":107,"column":72},"end":{"line":107,"column":76}}]},"7":{"loc":{"start":{"line":107,"column":25},"end":{"line":107,"column":72}},"type":"cond-expr","locations":[{"start":{"line":107,"column":40},"end":{"line":107,"column":42}},{"start":{"line":107,"column":25},"end":{"line":107,"column":72}}]},"8":{"loc":{"start":{"line":107,"column":25},"end":{"line":107,"column":42}},"type":"binary-expr","locations":[{"start":{"line":107,"column":25},"end":{"line":107,"column":42}},{"start":{"line":107,"column":25},"end":{"line":107,"column":42}}]},"9":{"loc":{"start":{"line":116,"column":2},"end":{"line":118,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":118,"column":3}},{"start":{},"end":{}}]},"10":{"loc":{"start":{"line":124,"column":8},"end":{"line":125,"column":47}},"type":"binary-expr","locations":[{"start":{"line":124,"column":8},"end":{"line":124,"column":40}},{"start":{"line":125,"column":8},"end":{"line":125,"column":47}}]},"11":{"loc":{"start":{"line":165,"column":6},"end":{"line":165,"column":14}},"type":"if","locations":[{"start":{"line":165,"column":6},"end":{"line":165,"column":14}},{"start":{},"end":{}}]},"12":{"loc":{"start":{"line":167,"column":4},"end":{"line":169,"column":5}},"type":"if","locations":[{"start":{"line":167,"column":4},"end":{"line":169,"column":5}},{"start":{},"end":{}}]},"13":{"loc":{"start":{"line":167,"column":9},"end":{"line":167,"column":31}},"type":"cond-expr","locations":[{"start":{"line":167,"column":25},"end":{"line":167,"column":27}},{"start":{"line":167,"column":25},"end":{"line":167,"column":31}}]},"14":{"loc":{"start":{"line":167,"column":9},"end":{"line":167,"column":27}},"type":"binary-expr","locations":[{"start":{"line":167,"column":9},"end":{"line":167,"column":27}},{"start":{"line":167,"column":25},"end":{"line":167,"column":27}}]},"15":{"loc":{"start":{"line":167,"column":9},"end":{"line":167,"column":25}},"type":"cond-expr","locations":[{"start":{"line":167,"column":15},"end":{"line":167,"column":17}},{"start":{"line":167,"column":9},"end":{"line":167,"column":25}}]},"16":{"loc":{"start":{"line":167,"column":9},"end":{"line":167,"column":17}},"type":"binary-expr","locations":[{"start":{"line":167,"column":9},"end":{"line":167,"column":17}},{"start":{"line":167,"column":9},"end":{"line":167,"column":17}}]},"17":{"loc":{"start":{"line":175,"column":2},"end":{"line":177,"column":3}},"type":"if","locations":[{"start":{"line":175,"column":2},"end":{"line":177,"column":3}},{"start":{},"end":{}}]},"18":{"loc":{"start":{"line":175,"column":6},"end":{"line":175,"column":25}},"type":"cond-expr","locations":[{"start":{"line":175,"column":15},"end":{"line":175,"column":17}},{"start":{"line":175,"column":6},"end":{"line":175,"column":25}}]},"19":{"loc":{"start":{"line":175,"column":6},"end":{"line":175,"column":17}},"type":"binary-expr","locations":[{"start":{"line":175,"column":6},"end":{"line":175,"column":17}},{"start":{"line":175,"column":6},"end":{"line":175,"column":17}}]},"20":{"loc":{"start":{"line":179,"column":2},"end":{"line":181,"column":3}},"type":"if","locations":[{"start":{"line":179,"column":2},"end":{"line":181,"column":3}},{"start":{},"end":{}}]},"21":{"loc":{"start":{"line":179,"column":6},"end":{"line":179,"column":21}},"type":"cond-expr","locations":[{"start":{"line":179,"column":15},"end":{"line":179,"column":17}},{"start":{"line":179,"column":6},"end":{"line":179,"column":21}}]},"22":{"loc":{"start":{"line":179,"column":6},"end":{"line":179,"column":17}},"type":"binary-expr","locations":[{"start":{"line":179,"column":6},"end":{"line":179,"column":17}},{"start":{"line":179,"column":6},"end":{"line":179,"column":17}}]},"23":{"loc":{"start":{"line":236,"column":2},"end":{"line":239,"column":null}},"type":"switch","locations":[{"start":{"line":236,"column":2},"end":{"line":239,"column":null}}]},"24":{"loc":{"start":{"line":228,"column":2},"end":{"line":230,"column":3}},"type":"if","locations":[{"start":{"line":228,"column":2},"end":{"line":230,"column":3}},{"start":{},"end":{}}]},"25":{"loc":{"start":{"line":228,"column":6},"end":{"line":228,"column":25}},"type":"cond-expr","locations":[{"start":{"line":228,"column":15},"end":{"line":228,"column":17}},{"start":{"line":228,"column":6},"end":{"line":228,"column":25}}]},"26":{"loc":{"start":{"line":228,"column":6},"end":{"line":228,"column":17}},"type":"binary-expr","locations":[{"start":{"line":228,"column":6},"end":{"line":228,"column":17}},{"start":{"line":228,"column":6},"end":{"line":228,"column":17}}]},"27":{"loc":{"start":{"line":232,"column":2},"end":{"line":234,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":234,"column":3}},{"start":{},"end":{}}]},"28":{"loc":{"start":{"line":232,"column":6},"end":{"line":232,"column":21}},"type":"cond-expr","locations":[{"start":{"line":232,"column":15},"end":{"line":232,"column":17}},{"start":{"line":232,"column":6},"end":{"line":232,"column":21}}]},"29":{"loc":{"start":{"line":232,"column":6},"end":{"line":232,"column":17}},"type":"binary-expr","locations":[{"start":{"line":232,"column":6},"end":{"line":232,"column":17}},{"start":{"line":232,"column":6},"end":{"line":232,"column":17}}]},"30":{"loc":{"start":{"line":243,"column":2},"end":{"line":247,"column":null}},"type":"switch","locations":[{"start":{"line":243,"column":2},"end":{"line":247,"column":null}}]},"31":{"loc":{"start":{"line":290,"column":8},"end":{"line":290,"column":21}},"type":"cond-expr","locations":[{"start":{"line":290,"column":8},"end":{"line":290,"column":13}},{"start":{"line":290,"column":17},"end":{"line":290,"column":21}}]},"32":{"loc":{"start":{"line":290,"column":8},"end":{"line":290,"column":17}},"type":"binary-expr","locations":[{"start":{"line":290,"column":8},"end":{"line":290,"column":17}},{"start":{"line":290,"column":8},"end":{"line":290,"column":17}}]},"33":{"loc":{"start":{"line":302,"column":12},"end":{"line":321,"column":13}},"type":"if","locations":[{"start":{"line":302,"column":12},"end":{"line":321,"column":13}},{"start":{},"end":{}}]},"34":{"loc":{"start":{"line":303,"column":14},"end":{"line":304,"column":66}},"type":"binary-expr","locations":[{"start":{"line":303,"column":14},"end":{"line":303,"column":20}},{"start":{"line":304,"column":15},"end":{"line":304,"column":38}},{"start":{"line":304,"column":42},"end":{"line":304,"column":65}}]},"35":{"loc":{"start":{"line":324,"column":14},"end":{"line":324,"column":18}},"type":"if","locations":[{"start":{"line":324,"column":14},"end":{"line":324,"column":18}},{"start":{},"end":{}}]},"36":{"loc":{"start":{"line":327,"column":20},"end":{"line":327,"column":34}},"type":"binary-expr","locations":[{"start":{"line":327,"column":20},"end":{"line":327,"column":29}},{"start":{"line":327,"column":33},"end":{"line":327,"column":34}}]},"37":{"loc":{"start":{"line":330,"column":66},"end":{"line":330,"column":79}},"type":"cond-expr","locations":[{"start":{"line":330,"column":70},"end":{"line":330,"column":72}},{"start":{"line":330,"column":66},"end":{"line":330,"column":79}}]},"38":{"loc":{"start":{"line":330,"column":66},"end":{"line":330,"column":72}},"type":"binary-expr","locations":[{"start":{"line":330,"column":66},"end":{"line":330,"column":72}},{"start":{"line":330,"column":66},"end":{"line":330,"column":72}}]},"39":{"loc":{"start":{"line":330,"column":90},"end":{"line":330,"column":103}},"type":"cond-expr","locations":[{"start":{"line":330,"column":94},"end":{"line":330,"column":96}},{"start":{"line":330,"column":90},"end":{"line":330,"column":103}}]},"40":{"loc":{"start":{"line":330,"column":90},"end":{"line":330,"column":96}},"type":"binary-expr","locations":[{"start":{"line":330,"column":90},"end":{"line":330,"column":96}},{"start":{"line":330,"column":90},"end":{"line":330,"column":96}}]},"41":{"loc":{"start":{"line":333,"column":29},"end":{"line":333,"column":66}},"type":"binary-expr","locations":[{"start":{"line":333,"column":29},"end":{"line":333,"column":42}},{"start":{"line":333,"column":46},"end":{"line":333,"column":66}}]},"42":{"loc":{"start":{"line":333,"column":29},"end":{"line":333,"column":42}},"type":"cond-expr","locations":[{"start":{"line":333,"column":33},"end":{"line":333,"column":35}},{"start":{"line":333,"column":29},"end":{"line":333,"column":42}}]},"43":{"loc":{"start":{"line":333,"column":29},"end":{"line":333,"column":35}},"type":"binary-expr","locations":[{"start":{"line":333,"column":29},"end":{"line":333,"column":35}},{"start":{"line":333,"column":29},"end":{"line":333,"column":35}}]},"44":{"loc":{"start":{"line":340,"column":8},"end":{"line":344,"column":9}},"type":"if","locations":[{"start":{"line":340,"column":8},"end":{"line":344,"column":9}},{"start":{"line":342,"column":15},"end":{"line":344,"column":9}}]},"45":{"loc":{"start":{"line":352,"column":12},"end":{"line":352,"column":18}},"type":"if","locations":[{"start":{"line":352,"column":12},"end":{"line":352,"column":18}},{"start":{},"end":{}}]},"46":{"loc":{"start":{"line":352,"column":12},"end":{"line":352,"column":74}},"type":"binary-expr","locations":[{"start":{"line":352,"column":12},"end":{"line":352,"column":18}},{"start":{"line":352,"column":23},"end":{"line":352,"column":46}},{"start":{"line":352,"column":50},"end":{"line":352,"column":73}}]},"47":{"loc":{"start":{"line":383,"column":2},"end":{"line":383,"column":null}},"type":"if","locations":[{"start":{"line":383,"column":2},"end":{"line":383,"column":null}},{"start":{},"end":{}}]},"48":{"loc":{"start":{"line":456,"column":2},"end":{"line":500,"column":null}},"type":"switch","locations":[{"start":{"line":456,"column":2},"end":{"line":500,"column":null}}]},"49":{"loc":{"start":{"line":392,"column":4},"end":{"line":392,"column":33}},"type":"if","locations":[{"start":{"line":392,"column":4},"end":{"line":392,"column":33}},{"start":{},"end":{}}]},"50":{"loc":{"start":{"line":394,"column":4},"end":{"line":394,"column":null}},"type":"if","locations":[{"start":{"line":394,"column":4},"end":{"line":394,"column":null}},{"start":{},"end":{}}]},"51":{"loc":{"start":{"line":402,"column":17},"end":{"line":402,"column":34}},"type":"cond-expr","locations":[{"start":{"line":402,"column":28},"end":{"line":402,"column":32}},{"start":{"line":402,"column":32},"end":{"line":402,"column":34}}]},"52":{"loc":{"start":{"line":402,"column":17},"end":{"line":402,"column":32}},"type":"binary-expr","locations":[{"start":{"line":402,"column":17},"end":{"line":402,"column":32}},{"start":{"line":402,"column":28},"end":{"line":402,"column":32}}]},"53":{"loc":{"start":{"line":410,"column":17},"end":{"line":410,"column":34}},"type":"cond-expr","locations":[{"start":{"line":410,"column":28},"end":{"line":410,"column":32}},{"start":{"line":410,"column":32},"end":{"line":410,"column":34}}]},"54":{"loc":{"start":{"line":410,"column":17},"end":{"line":410,"column":32}},"type":"binary-expr","locations":[{"start":{"line":410,"column":17},"end":{"line":410,"column":32}},{"start":{"line":410,"column":28},"end":{"line":410,"column":32}}]},"55":{"loc":{"start":{"line":415,"column":4},"end":{"line":418,"column":5}},"type":"if","locations":[{"start":{"line":415,"column":4},"end":{"line":418,"column":5}},{"start":{},"end":{}}]},"56":{"loc":{"start":{"line":419,"column":4},"end":{"line":422,"column":5}},"type":"if","locations":[{"start":{"line":419,"column":4},"end":{"line":422,"column":5}},{"start":{},"end":{}}]},"57":{"loc":{"start":{"line":452,"column":14},"end":{"line":452,"column":49}},"type":"cond-expr","locations":[{"start":{"line":452,"column":17},"end":{"line":452,"column":19}},{"start":{"line":452,"column":14},"end":{"line":452,"column":49}}]},"58":{"loc":{"start":{"line":452,"column":14},"end":{"line":452,"column":19}},"type":"binary-expr","locations":[{"start":{"line":452,"column":14},"end":{"line":452,"column":19}},{"start":{"line":452,"column":14},"end":{"line":452,"column":19}}]},"59":{"loc":{"start":{"line":453,"column":11},"end":{"line":453,"column":40}},"type":"cond-expr","locations":[{"start":{"line":453,"column":15},"end":{"line":453,"column":33}},{"start":{"line":453,"column":36},"end":{"line":453,"column":40}}]},"60":{"loc":{"start":{"line":465,"column":8},"end":{"line":465,"column":21}},"type":"cond-expr","locations":[{"start":{"line":465,"column":8},"end":{"line":465,"column":13}},{"start":{"line":465,"column":17},"end":{"line":465,"column":21}}]},"61":{"loc":{"start":{"line":465,"column":8},"end":{"line":465,"column":17}},"type":"binary-expr","locations":[{"start":{"line":465,"column":8},"end":{"line":465,"column":17}},{"start":{"line":465,"column":8},"end":{"line":465,"column":17}}]},"62":{"loc":{"start":{"line":470,"column":10},"end":{"line":482,"column":11}},"type":"if","locations":[{"start":{"line":470,"column":10},"end":{"line":482,"column":11}},{"start":{"line":472,"column":17},"end":{"line":482,"column":11}}]},"63":{"loc":{"start":{"line":471,"column":28},"end":{"line":471,"column":42}},"type":"binary-expr","locations":[{"start":{"line":471,"column":28},"end":{"line":471,"column":37}},{"start":{"line":471,"column":41},"end":{"line":471,"column":42}}]},"64":{"loc":{"start":{"line":476,"column":39},"end":{"line":476,"column":52}},"type":"cond-expr","locations":[{"start":{"line":476,"column":43},"end":{"line":476,"column":45}},{"start":{"line":476,"column":39},"end":{"line":476,"column":52}}]},"65":{"loc":{"start":{"line":476,"column":39},"end":{"line":476,"column":45}},"type":"binary-expr","locations":[{"start":{"line":476,"column":39},"end":{"line":476,"column":45}},{"start":{"line":476,"column":39},"end":{"line":476,"column":45}}]},"66":{"loc":{"start":{"line":477,"column":12},"end":{"line":481,"column":13}},"type":"if","locations":[{"start":{"line":477,"column":12},"end":{"line":481,"column":13}},{"start":{"line":479,"column":19},"end":{"line":481,"column":13}}]},"67":{"loc":{"start":{"line":480,"column":31},"end":{"line":480,"column":78}},"type":"binary-expr","locations":[{"start":{"line":480,"column":31},"end":{"line":480,"column":44}},{"start":{"line":480,"column":48},"end":{"line":480,"column":78}}]},"68":{"loc":{"start":{"line":480,"column":31},"end":{"line":480,"column":44}},"type":"cond-expr","locations":[{"start":{"line":480,"column":35},"end":{"line":480,"column":37}},{"start":{"line":480,"column":31},"end":{"line":480,"column":44}}]},"69":{"loc":{"start":{"line":480,"column":31},"end":{"line":480,"column":37}},"type":"binary-expr","locations":[{"start":{"line":480,"column":31},"end":{"line":480,"column":37}},{"start":{"line":480,"column":31},"end":{"line":480,"column":37}}]},"70":{"loc":{"start":{"line":492,"column":23},"end":{"line":492,"column":65}},"type":"cond-expr","locations":[{"start":{"line":492,"column":44},"end":{"line":492,"column":53}},{"start":{"line":492,"column":56},"end":{"line":492,"column":65}}]},"71":{"loc":{"start":{"line":494,"column":8},"end":{"line":498,"column":9}},"type":"if","locations":[{"start":{"line":494,"column":8},"end":{"line":498,"column":9}},{"start":{"line":496,"column":15},"end":{"line":498,"column":9}}]},"72":{"loc":{"start":{"line":535,"column":10},"end":{"line":545,"column":11}},"type":"if","locations":[{"start":{"line":535,"column":10},"end":{"line":545,"column":11}},{"start":{"line":537,"column":17},"end":{"line":545,"column":11}}]},"73":{"loc":{"start":{"line":540,"column":25},"end":{"line":540,"column":38}},"type":"cond-expr","locations":[{"start":{"line":540,"column":29},"end":{"line":540,"column":31}},{"start":{"line":540,"column":25},"end":{"line":540,"column":38}}]},"74":{"loc":{"start":{"line":540,"column":25},"end":{"line":540,"column":31}},"type":"binary-expr","locations":[{"start":{"line":540,"column":25},"end":{"line":540,"column":31}},{"start":{"line":540,"column":25},"end":{"line":540,"column":31}}]},"75":{"loc":{"start":{"line":541,"column":25},"end":{"line":541,"column":38}},"type":"cond-expr","locations":[{"start":{"line":541,"column":29},"end":{"line":541,"column":31}},{"start":{"line":541,"column":25},"end":{"line":541,"column":38}}]},"76":{"loc":{"start":{"line":541,"column":25},"end":{"line":541,"column":31}},"type":"binary-expr","locations":[{"start":{"line":541,"column":25},"end":{"line":541,"column":31}},{"start":{"line":541,"column":25},"end":{"line":541,"column":31}}]},"77":{"loc":{"start":{"line":544,"column":29},"end":{"line":544,"column":73}},"type":"binary-expr","locations":[{"start":{"line":544,"column":29},"end":{"line":544,"column":42}},{"start":{"line":544,"column":46},"end":{"line":544,"column":73}}]},"78":{"loc":{"start":{"line":544,"column":29},"end":{"line":544,"column":42}},"type":"cond-expr","locations":[{"start":{"line":544,"column":33},"end":{"line":544,"column":35}},{"start":{"line":544,"column":29},"end":{"line":544,"column":42}}]},"79":{"loc":{"start":{"line":544,"column":29},"end":{"line":544,"column":35}},"type":"binary-expr","locations":[{"start":{"line":544,"column":29},"end":{"line":544,"column":35}},{"start":{"line":544,"column":29},"end":{"line":544,"column":35}}]},"80":{"loc":{"start":{"line":568,"column":9},"end":{"line":596,"column":null}},"type":"switch","locations":[{"start":{"line":568,"column":9},"end":{"line":596,"column":null}},{"start":{"line":568,"column":2},"end":{"line":596,"column":null}}]},"81":{"loc":{"start":{"line":580,"column":8},"end":{"line":593,"column":9}},"type":"if","locations":[{"start":{"line":580,"column":8},"end":{"line":593,"column":9}},{"start":{"line":591,"column":15},"end":{"line":593,"column":9}}]},"82":{"loc":{"start":{"line":634,"column":14},"end":{"line":640,"column":15}},"type":"if","locations":[{"start":{"line":634,"column":14},"end":{"line":640,"column":15}},{"start":{},"end":{}}]},"83":{"loc":{"start":{"line":650,"column":6},"end":{"line":654,"column":7}},"type":"if","locations":[{"start":{"line":650,"column":6},"end":{"line":654,"column":7}},{"start":{},"end":{}}]},"84":{"loc":{"start":{"line":607,"column":9},"end":{"line":607,"column":null}},"type":"if","locations":[{"start":{"line":607,"column":9},"end":{"line":607,"column":null}},{"start":{},"end":{}}]},"85":{"loc":{"start":{"line":677,"column":10},"end":{"line":677,"column":13}},"type":"if","locations":[{"start":{"line":677,"column":10},"end":{"line":677,"column":13}},{"start":{},"end":{}}]},"86":{"loc":{"start":{"line":699,"column":19},"end":{"line":699,"column":77}},"type":"binary-expr","locations":[{"start":{"line":699,"column":19},"end":{"line":699,"column":35}},{"start":{"line":699,"column":39},"end":{"line":699,"column":77}}]},"87":{"loc":{"start":{"line":661,"column":18},"end":{"line":661,"column":32}},"type":"if","locations":[{"start":{"line":661,"column":18},"end":{"line":661,"column":32}},{"start":{},"end":{}}]},"88":{"loc":{"start":{"line":734,"column":2},"end":{"line":736,"column":3}},"type":"if","locations":[{"start":{"line":734,"column":2},"end":{"line":736,"column":3}},{"start":{},"end":{}}]},"89":{"loc":{"start":{"line":750,"column":8},"end":{"line":750,"column":39}},"type":"binary-expr","locations":[{"start":{"line":750,"column":8},"end":{"line":750,"column":32}},{"start":{"line":750,"column":36},"end":{"line":750,"column":39}}]},"90":{"loc":{"start":{"line":774,"column":14},"end":{"line":780,"column":15}},"type":"if","locations":[{"start":{"line":774,"column":14},"end":{"line":780,"column":15}},{"start":{},"end":{}}]},"91":{"loc":{"start":{"line":789,"column":6},"end":{"line":793,"column":7}},"type":"if","locations":[{"start":{"line":789,"column":6},"end":{"line":793,"column":7}},{"start":{},"end":{}}]},"92":{"loc":{"start":{"line":739,"column":9},"end":{"line":739,"column":null}},"type":"if","locations":[{"start":{"line":739,"column":9},"end":{"line":739,"column":null}},{"start":{},"end":{}}]},"93":{"loc":{"start":{"line":816,"column":10},"end":{"line":816,"column":13}},"type":"if","locations":[{"start":{"line":816,"column":10},"end":{"line":816,"column":13}},{"start":{},"end":{}}]},"94":{"loc":{"start":{"line":838,"column":19},"end":{"line":838,"column":77}},"type":"binary-expr","locations":[{"start":{"line":838,"column":19},"end":{"line":838,"column":35}},{"start":{"line":838,"column":39},"end":{"line":838,"column":77}}]},"95":{"loc":{"start":{"line":800,"column":18},"end":{"line":800,"column":32}},"type":"if","locations":[{"start":{"line":800,"column":18},"end":{"line":800,"column":32}},{"start":{},"end":{}}]},"96":{"loc":{"start":{"line":869,"column":4},"end":{"line":869,"column":null}},"type":"switch","locations":[{"start":{"line":869,"column":4},"end":{"line":869,"column":null}}]},"97":{"loc":{"start":{"line":861,"column":9},"end":{"line":861,"column":null}},"type":"if","locations":[{"start":{"line":861,"column":9},"end":{"line":861,"column":null}},{"start":{},"end":{}}]},"98":{"loc":{"start":{"line":863,"column":6},"end":{"line":865,"column":7}},"type":"if","locations":[{"start":{"line":863,"column":6},"end":{"line":865,"column":7}},{"start":{},"end":{}}]},"99":{"loc":{"start":{"line":908,"column":2},"end":{"line":911,"column":null}},"type":"switch","locations":[{"start":{"line":908,"column":2},"end":{"line":911,"column":null}}]},"100":{"loc":{"start":{"line":878,"column":7},"end":{"line":878,"column":58}},"type":"binary-expr","locations":[{"start":{"line":878,"column":7},"end":{"line":878,"column":25}},{"start":{"line":878,"column":29},"end":{"line":878,"column":58}}]},"101":{"loc":{"start":{"line":943,"column":2},"end":{"line":946,"column":null}},"type":"switch","locations":[{"start":{"line":943,"column":2},"end":{"line":946,"column":null}}]},"102":{"loc":{"start":{"line":950,"column":21},"end":{"line":953,"column":null}},"type":"switch","locations":[{"start":{"line":950,"column":21},"end":{"line":953,"column":null}}]},"103":{"loc":{"start":{"line":954,"column":2},"end":{"line":956,"column":3}},"type":"if","locations":[{"start":{"line":954,"column":2},"end":{"line":956,"column":3}},{"start":{},"end":{}}]},"104":{"loc":{"start":{"line":961,"column":8},"end":{"line":961,"column":14}},"type":"switch","locations":[{"start":{"line":961,"column":8},"end":{"line":961,"column":14}}]},"105":{"loc":{"start":{"line":961,"column":8},"end":{"line":961,"column":29}},"type":"cond-expr","locations":[{"start":{"line":961,"column":23},"end":{"line":961,"column":25}},{"start":{"line":961,"column":23},"end":{"line":961,"column":29}}]},"106":{"loc":{"start":{"line":961,"column":8},"end":{"line":961,"column":25}},"type":"binary-expr","locations":[{"start":{"line":961,"column":8},"end":{"line":961,"column":25}},{"start":{"line":961,"column":23},"end":{"line":961,"column":25}}]},"107":{"loc":{"start":{"line":1054,"column":2},"end":{"line":1056,"column":3}},"type":"if","locations":[{"start":{"line":1054,"column":2},"end":{"line":1056,"column":3}},{"start":{},"end":{}}]},"108":{"loc":{"start":{"line":1060,"column":4},"end":{"line":1062,"column":5}},"type":"if","locations":[{"start":{"line":1060,"column":4},"end":{"line":1062,"column":5}},{"start":{},"end":{}}]},"109":{"loc":{"start":{"line":1072,"column":2},"end":{"line":1074,"column":3}},"type":"if","locations":[{"start":{"line":1072,"column":2},"end":{"line":1074,"column":3}},{"start":{},"end":{}}]},"110":{"loc":{"start":{"line":1078,"column":4},"end":{"line":1080,"column":5}},"type":"if","locations":[{"start":{"line":1078,"column":4},"end":{"line":1080,"column":5}},{"start":{},"end":{}}]},"111":{"loc":{"start":{"line":1088,"column":2},"end":{"line":1090,"column":3}},"type":"if","locations":[{"start":{"line":1088,"column":2},"end":{"line":1090,"column":3}},{"start":{},"end":{}}]},"112":{"loc":{"start":{"line":1094,"column":4},"end":{"line":1096,"column":5}},"type":"if","locations":[{"start":{"line":1094,"column":4},"end":{"line":1096,"column":5}},{"start":{},"end":{}}]},"113":{"loc":{"start":{"line":1110,"column":2},"end":{"line":1110,"column":null}},"type":"if","locations":[{"start":{"line":1110,"column":2},"end":{"line":1110,"column":null}},{"start":{},"end":{}}]},"114":{"loc":{"start":{"line":1125,"column":2},"end":{"line":1125,"column":null}},"type":"if","locations":[{"start":{"line":1125,"column":2},"end":{"line":1125,"column":null}},{"start":{},"end":{}}]},"115":{"loc":{"start":{"line":1126,"column":2},"end":{"line":1128,"column":3}},"type":"if","locations":[{"start":{"line":1126,"column":2},"end":{"line":1128,"column":3}},{"start":{},"end":{}}]},"116":{"loc":{"start":{"line":1126,"column":6},"end":{"line":1126,"column":71}},"type":"binary-expr","locations":[{"start":{"line":1126,"column":6},"end":{"line":1126,"column":31}},{"start":{"line":1126,"column":35},"end":{"line":1126,"column":71}}]},"117":{"loc":{"start":{"line":1132,"column":4},"end":{"line":1132,"column":26}},"type":"if","locations":[{"start":{"line":1132,"column":4},"end":{"line":1132,"column":26}},{"start":{},"end":{}}]},"118":{"loc":{"start":{"line":1147,"column":2},"end":{"line":1162,"column":3}},"type":"switch","locations":[{"start":{"line":1148,"column":4},"end":{"line":1155,"column":null}},{"start":{"line":1156,"column":4},"end":{"line":1157,"column":null}},{"start":{"line":1158,"column":4},"end":{"line":1159,"column":null}},{"start":{"line":1160,"column":4},"end":{"line":1161,"column":null}}]},"119":{"loc":{"start":{"line":1169,"column":8},"end":{"line":1169,"column":47}},"type":"cond-expr","locations":[{"start":{"line":1169,"column":41},"end":{"line":1169,"column":45}},{"start":{"line":1169,"column":45},"end":{"line":1169,"column":47}}]},"120":{"loc":{"start":{"line":1169,"column":8},"end":{"line":1169,"column":45}},"type":"binary-expr","locations":[{"start":{"line":1169,"column":8},"end":{"line":1169,"column":45}},{"start":{"line":1169,"column":41},"end":{"line":1169,"column":45}}]},"121":{"loc":{"start":{"line":1169,"column":8},"end":{"line":1169,"column":41}},"type":"cond-expr","locations":[{"start":{"line":1169,"column":18},"end":{"line":1169,"column":20}},{"start":{"line":1169,"column":18},"end":{"line":1169,"column":41}}]},"122":{"loc":{"start":{"line":1169,"column":8},"end":{"line":1169,"column":20}},"type":"binary-expr","locations":[{"start":{"line":1169,"column":8},"end":{"line":1169,"column":20}},{"start":{"line":1169,"column":18},"end":{"line":1169,"column":20}}]},"123":{"loc":{"start":{"line":1170,"column":8},"end":{"line":1170,"column":43}},"type":"cond-expr","locations":[{"start":{"line":1170,"column":37},"end":{"line":1170,"column":41}},{"start":{"line":1170,"column":41},"end":{"line":1170,"column":43}}]},"124":{"loc":{"start":{"line":1170,"column":8},"end":{"line":1170,"column":41}},"type":"binary-expr","locations":[{"start":{"line":1170,"column":8},"end":{"line":1170,"column":41}},{"start":{"line":1170,"column":37},"end":{"line":1170,"column":41}}]},"125":{"loc":{"start":{"line":1170,"column":8},"end":{"line":1170,"column":37}},"type":"cond-expr","locations":[{"start":{"line":1170,"column":18},"end":{"line":1170,"column":20}},{"start":{"line":1170,"column":18},"end":{"line":1170,"column":37}}]},"126":{"loc":{"start":{"line":1170,"column":8},"end":{"line":1170,"column":20}},"type":"binary-expr","locations":[{"start":{"line":1170,"column":8},"end":{"line":1170,"column":20}},{"start":{"line":1170,"column":18},"end":{"line":1170,"column":20}}]},"127":{"loc":{"start":{"line":1173,"column":20},"end":{"line":1173,"column":37}},"type":"cond-expr","locations":[{"start":{"line":1173,"column":28},"end":{"line":1173,"column":30}},{"start":{"line":1173,"column":28},"end":{"line":1173,"column":37}}]},"128":{"loc":{"start":{"line":1173,"column":20},"end":{"line":1173,"column":30}},"type":"binary-expr","locations":[{"start":{"line":1173,"column":20},"end":{"line":1173,"column":30}},{"start":{"line":1173,"column":28},"end":{"line":1173,"column":30}}]},"129":{"loc":{"start":{"line":1174,"column":4},"end":{"line":1179,"column":5}},"type":"if","locations":[{"start":{"line":1174,"column":4},"end":{"line":1179,"column":5}},{"start":{},"end":{}}]},"130":{"loc":{"start":{"line":1174,"column":8},"end":{"line":1174,"column":67}},"type":"binary-expr","locations":[{"start":{"line":1174,"column":8},"end":{"line":1174,"column":23}},{"start":{"line":1174,"column":27},"end":{"line":1174,"column":67}}]},"131":{"loc":{"start":{"line":1174,"column":8},"end":{"line":1174,"column":23}},"type":"cond-expr","locations":[{"start":{"line":1174,"column":15},"end":{"line":1174,"column":17}},{"start":{"line":1174,"column":8},"end":{"line":1174,"column":23}}]},"132":{"loc":{"start":{"line":1174,"column":8},"end":{"line":1174,"column":17}},"type":"binary-expr","locations":[{"start":{"line":1174,"column":8},"end":{"line":1174,"column":17}},{"start":{"line":1174,"column":8},"end":{"line":1174,"column":17}}]},"133":{"loc":{"start":{"line":1176,"column":21},"end":{"line":1176,"column":70}},"type":"cond-expr","locations":[{"start":{"line":1176,"column":39},"end":{"line":1176,"column":65}},{"start":{"line":1176,"column":68},"end":{"line":1176,"column":70}}]},"134":{"loc":{"start":{"line":1188,"column":2},"end":{"line":1190,"column":3}},"type":"if","locations":[{"start":{"line":1188,"column":2},"end":{"line":1190,"column":3}},{"start":{},"end":{}}]},"135":{"loc":{"start":{"line":1191,"column":2},"end":{"line":1193,"column":3}},"type":"if","locations":[{"start":{"line":1191,"column":2},"end":{"line":1193,"column":3}},{"start":{},"end":{}}]},"136":{"loc":{"start":{"line":1194,"column":2},"end":{"line":1207,"column":3}},"type":"if","locations":[{"start":{"line":1194,"column":2},"end":{"line":1207,"column":3}},{"start":{},"end":{}}]},"137":{"loc":{"start":{"line":1195,"column":4},"end":{"line":1206,"column":5}},"type":"switch","locations":[{"start":{"line":1196,"column":6},"end":{"line":1197,"column":null}},{"start":{"line":1198,"column":6},"end":{"line":1199,"column":null}},{"start":{"line":1200,"column":6},"end":{"line":1201,"column":null}},{"start":{"line":1202,"column":6},"end":{"line":1203,"column":null}},{"start":{"line":1204,"column":6},"end":{"line":1205,"column":null}}]},"138":{"loc":{"start":{"line":1205,"column":69},"end":{"line":1205,"column":90}},"type":"cond-expr","locations":[{"start":{"line":1205,"column":69},"end":{"line":1205,"column":77}},{"start":{"line":1205,"column":81},"end":{"line":1205,"column":90}}]},"139":{"loc":{"start":{"line":1205,"column":69},"end":{"line":1205,"column":81}},"type":"binary-expr","locations":[{"start":{"line":1205,"column":69},"end":{"line":1205,"column":81}},{"start":{"line":1205,"column":69},"end":{"line":1205,"column":81}}]},"140":{"loc":{"start":{"line":1215,"column":8},"end":{"line":1215,"column":47}},"type":"cond-expr","locations":[{"start":{"line":1215,"column":41},"end":{"line":1215,"column":45}},{"start":{"line":1215,"column":45},"end":{"line":1215,"column":47}}]},"141":{"loc":{"start":{"line":1215,"column":8},"end":{"line":1215,"column":45}},"type":"binary-expr","locations":[{"start":{"line":1215,"column":8},"end":{"line":1215,"column":45}},{"start":{"line":1215,"column":41},"end":{"line":1215,"column":45}}]},"142":{"loc":{"start":{"line":1215,"column":8},"end":{"line":1215,"column":41}},"type":"cond-expr","locations":[{"start":{"line":1215,"column":18},"end":{"line":1215,"column":20}},{"start":{"line":1215,"column":18},"end":{"line":1215,"column":41}}]},"143":{"loc":{"start":{"line":1215,"column":8},"end":{"line":1215,"column":20}},"type":"binary-expr","locations":[{"start":{"line":1215,"column":8},"end":{"line":1215,"column":20}},{"start":{"line":1215,"column":18},"end":{"line":1215,"column":20}}]},"144":{"loc":{"start":{"line":1216,"column":8},"end":{"line":1216,"column":43}},"type":"cond-expr","locations":[{"start":{"line":1216,"column":37},"end":{"line":1216,"column":41}},{"start":{"line":1216,"column":41},"end":{"line":1216,"column":43}}]},"145":{"loc":{"start":{"line":1216,"column":8},"end":{"line":1216,"column":41}},"type":"binary-expr","locations":[{"start":{"line":1216,"column":8},"end":{"line":1216,"column":41}},{"start":{"line":1216,"column":37},"end":{"line":1216,"column":41}}]},"146":{"loc":{"start":{"line":1216,"column":8},"end":{"line":1216,"column":37}},"type":"cond-expr","locations":[{"start":{"line":1216,"column":18},"end":{"line":1216,"column":20}},{"start":{"line":1216,"column":18},"end":{"line":1216,"column":37}}]},"147":{"loc":{"start":{"line":1216,"column":8},"end":{"line":1216,"column":20}},"type":"binary-expr","locations":[{"start":{"line":1216,"column":8},"end":{"line":1216,"column":20}},{"start":{"line":1216,"column":18},"end":{"line":1216,"column":20}}]},"148":{"loc":{"start":{"line":1219,"column":23},"end":{"line":1219,"column":43}},"type":"cond-expr","locations":[{"start":{"line":1219,"column":31},"end":{"line":1219,"column":33}},{"start":{"line":1219,"column":31},"end":{"line":1219,"column":43}}]},"149":{"loc":{"start":{"line":1219,"column":23},"end":{"line":1219,"column":33}},"type":"binary-expr","locations":[{"start":{"line":1219,"column":23},"end":{"line":1219,"column":33}},{"start":{"line":1219,"column":31},"end":{"line":1219,"column":33}}]},"150":{"loc":{"start":{"line":1220,"column":4},"end":{"line":1225,"column":5}},"type":"if","locations":[{"start":{"line":1220,"column":4},"end":{"line":1225,"column":5}},{"start":{},"end":{}}]},"151":{"loc":{"start":{"line":1220,"column":8},"end":{"line":1220,"column":73}},"type":"binary-expr","locations":[{"start":{"line":1220,"column":8},"end":{"line":1220,"column":26}},{"start":{"line":1220,"column":30},"end":{"line":1220,"column":73}}]},"152":{"loc":{"start":{"line":1220,"column":8},"end":{"line":1220,"column":26}},"type":"cond-expr","locations":[{"start":{"line":1220,"column":18},"end":{"line":1220,"column":20}},{"start":{"line":1220,"column":8},"end":{"line":1220,"column":26}}]},"153":{"loc":{"start":{"line":1220,"column":8},"end":{"line":1220,"column":20}},"type":"binary-expr","locations":[{"start":{"line":1220,"column":8},"end":{"line":1220,"column":20}},{"start":{"line":1220,"column":8},"end":{"line":1220,"column":20}}]},"154":{"loc":{"start":{"line":1222,"column":21},"end":{"line":1222,"column":76}},"type":"cond-expr","locations":[{"start":{"line":1222,"column":42},"end":{"line":1222,"column":71}},{"start":{"line":1222,"column":74},"end":{"line":1222,"column":76}}]},"155":{"loc":{"start":{"line":1231,"column":2},"end":{"line":1255,"column":3}},"type":"switch","locations":[{"start":{"line":1232,"column":4},"end":{"line":1238,"column":null}},{"start":{"line":1239,"column":4},"end":{"line":1245,"column":null}},{"start":{"line":1246,"column":4},"end":{"line":1252,"column":null}},{"start":{"line":1253,"column":4},"end":{"line":1254,"column":null}}]},"156":{"loc":{"start":{"line":1268,"column":2},"end":{"line":1270,"column":3}},"type":"if","locations":[{"start":{"line":1268,"column":2},"end":{"line":1270,"column":3}},{"start":{},"end":{}}]},"157":{"loc":{"start":{"line":1278,"column":12},"end":{"line":1278,"column":30}},"type":"cond-expr","locations":[{"start":{"line":1278,"column":24},"end":{"line":1278,"column":28}},{"start":{"line":1278,"column":28},"end":{"line":1278,"column":30}}]},"158":{"loc":{"start":{"line":1278,"column":12},"end":{"line":1278,"column":28}},"type":"binary-expr","locations":[{"start":{"line":1278,"column":12},"end":{"line":1278,"column":28}},{"start":{"line":1278,"column":24},"end":{"line":1278,"column":28}}]},"159":{"loc":{"start":{"line":1282,"column":8},"end":{"line":1282,"column":56}},"type":"cond-expr","locations":[{"start":{"line":1282,"column":31},"end":{"line":1282,"column":42}},{"start":{"line":1282,"column":45},"end":{"line":1282,"column":56}}]},"160":{"loc":{"start":{"line":1291,"column":4},"end":{"line":1297,"column":5}},"type":"if","locations":[{"start":{"line":1291,"column":4},"end":{"line":1297,"column":5}},{"start":{},"end":{}}]},"161":{"loc":{"start":{"line":1292,"column":6},"end":{"line":1294,"column":41}},"type":"binary-expr","locations":[{"start":{"line":1292,"column":6},"end":{"line":1292,"column":26}},{"start":{"line":1293,"column":6},"end":{"line":1293,"column":15}},{"start":{"line":1294,"column":6},"end":{"line":1294,"column":41}}]},"162":{"loc":{"start":{"line":1301,"column":4},"end":{"line":1311,"column":5}},"type":"if","locations":[{"start":{"line":1301,"column":4},"end":{"line":1311,"column":5}},{"start":{},"end":{}}]},"163":{"loc":{"start":{"line":1302,"column":6},"end":{"line":1303,"column":46}},"type":"binary-expr","locations":[{"start":{"line":1302,"column":6},"end":{"line":1302,"column":37}},{"start":{"line":1303,"column":6},"end":{"line":1303,"column":46}}]},"164":{"loc":{"start":{"line":1307,"column":10},"end":{"line":1307,"column":37}},"type":"cond-expr","locations":[{"start":{"line":1307,"column":19},"end":{"line":1307,"column":23}},{"start":{"line":1307,"column":23},"end":{"line":1307,"column":37}}]},"165":{"loc":{"start":{"line":1307,"column":10},"end":{"line":1307,"column":23}},"type":"binary-expr","locations":[{"start":{"line":1307,"column":10},"end":{"line":1307,"column":23}},{"start":{"line":1307,"column":19},"end":{"line":1307,"column":23}}]},"166":{"loc":{"start":{"line":1312,"column":4},"end":{"line":1314,"column":5}},"type":"if","locations":[{"start":{"line":1312,"column":4},"end":{"line":1314,"column":5}},{"start":{},"end":{}}]},"167":{"loc":{"start":{"line":1316,"column":18},"end":{"line":1316,"column":64}},"type":"cond-expr","locations":[{"start":{"line":1316,"column":43},"end":{"line":1316,"column":59}},{"start":{"line":1316,"column":62},"end":{"line":1316,"column":64}}]},"168":{"loc":{"start":{"line":1316,"column":18},"end":{"line":1316,"column":40}},"type":"binary-expr","locations":[{"start":{"line":1316,"column":18},"end":{"line":1316,"column":25}},{"start":{"line":1316,"column":29},"end":{"line":1316,"column":40}}]},"169":{"loc":{"start":{"line":1318,"column":19},"end":{"line":1318,"column":56}},"type":"cond-expr","locations":[{"start":{"line":1318,"column":31},"end":{"line":1318,"column":51}},{"start":{"line":1318,"column":54},"end":{"line":1318,"column":56}}]},"170":{"loc":{"start":{"line":1337,"column":6},"end":{"line":1337,"column":54}},"type":"cond-expr","locations":[{"start":{"line":1337,"column":29},"end":{"line":1337,"column":40}},{"start":{"line":1337,"column":43},"end":{"line":1337,"column":54}}]},"171":{"loc":{"start":{"line":1346,"column":21},"end":{"line":1348,"column":15}},"type":"cond-expr","locations":[{"start":{"line":1347,"column":6},"end":{"line":1347,"column":68}},{"start":{"line":1348,"column":6},"end":{"line":1348,"column":15}}]},"172":{"loc":{"start":{"line":1346,"column":21},"end":{"line":1346,"column":34}},"type":"cond-expr","locations":[{"start":{"line":1346,"column":27},"end":{"line":1346,"column":29}},{"start":{"line":1346,"column":21},"end":{"line":1346,"column":34}}]},"173":{"loc":{"start":{"line":1346,"column":21},"end":{"line":1346,"column":29}},"type":"binary-expr","locations":[{"start":{"line":1346,"column":21},"end":{"line":1346,"column":29}},{"start":{"line":1346,"column":21},"end":{"line":1346,"column":29}}]},"174":{"loc":{"start":{"line":1347,"column":24},"end":{"line":1347,"column":66}},"type":"cond-expr","locations":[{"start":{"line":1347,"column":40},"end":{"line":1347,"column":61}},{"start":{"line":1347,"column":64},"end":{"line":1347,"column":66}}]},"175":{"loc":{"start":{"line":1350,"column":2},"end":{"line":1352,"column":3}},"type":"if","locations":[{"start":{"line":1350,"column":2},"end":{"line":1352,"column":3}},{"start":{},"end":{}}]},"176":{"loc":{"start":{"line":1350,"column":6},"end":{"line":1350,"column":21}},"type":"cond-expr","locations":[{"start":{"line":1350,"column":12},"end":{"line":1350,"column":14}},{"start":{"line":1350,"column":6},"end":{"line":1350,"column":21}}]},"177":{"loc":{"start":{"line":1350,"column":6},"end":{"line":1350,"column":14}},"type":"binary-expr","locations":[{"start":{"line":1350,"column":6},"end":{"line":1350,"column":14}},{"start":{"line":1350,"column":6},"end":{"line":1350,"column":14}}]},"178":{"loc":{"start":{"line":1355,"column":21},"end":{"line":1355,"column":45}},"type":"cond-expr","locations":[{"start":{"line":1355,"column":39},"end":{"line":1355,"column":43}},{"start":{"line":1355,"column":43},"end":{"line":1355,"column":45}}]},"179":{"loc":{"start":{"line":1355,"column":21},"end":{"line":1355,"column":43}},"type":"binary-expr","locations":[{"start":{"line":1355,"column":21},"end":{"line":1355,"column":43}},{"start":{"line":1355,"column":39},"end":{"line":1355,"column":43}}]},"180":{"loc":{"start":{"line":1355,"column":21},"end":{"line":1355,"column":39}},"type":"cond-expr","locations":[{"start":{"line":1355,"column":27},"end":{"line":1355,"column":29}},{"start":{"line":1355,"column":21},"end":{"line":1355,"column":39}}]},"181":{"loc":{"start":{"line":1355,"column":21},"end":{"line":1355,"column":29}},"type":"binary-expr","locations":[{"start":{"line":1355,"column":21},"end":{"line":1355,"column":29}},{"start":{"line":1355,"column":21},"end":{"line":1355,"column":29}}]},"182":{"loc":{"start":{"line":1356,"column":4},"end":{"line":1360,"column":5}},"type":"if","locations":[{"start":{"line":1356,"column":4},"end":{"line":1360,"column":5}},{"start":{},"end":{}}]},"183":{"loc":{"start":{"line":1357,"column":21},"end":{"line":1357,"column":59}},"type":"cond-expr","locations":[{"start":{"line":1357,"column":35},"end":{"line":1357,"column":54}},{"start":{"line":1357,"column":57},"end":{"line":1357,"column":59}}]},"184":{"loc":{"start":{"line":1358,"column":18},"end":{"line":1358,"column":57}},"type":"cond-expr","locations":[{"start":{"line":1358,"column":33},"end":{"line":1358,"column":52}},{"start":{"line":1358,"column":55},"end":{"line":1358,"column":57}}]},"185":{"loc":{"start":{"line":1367,"column":8},"end":{"line":1367,"column":43}},"type":"cond-expr","locations":[{"start":{"line":1367,"column":37},"end":{"line":1367,"column":41}},{"start":{"line":1367,"column":41},"end":{"line":1367,"column":43}}]},"186":{"loc":{"start":{"line":1367,"column":8},"end":{"line":1367,"column":41}},"type":"binary-expr","locations":[{"start":{"line":1367,"column":8},"end":{"line":1367,"column":41}},{"start":{"line":1367,"column":37},"end":{"line":1367,"column":41}}]},"187":{"loc":{"start":{"line":1367,"column":8},"end":{"line":1367,"column":37}},"type":"cond-expr","locations":[{"start":{"line":1367,"column":14},"end":{"line":1367,"column":16}},{"start":{"line":1367,"column":8},"end":{"line":1367,"column":37}}]},"188":{"loc":{"start":{"line":1367,"column":8},"end":{"line":1367,"column":16}},"type":"binary-expr","locations":[{"start":{"line":1367,"column":8},"end":{"line":1367,"column":16}},{"start":{"line":1367,"column":8},"end":{"line":1367,"column":16}}]},"189":{"loc":{"start":{"line":1368,"column":8},"end":{"line":1368,"column":39}},"type":"cond-expr","locations":[{"start":{"line":1368,"column":33},"end":{"line":1368,"column":37}},{"start":{"line":1368,"column":37},"end":{"line":1368,"column":39}}]},"190":{"loc":{"start":{"line":1368,"column":8},"end":{"line":1368,"column":37}},"type":"binary-expr","locations":[{"start":{"line":1368,"column":8},"end":{"line":1368,"column":37}},{"start":{"line":1368,"column":33},"end":{"line":1368,"column":37}}]},"191":{"loc":{"start":{"line":1368,"column":8},"end":{"line":1368,"column":33}},"type":"cond-expr","locations":[{"start":{"line":1368,"column":14},"end":{"line":1368,"column":16}},{"start":{"line":1368,"column":8},"end":{"line":1368,"column":33}}]},"192":{"loc":{"start":{"line":1368,"column":8},"end":{"line":1368,"column":16}},"type":"binary-expr","locations":[{"start":{"line":1368,"column":8},"end":{"line":1368,"column":16}},{"start":{"line":1368,"column":8},"end":{"line":1368,"column":16}}]},"193":{"loc":{"start":{"line":1372,"column":20},"end":{"line":1372,"column":37}},"type":"cond-expr","locations":[{"start":{"line":1372,"column":28},"end":{"line":1372,"column":30}},{"start":{"line":1372,"column":28},"end":{"line":1372,"column":37}}]},"194":{"loc":{"start":{"line":1372,"column":20},"end":{"line":1372,"column":30}},"type":"binary-expr","locations":[{"start":{"line":1372,"column":20},"end":{"line":1372,"column":30}},{"start":{"line":1372,"column":28},"end":{"line":1372,"column":30}}]},"195":{"loc":{"start":{"line":1373,"column":4},"end":{"line":1382,"column":5}},"type":"if","locations":[{"start":{"line":1373,"column":4},"end":{"line":1382,"column":5}},{"start":{},"end":{}}]},"196":{"loc":{"start":{"line":1373,"column":8},"end":{"line":1373,"column":23}},"type":"cond-expr","locations":[{"start":{"line":1373,"column":15},"end":{"line":1373,"column":17}},{"start":{"line":1373,"column":8},"end":{"line":1373,"column":23}}]},"197":{"loc":{"start":{"line":1373,"column":8},"end":{"line":1373,"column":17}},"type":"binary-expr","locations":[{"start":{"line":1373,"column":8},"end":{"line":1373,"column":17}},{"start":{"line":1373,"column":8},"end":{"line":1373,"column":17}}]},"198":{"loc":{"start":{"line":1376,"column":6},"end":{"line":1381,"column":7}},"type":"if","locations":[{"start":{"line":1376,"column":6},"end":{"line":1381,"column":7}},{"start":{},"end":{}}]},"199":{"loc":{"start":{"line":1377,"column":20},"end":{"line":1377,"column":69}},"type":"cond-expr","locations":[{"start":{"line":1377,"column":38},"end":{"line":1377,"column":64}},{"start":{"line":1377,"column":67},"end":{"line":1377,"column":69}}]},"200":{"loc":{"start":{"line":1383,"column":23},"end":{"line":1383,"column":43}},"type":"cond-expr","locations":[{"start":{"line":1383,"column":31},"end":{"line":1383,"column":33}},{"start":{"line":1383,"column":31},"end":{"line":1383,"column":43}}]},"201":{"loc":{"start":{"line":1383,"column":23},"end":{"line":1383,"column":33}},"type":"binary-expr","locations":[{"start":{"line":1383,"column":23},"end":{"line":1383,"column":33}},{"start":{"line":1383,"column":31},"end":{"line":1383,"column":33}}]},"202":{"loc":{"start":{"line":1385,"column":4},"end":{"line":1391,"column":5}},"type":"if","locations":[{"start":{"line":1385,"column":4},"end":{"line":1391,"column":5}},{"start":{},"end":{}}]},"203":{"loc":{"start":{"line":1385,"column":8},"end":{"line":1385,"column":47}},"type":"binary-expr","locations":[{"start":{"line":1385,"column":8},"end":{"line":1385,"column":18}},{"start":{"line":1385,"column":22},"end":{"line":1385,"column":47}}]},"204":{"loc":{"start":{"line":1386,"column":21},"end":{"line":1386,"column":51}},"type":"cond-expr","locations":[{"start":{"line":1386,"column":38},"end":{"line":1386,"column":42}},{"start":{"line":1386,"column":42},"end":{"line":1386,"column":51}}]},"205":{"loc":{"start":{"line":1386,"column":21},"end":{"line":1386,"column":42}},"type":"binary-expr","locations":[{"start":{"line":1386,"column":21},"end":{"line":1386,"column":42}},{"start":{"line":1386,"column":38},"end":{"line":1386,"column":42}}]},"206":{"loc":{"start":{"line":1387,"column":18},"end":{"line":1387,"column":73}},"type":"cond-expr","locations":[{"start":{"line":1387,"column":39},"end":{"line":1387,"column":68}},{"start":{"line":1387,"column":71},"end":{"line":1387,"column":73}}]},"207":{"loc":{"start":{"line":1393,"column":2},"end":{"line":1395,"column":3}},"type":"if","locations":[{"start":{"line":1393,"column":2},"end":{"line":1395,"column":3}},{"start":{},"end":{}}]},"208":{"loc":{"start":{"line":1399,"column":2},"end":{"line":1401,"column":3}},"type":"if","locations":[{"start":{"line":1399,"column":2},"end":{"line":1401,"column":3}},{"start":{},"end":{}}]},"209":{"loc":{"start":{"line":1403,"column":2},"end":{"line":1405,"column":3}},"type":"if","locations":[{"start":{"line":1403,"column":2},"end":{"line":1405,"column":3}},{"start":{},"end":{}}]},"210":{"loc":{"start":{"line":1419,"column":12},"end":{"line":1419,"column":30}},"type":"cond-expr","locations":[{"start":{"line":1419,"column":24},"end":{"line":1419,"column":28}},{"start":{"line":1419,"column":28},"end":{"line":1419,"column":30}}]},"211":{"loc":{"start":{"line":1419,"column":12},"end":{"line":1419,"column":28}},"type":"binary-expr","locations":[{"start":{"line":1419,"column":12},"end":{"line":1419,"column":28}},{"start":{"line":1419,"column":24},"end":{"line":1419,"column":28}}]},"212":{"loc":{"start":{"line":1423,"column":8},"end":{"line":1423,"column":56}},"type":"cond-expr","locations":[{"start":{"line":1423,"column":31},"end":{"line":1423,"column":42}},{"start":{"line":1423,"column":45},"end":{"line":1423,"column":56}}]},"213":{"loc":{"start":{"line":1430,"column":2},"end":{"line":1432,"column":3}},"type":"if","locations":[{"start":{"line":1430,"column":2},"end":{"line":1432,"column":3}},{"start":{},"end":{}}]},"214":{"loc":{"start":{"line":1435,"column":14},"end":{"line":1435,"column":64}},"type":"cond-expr","locations":[{"start":{"line":1435,"column":44},"end":{"line":1435,"column":48}},{"start":{"line":1435,"column":48},"end":{"line":1435,"column":64}}]},"215":{"loc":{"start":{"line":1435,"column":14},"end":{"line":1435,"column":48}},"type":"binary-expr","locations":[{"start":{"line":1435,"column":14},"end":{"line":1435,"column":48}},{"start":{"line":1435,"column":44},"end":{"line":1435,"column":48}}]},"216":{"loc":{"start":{"line":1435,"column":14},"end":{"line":1435,"column":44}},"type":"cond-expr","locations":[{"start":{"line":1435,"column":29},"end":{"line":1435,"column":33}},{"start":{"line":1435,"column":33},"end":{"line":1435,"column":44}}]},"217":{"loc":{"start":{"line":1435,"column":14},"end":{"line":1435,"column":33}},"type":"binary-expr","locations":[{"start":{"line":1435,"column":14},"end":{"line":1435,"column":33}},{"start":{"line":1435,"column":29},"end":{"line":1435,"column":33}}]},"218":{"loc":{"start":{"line":1436,"column":11},"end":{"line":1436,"column":40}},"type":"cond-expr","locations":[{"start":{"line":1436,"column":15},"end":{"line":1436,"column":36}},{"start":{"line":1436,"column":39},"end":{"line":1436,"column":40}}]},"219":{"loc":{"start":{"line":1442,"column":18},"end":{"line":1442,"column":64}},"type":"cond-expr","locations":[{"start":{"line":1442,"column":43},"end":{"line":1442,"column":59}},{"start":{"line":1442,"column":62},"end":{"line":1442,"column":64}}]},"220":{"loc":{"start":{"line":1442,"column":18},"end":{"line":1442,"column":40}},"type":"binary-expr","locations":[{"start":{"line":1442,"column":18},"end":{"line":1442,"column":25}},{"start":{"line":1442,"column":29},"end":{"line":1442,"column":40}}]},"221":{"loc":{"start":{"line":1443,"column":17},"end":{"line":1443,"column":38}},"type":"cond-expr","locations":[{"start":{"line":1443,"column":25},"end":{"line":1443,"column":29}},{"start":{"line":1443,"column":29},"end":{"line":1443,"column":38}}]},"222":{"loc":{"start":{"line":1443,"column":17},"end":{"line":1443,"column":29}},"type":"binary-expr","locations":[{"start":{"line":1443,"column":17},"end":{"line":1443,"column":29}},{"start":{"line":1443,"column":25},"end":{"line":1443,"column":29}}]},"223":{"loc":{"start":{"line":1443,"column":51},"end":{"line":1443,"column":66}},"type":"cond-expr","locations":[{"start":{"line":1443,"column":60},"end":{"line":1443,"column":64}},{"start":{"line":1443,"column":64},"end":{"line":1443,"column":66}}]},"224":{"loc":{"start":{"line":1443,"column":51},"end":{"line":1443,"column":64}},"type":"binary-expr","locations":[{"start":{"line":1443,"column":51},"end":{"line":1443,"column":64}},{"start":{"line":1443,"column":60},"end":{"line":1443,"column":64}}]},"225":{"loc":{"start":{"line":1445,"column":2},"end":{"line":1449,"column":3}},"type":"if","locations":[{"start":{"line":1445,"column":2},"end":{"line":1449,"column":3}},{"start":{},"end":{}}]},"226":{"loc":{"start":{"line":1485,"column":13},"end":{"line":1485,"column":74}},"type":"binary-expr","locations":[{"start":{"line":1485,"column":13},"end":{"line":1485,"column":43}},{"start":{"line":1485,"column":47},"end":{"line":1485,"column":74}}]},"227":{"loc":{"start":{"line":1500,"column":2},"end":{"line":1500,"column":null}},"type":"if","locations":[{"start":{"line":1500,"column":2},"end":{"line":1500,"column":null}},{"start":{},"end":{}}]},"228":{"loc":{"start":{"line":1526,"column":6},"end":{"line":1526,"column":14}},"type":"switch","locations":[{"start":{"line":1526,"column":6},"end":{"line":1526,"column":14}},{"start":{"line":1554,"column":19},"end":{"line":1554,"column":null}}]},"229":{"loc":{"start":{"line":1504,"column":9},"end":{"line":1504,"column":null}},"type":"if","locations":[{"start":{"line":1504,"column":9},"end":{"line":1504,"column":null}},{"start":{},"end":{}}]},"230":{"loc":{"start":{"line":1514,"column":10},"end":{"line":1514,"column":58}},"type":"cond-expr","locations":[{"start":{"line":1514,"column":33},"end":{"line":1514,"column":44}},{"start":{"line":1514,"column":47},"end":{"line":1514,"column":58}}]},"231":{"loc":{"start":{"line":1522,"column":12},"end":{"line":1522,"column":60}},"type":"cond-expr","locations":[{"start":{"line":1522,"column":35},"end":{"line":1522,"column":46}},{"start":{"line":1522,"column":49},"end":{"line":1522,"column":60}}]},"232":{"loc":{"start":{"line":1529,"column":4},"end":{"line":1531,"column":5}},"type":"if","locations":[{"start":{"line":1529,"column":4},"end":{"line":1531,"column":5}},{"start":{},"end":{}}]},"233":{"loc":{"start":{"line":1538,"column":8},"end":{"line":1538,"column":9}},"type":"if","locations":[{"start":{"line":1538,"column":8},"end":{"line":1538,"column":9}},{"start":{},"end":{}}]},"234":{"loc":{"start":{"line":1541,"column":6},"end":{"line":1545,"column":7}},"type":"if","locations":[{"start":{"line":1541,"column":6},"end":{"line":1545,"column":7}},{"start":{},"end":{}}]},"235":{"loc":{"start":{"line":1555,"column":8},"end":{"line":1555,"column":14}},"type":"if","locations":[{"start":{"line":1555,"column":8},"end":{"line":1555,"column":14}},{"start":{},"end":{}}]},"236":{"loc":{"start":{"line":1580,"column":2},"end":{"line":1582,"column":3}},"type":"if","locations":[{"start":{"line":1580,"column":2},"end":{"line":1582,"column":3}},{"start":{},"end":{}}]},"237":{"loc":{"start":{"line":1585,"column":2},"end":{"line":1590,"column":3}},"type":"if","locations":[{"start":{"line":1585,"column":2},"end":{"line":1590,"column":3}},{"start":{},"end":{}}]},"238":{"loc":{"start":{"line":1585,"column":6},"end":{"line":1585,"column":44}},"type":"binary-expr","locations":[{"start":{"line":1585,"column":6},"end":{"line":1585,"column":21}},{"start":{"line":1585,"column":25},"end":{"line":1585,"column":44}}]},"239":{"loc":{"start":{"line":1596,"column":9},"end":{"line":1599,"column":null}},"type":"switch","locations":[{"start":{"line":1596,"column":9},"end":{"line":1599,"column":null}},{"start":{"line":1596,"column":2},"end":{"line":1599,"column":null}}]},"240":{"loc":{"start":{"line":1611,"column":2},"end":{"line":1613,"column":3}},"type":"if","locations":[{"start":{"line":1611,"column":2},"end":{"line":1613,"column":3}},{"start":{},"end":{}}]},"241":{"loc":{"start":{"line":1611,"column":6},"end":{"line":1611,"column":65}},"type":"binary-expr","locations":[{"start":{"line":1611,"column":6},"end":{"line":1611,"column":28}},{"start":{"line":1611,"column":28},"end":{"line":1611,"column":65}}]},"242":{"loc":{"start":{"line":1611,"column":7},"end":{"line":1611,"column":24}},"type":"cond-expr","locations":[{"start":{"line":1611,"column":17},"end":{"line":1611,"column":19}},{"start":{"line":1611,"column":17},"end":{"line":1611,"column":24}}]},"243":{"loc":{"start":{"line":1611,"column":7},"end":{"line":1611,"column":19}},"type":"binary-expr","locations":[{"start":{"line":1611,"column":7},"end":{"line":1611,"column":19}},{"start":{"line":1611,"column":17},"end":{"line":1611,"column":19}}]},"244":{"loc":{"start":{"line":1618,"column":14},"end":{"line":1621,"column":null}},"type":"switch","locations":[{"start":{"line":1618,"column":14},"end":{"line":1621,"column":null}}]},"245":{"loc":{"start":{"line":1622,"column":2},"end":{"line":1624,"column":3}},"type":"if","locations":[{"start":{"line":1622,"column":2},"end":{"line":1624,"column":3}},{"start":{},"end":{}}]},"246":{"loc":{"start":{"line":1622,"column":6},"end":{"line":1622,"column":24}},"type":"cond-expr","locations":[{"start":{"line":1622,"column":16},"end":{"line":1622,"column":18}},{"start":{"line":1622,"column":16},"end":{"line":1622,"column":24}}]},"247":{"loc":{"start":{"line":1622,"column":6},"end":{"line":1622,"column":18}},"type":"binary-expr","locations":[{"start":{"line":1622,"column":6},"end":{"line":1622,"column":18}},{"start":{"line":1622,"column":16},"end":{"line":1622,"column":18}}]},"248":{"loc":{"start":{"line":1625,"column":11},"end":{"line":1625,"column":32}},"type":"cond-expr","locations":[{"start":{"line":1625,"column":21},"end":{"line":1625,"column":23}},{"start":{"line":1625,"column":21},"end":{"line":1625,"column":32}}]},"249":{"loc":{"start":{"line":1625,"column":11},"end":{"line":1625,"column":23}},"type":"binary-expr","locations":[{"start":{"line":1625,"column":11},"end":{"line":1625,"column":23}},{"start":{"line":1625,"column":21},"end":{"line":1625,"column":23}}]},"250":{"loc":{"start":{"line":1654,"column":18},"end":{"line":1657,"column":null}},"type":"switch","locations":[{"start":{"line":1654,"column":18},"end":{"line":1657,"column":null}}]},"251":{"loc":{"start":{"line":1658,"column":2},"end":{"line":1660,"column":3}},"type":"if","locations":[{"start":{"line":1658,"column":2},"end":{"line":1660,"column":3}},{"start":{},"end":{}}]},"252":{"loc":{"start":{"line":1664,"column":19},"end":{"line":1664,"column":22}},"type":"switch","locations":[{"start":{"line":1664,"column":19},"end":{"line":1664,"column":22}}]},"253":{"loc":{"start":{"line":1664,"column":19},"end":{"line":1664,"column":37}},"type":"cond-expr","locations":[{"start":{"line":1664,"column":31},"end":{"line":1664,"column":33}},{"start":{"line":1664,"column":31},"end":{"line":1664,"column":37}}]},"254":{"loc":{"start":{"line":1664,"column":19},"end":{"line":1664,"column":33}},"type":"binary-expr","locations":[{"start":{"line":1664,"column":19},"end":{"line":1664,"column":33}},{"start":{"line":1664,"column":31},"end":{"line":1664,"column":33}}]},"255":{"loc":{"start":{"line":1672,"column":14},"end":{"line":1675,"column":null}},"type":"switch","locations":[{"start":{"line":1672,"column":14},"end":{"line":1675,"column":null}}]},"256":{"loc":{"start":{"line":1697,"column":33},"end":{"line":1697,"column":53}},"type":"cond-expr","locations":[{"start":{"line":1697,"column":44},"end":{"line":1697,"column":46}},{"start":{"line":1697,"column":44},"end":{"line":1697,"column":53}}]},"257":{"loc":{"start":{"line":1697,"column":33},"end":{"line":1697,"column":46}},"type":"binary-expr","locations":[{"start":{"line":1697,"column":33},"end":{"line":1697,"column":46}},{"start":{"line":1697,"column":44},"end":{"line":1697,"column":46}}]},"258":{"loc":{"start":{"line":1719,"column":2},"end":{"line":1719,"column":null}},"type":"switch","locations":[{"start":{"line":1719,"column":2},"end":{"line":1719,"column":null}}]},"259":{"loc":{"start":{"line":1723,"column":2},"end":{"line":1725,"column":3}},"type":"if","locations":[{"start":{"line":1723,"column":2},"end":{"line":1725,"column":3}},{"start":{},"end":{}}]},"260":{"loc":{"start":{"line":1728,"column":2},"end":{"line":1730,"column":3}},"type":"if","locations":[{"start":{"line":1728,"column":2},"end":{"line":1730,"column":3}},{"start":{},"end":{}}]},"261":{"loc":{"start":{"line":1728,"column":6},"end":{"line":1728,"column":24}},"type":"cond-expr","locations":[{"start":{"line":1728,"column":13},"end":{"line":1728,"column":15}},{"start":{"line":1728,"column":6},"end":{"line":1728,"column":24}}]},"262":{"loc":{"start":{"line":1728,"column":6},"end":{"line":1728,"column":15}},"type":"binary-expr","locations":[{"start":{"line":1728,"column":6},"end":{"line":1728,"column":15}},{"start":{"line":1728,"column":6},"end":{"line":1728,"column":15}}]},"263":{"loc":{"start":{"line":1738,"column":4},"end":{"line":1740,"column":5}},"type":"if","locations":[{"start":{"line":1738,"column":4},"end":{"line":1740,"column":5}},{"start":{},"end":{}}]},"264":{"loc":{"start":{"line":1754,"column":4},"end":{"line":1756,"column":5}},"type":"if","locations":[{"start":{"line":1754,"column":4},"end":{"line":1756,"column":5}},{"start":{},"end":{}}]},"265":{"loc":{"start":{"line":1754,"column":8},"end":{"line":1754,"column":51}},"type":"binary-expr","locations":[{"start":{"line":1754,"column":8},"end":{"line":1754,"column":26}},{"start":{"line":1754,"column":30},"end":{"line":1754,"column":51}}]},"266":{"loc":{"start":{"line":1760,"column":4},"end":{"line":1762,"column":null}},"type":"switch","locations":[{"start":{"line":1760,"column":4},"end":{"line":1762,"column":null}}]},"267":{"loc":{"start":{"line":1764,"column":4},"end":{"line":1766,"column":5}},"type":"if","locations":[{"start":{"line":1764,"column":4},"end":{"line":1766,"column":5}},{"start":{},"end":{}}]},"268":{"loc":{"start":{"line":1764,"column":8},"end":{"line":1764,"column":73}},"type":"binary-expr","locations":[{"start":{"line":1764,"column":8},"end":{"line":1764,"column":30}},{"start":{"line":1764,"column":34},"end":{"line":1764,"column":73}}]},"269":{"loc":{"start":{"line":1767,"column":4},"end":{"line":1769,"column":5}},"type":"if","locations":[{"start":{"line":1767,"column":4},"end":{"line":1769,"column":5}},{"start":{},"end":{}}]},"270":{"loc":{"start":{"line":1770,"column":4},"end":{"line":1772,"column":5}},"type":"if","locations":[{"start":{"line":1770,"column":4},"end":{"line":1772,"column":5}},{"start":{},"end":{}}]},"271":{"loc":{"start":{"line":1780,"column":2},"end":{"line":1782,"column":3}},"type":"if","locations":[{"start":{"line":1780,"column":2},"end":{"line":1782,"column":3}},{"start":{},"end":{}}]},"272":{"loc":{"start":{"line":1780,"column":7},"end":{"line":1780,"column":37}},"type":"cond-expr","locations":[{"start":{"line":1780,"column":29},"end":{"line":1780,"column":31}},{"start":{"line":1780,"column":29},"end":{"line":1780,"column":37}}]},"273":{"loc":{"start":{"line":1780,"column":7},"end":{"line":1780,"column":31}},"type":"binary-expr","locations":[{"start":{"line":1780,"column":7},"end":{"line":1780,"column":31}},{"start":{"line":1780,"column":29},"end":{"line":1780,"column":31}}]},"274":{"loc":{"start":{"line":1785,"column":4},"end":{"line":1787,"column":5}},"type":"if","locations":[{"start":{"line":1785,"column":4},"end":{"line":1787,"column":5}},{"start":{},"end":{}}]},"275":{"loc":{"start":{"line":1791,"column":6},"end":{"line":1791,"column":75}},"type":"cond-expr","locations":[{"start":{"line":1791,"column":36},"end":{"line":1791,"column":67}},{"start":{"line":1791,"column":70},"end":{"line":1791,"column":75}}]},"276":{"loc":{"start":{"line":1794,"column":4},"end":{"line":1796,"column":5}},"type":"if","locations":[{"start":{"line":1794,"column":4},"end":{"line":1796,"column":5}},{"start":{},"end":{}}]},"277":{"loc":{"start":{"line":1800,"column":6},"end":{"line":1802,"column":7}},"type":"if","locations":[{"start":{"line":1800,"column":6},"end":{"line":1802,"column":7}},{"start":{},"end":{}}]},"278":{"loc":{"start":{"line":1800,"column":10},"end":{"line":1800,"column":58}},"type":"binary-expr","locations":[{"start":{"line":1800,"column":10},"end":{"line":1800,"column":32}},{"start":{"line":1800,"column":36},"end":{"line":1800,"column":43}},{"start":{"line":1800,"column":47},"end":{"line":1800,"column":58}}]},"279":{"loc":{"start":{"line":1806,"column":4},"end":{"line":1811,"column":5}},"type":"if","locations":[{"start":{"line":1806,"column":4},"end":{"line":1811,"column":5}},{"start":{"line":1808,"column":11},"end":{"line":1811,"column":5}}]},"280":{"loc":{"start":{"line":1819,"column":9},"end":{"line":1822,"column":null}},"type":"switch","locations":[{"start":{"line":1819,"column":9},"end":{"line":1822,"column":null}},{"start":{"line":1819,"column":2},"end":{"line":1822,"column":null}}]},"281":{"loc":{"start":{"line":1826,"column":9},"end":{"line":1829,"column":null}},"type":"switch","locations":[{"start":{"line":1826,"column":9},"end":{"line":1829,"column":null}},{"start":{"line":1826,"column":2},"end":{"line":1829,"column":null}}]},"282":{"loc":{"start":{"line":1833,"column":18},"end":{"line":1836,"column":null}},"type":"switch","locations":[{"start":{"line":1833,"column":18},"end":{"line":1836,"column":null}}]},"283":{"loc":{"start":{"line":1837,"column":9},"end":{"line":1837,"column":28}},"type":"cond-expr","locations":[{"start":{"line":1837,"column":22},"end":{"line":1837,"column":26}},{"start":{"line":1837,"column":26},"end":{"line":1837,"column":28}}]},"284":{"loc":{"start":{"line":1837,"column":9},"end":{"line":1837,"column":26}},"type":"binary-expr","locations":[{"start":{"line":1837,"column":9},"end":{"line":1837,"column":26}},{"start":{"line":1837,"column":22},"end":{"line":1837,"column":26}}]}},"s":{"0":13,"1":13,"2":13,"3":13,"4":13,"5":13,"6":13,"7":13,"8":13,"9":13,"10":13,"11":13,"12":13,"13":13,"14":13,"15":13,"16":13,"17":13,"18":13,"19":13,"20":13,"21":13,"22":13,"23":13,"24":13,"25":13,"26":13,"27":13,"28":13,"29":13,"30":13,"31":13,"32":13,"33":13,"34":13,"35":13,"36":13,"37":13,"38":13,"39":13,"40":13,"41":13,"42":13,"43":13,"44":13,"45":13,"46":13,"47":13,"48":13,"49":13,"50":13,"51":13,"52":13,"53":13,"54":13,"55":13,"56":13,"57":13,"58":13,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":13,"171":7,"172":7,"173":7,"174":7,"175":36,"176":0,"177":36,"178":36,"179":25,"180":7,"181":7,"182":35,"183":35,"184":35,"185":35,"186":70,"187":34,"188":34,"189":7,"190":7,"191":3,"192":3,"193":3,"194":3,"195":6,"196":2,"197":2,"198":7,"199":7,"200":0,"201":0,"202":7,"203":0,"204":0,"205":7,"206":35,"207":35,"208":35,"209":35,"210":0,"211":7,"212":3,"213":3,"214":3,"215":3,"216":0,"217":7,"218":4,"219":4,"220":7,"221":7,"222":5,"223":5,"224":5,"225":3,"226":2,"227":2,"228":1,"229":1,"230":2,"231":2,"232":2,"233":2,"234":1,"235":1,"236":7,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":3,"276":3,"277":90,"278":90,"279":90,"280":90,"281":180,"282":90,"283":0,"284":0,"285":0,"286":0,"287":90,"288":90,"289":90,"290":90,"291":3,"292":174,"293":90,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":2,"329":2,"330":2,"331":0,"332":2,"333":60,"334":60,"335":60,"336":60,"337":60,"338":60,"339":120,"340":60,"341":60,"342":60,"343":0,"344":0,"345":0,"346":60,"347":60,"348":60,"349":60,"350":2,"351":116,"352":60,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":3,"388":3,"389":0,"390":3,"391":3,"392":0,"393":3,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":21,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":13,"437":13,"438":13,"439":13,"440":13,"441":28,"442":28,"443":26,"444":2,"445":2,"446":2,"447":2,"448":3,"449":3,"450":3,"451":3,"452":2,"453":23,"454":23,"455":21,"456":2,"457":2,"458":2,"459":2,"460":3,"461":3,"462":3,"463":3,"464":2,"465":24,"466":24,"467":21,"468":3,"469":3,"470":3,"471":3,"472":7,"473":7,"474":7,"475":4,"476":3,"477":19,"478":2,"479":17,"480":58,"481":17,"482":17,"483":17,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":9,"501":4,"502":3,"503":1,"504":1,"505":18,"506":18,"507":18,"508":18,"509":36,"510":14,"511":14,"512":14,"513":9,"514":9,"515":9,"516":9,"517":18,"518":11,"519":3,"520":8,"521":2,"522":6,"523":5,"524":1,"525":0,"526":0,"527":1,"528":3,"529":1,"530":21,"531":21,"532":21,"533":21,"534":42,"535":17,"536":17,"537":17,"538":11,"539":11,"540":11,"541":11,"542":21,"543":10,"544":4,"545":1,"546":4,"547":1,"548":21,"549":21,"550":0,"551":21,"552":20,"553":19,"554":2,"555":2,"556":19,"557":19,"558":19,"559":19,"560":19,"561":3,"562":16,"563":5,"564":5,"565":11,"566":1,"567":10,"568":10,"569":10,"570":10,"571":10,"572":10,"573":19,"574":9,"575":9,"576":1,"577":8,"578":8,"579":8,"580":8,"581":8,"582":8,"583":1,"584":8,"585":1,"586":1,"587":1,"588":1,"589":1,"590":8,"591":8,"592":8,"593":8,"594":8,"595":3,"596":3,"597":3,"598":2,"599":1,"600":1,"601":3,"602":3,"603":1,"604":1,"605":1,"606":8,"607":2,"608":8,"609":8,"610":8,"611":3,"612":8,"613":0,"614":8,"615":8,"616":7,"617":6,"618":2,"619":2,"620":6,"621":4,"622":6,"623":3,"624":3,"625":0,"626":0,"627":3,"628":0,"629":3,"630":3,"631":3,"632":3,"633":3,"634":0,"635":3,"636":6,"637":6,"638":6,"639":6,"640":6,"641":6,"642":0,"643":0,"644":6,"645":18,"646":10,"647":10,"648":15,"649":0,"650":15,"651":15,"652":15,"653":6,"654":12,"655":2,"656":4,"657":9,"658":9,"659":3,"660":10,"661":2,"662":2,"663":2,"664":2,"665":2,"666":0,"667":2,"668":4,"669":4,"670":5,"671":3,"672":3,"673":3,"674":2,"675":0,"676":0,"677":0,"678":5,"679":5,"680":5,"681":0,"682":0,"683":0,"684":0,"685":0,"686":24,"687":24,"688":13,"689":16,"690":3,"691":13,"692":3,"693":3,"694":1,"695":1,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":21,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":276,"744":213,"745":63,"746":63,"747":63,"748":63,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":13,"756":13,"757":13,"758":13,"759":13,"760":3,"761":13,"762":14,"763":7,"764":7,"765":7,"766":2,"767":5,"768":5,"769":5,"770":0,"771":13,"772":21,"773":21,"774":21,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":21,"803":0,"804":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":7,"18":36,"19":35,"20":3,"21":7,"22":35,"23":3,"24":4,"25":7,"26":5,"27":2,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":3,"40":90,"41":0,"42":0,"43":90,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":2,"51":60,"52":0,"53":0,"54":60,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":3,"62":0,"63":0,"64":0,"65":21,"66":0,"67":0,"68":28,"69":23,"70":24,"71":19,"72":58,"73":17,"74":9,"75":18,"76":11,"77":21,"78":10,"79":21,"80":9,"81":8,"82":4,"83":0,"84":0,"85":3,"86":6,"87":6,"88":0,"89":0,"90":10,"91":5,"92":24,"93":16,"94":3,"95":0,"96":0,"97":0,"98":0,"99":0,"100":21,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":276,"108":63,"109":13,"110":13,"111":7,"112":7,"113":21,"114":0,"115":0,"116":0,"117":21},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0],"31":[0,0],"32":[0,0],"33":[0,0],"34":[0,0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,0],"39":[0,0],"40":[0,0],"41":[0,0],"42":[0,0],"43":[0,0],"44":[0,0],"45":[0,0],"46":[0,0,0],"47":[6,1],"48":[7],"49":[0,36],"50":[25,11],"51":[35,0],"52":[35,35],"53":[3,0],"54":[3,3],"55":[0,7],"56":[0,7],"57":[0,4],"58":[4,4],"59":[2,2],"60":[0,7],"61":[7,7],"62":[3,2],"63":[3,3],"64":[0,2],"65":[2,2],"66":[1,1],"67":[1,0],"68":[0,1],"69":[1,1],"70":[2,0],"71":[1,1],"72":[0,0],"73":[0,0],"74":[0,0],"75":[0,0],"76":[0,0],"77":[0,0],"78":[0,0],"79":[0,0],"80":[0,0],"81":[0,0],"82":[0,0],"83":[3,87],"84":[0,90],"85":[0,0],"86":[0,0],"87":[0,0],"88":[0,2],"89":[60,0],"90":[0,0],"91":[2,58],"92":[0,60],"93":[0,0],"94":[0,0],"95":[0,0],"96":[0],"97":[0,3],"98":[0,0],"99":[0],"100":[0,0],"101":[0],"102":[21],"103":[0,0],"104":[0],"105":[0,0],"106":[0,0],"107":[26,2],"108":[3,0],"109":[21,2],"110":[3,0],"111":[21,3],"112":[4,3],"113":[2,17],"114":[17,0],"115":[0,0],"116":[0,0],"117":[0,0],"118":[4,3,1,1],"119":[1,17],"120":[18,18],"121":[1,17],"122":[18,18],"123":[12,6],"124":[18,18],"125":[1,17],"126":[18,18],"127":[0,14],"128":[14,14],"129":[9,5],"130":[14,13],"131":[1,13],"132":[14,14],"133":[2,7],"134":[3,8],"135":[2,6],"136":[5,1],"137":[1,0,0,1,3],"138":[3,0],"139":[3,3],"140":[1,20],"141":[21,21],"142":[1,20],"143":[21,21],"144":[15,6],"145":[21,21],"146":[1,20],"147":[21,21],"148":[0,17],"149":[17,17],"150":[11,6],"151":[17,13],"152":[4,13],"153":[17,17],"154":[2,9],"155":[4,1,4,1],"156":[0,21],"157":[19,0],"158":[19,19],"159":[2,0],"160":[3,16],"161":[19,18,18],"162":[5,11],"163":[16,9],"164":[4,1],"165":[5,5],"166":[1,10],"167":[2,8],"168":[10,3],"169":[10,0],"170":[1,0],"171":[8,0],"172":[0,8],"173":[8,8],"174":[1,7],"175":[1,7],"176":[0,8],"177":[8,8],"178":[1,7],"179":[8,8],"180":[0,8],"181":[8,8],"182":[1,0],"183":[1,0],"184":[1,0],"185":[0,8],"186":[8,8],"187":[0,8],"188":[8,8],"189":[3,5],"190":[8,8],"191":[0,8],"192":[8,8],"193":[0,3],"194":[3,3],"195":[2,1],"196":[1,2],"197":[3,3],"198":[1,1],"199":[0,1],"200":[0,3],"201":[3,3],"202":[1,2],"203":[3,1],"204":[1,0],"205":[1,1],"206":[0,1],"207":[2,6],"208":[3,5],"209":[0,8],"210":[6,0],"211":[6,6],"212":[2,0],"213":[3,3],"214":[0,0],"215":[0,0],"216":[0,0],"217":[0,0],"218":[0,0],"219":[2,1],"220":[3,2],"221":[3,0],"222":[3,3],"223":[3,0],"224":[3,3],"225":[0,3],"226":[0,0],"227":[8,2],"228":[4,4],"229":[0,15],"230":[6,0],"231":[2,0],"232":[3,6],"233":[4,2],"234":[0,2],"235":[1,3],"236":[5,0],"237":[0,0],"238":[0,0],"239":[24,24],"240":[3,13],"241":[16,14],"242":[1,15],"243":[16,16],"244":[3],"245":[1,0],"246":[0,1],"247":[1,1],"248":[0,0],"249":[0,0],"250":[21],"251":[0,0],"252":[0],"253":[0,0],"254":[0,0],"255":[0],"256":[0,0],"257":[0,0],"258":[0],"259":[213,63],"260":[63,0],"261":[0,63],"262":[63,63],"263":[0,0],"264":[3,10],"265":[13,10],"266":[7],"267":[2,5],"268":[7,7],"269":[5,0],"270":[0,5],"271":[21,0],"272":[11,10],"273":[21,21],"274":[0,0],"275":[0,0],"276":[0,0],"277":[0,0],"278":[0,0,0],"279":[0,0],"280":[0,0],"281":[0,0],"282":[21],"283":[0,0],"284":[0,0]}} +,"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/k8s/utils/index.ts": {"path":"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/k8s/utils/index.ts","statementMap":{"0":{"start":{"line":35,"column":0},"end":{"line":35,"column":16}},"1":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"2":{"start":{"line":94,"column":0},"end":{"line":94,"column":16}},"3":{"start":{"line":161,"column":0},"end":{"line":161,"column":16}},"4":{"start":{"line":180,"column":0},"end":{"line":180,"column":16}},"5":{"start":{"line":208,"column":0},"end":{"line":208,"column":16}},"6":{"start":{"line":228,"column":0},"end":{"line":228,"column":16}},"7":{"start":{"line":258,"column":0},"end":{"line":258,"column":16}},"8":{"start":{"line":270,"column":0},"end":{"line":270,"column":16}},"9":{"start":{"line":292,"column":0},"end":{"line":292,"column":16}},"10":{"start":{"line":301,"column":0},"end":{"line":301,"column":22}},"11":{"start":{"line":305,"column":0},"end":{"line":305,"column":16}},"12":{"start":{"line":315,"column":0},"end":{"line":315,"column":16}},"13":{"start":{"line":2,"column":0},"end":{"line":2,"column":24}},"14":{"start":{"line":3,"column":0},"end":{"line":3,"column":31}},"15":{"start":{"line":4,"column":0},"end":{"line":4,"column":37}},"16":{"start":{"line":5,"column":0},"end":{"line":5,"column":35}},"17":{"start":{"line":6,"column":0},"end":{"line":6,"column":66}},"18":{"start":{"line":7,"column":0},"end":{"line":7,"column":30}},"19":{"start":{"line":10,"column":13},"end":{"line":10,"column":null}},"20":{"start":{"line":11,"column":13},"end":{"line":11,"column":null}},"21":{"start":{"line":13,"column":13},"end":{"line":13,"column":null}},"22":{"start":{"line":14,"column":13},"end":{"line":14,"column":null}},"23":{"start":{"line":16,"column":13},"end":{"line":16,"column":null}},"24":{"start":{"line":17,"column":13},"end":{"line":17,"column":null}},"25":{"start":{"line":18,"column":13},"end":{"line":18,"column":null}},"26":{"start":{"line":20,"column":13},"end":{"line":33,"column":null}},"27":{"start":{"line":39,"column":18},"end":{"line":41,"column":14}},"28":{"start":{"line":40,"column":14},"end":{"line":40,"column":46}},"29":{"start":{"line":43,"column":18},"end":{"line":47,"column":null}},"30":{"start":{"line":50,"column":19},"end":{"line":50,"column":35}},"31":{"start":{"line":51,"column":25},"end":{"line":51,"column":65}},"32":{"start":{"line":52,"column":2},"end":{"line":52,"column":null}},"33":{"start":{"line":53,"column":2},"end":{"line":56,"column":null}},"34":{"start":{"line":66,"column":19},"end":{"line":66,"column":21}},"35":{"start":{"line":67,"column":2},"end":{"line":72,"column":3}},"36":{"start":{"line":70,"column":6},"end":{"line":70,"column":75}},"37":{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},"38":{"start":{"line":74,"column":26},"end":{"line":74,"column":57}},"39":{"start":{"line":76,"column":18},"end":{"line":82,"column":null}},"40":{"start":{"line":85,"column":19},"end":{"line":85,"column":35}},"41":{"start":{"line":86,"column":25},"end":{"line":86,"column":65}},"42":{"start":{"line":87,"column":2},"end":{"line":87,"column":null}},"43":{"start":{"line":88,"column":2},"end":{"line":91,"column":null}},"44":{"start":{"line":101,"column":26},"end":{"line":101,"column":57}},"45":{"start":{"line":103,"column":16},"end":{"line":103,"column":53}},"46":{"start":{"line":104,"column":2},"end":{"line":106,"column":3}},"47":{"start":{"line":105,"column":4},"end":{"line":105,"column":null}},"48":{"start":{"line":108,"column":18},"end":{"line":116,"column":null}},"49":{"start":{"line":119,"column":19},"end":{"line":119,"column":35}},"50":{"start":{"line":120,"column":25},"end":{"line":120,"column":45}},"51":{"start":{"line":121,"column":2},"end":{"line":121,"column":null}},"52":{"start":{"line":122,"column":2},"end":{"line":122,"column":null}},"53":{"start":{"line":123,"column":2},"end":{"line":126,"column":null}},"54":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"55":{"start":{"line":131,"column":4},"end":{"line":131,"column":null}},"56":{"start":{"line":133,"column":30},"end":{"line":133,"column":32}},"57":{"start":{"line":134,"column":2},"end":{"line":152,"column":3}},"58":{"start":{"line":134,"column":29},"end":{"line":134,"column":35}},"59":{"start":{"line":134,"column":29},"end":{"line":134,"column":49}},"60":{"start":{"line":134,"column":13},"end":{"line":134,"column":14}},"61":{"start":{"line":134,"column":17},"end":{"line":134,"column":19}},"62":{"start":{"line":134,"column":24},"end":{"line":134,"column":25}},"63":{"start":{"line":135,"column":4},"end":{"line":144,"column":5}},"64":{"start":{"line":141,"column":6},"end":{"line":143,"column":null}},"65":{"start":{"line":145,"column":4},"end":{"line":151,"column":null}},"66":{"start":{"line":154,"column":2},"end":{"line":156,"column":3}},"67":{"start":{"line":155,"column":4},"end":{"line":155,"column":null}},"68":{"start":{"line":158,"column":2},"end":{"line":158,"column":null}},"69":{"start":{"line":162,"column":22},"end":{"line":162,"column":44}},"70":{"start":{"line":163,"column":15},"end":{"line":163,"column":41}},"71":{"start":{"line":165,"column":2},"end":{"line":167,"column":3}},"72":{"start":{"line":166,"column":4},"end":{"line":166,"column":null}},"73":{"start":{"line":169,"column":2},"end":{"line":169,"column":null}},"74":{"start":{"line":184,"column":2},"end":{"line":205,"column":3}},"75":{"start":{"line":184,"column":29},"end":{"line":184,"column":35}},"76":{"start":{"line":184,"column":29},"end":{"line":184,"column":49}},"77":{"start":{"line":184,"column":13},"end":{"line":184,"column":14}},"78":{"start":{"line":184,"column":17},"end":{"line":184,"column":19}},"79":{"start":{"line":184,"column":24},"end":{"line":184,"column":25}},"80":{"start":{"line":185,"column":4},"end":{"line":204,"column":5}},"81":{"start":{"line":186,"column":6},"end":{"line":188,"column":7}},"82":{"start":{"line":187,"column":8},"end":{"line":187,"column":null}},"83":{"start":{"line":189,"column":6},"end":{"line":189,"column":14}},"84":{"start":{"line":190,"column":11},"end":{"line":204,"column":5}},"85":{"start":{"line":191,"column":6},"end":{"line":191,"column":null}},"86":{"start":{"line":192,"column":6},"end":{"line":192,"column":14}},"87":{"start":{"line":193,"column":11},"end":{"line":204,"column":5}},"88":{"start":{"line":194,"column":19},"end":{"line":194,"column":42}},"89":{"start":{"line":195,"column":6},"end":{"line":195,"column":null}},"90":{"start":{"line":196,"column":11},"end":{"line":204,"column":5}},"91":{"start":{"line":197,"column":27},"end":{"line":197,"column":55}},"92":{"start":{"line":198,"column":6},"end":{"line":198,"column":null}},"93":{"start":{"line":199,"column":11},"end":{"line":204,"column":5}},"94":{"start":{"line":200,"column":20},"end":{"line":200,"column":50}},"95":{"start":{"line":201,"column":6},"end":{"line":201,"column":null}},"96":{"start":{"line":203,"column":6},"end":{"line":203,"column":null}},"97":{"start":{"line":212,"column":2},"end":{"line":225,"column":3}},"98":{"start":{"line":212,"column":29},"end":{"line":212,"column":35}},"99":{"start":{"line":212,"column":29},"end":{"line":212,"column":49}},"100":{"start":{"line":212,"column":13},"end":{"line":212,"column":14}},"101":{"start":{"line":212,"column":17},"end":{"line":212,"column":19}},"102":{"start":{"line":212,"column":24},"end":{"line":212,"column":25}},"103":{"start":{"line":213,"column":4},"end":{"line":224,"column":5}},"104":{"start":{"line":214,"column":6},"end":{"line":217,"column":null}},"105":{"start":{"line":216,"column":15},"end":{"line":216,"column":null}},"106":{"start":{"line":219,"column":11},"end":{"line":224,"column":5}},"107":{"start":{"line":220,"column":22},"end":{"line":220,"column":45}},"108":{"start":{"line":221,"column":6},"end":{"line":221,"column":null}},"109":{"start":{"line":223,"column":6},"end":{"line":223,"column":null}},"110":{"start":{"line":232,"column":2},"end":{"line":236,"column":3}},"111":{"start":{"line":233,"column":4},"end":{"line":235,"column":null}},"112":{"start":{"line":237,"column":2},"end":{"line":244,"column":3}},"113":{"start":{"line":238,"column":4},"end":{"line":243,"column":5}},"114":{"start":{"line":238,"column":31},"end":{"line":238,"column":37}},"115":{"start":{"line":238,"column":31},"end":{"line":238,"column":58}},"116":{"start":{"line":238,"column":15},"end":{"line":238,"column":16}},"117":{"start":{"line":238,"column":19},"end":{"line":238,"column":21}},"118":{"start":{"line":238,"column":26},"end":{"line":238,"column":27}},"119":{"start":{"line":239,"column":6},"end":{"line":241,"column":7}},"120":{"start":{"line":240,"column":8},"end":{"line":240,"column":null}},"121":{"start":{"line":242,"column":6},"end":{"line":242,"column":null}},"122":{"start":{"line":246,"column":2},"end":{"line":255,"column":3}},"123":{"start":{"line":247,"column":4},"end":{"line":254,"column":5}},"124":{"start":{"line":247,"column":31},"end":{"line":247,"column":37}},"125":{"start":{"line":247,"column":31},"end":{"line":247,"column":63}},"126":{"start":{"line":247,"column":15},"end":{"line":247,"column":16}},"127":{"start":{"line":247,"column":19},"end":{"line":247,"column":21}},"128":{"start":{"line":247,"column":26},"end":{"line":247,"column":27}},"129":{"start":{"line":248,"column":6},"end":{"line":252,"column":7}},"130":{"start":{"line":249,"column":8},"end":{"line":251,"column":null}},"131":{"start":{"line":253,"column":6},"end":{"line":253,"column":null}},"132":{"start":{"line":259,"column":19},"end":{"line":259,"column":54}},"133":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"134":{"start":{"line":261,"column":4},"end":{"line":261,"column":null}},"135":{"start":{"line":263,"column":14},"end":{"line":263,"column":58}},"136":{"start":{"line":264,"column":2},"end":{"line":266,"column":3}},"137":{"start":{"line":265,"column":4},"end":{"line":265,"column":null}},"138":{"start":{"line":267,"column":2},"end":{"line":267,"column":null}},"139":{"start":{"line":271,"column":2},"end":{"line":271,"column":null}},"140":{"start":{"line":274,"column":0},"end":{"line":274,"column":null}},"141":{"start":{"line":275,"column":2},"end":{"line":275,"column":null}},"142":{"start":{"line":276,"column":2},"end":{"line":276,"column":null}},"143":{"start":{"line":277,"column":2},"end":{"line":277,"column":null}},"144":{"start":{"line":278,"column":2},"end":{"line":278,"column":null}},"145":{"start":{"line":279,"column":2},"end":{"line":279,"column":null}},"146":{"start":{"line":280,"column":2},"end":{"line":280,"column":null}},"147":{"start":{"line":284,"column":17},"end":{"line":284,"column":27}},"148":{"start":{"line":285,"column":2},"end":{"line":287,"column":3}},"149":{"start":{"line":286,"column":4},"end":{"line":286,"column":null}},"150":{"start":{"line":288,"column":2},"end":{"line":288,"column":17}},"151":{"start":{"line":289,"column":2},"end":{"line":289,"column":null}},"152":{"start":{"line":295,"column":2},"end":{"line":297,"column":3}},"153":{"start":{"line":296,"column":4},"end":{"line":296,"column":null}},"154":{"start":{"line":298,"column":2},"end":{"line":298,"column":null}},"155":{"start":{"line":302,"column":2},"end":{"line":302,"column":null}},"156":{"start":{"line":302,"column":32},"end":{"line":302,"column":56}},"157":{"start":{"line":306,"column":2},"end":{"line":306,"column":null}},"158":{"start":{"line":316,"column":2},"end":{"line":318,"column":3}},"159":{"start":{"line":317,"column":4},"end":{"line":317,"column":null}},"160":{"start":{"line":323,"column":4},"end":{"line":324,"column":37}},"161":{"start":{"line":325,"column":2},"end":{"line":333,"column":3}},"162":{"start":{"line":326,"column":17},"end":{"line":326,"column":55}},"163":{"start":{"line":327,"column":20},"end":{"line":327,"column":56}},"164":{"start":{"line":328,"column":4},"end":{"line":332,"column":5}},"165":{"start":{"line":329,"column":6},"end":{"line":331,"column":null}},"166":{"start":{"line":335,"column":2},"end":{"line":337,"column":3}},"167":{"start":{"line":336,"column":4},"end":{"line":336,"column":null}},"168":{"start":{"line":339,"column":2},"end":{"line":353,"column":3}},"169":{"start":{"line":344,"column":17},"end":{"line":344,"column":54}},"170":{"start":{"line":345,"column":4},"end":{"line":347,"column":5}},"171":{"start":{"line":346,"column":6},"end":{"line":346,"column":null}},"172":{"start":{"line":348,"column":4},"end":{"line":352,"column":5}},"173":{"start":{"line":349,"column":6},"end":{"line":349,"column":null}},"174":{"start":{"line":351,"column":6},"end":{"line":351,"column":null}},"175":{"start":{"line":357,"column":2},"end":{"line":357,"column":null}}},"fnMap":{"0":{"name":"prepareJobScript","decl":{"start":{"line":35,"column":16},"end":{"line":35,"column":32}},"loc":{"start":{"line":35,"column":58},"end":{"line":57,"column":1}}},"1":{"name":"(anonymous_23)","decl":{"start":{"line":40,"column":9},"end":{"line":40,"column":10}},"loc":{"start":{"line":40,"column":10},"end":{"line":40,"column":19}}},"2":{"name":"writeRunScript","decl":{"start":{"line":59,"column":16},"end":{"line":59,"column":30}},"loc":{"start":{"line":64,"column":50},"end":{"line":92,"column":1}}},"3":{"name":"writeContainerStepScript","decl":{"start":{"line":94,"column":16},"end":{"line":94,"column":40}},"loc":{"start":{"line":99,"column":50},"end":{"line":127,"column":1}}},"4":{"name":"scriptEnv","decl":{"start":{"line":129,"column":9},"end":{"line":129,"column":18}},"loc":{"start":{"line":129,"column":51},"end":{"line":159,"column":1}}},"5":{"name":"generateContainerName","decl":{"start":{"line":161,"column":16},"end":{"line":161,"column":37}},"loc":{"start":{"line":161,"column":51},"end":{"line":170,"column":1}}},"6":{"name":"mergeContainerWithOptions","decl":{"start":{"line":180,"column":16},"end":{"line":180,"column":41}},"loc":{"start":{"line":182,"column":23},"end":{"line":206,"column":1}}},"7":{"name":"mergePodSpecWithOptions","decl":{"start":{"line":208,"column":16},"end":{"line":208,"column":39}},"loc":{"start":{"line":210,"column":21},"end":{"line":226,"column":1}}},"8":{"name":"(anonymous_30)","decl":{"start":{"line":216,"column":10},"end":{"line":216,"column":11}},"loc":{"start":{"line":216,"column":11},"end":{"line":216,"column":null}}},"9":{"name":"mergeObjectMeta","decl":{"start":{"line":228,"column":16},"end":{"line":228,"column":31}},"loc":{"start":{"line":230,"column":24},"end":{"line":256,"column":1}}},"10":{"name":"readExtensionFromFile","decl":{"start":{"line":258,"column":16},"end":{"line":258,"column":37}},"loc":{"start":{"line":258,"column":37},"end":{"line":268,"column":1}}},"11":{"name":"useKubeScheduler","decl":{"start":{"line":270,"column":16},"end":{"line":270,"column":32}},"loc":{"start":{"line":270,"column":32},"end":{"line":272,"column":1}}},"12":{"name":"(anonymous_34)","decl":{"start":{"line":274,"column":0},"end":{"line":274,"column":12}},"loc":{"start":{"line":274,"column":20},"end":{"line":281,"column":1}}},"13":{"name":"mergeLists","decl":{"start":{"line":283,"column":9},"end":{"line":283,"column":19}},"loc":{"start":{"line":283,"column":45},"end":{"line":290,"column":1}}},"14":{"name":"fixArgs","decl":{"start":{"line":292,"column":16},"end":{"line":292,"column":23}},"loc":{"start":{"line":292,"column":38},"end":{"line":299,"column":1}}},"15":{"name":"sleep","decl":{"start":{"line":301,"column":22},"end":{"line":301,"column":27}},"loc":{"start":{"line":301,"column":38},"end":{"line":303,"column":null}}},"16":{"name":"(anonymous_40)","decl":{"start":{"line":302,"column":21},"end":{"line":302,"column":28}},"loc":{"start":{"line":302,"column":28},"end":{"line":302,"column":42}}},"17":{"name":"listDirAllCommand","decl":{"start":{"line":305,"column":16},"end":{"line":305,"column":33}},"loc":{"start":{"line":305,"column":45},"end":{"line":307,"column":1}}},"18":{"name":"formatError","decl":{"start":{"line":315,"column":16},"end":{"line":315,"column":27}},"loc":{"start":{"line":315,"column":40},"end":{"line":358,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":67,"column":2},"end":{"line":72,"column":3}},"type":"if","locations":[{"start":{"line":67,"column":2},"end":{"line":72,"column":3}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":67,"column":6},"end":{"line":67,"column":25}},"type":"cond-expr","locations":[{"start":{"line":67,"column":17},"end":{"line":67,"column":19}},{"start":{"line":67,"column":6},"end":{"line":67,"column":25}}]},"2":{"loc":{"start":{"line":67,"column":6},"end":{"line":67,"column":19}},"type":"binary-expr","locations":[{"start":{"line":67,"column":6},"end":{"line":67,"column":19}},{"start":{"line":67,"column":6},"end":{"line":67,"column":19}}]},"3":{"loc":{"start":{"line":70,"column":6},"end":{"line":70,"column":75}},"type":"cond-expr","locations":[{"start":{"line":70,"column":40},"end":{"line":70,"column":51}},{"start":{"line":70,"column":54},"end":{"line":70,"column":75}}]},"4":{"loc":{"start":{"line":82,"column":4},"end":{"line":82,"column":58}},"type":"cond-expr","locations":[{"start":{"line":82,"column":29},"end":{"line":82,"column":53}},{"start":{"line":82,"column":56},"end":{"line":82,"column":58}}]},"5":{"loc":{"start":{"line":82,"column":4},"end":{"line":82,"column":26}},"type":"cond-expr","locations":[{"start":{"line":82,"column":18},"end":{"line":82,"column":20}},{"start":{"line":82,"column":4},"end":{"line":82,"column":26}}]},"6":{"loc":{"start":{"line":82,"column":4},"end":{"line":82,"column":20}},"type":"binary-expr","locations":[{"start":{"line":82,"column":4},"end":{"line":82,"column":20}},{"start":{"line":82,"column":4},"end":{"line":82,"column":20}}]},"7":{"loc":{"start":{"line":104,"column":2},"end":{"line":106,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":106,"column":3}},{"start":{},"end":{}}]},"8":{"loc":{"start":{"line":116,"column":4},"end":{"line":116,"column":75}},"type":"cond-expr","locations":[{"start":{"line":116,"column":29},"end":{"line":116,"column":70}},{"start":{"line":116,"column":73},"end":{"line":116,"column":75}}]},"9":{"loc":{"start":{"line":116,"column":4},"end":{"line":116,"column":26}},"type":"cond-expr","locations":[{"start":{"line":116,"column":18},"end":{"line":116,"column":20}},{"start":{"line":116,"column":4},"end":{"line":116,"column":26}}]},"10":{"loc":{"start":{"line":116,"column":4},"end":{"line":116,"column":20}},"type":"binary-expr","locations":[{"start":{"line":116,"column":4},"end":{"line":116,"column":20}},{"start":{"line":116,"column":4},"end":{"line":116,"column":20}}]},"11":{"loc":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"type":"if","locations":[{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},{"start":{},"end":{}}]},"12":{"loc":{"start":{"line":130,"column":6},"end":{"line":130,"column":43}},"type":"binary-expr","locations":[{"start":{"line":130,"column":6},"end":{"line":130,"column":11}},{"start":{"line":130,"column":15},"end":{"line":130,"column":43}}]},"13":{"loc":{"start":{"line":135,"column":4},"end":{"line":144,"column":5}},"type":"if","locations":[{"start":{"line":135,"column":4},"end":{"line":144,"column":5}},{"start":{},"end":{}}]},"14":{"loc":{"start":{"line":136,"column":6},"end":{"line":139,"column":23}},"type":"binary-expr","locations":[{"start":{"line":136,"column":6},"end":{"line":136,"column":23}},{"start":{"line":137,"column":6},"end":{"line":137,"column":23}},{"start":{"line":138,"column":6},"end":{"line":138,"column":23}},{"start":{"line":139,"column":6},"end":{"line":139,"column":23}}]},"15":{"loc":{"start":{"line":154,"column":2},"end":{"line":156,"column":3}},"type":"if","locations":[{"start":{"line":154,"column":2},"end":{"line":156,"column":3}},{"start":{},"end":{}}]},"16":{"loc":{"start":{"line":154,"column":7},"end":{"line":154,"column":24}},"type":"cond-expr","locations":[{"start":{"line":154,"column":16},"end":{"line":154,"column":18}},{"start":{"line":154,"column":7},"end":{"line":154,"column":24}}]},"17":{"loc":{"start":{"line":154,"column":7},"end":{"line":154,"column":18}},"type":"binary-expr","locations":[{"start":{"line":154,"column":7},"end":{"line":154,"column":18}},{"start":{"line":154,"column":7},"end":{"line":154,"column":18}}]},"18":{"loc":{"start":{"line":163,"column":15},"end":{"line":163,"column":41}},"type":"cond-expr","locations":[{"start":{"line":163,"column":26},"end":{"line":163,"column":28}},{"start":{"line":163,"column":15},"end":{"line":163,"column":41}}]},"19":{"loc":{"start":{"line":163,"column":15},"end":{"line":163,"column":28}},"type":"binary-expr","locations":[{"start":{"line":163,"column":15},"end":{"line":163,"column":28}},{"start":{"line":163,"column":15},"end":{"line":163,"column":28}}]},"20":{"loc":{"start":{"line":165,"column":2},"end":{"line":167,"column":3}},"type":"if","locations":[{"start":{"line":165,"column":2},"end":{"line":167,"column":3}},{"start":{},"end":{}}]},"21":{"loc":{"start":{"line":185,"column":4},"end":{"line":204,"column":5}},"type":"if","locations":[{"start":{"line":185,"column":4},"end":{"line":204,"column":5}},{"start":{"line":190,"column":11},"end":{"line":204,"column":5}}]},"22":{"loc":{"start":{"line":186,"column":6},"end":{"line":188,"column":7}},"type":"if","locations":[{"start":{"line":186,"column":6},"end":{"line":188,"column":7}},{"start":{},"end":{}}]},"23":{"loc":{"start":{"line":190,"column":11},"end":{"line":204,"column":5}},"type":"if","locations":[{"start":{"line":190,"column":11},"end":{"line":204,"column":5}},{"start":{"line":193,"column":11},"end":{"line":204,"column":5}}]},"24":{"loc":{"start":{"line":193,"column":11},"end":{"line":204,"column":5}},"type":"if","locations":[{"start":{"line":193,"column":11},"end":{"line":204,"column":5}},{"start":{"line":196,"column":11},"end":{"line":204,"column":5}}]},"25":{"loc":{"start":{"line":196,"column":11},"end":{"line":204,"column":5}},"type":"if","locations":[{"start":{"line":196,"column":11},"end":{"line":204,"column":5}},{"start":{"line":199,"column":11},"end":{"line":204,"column":5}}]},"26":{"loc":{"start":{"line":196,"column":15},"end":{"line":196,"column":46}},"type":"binary-expr","locations":[{"start":{"line":196,"column":15},"end":{"line":196,"column":37}},{"start":{"line":196,"column":41},"end":{"line":196,"column":46}}]},"27":{"loc":{"start":{"line":199,"column":11},"end":{"line":204,"column":5}},"type":"if","locations":[{"start":{"line":199,"column":11},"end":{"line":204,"column":5}},{"start":{"line":202,"column":11},"end":{"line":204,"column":5}}]},"28":{"loc":{"start":{"line":199,"column":15},"end":{"line":199,"column":39}},"type":"binary-expr","locations":[{"start":{"line":199,"column":15},"end":{"line":199,"column":30}},{"start":{"line":199,"column":34},"end":{"line":199,"column":39}}]},"29":{"loc":{"start":{"line":213,"column":4},"end":{"line":224,"column":5}},"type":"if","locations":[{"start":{"line":213,"column":4},"end":{"line":224,"column":5}},{"start":{"line":219,"column":11},"end":{"line":224,"column":5}}]},"30":{"loc":{"start":{"line":216,"column":16},"end":{"line":216,"column":62}},"type":"cond-expr","locations":[{"start":{"line":216,"column":22},"end":{"line":216,"column":24}},{"start":{"line":216,"column":22},"end":{"line":216,"column":62}}]},"31":{"loc":{"start":{"line":216,"column":16},"end":{"line":216,"column":24}},"type":"binary-expr","locations":[{"start":{"line":216,"column":16},"end":{"line":216,"column":24}},{"start":{"line":216,"column":22},"end":{"line":216,"column":24}}]},"32":{"loc":{"start":{"line":219,"column":11},"end":{"line":224,"column":5}},"type":"if","locations":[{"start":{"line":219,"column":11},"end":{"line":224,"column":5}},{"start":{"line":222,"column":11},"end":{"line":224,"column":5}}]},"33":{"loc":{"start":{"line":219,"column":15},"end":{"line":219,"column":41}},"type":"binary-expr","locations":[{"start":{"line":219,"column":15},"end":{"line":219,"column":32}},{"start":{"line":219,"column":36},"end":{"line":219,"column":41}}]},"34":{"loc":{"start":{"line":232,"column":2},"end":{"line":236,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":236,"column":3}},{"start":{},"end":{}}]},"35":{"loc":{"start":{"line":232,"column":6},"end":{"line":232,"column":61}},"type":"binary-expr","locations":[{"start":{"line":232,"column":6},"end":{"line":232,"column":32}},{"start":{"line":232,"column":32},"end":{"line":232,"column":61}}]},"36":{"loc":{"start":{"line":232,"column":7},"end":{"line":232,"column":28}},"type":"cond-expr","locations":[{"start":{"line":232,"column":20},"end":{"line":232,"column":22}},{"start":{"line":232,"column":20},"end":{"line":232,"column":28}}]},"37":{"loc":{"start":{"line":232,"column":7},"end":{"line":232,"column":22}},"type":"binary-expr","locations":[{"start":{"line":232,"column":7},"end":{"line":232,"column":22}},{"start":{"line":232,"column":20},"end":{"line":232,"column":22}}]},"38":{"loc":{"start":{"line":232,"column":33},"end":{"line":232,"column":59}},"type":"cond-expr","locations":[{"start":{"line":232,"column":46},"end":{"line":232,"column":48}},{"start":{"line":232,"column":46},"end":{"line":232,"column":59}}]},"39":{"loc":{"start":{"line":232,"column":33},"end":{"line":232,"column":48}},"type":"binary-expr","locations":[{"start":{"line":232,"column":33},"end":{"line":232,"column":48}},{"start":{"line":232,"column":46},"end":{"line":232,"column":48}}]},"40":{"loc":{"start":{"line":237,"column":2},"end":{"line":244,"column":3}},"type":"if","locations":[{"start":{"line":237,"column":2},"end":{"line":244,"column":3}},{"start":{},"end":{}}]},"41":{"loc":{"start":{"line":237,"column":6},"end":{"line":237,"column":18}},"type":"cond-expr","locations":[{"start":{"line":237,"column":10},"end":{"line":237,"column":12}},{"start":{"line":237,"column":6},"end":{"line":237,"column":18}}]},"42":{"loc":{"start":{"line":237,"column":6},"end":{"line":237,"column":12}},"type":"binary-expr","locations":[{"start":{"line":237,"column":6},"end":{"line":237,"column":12}},{"start":{"line":237,"column":6},"end":{"line":237,"column":12}}]},"43":{"loc":{"start":{"line":239,"column":6},"end":{"line":241,"column":7}},"type":"if","locations":[{"start":{"line":239,"column":6},"end":{"line":241,"column":7}},{"start":{},"end":{}}]},"44":{"loc":{"start":{"line":239,"column":10},"end":{"line":239,"column":38}},"type":"cond-expr","locations":[{"start":{"line":239,"column":31},"end":{"line":239,"column":34}},{"start":{"line":239,"column":31},"end":{"line":239,"column":38}}]},"45":{"loc":{"start":{"line":239,"column":10},"end":{"line":239,"column":34}},"type":"binary-expr","locations":[{"start":{"line":239,"column":10},"end":{"line":239,"column":34}},{"start":{"line":239,"column":31},"end":{"line":239,"column":34}}]},"46":{"loc":{"start":{"line":239,"column":10},"end":{"line":239,"column":31}},"type":"cond-expr","locations":[{"start":{"line":239,"column":23},"end":{"line":239,"column":25}},{"start":{"line":239,"column":23},"end":{"line":239,"column":31}}]},"47":{"loc":{"start":{"line":239,"column":10},"end":{"line":239,"column":25}},"type":"binary-expr","locations":[{"start":{"line":239,"column":10},"end":{"line":239,"column":25}},{"start":{"line":239,"column":23},"end":{"line":239,"column":25}}]},"48":{"loc":{"start":{"line":246,"column":2},"end":{"line":255,"column":3}},"type":"if","locations":[{"start":{"line":246,"column":2},"end":{"line":255,"column":3}},{"start":{},"end":{}}]},"49":{"loc":{"start":{"line":246,"column":6},"end":{"line":246,"column":23}},"type":"cond-expr","locations":[{"start":{"line":246,"column":10},"end":{"line":246,"column":12}},{"start":{"line":246,"column":6},"end":{"line":246,"column":23}}]},"50":{"loc":{"start":{"line":246,"column":6},"end":{"line":246,"column":12}},"type":"binary-expr","locations":[{"start":{"line":246,"column":6},"end":{"line":246,"column":12}},{"start":{"line":246,"column":6},"end":{"line":246,"column":12}}]},"51":{"loc":{"start":{"line":248,"column":6},"end":{"line":252,"column":7}},"type":"if","locations":[{"start":{"line":248,"column":6},"end":{"line":252,"column":7}},{"start":{},"end":{}}]},"52":{"loc":{"start":{"line":248,"column":10},"end":{"line":248,"column":43}},"type":"cond-expr","locations":[{"start":{"line":248,"column":36},"end":{"line":248,"column":39}},{"start":{"line":248,"column":36},"end":{"line":248,"column":43}}]},"53":{"loc":{"start":{"line":248,"column":10},"end":{"line":248,"column":39}},"type":"binary-expr","locations":[{"start":{"line":248,"column":10},"end":{"line":248,"column":39}},{"start":{"line":248,"column":36},"end":{"line":248,"column":39}}]},"54":{"loc":{"start":{"line":248,"column":10},"end":{"line":248,"column":36}},"type":"cond-expr","locations":[{"start":{"line":248,"column":23},"end":{"line":248,"column":25}},{"start":{"line":248,"column":23},"end":{"line":248,"column":36}}]},"55":{"loc":{"start":{"line":248,"column":10},"end":{"line":248,"column":25}},"type":"binary-expr","locations":[{"start":{"line":248,"column":10},"end":{"line":248,"column":25}},{"start":{"line":248,"column":23},"end":{"line":248,"column":25}}]},"56":{"loc":{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},"type":"if","locations":[{"start":{"line":260,"column":2},"end":{"line":262,"column":3}},{"start":{},"end":{}}]},"57":{"loc":{"start":{"line":264,"column":2},"end":{"line":266,"column":3}},"type":"if","locations":[{"start":{"line":264,"column":2},"end":{"line":266,"column":3}},{"start":{},"end":{}}]},"58":{"loc":{"start":{"line":264,"column":6},"end":{"line":264,"column":37}},"type":"binary-expr","locations":[{"start":{"line":264,"column":6},"end":{"line":264,"column":10}},{"start":{"line":264,"column":14},"end":{"line":264,"column":37}}]},"59":{"loc":{"start":{"line":274,"column":12},"end":{"line":274,"column":null}},"type":"binary-expr","locations":[{"start":{"line":274,"column":12},"end":{"line":274,"column":20}},{"start":{"line":274,"column":20},"end":{"line":274,"column":null}}]},"60":{"loc":{"start":{"line":284,"column":17},"end":{"line":284,"column":27}},"type":"binary-expr","locations":[{"start":{"line":284,"column":17},"end":{"line":284,"column":21}},{"start":{"line":284,"column":25},"end":{"line":284,"column":27}}]},"61":{"loc":{"start":{"line":285,"column":2},"end":{"line":287,"column":3}},"type":"if","locations":[{"start":{"line":285,"column":2},"end":{"line":287,"column":3}},{"start":{},"end":{}}]},"62":{"loc":{"start":{"line":285,"column":7},"end":{"line":285,"column":19}},"type":"cond-expr","locations":[{"start":{"line":285,"column":11},"end":{"line":285,"column":13}},{"start":{"line":285,"column":7},"end":{"line":285,"column":19}}]},"63":{"loc":{"start":{"line":285,"column":7},"end":{"line":285,"column":13}},"type":"binary-expr","locations":[{"start":{"line":285,"column":7},"end":{"line":285,"column":13}},{"start":{"line":285,"column":7},"end":{"line":285,"column":13}}]},"64":{"loc":{"start":{"line":295,"column":2},"end":{"line":297,"column":3}},"type":"if","locations":[{"start":{"line":295,"column":2},"end":{"line":297,"column":3}},{"start":{},"end":{}}]},"65":{"loc":{"start":{"line":295,"column":6},"end":{"line":295,"column":62}},"type":"binary-expr","locations":[{"start":{"line":295,"column":6},"end":{"line":295,"column":22}},{"start":{"line":295,"column":26},"end":{"line":295,"column":42}},{"start":{"line":295,"column":46},"end":{"line":295,"column":62}}]},"66":{"loc":{"start":{"line":316,"column":2},"end":{"line":318,"column":3}},"type":"if","locations":[{"start":{"line":316,"column":2},"end":{"line":318,"column":3}},{"start":{},"end":{}}]},"67":{"loc":{"start":{"line":316,"column":6},"end":{"line":316,"column":39}},"type":"binary-expr","locations":[{"start":{"line":316,"column":6},"end":{"line":316,"column":18}},{"start":{"line":316,"column":22},"end":{"line":316,"column":39}}]},"68":{"loc":{"start":{"line":323,"column":4},"end":{"line":324,"column":37}},"type":"cond-expr","locations":[{"start":{"line":323,"column":62},"end":{"line":323,"column":null}},{"start":{"line":324,"column":5},"end":{"line":324,"column":37}}]},"69":{"loc":{"start":{"line":323,"column":4},"end":{"line":323,"column":null}},"type":"binary-expr","locations":[{"start":{"line":323,"column":4},"end":{"line":323,"column":null}},{"start":{"line":323,"column":62},"end":{"line":323,"column":null}}]},"70":{"loc":{"start":{"line":323,"column":4},"end":{"line":323,"column":62}},"type":"cond-expr","locations":[{"start":{"line":323,"column":56},"end":{"line":323,"column":58}},{"start":{"line":323,"column":56},"end":{"line":323,"column":62}}]},"71":{"loc":{"start":{"line":323,"column":4},"end":{"line":323,"column":58}},"type":"binary-expr","locations":[{"start":{"line":323,"column":4},"end":{"line":323,"column":58}},{"start":{"line":323,"column":56},"end":{"line":323,"column":58}}]},"72":{"loc":{"start":{"line":323,"column":5},"end":{"line":323,"column":56}},"type":"cond-expr","locations":[{"start":{"line":323,"column":8},"end":{"line":323,"column":46}},{"start":{"line":323,"column":5},"end":{"line":323,"column":56}}]},"73":{"loc":{"start":{"line":323,"column":5},"end":{"line":323,"column":46}},"type":"binary-expr","locations":[{"start":{"line":323,"column":5},"end":{"line":323,"column":48}},{"start":{"line":323,"column":5},"end":{"line":323,"column":46}}]},"74":{"loc":{"start":{"line":324,"column":5},"end":{"line":324,"column":37}},"type":"cond-expr","locations":[{"start":{"line":324,"column":8},"end":{"line":324,"column":31}},{"start":{"line":324,"column":5},"end":{"line":324,"column":37}}]},"75":{"loc":{"start":{"line":324,"column":5},"end":{"line":324,"column":31}},"type":"binary-expr","locations":[{"start":{"line":324,"column":5},"end":{"line":324,"column":33}},{"start":{"line":324,"column":5},"end":{"line":324,"column":31}}]},"76":{"loc":{"start":{"line":325,"column":2},"end":{"line":333,"column":3}},"type":"if","locations":[{"start":{"line":325,"column":2},"end":{"line":333,"column":3}},{"start":{},"end":{}}]},"77":{"loc":{"start":{"line":325,"column":6},"end":{"line":325,"column":38}},"type":"binary-expr","locations":[{"start":{"line":325,"column":6},"end":{"line":325,"column":10}},{"start":{"line":325,"column":14},"end":{"line":325,"column":38}}]},"78":{"loc":{"start":{"line":328,"column":4},"end":{"line":332,"column":5}},"type":"if","locations":[{"start":{"line":328,"column":4},"end":{"line":332,"column":5}},{"start":{},"end":{}}]},"79":{"loc":{"start":{"line":329,"column":13},"end":{"line":331,"column":13}},"type":"cond-expr","locations":[{"start":{"line":330,"column":10},"end":{"line":330,"column":38}},{"start":{"line":331,"column":10},"end":{"line":331,"column":13}}]},"80":{"loc":{"start":{"line":329,"column":13},"end":{"line":329,"column":60}},"type":"binary-expr","locations":[{"start":{"line":329,"column":13},"end":{"line":329,"column":39}},{"start":{"line":329,"column":43},"end":{"line":329,"column":60}}]},"81":{"loc":{"start":{"line":335,"column":2},"end":{"line":337,"column":3}},"type":"if","locations":[{"start":{"line":335,"column":2},"end":{"line":337,"column":3}},{"start":{},"end":{}}]},"82":{"loc":{"start":{"line":339,"column":2},"end":{"line":353,"column":3}},"type":"if","locations":[{"start":{"line":339,"column":2},"end":{"line":353,"column":3}},{"start":{},"end":{}}]},"83":{"loc":{"start":{"line":345,"column":4},"end":{"line":347,"column":5}},"type":"if","locations":[{"start":{"line":345,"column":4},"end":{"line":347,"column":5}},{"start":{},"end":{}}]}},"s":{"0":14,"1":14,"2":14,"3":14,"4":14,"5":14,"6":14,"7":14,"8":14,"9":14,"10":14,"11":14,"12":14,"13":14,"14":14,"15":14,"16":14,"17":14,"18":14,"19":14,"20":14,"21":14,"22":14,"23":14,"24":14,"25":14,"26":14,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":12,"70":12,"71":12,"72":2,"73":10,"74":2,"75":2,"76":2,"77":6,"78":6,"79":6,"80":6,"81":2,"82":1,"83":2,"84":4,"85":1,"86":1,"87":3,"88":1,"89":1,"90":2,"91":0,"92":0,"93":2,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":4,"101":4,"102":4,"103":4,"104":1,"105":1,"106":3,"107":1,"108":1,"109":2,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":23,"133":23,"134":23,"135":0,"136":0,"137":0,"138":0,"139":0,"140":14,"141":14,"142":14,"143":14,"144":14,"145":14,"146":14,"147":3,"148":3,"149":0,"150":3,"151":3,"152":17,"153":3,"154":14,"155":0,"156":0,"157":0,"158":63,"159":2,"160":61,"161":61,"162":3,"163":3,"164":3,"165":3,"166":58,"167":47,"168":11,"169":6,"170":6,"171":3,"172":3,"173":3,"174":2,"175":5},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":12,"6":2,"7":1,"8":1,"9":0,"10":23,"11":0,"12":14,"13":3,"14":17,"15":0,"16":0,"17":0,"18":63},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0,0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,12],"19":[12,12],"20":[2,10],"21":[2,4],"22":[1,1],"23":[1,3],"24":[1,2],"25":[0,2],"26":[2,0],"27":[1,1],"28":[2,1],"29":[1,3],"30":[0,1],"31":[1,1],"32":[1,2],"33":[3,1],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,0],"39":[0,0],"40":[0,0],"41":[0,0],"42":[0,0],"43":[0,0],"44":[0,0],"45":[0,0],"46":[0,0],"47":[0,0],"48":[0,0],"49":[0,0],"50":[0,0],"51":[0,0],"52":[0,0],"53":[0,0],"54":[0,0],"55":[0,0],"56":[23,0],"57":[0,0],"58":[0,0],"59":[14,14],"60":[3,1],"61":[0,3],"62":[0,3],"63":[3,3],"64":[3,14],"65":[17,14,3],"66":[2,61],"67":[63,62],"68":[2,59],"69":[61,61],"70":[57,4],"71":[61,61],"72":[0,61],"73":[61,61],"74":[0,59],"75":[59,59],"76":[3,58],"77":[61,3],"78":[3,0],"79":[1,2],"80":[3,1],"81":[47,11],"82":[6,5],"83":[3,3]}} +,"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/k8s/utils/npu-metrics.ts": {"path":"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/src/k8s/utils/npu-metrics.ts","statementMap":{"0":{"start":{"line":71,"column":0},"end":{"line":71,"column":16}},"1":{"start":{"line":79,"column":0},"end":{"line":79,"column":16}},"2":{"start":{"line":96,"column":0},"end":{"line":96,"column":16}},"3":{"start":{"line":113,"column":0},"end":{"line":113,"column":16}},"4":{"start":{"line":125,"column":0},"end":{"line":125,"column":16}},"5":{"start":{"line":133,"column":0},"end":{"line":133,"column":16}},"6":{"start":{"line":187,"column":0},"end":{"line":187,"column":16}},"7":{"start":{"line":224,"column":0},"end":{"line":224,"column":16}},"8":{"start":{"line":269,"column":0},"end":{"line":269,"column":16}},"9":{"start":{"line":279,"column":0},"end":{"line":279,"column":16}},"10":{"start":{"line":324,"column":0},"end":{"line":324,"column":16}},"11":{"start":{"line":334,"column":0},"end":{"line":334,"column":16}},"12":{"start":{"line":338,"column":0},"end":{"line":338,"column":16}},"13":{"start":{"line":359,"column":0},"end":{"line":359,"column":16}},"14":{"start":{"line":401,"column":0},"end":{"line":401,"column":16}},"15":{"start":{"line":408,"column":0},"end":{"line":408,"column":16}},"16":{"start":{"line":418,"column":0},"end":{"line":418,"column":22}},"17":{"start":{"line":448,"column":0},"end":{"line":448,"column":22}},"18":{"start":{"line":484,"column":0},"end":{"line":484,"column":22}},"19":{"start":{"line":518,"column":0},"end":{"line":518,"column":16}},"20":{"start":{"line":545,"column":0},"end":{"line":545,"column":22}},"21":{"start":{"line":565,"column":0},"end":{"line":565,"column":16}},"22":{"start":{"line":589,"column":0},"end":{"line":589,"column":16}},"23":{"start":{"line":630,"column":0},"end":{"line":630,"column":16}},"24":{"start":{"line":644,"column":0},"end":{"line":644,"column":22}},"25":{"start":{"line":670,"column":0},"end":{"line":670,"column":22}},"26":{"start":{"line":1,"column":0},"end":{"line":1,"column":37}},"27":{"start":{"line":3,"column":0},"end":{"line":3,"column":30}},"28":{"start":{"line":4,"column":0},"end":{"line":4,"column":28}},"29":{"start":{"line":5,"column":0},"end":{"line":5,"column":25}},"30":{"start":{"line":6,"column":0},"end":{"line":6,"column":76}},"31":{"start":{"line":7,"column":0},"end":{"line":7,"column":37}},"32":{"start":{"line":8,"column":0},"end":{"line":8,"column":null}},"33":{"start":{"line":16,"column":13},"end":{"line":16,"column":null}},"34":{"start":{"line":17,"column":13},"end":{"line":17,"column":null}},"35":{"start":{"line":18,"column":13},"end":{"line":18,"column":null}},"36":{"start":{"line":19,"column":13},"end":{"line":19,"column":null}},"37":{"start":{"line":21,"column":13},"end":{"line":21,"column":null}},"38":{"start":{"line":22,"column":13},"end":{"line":22,"column":null}},"39":{"start":{"line":23,"column":13},"end":{"line":23,"column":null}},"40":{"start":{"line":25,"column":13},"end":{"line":25,"column":null}},"41":{"start":{"line":26,"column":13},"end":{"line":26,"column":null}},"42":{"start":{"line":27,"column":13},"end":{"line":27,"column":null}},"43":{"start":{"line":28,"column":13},"end":{"line":28,"column":null}},"44":{"start":{"line":30,"column":13},"end":{"line":30,"column":null}},"45":{"start":{"line":31,"column":13},"end":{"line":31,"column":null}},"46":{"start":{"line":32,"column":13},"end":{"line":32,"column":null}},"47":{"start":{"line":34,"column":27},"end":{"line":34,"column":56}},"48":{"start":{"line":35,"column":29},"end":{"line":35,"column":80}},"49":{"start":{"line":72,"column":2},"end":{"line":72,"column":null}},"50":{"start":{"line":74,"column":2},"end":{"line":76,"column":null}},"51":{"start":{"line":80,"column":2},"end":{"line":80,"column":null}},"52":{"start":{"line":82,"column":14},"end":{"line":82,"column":42}},"53":{"start":{"line":83,"column":2},"end":{"line":85,"column":3}},"54":{"start":{"line":84,"column":4},"end":{"line":84,"column":null}},"55":{"start":{"line":86,"column":17},"end":{"line":86,"column":28}},"56":{"start":{"line":87,"column":2},"end":{"line":92,"column":3}},"57":{"start":{"line":88,"column":4},"end":{"line":90,"column":null}},"58":{"start":{"line":91,"column":4},"end":{"line":91,"column":null}},"59":{"start":{"line":93,"column":2},"end":{"line":93,"column":null}},"60":{"start":{"line":97,"column":2},"end":{"line":97,"column":null}},"61":{"start":{"line":99,"column":14},"end":{"line":99,"column":41}},"62":{"start":{"line":100,"column":2},"end":{"line":102,"column":3}},"63":{"start":{"line":101,"column":4},"end":{"line":101,"column":null}},"64":{"start":{"line":103,"column":17},"end":{"line":103,"column":28}},"65":{"start":{"line":104,"column":2},"end":{"line":109,"column":3}},"66":{"start":{"line":105,"column":4},"end":{"line":107,"column":null}},"67":{"start":{"line":108,"column":4},"end":{"line":108,"column":null}},"68":{"start":{"line":110,"column":2},"end":{"line":110,"column":null}},"69":{"start":{"line":114,"column":20},"end":{"line":114,"column":80}},"70":{"start":{"line":115,"column":2},"end":{"line":121,"column":3}},"71":{"start":{"line":115,"column":22},"end":{"line":115,"column":31}},"72":{"start":{"line":115,"column":18},"end":{"line":115,"column":22}},"73":{"start":{"line":116,"column":4},"end":{"line":120,"column":5}},"74":{"start":{"line":116,"column":22},"end":{"line":116,"column":28}},"75":{"start":{"line":116,"column":22},"end":{"line":116,"column":46}},"76":{"start":{"line":116,"column":18},"end":{"line":116,"column":22}},"77":{"start":{"line":117,"column":6},"end":{"line":119,"column":7}},"78":{"start":{"line":118,"column":8},"end":{"line":118,"column":null}},"79":{"start":{"line":122,"column":2},"end":{"line":122,"column":null}},"80":{"start":{"line":126,"column":2},"end":{"line":126,"column":null}},"81":{"start":{"line":126,"column":44},"end":{"line":126,"column":70}},"82":{"start":{"line":130,"column":2},"end":{"line":130,"column":null}},"83":{"start":{"line":134,"column":2},"end":{"line":134,"column":null}},"84":{"start":{"line":136,"column":2},"end":{"line":155,"column":null}},"85":{"start":{"line":158,"column":22},"end":{"line":185,"column":12}},"86":{"start":{"line":188,"column":2},"end":{"line":195,"column":null}},"87":{"start":{"line":199,"column":2},"end":{"line":199,"column":null}},"88":{"start":{"line":206,"column":2},"end":{"line":217,"column":3}},"89":{"start":{"line":212,"column":4},"end":{"line":216,"column":null}},"90":{"start":{"line":218,"column":17},"end":{"line":219,"column":null}},"91":{"start":{"line":219,"column":12},"end":{"line":219,"column":null}},"92":{"start":{"line":221,"column":2},"end":{"line":221,"column":null}},"93":{"start":{"line":226,"column":2},"end":{"line":226,"column":null}},"94":{"start":{"line":228,"column":20},"end":{"line":228,"column":45}},"95":{"start":{"line":229,"column":2},"end":{"line":234,"column":3}},"96":{"start":{"line":233,"column":4},"end":{"line":233,"column":null}},"97":{"start":{"line":236,"column":2},"end":{"line":244,"column":3}},"98":{"start":{"line":240,"column":4},"end":{"line":242,"column":null}},"99":{"start":{"line":243,"column":4},"end":{"line":243,"column":null}},"100":{"start":{"line":246,"column":22},"end":{"line":246,"column":85}},"101":{"start":{"line":247,"column":24},"end":{"line":247,"column":145}},"102":{"start":{"line":249,"column":2},"end":{"line":256,"column":null}},"103":{"start":{"line":257,"column":2},"end":{"line":264,"column":null}},"104":{"start":{"line":265,"column":2},"end":{"line":265,"column":null}},"105":{"start":{"line":266,"column":2},"end":{"line":266,"column":null}},"106":{"start":{"line":270,"column":2},"end":{"line":272,"column":3}},"107":{"start":{"line":271,"column":4},"end":{"line":271,"column":null}},"108":{"start":{"line":273,"column":2},"end":{"line":275,"column":3}},"109":{"start":{"line":274,"column":4},"end":{"line":274,"column":null}},"110":{"start":{"line":276,"column":2},"end":{"line":276,"column":null}},"111":{"start":{"line":282,"column":2},"end":{"line":284,"column":3}},"112":{"start":{"line":283,"column":4},"end":{"line":283,"column":null}},"113":{"start":{"line":285,"column":16},"end":{"line":285,"column":36}},"114":{"start":{"line":286,"column":2},"end":{"line":288,"column":3}},"115":{"start":{"line":287,"column":4},"end":{"line":287,"column":null}},"116":{"start":{"line":289,"column":21},"end":{"line":289,"column":39}},"117":{"start":{"line":290,"column":14},"end":{"line":290,"column":34}},"118":{"start":{"line":291,"column":2},"end":{"line":293,"column":3}},"119":{"start":{"line":292,"column":4},"end":{"line":292,"column":null}},"120":{"start":{"line":294,"column":2},"end":{"line":320,"column":3}},"121":{"start":{"line":294,"column":26},"end":{"line":294,"column":36}},"122":{"start":{"line":294,"column":22},"end":{"line":294,"column":26}},"123":{"start":{"line":295,"column":14},"end":{"line":295,"column":19}},"124":{"start":{"line":296,"column":4},"end":{"line":300,"column":5}},"125":{"start":{"line":297,"column":6},"end":{"line":297,"column":null}},"126":{"start":{"line":299,"column":6},"end":{"line":299,"column":14}},"127":{"start":{"line":301,"column":4},"end":{"line":303,"column":5}},"128":{"start":{"line":302,"column":6},"end":{"line":302,"column":14}},"129":{"start":{"line":304,"column":38},"end":{"line":304,"column":40}},"130":{"start":{"line":305,"column":4},"end":{"line":318,"column":5}},"131":{"start":{"line":305,"column":20},"end":{"line":305,"column":26}},"132":{"start":{"line":305,"column":20},"end":{"line":305,"column":32}},"133":{"start":{"line":305,"column":16},"end":{"line":305,"column":20}},"134":{"start":{"line":306,"column":6},"end":{"line":308,"column":7}},"135":{"start":{"line":307,"column":8},"end":{"line":307,"column":16}},"136":{"start":{"line":309,"column":6},"end":{"line":317,"column":null}},"137":{"start":{"line":319,"column":4},"end":{"line":319,"column":null}},"138":{"start":{"line":321,"column":2},"end":{"line":321,"column":null}},"139":{"start":{"line":326,"column":2},"end":{"line":326,"column":null}},"140":{"start":{"line":328,"column":2},"end":{"line":330,"column":3}},"141":{"start":{"line":329,"column":4},"end":{"line":329,"column":null}},"142":{"start":{"line":331,"column":2},"end":{"line":331,"column":null}},"143":{"start":{"line":331,"column":26},"end":{"line":331,"column":74}},"144":{"start":{"line":335,"column":2},"end":{"line":335,"column":null}},"145":{"start":{"line":339,"column":2},"end":{"line":342,"column":null}},"146":{"start":{"line":340,"column":17},"end":{"line":340,"column":18}},"147":{"start":{"line":340,"column":23},"end":{"line":340,"column":39}},"148":{"start":{"line":341,"column":12},"end":{"line":341,"column":14}},"149":{"start":{"line":341,"column":15},"end":{"line":341,"column":16}},"150":{"start":{"line":341,"column":21},"end":{"line":341,"column":57}},"151":{"start":{"line":345,"column":34},"end":{"line":357,"column":null}},"152":{"start":{"line":362,"column":2},"end":{"line":362,"column":null}},"153":{"start":{"line":364,"column":39},"end":{"line":374,"column":null}},"154":{"start":{"line":375,"column":15},"end":{"line":375,"column":68}},"155":{"start":{"line":376,"column":26},"end":{"line":376,"column":28}},"156":{"start":{"line":377,"column":2},"end":{"line":377,"column":null}},"157":{"start":{"line":378,"column":2},"end":{"line":378,"column":null}},"158":{"start":{"line":379,"column":2},"end":{"line":379,"column":null}},"159":{"start":{"line":380,"column":2},"end":{"line":380,"column":null}},"160":{"start":{"line":382,"column":20},"end":{"line":382,"column":57}},"161":{"start":{"line":383,"column":14},"end":{"line":386,"column":null}},"162":{"start":{"line":385,"column":43},"end":{"line":385,"column":62}},"163":{"start":{"line":388,"column":4},"end":{"line":388,"column":null}},"164":{"start":{"line":389,"column":4},"end":{"line":389,"column":null}},"165":{"start":{"line":390,"column":21},"end":{"line":390,"column":60}},"166":{"start":{"line":391,"column":4},"end":{"line":391,"column":null}},"167":{"start":{"line":392,"column":4},"end":{"line":392,"column":null}},"168":{"start":{"line":381,"column":2},"end":{"line":393,"column":null}},"169":{"start":{"line":381,"column":21},"end":{"line":381,"column":26}},"170":{"start":{"line":381,"column":17},"end":{"line":381,"column":21}},"171":{"start":{"line":381,"column":13},"end":{"line":381,"column":21}},"172":{"start":{"line":394,"column":2},"end":{"line":394,"column":null}},"173":{"start":{"line":395,"column":2},"end":{"line":397,"column":null}},"174":{"start":{"line":398,"column":2},"end":{"line":398,"column":null}},"175":{"start":{"line":402,"column":2},"end":{"line":405,"column":null}},"176":{"start":{"line":413,"column":2},"end":{"line":415,"column":null}},"177":{"start":{"line":422,"column":9},"end":{"line":434,"column":null}},"178":{"start":{"line":423,"column":18},"end":{"line":423,"column":75}},"179":{"start":{"line":423,"column":35},"end":{"line":423,"column":65}},"180":{"start":{"line":424,"column":4},"end":{"line":433,"column":null}},"181":{"start":{"line":426,"column":8},"end":{"line":426,"column":null}},"182":{"start":{"line":427,"column":8},"end":{"line":427,"column":null}},"183":{"start":{"line":430,"column":8},"end":{"line":430,"column":null}},"184":{"start":{"line":431,"column":8},"end":{"line":431,"column":null}},"185":{"start":{"line":422,"column":2},"end":{"line":434,"column":null}},"186":{"start":{"line":451,"column":8},"end":{"line":451,"column":null}},"187":{"start":{"line":452,"column":8},"end":{"line":452,"column":null}},"188":{"start":{"line":453,"column":8},"end":{"line":455,"column":null}},"189":{"start":{"line":456,"column":2},"end":{"line":461,"column":3}},"190":{"start":{"line":457,"column":10},"end":{"line":459,"column":null}},"191":{"start":{"line":460,"column":4},"end":{"line":460,"column":null}},"192":{"start":{"line":462,"column":9},"end":{"line":481,"column":null}},"193":{"start":{"line":463,"column":20},"end":{"line":476,"column":null}},"194":{"start":{"line":472,"column":8},"end":{"line":472,"column":null}},"195":{"start":{"line":473,"column":8},"end":{"line":475,"column":null}},"196":{"start":{"line":474,"column":10},"end":{"line":474,"column":null}},"197":{"start":{"line":478,"column":4},"end":{"line":478,"column":null}},"198":{"start":{"line":478,"column":32},"end":{"line":478,"column":78}},"199":{"start":{"line":479,"column":4},"end":{"line":479,"column":null}},"200":{"start":{"line":480,"column":4},"end":{"line":480,"column":null}},"201":{"start":{"line":462,"column":2},"end":{"line":481,"column":null}},"202":{"start":{"line":490,"column":8},"end":{"line":490,"column":null}},"203":{"start":{"line":491,"column":8},"end":{"line":491,"column":null}},"204":{"start":{"line":492,"column":8},"end":{"line":492,"column":null}},"205":{"start":{"line":493,"column":8},"end":{"line":493,"column":null}},"206":{"start":{"line":495,"column":11},"end":{"line":495,"column":24}},"207":{"start":{"line":495,"column":24},"end":{"line":495,"column":44}},"208":{"start":{"line":495,"column":42},"end":{"line":495,"column":44}},"209":{"start":{"line":496,"column":8},"end":{"line":496,"column":15}},"210":{"start":{"line":497,"column":6},"end":{"line":497,"column":null}},"211":{"start":{"line":497,"column":35},"end":{"line":497,"column":69}},"212":{"start":{"line":500,"column":23},"end":{"line":506,"column":null}},"213":{"start":{"line":500,"column":12},"end":{"line":506,"column":null}},"214":{"start":{"line":507,"column":6},"end":{"line":509,"column":7}},"215":{"start":{"line":508,"column":8},"end":{"line":508,"column":14}},"216":{"start":{"line":510,"column":6},"end":{"line":510,"column":null}},"217":{"start":{"line":512,"column":6},"end":{"line":512,"column":null}},"218":{"start":{"line":495,"column":44},"end":{"line":495,"column":null}},"219":{"start":{"line":515,"column":2},"end":{"line":515,"column":null}},"220":{"start":{"line":521,"column":15},"end":{"line":521,"column":33}},"221":{"start":{"line":522,"column":17},"end":{"line":533,"column":3}},"222":{"start":{"line":523,"column":20},"end":{"line":523,"column":29}},"223":{"start":{"line":524,"column":4},"end":{"line":526,"column":5}},"224":{"start":{"line":525,"column":6},"end":{"line":525,"column":null}},"225":{"start":{"line":527,"column":4},"end":{"line":532,"column":5}},"226":{"start":{"line":528,"column":22},"end":{"line":528,"column":69}},"227":{"start":{"line":529,"column":6},"end":{"line":529,"column":null}},"228":{"start":{"line":531,"column":6},"end":{"line":531,"column":null}},"229":{"start":{"line":534,"column":14},"end":{"line":534,"column":39}},"230":{"start":{"line":535,"column":2},"end":{"line":537,"column":3}},"231":{"start":{"line":536,"column":4},"end":{"line":536,"column":null}},"232":{"start":{"line":538,"column":2},"end":{"line":542,"column":null}},"233":{"start":{"line":547,"column":19},"end":{"line":547,"column":null}},"234":{"start":{"line":547,"column":10},"end":{"line":547,"column":null}},"235":{"start":{"line":548,"column":4},"end":{"line":548,"column":null}},"236":{"start":{"line":550,"column":4},"end":{"line":552,"column":null}},"237":{"start":{"line":553,"column":4},"end":{"line":553,"column":null}},"238":{"start":{"line":558,"column":2},"end":{"line":560,"column":3}},"239":{"start":{"line":559,"column":4},"end":{"line":559,"column":null}},"240":{"start":{"line":561,"column":16},"end":{"line":561,"column":49}},"241":{"start":{"line":562,"column":2},"end":{"line":562,"column":null}},"242":{"start":{"line":566,"column":17},"end":{"line":566,"column":43}},"243":{"start":{"line":567,"column":22},"end":{"line":567,"column":53}},"244":{"start":{"line":568,"column":15},"end":{"line":570,"column":null}},"245":{"start":{"line":572,"column":2},"end":{"line":579,"column":3}},"246":{"start":{"line":572,"column":29},"end":{"line":572,"column":36}},"247":{"start":{"line":572,"column":13},"end":{"line":572,"column":14}},"248":{"start":{"line":572,"column":17},"end":{"line":572,"column":19}},"249":{"start":{"line":572,"column":24},"end":{"line":572,"column":25}},"250":{"start":{"line":573,"column":4},"end":{"line":578,"column":5}},"251":{"start":{"line":574,"column":21},"end":{"line":574,"column":47}},"252":{"start":{"line":575,"column":6},"end":{"line":577,"column":7}},"253":{"start":{"line":576,"column":8},"end":{"line":576,"column":null}},"254":{"start":{"line":580,"column":2},"end":{"line":585,"column":3}},"255":{"start":{"line":580,"column":26},"end":{"line":580,"column":33}},"256":{"start":{"line":580,"column":13},"end":{"line":580,"column":16}},"257":{"start":{"line":580,"column":21},"end":{"line":580,"column":22}},"258":{"start":{"line":581,"column":19},"end":{"line":581,"column":45}},"259":{"start":{"line":582,"column":4},"end":{"line":584,"column":5}},"260":{"start":{"line":583,"column":6},"end":{"line":583,"column":null}},"261":{"start":{"line":586,"column":2},"end":{"line":586,"column":null}},"262":{"start":{"line":598,"column":18},"end":{"line":598,"column":66}},"263":{"start":{"line":599,"column":19},"end":{"line":599,"column":36}},"264":{"start":{"line":600,"column":14},"end":{"line":600,"column":15}},"265":{"start":{"line":601,"column":2},"end":{"line":614,"column":3}},"266":{"start":{"line":601,"column":26},"end":{"line":601,"column":29}},"267":{"start":{"line":601,"column":26},"end":{"line":601,"column":52}},"268":{"start":{"line":601,"column":22},"end":{"line":601,"column":26}},"269":{"start":{"line":602,"column":4},"end":{"line":613,"column":5}},"270":{"start":{"line":602,"column":28},"end":{"line":602,"column":null}},"271":{"start":{"line":602,"column":28},"end":{"line":605,"column":7}},"272":{"start":{"line":602,"column":24},"end":{"line":602,"column":28}},"273":{"start":{"line":606,"column":6},"end":{"line":612,"column":7}},"274":{"start":{"line":606,"column":36},"end":{"line":606,"column":42}},"275":{"start":{"line":606,"column":36},"end":{"line":606,"column":67}},"276":{"start":{"line":606,"column":17},"end":{"line":606,"column":18}},"277":{"start":{"line":606,"column":21},"end":{"line":606,"column":23}},"278":{"start":{"line":606,"column":31},"end":{"line":606,"column":32}},"279":{"start":{"line":607,"column":22},"end":{"line":607,"column":51}},"280":{"start":{"line":608,"column":8},"end":{"line":611,"column":9}},"281":{"start":{"line":609,"column":10},"end":{"line":609,"column":null}},"282":{"start":{"line":610,"column":10},"end":{"line":610,"column":null}},"283":{"start":{"line":615,"column":21},"end":{"line":616,"column":null}},"284":{"start":{"line":616,"column":9},"end":{"line":616,"column":null}},"285":{"start":{"line":618,"column":21},"end":{"line":618,"column":50}},"286":{"start":{"line":619,"column":17},"end":{"line":621,"column":38}},"287":{"start":{"line":622,"column":2},"end":{"line":627,"column":null}},"288":{"start":{"line":631,"column":2},"end":{"line":631,"column":null}},"289":{"start":{"line":633,"column":2},"end":{"line":635,"column":3}},"290":{"start":{"line":634,"column":4},"end":{"line":634,"column":null}},"291":{"start":{"line":636,"column":20},"end":{"line":636,"column":46}},"292":{"start":{"line":637,"column":16},"end":{"line":637,"column":62}},"293":{"start":{"line":637,"column":49},"end":{"line":637,"column":62}},"294":{"start":{"line":638,"column":2},"end":{"line":640,"column":3}},"295":{"start":{"line":639,"column":4},"end":{"line":639,"column":null}},"296":{"start":{"line":641,"column":2},"end":{"line":641,"column":null}},"297":{"start":{"line":647,"column":8},"end":{"line":647,"column":null}},"298":{"start":{"line":648,"column":2},"end":{"line":650,"column":3}},"299":{"start":{"line":649,"column":4},"end":{"line":649,"column":null}},"300":{"start":{"line":651,"column":8},"end":{"line":653,"column":null}},"301":{"start":{"line":652,"column":9},"end":{"line":652,"column":null}},"302":{"start":{"line":654,"column":8},"end":{"line":654,"column":null}},"303":{"start":{"line":655,"column":2},"end":{"line":657,"column":3}},"304":{"start":{"line":656,"column":4},"end":{"line":656,"column":null}},"305":{"start":{"line":658,"column":2},"end":{"line":660,"column":3}},"306":{"start":{"line":659,"column":4},"end":{"line":659,"column":null}},"307":{"start":{"line":661,"column":21},"end":{"line":666,"column":null}},"308":{"start":{"line":661,"column":10},"end":{"line":661,"column":21}},"309":{"start":{"line":667,"column":2},"end":{"line":667,"column":null}},"310":{"start":{"line":671,"column":2},"end":{"line":673,"column":3}},"311":{"start":{"line":672,"column":4},"end":{"line":672,"column":10}},"312":{"start":{"line":674,"column":6},"end":{"line":674,"column":null}},"313":{"start":{"line":676,"column":11},"end":{"line":676,"column":null}},"314":{"start":{"line":676,"column":4},"end":{"line":676,"column":null}},"315":{"start":{"line":678,"column":4},"end":{"line":678,"column":null}},"316":{"start":{"line":679,"column":4},"end":{"line":679,"column":10}},"317":{"start":{"line":681,"column":8},"end":{"line":683,"column":null}},"318":{"start":{"line":682,"column":11},"end":{"line":682,"column":null}},"319":{"start":{"line":684,"column":2},"end":{"line":686,"column":3}},"320":{"start":{"line":685,"column":4},"end":{"line":685,"column":10}},"321":{"start":{"line":688,"column":6},"end":{"line":688,"column":null}},"322":{"start":{"line":690,"column":22},"end":{"line":690,"column":null}},"323":{"start":{"line":690,"column":10},"end":{"line":690,"column":null}},"324":{"start":{"line":691,"column":4},"end":{"line":691,"column":null}},"325":{"start":{"line":693,"column":4},"end":{"line":693,"column":null}},"326":{"start":{"line":696,"column":17},"end":{"line":696,"column":null}},"327":{"start":{"line":696,"column":8},"end":{"line":696,"column":null}},"328":{"start":{"line":697,"column":2},"end":{"line":702,"column":3}},"329":{"start":{"line":698,"column":4},"end":{"line":700,"column":null}},"330":{"start":{"line":701,"column":4},"end":{"line":701,"column":10}},"331":{"start":{"line":704,"column":27},"end":{"line":704,"column":null}},"332":{"start":{"line":704,"column":20},"end":{"line":704,"column":null}},"333":{"start":{"line":704,"column":13},"end":{"line":704,"column":20}},"334":{"start":{"line":705,"column":10},"end":{"line":705,"column":null}},"335":{"start":{"line":707,"column":6},"end":{"line":707,"column":null}},"336":{"start":{"line":709,"column":6},"end":{"line":711,"column":null}},"337":{"start":{"line":722,"column":18},"end":{"line":722,"column":null}},"338":{"start":{"line":722,"column":8},"end":{"line":722,"column":null}},"339":{"start":{"line":723,"column":2},"end":{"line":726,"column":3}},"340":{"start":{"line":724,"column":4},"end":{"line":724,"column":null}},"341":{"start":{"line":725,"column":4},"end":{"line":725,"column":10}},"342":{"start":{"line":728,"column":8},"end":{"line":728,"column":null}},"343":{"start":{"line":729,"column":8},"end":{"line":739,"column":null}},"344":{"start":{"line":741,"column":8},"end":{"line":745,"column":null}},"345":{"start":{"line":746,"column":8},"end":{"line":746,"column":null}},"346":{"start":{"line":748,"column":4},"end":{"line":748,"column":null}},"347":{"start":{"line":749,"column":4},"end":{"line":749,"column":null}},"348":{"start":{"line":751,"column":4},"end":{"line":751,"column":null}},"349":{"start":{"line":753,"column":6},"end":{"line":753,"column":null}}},"fnMap":{"0":{"name":"npuMetricsEnabled","decl":{"start":{"line":71,"column":16},"end":{"line":71,"column":33}},"loc":{"start":{"line":72,"column":55},"end":{"line":77,"column":1}}},"1":{"name":"getNpuSampleIntervalSeconds","decl":{"start":{"line":79,"column":16},"end":{"line":79,"column":43}},"loc":{"start":{"line":80,"column":55},"end":{"line":94,"column":1}}},"2":{"name":"getIdleThresholdPercent","decl":{"start":{"line":96,"column":16},"end":{"line":96,"column":39}},"loc":{"start":{"line":97,"column":55},"end":{"line":111,"column":1}}},"3":{"name":"containerHasNpuRequest","decl":{"start":{"line":113,"column":16},"end":{"line":113,"column":38}},"loc":{"start":{"line":113,"column":65},"end":{"line":123,"column":1}}},"4":{"name":"hasNpuRequest","decl":{"start":{"line":125,"column":16},"end":{"line":125,"column":29}},"loc":{"start":{"line":125,"column":61},"end":{"line":127,"column":1}}},"5":{"name":"(anonymous_30)","decl":{"start":{"line":126,"column":39},"end":{"line":126,"column":40}},"loc":{"start":{"line":126,"column":40},"end":{"line":126,"column":66}}},"6":{"name":"listNpuCardsCommand","decl":{"start":{"line":129,"column":9},"end":{"line":129,"column":28}},"loc":{"start":{"line":129,"column":28},"end":{"line":131,"column":1}}},"7":{"name":"buildNpuSamplerScript","decl":{"start":{"line":133,"column":16},"end":{"line":133,"column":37}},"loc":{"start":{"line":134,"column":55},"end":{"line":156,"column":1}}},"8":{"name":"buildNpuAggregateScript","decl":{"start":{"line":187,"column":16},"end":{"line":187,"column":39}},"loc":{"start":{"line":187,"column":39},"end":{"line":196,"column":1}}},"9":{"name":"commandHasMarker","decl":{"start":{"line":198,"column":9},"end":{"line":198,"column":25}},"loc":{"start":{"line":198,"column":55},"end":{"line":200,"column":1}}},"10":{"name":"appendExecCommand","decl":{"start":{"line":202,"column":9},"end":{"line":202,"column":26}},"loc":{"start":{"line":204,"column":23},"end":{"line":222,"column":1}}},"11":{"name":"(anonymous_36)","decl":{"start":{"line":219,"column":4},"end":{"line":219,"column":8}},"loc":{"start":{"line":219,"column":8},"end":{"line":219,"column":16}}},"12":{"name":"injectNpuMetrics","decl":{"start":{"line":224,"column":16},"end":{"line":224,"column":32}},"loc":{"start":{"line":226,"column":55},"end":{"line":267,"column":1}}},"13":{"name":"maybeInjectNpuMetrics","decl":{"start":{"line":269,"column":16},"end":{"line":269,"column":37}},"loc":{"start":{"line":269,"column":64},"end":{"line":277,"column":1}}},"14":{"name":"parseNpuAggregate","decl":{"start":{"line":279,"column":16},"end":{"line":279,"column":33}},"loc":{"start":{"line":280,"column":25},"end":{"line":322,"column":1}}},"15":{"name":"isIdleRecord","decl":{"start":{"line":324,"column":16},"end":{"line":324,"column":28}},"loc":{"start":{"line":326,"column":48},"end":{"line":332,"column":1}}},"16":{"name":"(anonymous_41)","decl":{"start":{"line":331,"column":21},"end":{"line":331,"column":22}},"loc":{"start":{"line":331,"column":22},"end":{"line":331,"column":27}}},"17":{"name":"escapePromLabelValue","decl":{"start":{"line":334,"column":16},"end":{"line":334,"column":36}},"loc":{"start":{"line":334,"column":50},"end":{"line":336,"column":1}}},"18":{"name":"formatPromLabels","decl":{"start":{"line":338,"column":16},"end":{"line":338,"column":32}},"loc":{"start":{"line":338,"column":63},"end":{"line":343,"column":1}}},"19":{"name":"(anonymous_44)","decl":{"start":{"line":340,"column":12},"end":{"line":340,"column":13}},"loc":{"start":{"line":340,"column":18},"end":{"line":340,"column":24}}},"20":{"name":"(anonymous_45)","decl":{"start":{"line":341,"column":9},"end":{"line":341,"column":10}},"loc":{"start":{"line":341,"column":16},"end":{"line":341,"column":24}}},"21":{"name":"buildNpuJobMetricsBody","decl":{"start":{"line":359,"column":16},"end":{"line":359,"column":38}},"loc":{"start":{"line":362,"column":52},"end":{"line":399,"column":1}}},"22":{"name":"(anonymous_48)","decl":{"start":{"line":385,"column":38},"end":{"line":385,"column":39}},"loc":{"start":{"line":385,"column":39},"end":{"line":385,"column":44}}},"23":{"name":"buildNpuPushFailedBody","decl":{"start":{"line":401,"column":16},"end":{"line":401,"column":38}},"loc":{"start":{"line":401,"column":59},"end":{"line":406,"column":1}}},"24":{"name":"buildPushgatewayPath","decl":{"start":{"line":408,"column":16},"end":{"line":408,"column":36}},"loc":{"start":{"line":411,"column":13},"end":{"line":416,"column":1}}},"25":{"name":"withTimeout","decl":{"start":{"line":418,"column":22},"end":{"line":418,"column":33}},"loc":{"start":{"line":420,"column":19},"end":{"line":435,"column":null}}},"26":{"name":"(anonymous_54)","decl":{"start":{"line":422,"column":30},"end":{"line":422,"column":31}},"loc":{"start":{"line":422,"column":46},"end":{"line":434,"column":3}}},"27":{"name":"(anonymous_55)","decl":{"start":{"line":423,"column":29},"end":{"line":423,"column":35}},"loc":{"start":{"line":423,"column":29},"end":{"line":423,"column":41}}},"28":{"name":"(anonymous_56)","decl":{"start":{"line":425,"column":6},"end":{"line":425,"column":11}},"loc":{"start":{"line":425,"column":11},"end":{"line":428,"column":7}}},"29":{"name":"(anonymous_57)","decl":{"start":{"line":429,"column":6},"end":{"line":429,"column":9}},"loc":{"start":{"line":429,"column":9},"end":{"line":432,"column":7}}},"30":{"name":"nodeRequest","decl":{"start":{"line":448,"column":22},"end":{"line":448,"column":33}},"loc":{"start":{"line":448,"column":50},"end":{"line":482,"column":null}}},"31":{"name":"(anonymous_61)","decl":{"start":{"line":462,"column":27},"end":{"line":462,"column":28}},"loc":{"start":{"line":462,"column":43},"end":{"line":481,"column":3}}},"32":{"name":"(anonymous_62)","decl":{"start":{"line":471,"column":6},"end":{"line":471,"column":14}},"loc":{"start":{"line":471,"column":14},"end":{"line":476,"column":7}}},"33":{"name":"(anonymous_63)","decl":{"start":{"line":473,"column":27},"end":{"line":473,"column":null}},"loc":{"start":{"line":473,"column":27},"end":{"line":474,"column":null}}},"34":{"name":"(anonymous_64)","decl":{"start":{"line":478,"column":26},"end":{"line":478,"column":32}},"loc":{"start":{"line":478,"column":26},"end":{"line":478,"column":39}}},"35":{"name":"pushToPushgateway","decl":{"start":{"line":484,"column":22},"end":{"line":484,"column":39}},"loc":{"start":{"line":488,"column":78},"end":{"line":516,"column":null}}},"36":{"name":"(anonymous_68)","decl":{"start":{"line":497,"column":24},"end":{"line":497,"column":31}},"loc":{"start":{"line":497,"column":31},"end":{"line":497,"column":45}}},"37":{"name":"decodePushSecret","decl":{"start":{"line":518,"column":16},"end":{"line":518,"column":32}},"loc":{"start":{"line":519,"column":34},"end":{"line":543,"column":1}}},"38":{"name":"(anonymous_70)","decl":{"start":{"line":522,"column":17},"end":{"line":522,"column":18}},"loc":{"start":{"line":522,"column":29},"end":{"line":533,"column":3}}},"39":{"name":"readNpuPushConfig","decl":{"start":{"line":545,"column":22},"end":{"line":545,"column":39}},"loc":{"start":{"line":545,"column":39},"end":{"line":555,"column":null}}},"40":{"name":"parseScaleSetSuffix","decl":{"start":{"line":557,"column":9},"end":{"line":557,"column":28}},"loc":{"start":{"line":557,"column":54},"end":{"line":563,"column":1}}},"41":{"name":"extractClusterFromRunnerPod","decl":{"start":{"line":565,"column":16},"end":{"line":565,"column":43}},"loc":{"start":{"line":565,"column":58},"end":{"line":587,"column":1}}},"42":{"name":"resolveNpuLabelsFromPod","decl":{"start":{"line":589,"column":16},"end":{"line":589,"column":39}},"loc":{"start":{"line":591,"column":17},"end":{"line":628,"column":1}}},"43":{"name":"(anonymous_77)","decl":{"start":{"line":616,"column":4},"end":{"line":616,"column":5}},"loc":{"start":{"line":616,"column":5},"end":{"line":616,"column":10}}},"44":{"name":"repoFromEnv","decl":{"start":{"line":630,"column":16},"end":{"line":630,"column":27}},"loc":{"start":{"line":631,"column":55},"end":{"line":642,"column":1}}},"45":{"name":"(anonymous_79)","decl":{"start":{"line":637,"column":44},"end":{"line":637,"column":45}},"loc":{"start":{"line":637,"column":45},"end":{"line":637,"column":50}}},"46":{"name":"collectNpuAggregateFromPod","decl":{"start":{"line":644,"column":22},"end":{"line":644,"column":48}},"loc":{"start":{"line":645,"column":16},"end":{"line":668,"column":null}}},"47":{"name":"(anonymous_83)","decl":{"start":{"line":652,"column":4},"end":{"line":652,"column":5}},"loc":{"start":{"line":652,"column":5},"end":{"line":652,"column":10}}},"48":{"name":"collectAndPushNpuMetrics","decl":{"start":{"line":670,"column":22},"end":{"line":670,"column":46}},"loc":{"start":{"line":670,"column":46},"end":{"line":714,"column":null}}},"49":{"name":"(anonymous_87)","decl":{"start":{"line":682,"column":4},"end":{"line":682,"column":7}},"loc":{"start":{"line":682,"column":7},"end":{"line":682,"column":null}}},"50":{"name":"collectAndPushForPod","decl":{"start":{"line":716,"column":15},"end":{"line":716,"column":35}},"loc":{"start":{"line":720,"column":23},"end":{"line":758,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":72,"column":2},"end":{"line":72,"column":null}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":72,"column":null}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":75,"column":5},"end":{"line":75,"column":39}},"type":"cond-expr","locations":[{"start":{"line":75,"column":33},"end":{"line":75,"column":37}},{"start":{"line":75,"column":37},"end":{"line":75,"column":39}}]},"2":{"loc":{"start":{"line":75,"column":5},"end":{"line":75,"column":37}},"type":"binary-expr","locations":[{"start":{"line":75,"column":5},"end":{"line":75,"column":37}},{"start":{"line":75,"column":33},"end":{"line":75,"column":37}}]},"3":{"loc":{"start":{"line":80,"column":2},"end":{"line":80,"column":null}},"type":"if","locations":[{"start":{"line":80,"column":2},"end":{"line":80,"column":null}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":83,"column":2},"end":{"line":85,"column":3}},"type":"if","locations":[{"start":{"line":83,"column":2},"end":{"line":85,"column":3}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":87,"column":2},"end":{"line":92,"column":3}},"type":"if","locations":[{"start":{"line":87,"column":2},"end":{"line":92,"column":3}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":87,"column":6},"end":{"line":87,"column":45}},"type":"binary-expr","locations":[{"start":{"line":87,"column":6},"end":{"line":87,"column":30}},{"start":{"line":87,"column":34},"end":{"line":87,"column":45}}]},"7":{"loc":{"start":{"line":97,"column":2},"end":{"line":97,"column":null}},"type":"if","locations":[{"start":{"line":97,"column":2},"end":{"line":97,"column":null}},{"start":{},"end":{}}]},"8":{"loc":{"start":{"line":100,"column":2},"end":{"line":102,"column":3}},"type":"if","locations":[{"start":{"line":100,"column":2},"end":{"line":102,"column":3}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":104,"column":2},"end":{"line":109,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":109,"column":3}},{"start":{},"end":{}}]},"10":{"loc":{"start":{"line":104,"column":6},"end":{"line":104,"column":44}},"type":"binary-expr","locations":[{"start":{"line":104,"column":6},"end":{"line":104,"column":30}},{"start":{"line":104,"column":34},"end":{"line":104,"column":44}}]},"11":{"loc":{"start":{"line":114,"column":21},"end":{"line":114,"column":50}},"type":"cond-expr","locations":[{"start":{"line":114,"column":40},"end":{"line":114,"column":42}},{"start":{"line":114,"column":40},"end":{"line":114,"column":50}}]},"12":{"loc":{"start":{"line":114,"column":21},"end":{"line":114,"column":42}},"type":"binary-expr","locations":[{"start":{"line":114,"column":21},"end":{"line":114,"column":42}},{"start":{"line":114,"column":40},"end":{"line":114,"column":42}}]},"13":{"loc":{"start":{"line":114,"column":52},"end":{"line":114,"column":79}},"type":"cond-expr","locations":[{"start":{"line":114,"column":71},"end":{"line":114,"column":73}},{"start":{"line":114,"column":71},"end":{"line":114,"column":79}}]},"14":{"loc":{"start":{"line":114,"column":52},"end":{"line":114,"column":73}},"type":"binary-expr","locations":[{"start":{"line":114,"column":52},"end":{"line":114,"column":73}},{"start":{"line":114,"column":71},"end":{"line":114,"column":73}}]},"15":{"loc":{"start":{"line":116,"column":34},"end":{"line":116,"column":45}},"type":"cond-expr","locations":[{"start":{"line":116,"column":34},"end":{"line":116,"column":39}},{"start":{"line":116,"column":43},"end":{"line":116,"column":45}}]},"16":{"loc":{"start":{"line":116,"column":34},"end":{"line":116,"column":43}},"type":"binary-expr","locations":[{"start":{"line":116,"column":34},"end":{"line":116,"column":43}},{"start":{"line":116,"column":34},"end":{"line":116,"column":43}}]},"17":{"loc":{"start":{"line":117,"column":6},"end":{"line":119,"column":7}},"type":"if","locations":[{"start":{"line":117,"column":6},"end":{"line":119,"column":7}},{"start":{},"end":{}}]},"18":{"loc":{"start":{"line":126,"column":10},"end":{"line":126,"column":32}},"type":"cond-expr","locations":[{"start":{"line":126,"column":26},"end":{"line":126,"column":30}},{"start":{"line":126,"column":30},"end":{"line":126,"column":32}}]},"19":{"loc":{"start":{"line":126,"column":10},"end":{"line":126,"column":30}},"type":"binary-expr","locations":[{"start":{"line":126,"column":10},"end":{"line":126,"column":30}},{"start":{"line":126,"column":26},"end":{"line":126,"column":30}}]},"20":{"loc":{"start":{"line":126,"column":10},"end":{"line":126,"column":26}},"type":"cond-expr","locations":[{"start":{"line":126,"column":14},"end":{"line":126,"column":16}},{"start":{"line":126,"column":10},"end":{"line":126,"column":26}}]},"21":{"loc":{"start":{"line":126,"column":10},"end":{"line":126,"column":16}},"type":"binary-expr","locations":[{"start":{"line":126,"column":10},"end":{"line":126,"column":16}},{"start":{"line":126,"column":10},"end":{"line":126,"column":16}}]},"22":{"loc":{"start":{"line":134,"column":2},"end":{"line":134,"column":null}},"type":"if","locations":[{"start":{"line":134,"column":2},"end":{"line":134,"column":null}},{"start":{},"end":{}}]},"23":{"loc":{"start":{"line":199,"column":10},"end":{"line":199,"column":23}},"type":"cond-expr","locations":[{"start":{"line":199,"column":10},"end":{"line":199,"column":17}},{"start":{"line":199,"column":21},"end":{"line":199,"column":23}}]},"24":{"loc":{"start":{"line":199,"column":10},"end":{"line":199,"column":21}},"type":"binary-expr","locations":[{"start":{"line":199,"column":10},"end":{"line":199,"column":21}},{"start":{"line":199,"column":10},"end":{"line":199,"column":21}}]},"25":{"loc":{"start":{"line":206,"column":2},"end":{"line":217,"column":3}},"type":"if","locations":[{"start":{"line":206,"column":2},"end":{"line":217,"column":3}},{"start":{},"end":{}}]},"26":{"loc":{"start":{"line":207,"column":4},"end":{"line":210,"column":24}},"type":"binary-expr","locations":[{"start":{"line":207,"column":4},"end":{"line":207,"column":12}},{"start":{"line":208,"column":4},"end":{"line":208,"column":24}},{"start":{"line":209,"column":4},"end":{"line":209,"column":33}},{"start":{"line":210,"column":4},"end":{"line":210,"column":24}}]},"27":{"loc":{"start":{"line":218,"column":18},"end":{"line":218,"column":32}},"type":"cond-expr","locations":[{"start":{"line":218,"column":18},"end":{"line":218,"column":26}},{"start":{"line":218,"column":30},"end":{"line":218,"column":32}}]},"28":{"loc":{"start":{"line":218,"column":18},"end":{"line":218,"column":30}},"type":"binary-expr","locations":[{"start":{"line":218,"column":18},"end":{"line":218,"column":30}},{"start":{"line":218,"column":18},"end":{"line":218,"column":30}}]},"29":{"loc":{"start":{"line":226,"column":2},"end":{"line":226,"column":null}},"type":"if","locations":[{"start":{"line":226,"column":2},"end":{"line":226,"column":null}},{"start":{},"end":{}}]},"30":{"loc":{"start":{"line":228,"column":20},"end":{"line":228,"column":45}},"type":"cond-expr","locations":[{"start":{"line":228,"column":39},"end":{"line":228,"column":43}},{"start":{"line":228,"column":43},"end":{"line":228,"column":45}}]},"31":{"loc":{"start":{"line":228,"column":20},"end":{"line":228,"column":43}},"type":"binary-expr","locations":[{"start":{"line":228,"column":20},"end":{"line":228,"column":43}},{"start":{"line":228,"column":39},"end":{"line":228,"column":43}}]},"32":{"loc":{"start":{"line":229,"column":2},"end":{"line":234,"column":3}},"type":"if","locations":[{"start":{"line":229,"column":2},"end":{"line":234,"column":3}},{"start":{},"end":{}}]},"33":{"loc":{"start":{"line":230,"column":4},"end":{"line":231,"column":54}},"type":"binary-expr","locations":[{"start":{"line":230,"column":4},"end":{"line":230,"column":56}},{"start":{"line":231,"column":4},"end":{"line":231,"column":54}}]},"34":{"loc":{"start":{"line":230,"column":21},"end":{"line":230,"column":55}},"type":"cond-expr","locations":[{"start":{"line":230,"column":46},"end":{"line":230,"column":48}},{"start":{"line":230,"column":46},"end":{"line":230,"column":55}}]},"35":{"loc":{"start":{"line":230,"column":21},"end":{"line":230,"column":48}},"type":"binary-expr","locations":[{"start":{"line":230,"column":21},"end":{"line":230,"column":48}},{"start":{"line":230,"column":46},"end":{"line":230,"column":48}}]},"36":{"loc":{"start":{"line":230,"column":21},"end":{"line":230,"column":46}},"type":"cond-expr","locations":[{"start":{"line":230,"column":40},"end":{"line":230,"column":42}},{"start":{"line":230,"column":40},"end":{"line":230,"column":46}}]},"37":{"loc":{"start":{"line":230,"column":21},"end":{"line":230,"column":42}},"type":"binary-expr","locations":[{"start":{"line":230,"column":21},"end":{"line":230,"column":42}},{"start":{"line":230,"column":40},"end":{"line":230,"column":42}}]},"38":{"loc":{"start":{"line":231,"column":21},"end":{"line":231,"column":53}},"type":"cond-expr","locations":[{"start":{"line":231,"column":44},"end":{"line":231,"column":46}},{"start":{"line":231,"column":44},"end":{"line":231,"column":53}}]},"39":{"loc":{"start":{"line":231,"column":21},"end":{"line":231,"column":46}},"type":"binary-expr","locations":[{"start":{"line":231,"column":21},"end":{"line":231,"column":46}},{"start":{"line":231,"column":44},"end":{"line":231,"column":46}}]},"40":{"loc":{"start":{"line":231,"column":21},"end":{"line":231,"column":44}},"type":"cond-expr","locations":[{"start":{"line":231,"column":38},"end":{"line":231,"column":40}},{"start":{"line":231,"column":38},"end":{"line":231,"column":44}}]},"41":{"loc":{"start":{"line":231,"column":21},"end":{"line":231,"column":40}},"type":"binary-expr","locations":[{"start":{"line":231,"column":21},"end":{"line":231,"column":40}},{"start":{"line":231,"column":38},"end":{"line":231,"column":40}}]},"42":{"loc":{"start":{"line":236,"column":2},"end":{"line":244,"column":3}},"type":"if","locations":[{"start":{"line":236,"column":2},"end":{"line":244,"column":3}},{"start":{},"end":{}}]},"43":{"loc":{"start":{"line":237,"column":4},"end":{"line":238,"column":50}},"type":"binary-expr","locations":[{"start":{"line":237,"column":5},"end":{"line":237,"column":24}},{"start":{"line":237,"column":28},"end":{"line":237,"column":53}},{"start":{"line":238,"column":5},"end":{"line":238,"column":22}},{"start":{"line":238,"column":26},"end":{"line":238,"column":49}}]},"44":{"loc":{"start":{"line":251,"column":33},"end":{"line":251,"column":67}},"type":"cond-expr","locations":[{"start":{"line":251,"column":58},"end":{"line":251,"column":60}},{"start":{"line":251,"column":58},"end":{"line":251,"column":67}}]},"45":{"loc":{"start":{"line":251,"column":33},"end":{"line":251,"column":60}},"type":"binary-expr","locations":[{"start":{"line":251,"column":33},"end":{"line":251,"column":60}},{"start":{"line":251,"column":58},"end":{"line":251,"column":60}}]},"46":{"loc":{"start":{"line":251,"column":33},"end":{"line":251,"column":58}},"type":"cond-expr","locations":[{"start":{"line":251,"column":52},"end":{"line":251,"column":54}},{"start":{"line":251,"column":52},"end":{"line":251,"column":58}}]},"47":{"loc":{"start":{"line":251,"column":33},"end":{"line":251,"column":54}},"type":"binary-expr","locations":[{"start":{"line":251,"column":33},"end":{"line":251,"column":54}},{"start":{"line":251,"column":52},"end":{"line":251,"column":54}}]},"48":{"loc":{"start":{"line":259,"column":33},"end":{"line":259,"column":65}},"type":"cond-expr","locations":[{"start":{"line":259,"column":56},"end":{"line":259,"column":58}},{"start":{"line":259,"column":56},"end":{"line":259,"column":65}}]},"49":{"loc":{"start":{"line":259,"column":33},"end":{"line":259,"column":58}},"type":"binary-expr","locations":[{"start":{"line":259,"column":33},"end":{"line":259,"column":58}},{"start":{"line":259,"column":56},"end":{"line":259,"column":58}}]},"50":{"loc":{"start":{"line":259,"column":33},"end":{"line":259,"column":56}},"type":"cond-expr","locations":[{"start":{"line":259,"column":50},"end":{"line":259,"column":52}},{"start":{"line":259,"column":50},"end":{"line":259,"column":56}}]},"51":{"loc":{"start":{"line":259,"column":33},"end":{"line":259,"column":52}},"type":"binary-expr","locations":[{"start":{"line":259,"column":33},"end":{"line":259,"column":52}},{"start":{"line":259,"column":50},"end":{"line":259,"column":52}}]},"52":{"loc":{"start":{"line":270,"column":2},"end":{"line":272,"column":3}},"type":"if","locations":[{"start":{"line":270,"column":2},"end":{"line":272,"column":3}},{"start":{},"end":{}}]},"53":{"loc":{"start":{"line":273,"column":2},"end":{"line":275,"column":3}},"type":"if","locations":[{"start":{"line":273,"column":2},"end":{"line":275,"column":3}},{"start":{},"end":{}}]},"54":{"loc":{"start":{"line":282,"column":2},"end":{"line":284,"column":3}},"type":"if","locations":[{"start":{"line":282,"column":2},"end":{"line":284,"column":3}},{"start":{},"end":{}}]},"55":{"loc":{"start":{"line":286,"column":2},"end":{"line":288,"column":3}},"type":"if","locations":[{"start":{"line":286,"column":2},"end":{"line":288,"column":3}},{"start":{},"end":{}}]},"56":{"loc":{"start":{"line":291,"column":2},"end":{"line":293,"column":3}},"type":"if","locations":[{"start":{"line":291,"column":2},"end":{"line":293,"column":3}},{"start":{},"end":{}}]},"57":{"loc":{"start":{"line":301,"column":4},"end":{"line":303,"column":5}},"type":"if","locations":[{"start":{"line":301,"column":4},"end":{"line":303,"column":5}},{"start":{},"end":{}}]},"58":{"loc":{"start":{"line":301,"column":8},"end":{"line":301,"column":72}},"type":"binary-expr","locations":[{"start":{"line":301,"column":8},"end":{"line":301,"column":40}},{"start":{"line":301,"column":44},"end":{"line":301,"column":72}}]},"59":{"loc":{"start":{"line":301,"column":8},"end":{"line":301,"column":17}},"type":"cond-expr","locations":[{"start":{"line":301,"column":14},"end":{"line":301,"column":16}},{"start":{"line":301,"column":8},"end":{"line":301,"column":17}}]},"60":{"loc":{"start":{"line":301,"column":8},"end":{"line":301,"column":16}},"type":"binary-expr","locations":[{"start":{"line":301,"column":8},"end":{"line":301,"column":16}},{"start":{"line":301,"column":8},"end":{"line":301,"column":16}}]},"61":{"loc":{"start":{"line":306,"column":6},"end":{"line":308,"column":7}},"type":"if","locations":[{"start":{"line":306,"column":6},"end":{"line":308,"column":7}},{"start":{},"end":{}}]},"62":{"loc":{"start":{"line":306,"column":10},"end":{"line":306,"column":66}},"type":"binary-expr","locations":[{"start":{"line":306,"column":10},"end":{"line":306,"column":20}},{"start":{"line":306,"column":24},"end":{"line":306,"column":45}},{"start":{"line":306,"column":49},"end":{"line":306,"column":66}}]},"63":{"loc":{"start":{"line":311,"column":17},"end":{"line":311,"column":33}},"type":"binary-expr","locations":[{"start":{"line":311,"column":17},"end":{"line":311,"column":28}},{"start":{"line":311,"column":32},"end":{"line":311,"column":33}}]},"64":{"loc":{"start":{"line":312,"column":18},"end":{"line":312,"column":35}},"type":"binary-expr","locations":[{"start":{"line":312,"column":18},"end":{"line":312,"column":30}},{"start":{"line":312,"column":34},"end":{"line":312,"column":35}}]},"65":{"loc":{"start":{"line":313,"column":17},"end":{"line":313,"column":34}},"type":"binary-expr","locations":[{"start":{"line":313,"column":17},"end":{"line":313,"column":29}},{"start":{"line":313,"column":33},"end":{"line":313,"column":34}}]},"66":{"loc":{"start":{"line":314,"column":17},"end":{"line":314,"column":34}},"type":"binary-expr","locations":[{"start":{"line":314,"column":17},"end":{"line":314,"column":29}},{"start":{"line":314,"column":33},"end":{"line":314,"column":34}}]},"67":{"loc":{"start":{"line":315,"column":17},"end":{"line":315,"column":34}},"type":"binary-expr","locations":[{"start":{"line":315,"column":17},"end":{"line":315,"column":29}},{"start":{"line":315,"column":33},"end":{"line":315,"column":34}}]},"68":{"loc":{"start":{"line":316,"column":16},"end":{"line":316,"column":33}},"type":"binary-expr","locations":[{"start":{"line":316,"column":16},"end":{"line":316,"column":28}},{"start":{"line":316,"column":32},"end":{"line":316,"column":33}}]},"69":{"loc":{"start":{"line":319,"column":36},"end":{"line":319,"column":58}},"type":"binary-expr","locations":[{"start":{"line":319,"column":36},"end":{"line":319,"column":53}},{"start":{"line":319,"column":57},"end":{"line":319,"column":58}}]},"70":{"loc":{"start":{"line":326,"column":2},"end":{"line":326,"column":null}},"type":"if","locations":[{"start":{"line":326,"column":2},"end":{"line":326,"column":null}},{"start":{},"end":{}}]},"71":{"loc":{"start":{"line":328,"column":2},"end":{"line":330,"column":3}},"type":"if","locations":[{"start":{"line":328,"column":2},"end":{"line":330,"column":3}},{"start":{},"end":{}}]},"72":{"loc":{"start":{"line":331,"column":26},"end":{"line":331,"column":73}},"type":"binary-expr","locations":[{"start":{"line":331,"column":26},"end":{"line":331,"column":48}},{"start":{"line":331,"column":52},"end":{"line":331,"column":73}}]},"73":{"loc":{"start":{"line":362,"column":2},"end":{"line":362,"column":null}},"type":"if","locations":[{"start":{"line":362,"column":2},"end":{"line":362,"column":null}},{"start":{},"end":{}}]},"74":{"loc":{"start":{"line":375,"column":15},"end":{"line":375,"column":68}},"type":"cond-expr","locations":[{"start":{"line":375,"column":52},"end":{"line":375,"column":58}},{"start":{"line":375,"column":61},"end":{"line":375,"column":68}}]},"75":{"loc":{"start":{"line":422,"column":9},"end":{"line":434,"column":null}},"type":"switch","locations":[{"start":{"line":422,"column":9},"end":{"line":434,"column":null}},{"start":{"line":422,"column":2},"end":{"line":434,"column":null}}]},"76":{"loc":{"start":{"line":462,"column":2},"end":{"line":481,"column":null}},"type":"switch","locations":[{"start":{"line":462,"column":2},"end":{"line":481,"column":null}}]},"77":{"loc":{"start":{"line":452,"column":17},"end":{"line":452,"column":59}},"type":"cond-expr","locations":[{"start":{"line":452,"column":47},"end":{"line":452,"column":51}},{"start":{"line":452,"column":54},"end":{"line":452,"column":59}}]},"78":{"loc":{"start":{"line":456,"column":2},"end":{"line":461,"column":3}},"type":"if","locations":[{"start":{"line":456,"column":2},"end":{"line":461,"column":3}},{"start":{},"end":{}}]},"79":{"loc":{"start":{"line":456,"column":6},"end":{"line":456,"column":62}},"type":"binary-expr","locations":[{"start":{"line":456,"column":6},"end":{"line":456,"column":32}},{"start":{"line":456,"column":36},"end":{"line":456,"column":62}}]},"80":{"loc":{"start":{"line":458,"column":9},"end":{"line":458,"column":27}},"type":"cond-expr","locations":[{"start":{"line":458,"column":21},"end":{"line":458,"column":25}},{"start":{"line":458,"column":25},"end":{"line":458,"column":27}}]},"81":{"loc":{"start":{"line":458,"column":9},"end":{"line":458,"column":25}},"type":"binary-expr","locations":[{"start":{"line":458,"column":9},"end":{"line":458,"column":25}},{"start":{"line":458,"column":21},"end":{"line":458,"column":25}}]},"82":{"loc":{"start":{"line":458,"column":31},"end":{"line":458,"column":49}},"type":"cond-expr","locations":[{"start":{"line":458,"column":43},"end":{"line":458,"column":47}},{"start":{"line":458,"column":47},"end":{"line":458,"column":49}}]},"83":{"loc":{"start":{"line":458,"column":31},"end":{"line":458,"column":47}},"type":"binary-expr","locations":[{"start":{"line":458,"column":31},"end":{"line":458,"column":47}},{"start":{"line":458,"column":43},"end":{"line":458,"column":47}}]},"84":{"loc":{"start":{"line":468,"column":17},"end":{"line":468,"column":38}},"type":"cond-expr","locations":[{"start":{"line":468,"column":30},"end":{"line":468,"column":34}},{"start":{"line":468,"column":34},"end":{"line":468,"column":38}}]},"85":{"loc":{"start":{"line":468,"column":17},"end":{"line":468,"column":34}},"type":"binary-expr","locations":[{"start":{"line":468,"column":17},"end":{"line":468,"column":34}},{"start":{"line":468,"column":30},"end":{"line":468,"column":34}}]},"86":{"loc":{"start":{"line":474,"column":32},"end":{"line":474,"column":56}},"type":"cond-expr","locations":[{"start":{"line":474,"column":51},"end":{"line":474,"column":55}},{"start":{"line":474,"column":55},"end":{"line":474,"column":56}}]},"87":{"loc":{"start":{"line":474,"column":32},"end":{"line":474,"column":55}},"type":"binary-expr","locations":[{"start":{"line":474,"column":32},"end":{"line":474,"column":55}},{"start":{"line":474,"column":51},"end":{"line":474,"column":55}}]},"88":{"loc":{"start":{"line":515,"column":2},"end":{"line":515,"column":null}},"type":"switch","locations":[{"start":{"line":515,"column":2},"end":{"line":515,"column":null}}]},"89":{"loc":{"start":{"line":490,"column":18},"end":{"line":490,"column":39}},"type":"cond-expr","locations":[{"start":{"line":490,"column":34},"end":{"line":490,"column":38}},{"start":{"line":490,"column":38},"end":{"line":490,"column":39}}]},"90":{"loc":{"start":{"line":490,"column":18},"end":{"line":490,"column":38}},"type":"binary-expr","locations":[{"start":{"line":490,"column":18},"end":{"line":490,"column":38}},{"start":{"line":490,"column":34},"end":{"line":490,"column":38}}]},"91":{"loc":{"start":{"line":490,"column":18},"end":{"line":490,"column":34}},"type":"cond-expr","locations":[{"start":{"line":490,"column":25},"end":{"line":490,"column":27}},{"start":{"line":490,"column":18},"end":{"line":490,"column":34}}]},"92":{"loc":{"start":{"line":490,"column":18},"end":{"line":490,"column":27}},"type":"binary-expr","locations":[{"start":{"line":490,"column":18},"end":{"line":490,"column":27}},{"start":{"line":490,"column":18},"end":{"line":490,"column":27}}]},"93":{"loc":{"start":{"line":491,"column":23},"end":{"line":491,"column":52}},"type":"cond-expr","locations":[{"start":{"line":491,"column":44},"end":{"line":491,"column":48}},{"start":{"line":491,"column":48},"end":{"line":491,"column":52}}]},"94":{"loc":{"start":{"line":491,"column":23},"end":{"line":491,"column":48}},"type":"binary-expr","locations":[{"start":{"line":491,"column":23},"end":{"line":491,"column":48}},{"start":{"line":491,"column":44},"end":{"line":491,"column":48}}]},"95":{"loc":{"start":{"line":491,"column":23},"end":{"line":491,"column":44}},"type":"cond-expr","locations":[{"start":{"line":491,"column":30},"end":{"line":491,"column":32}},{"start":{"line":491,"column":23},"end":{"line":491,"column":44}}]},"96":{"loc":{"start":{"line":491,"column":23},"end":{"line":491,"column":32}},"type":"binary-expr","locations":[{"start":{"line":491,"column":23},"end":{"line":491,"column":32}},{"start":{"line":491,"column":23},"end":{"line":491,"column":32}}]},"97":{"loc":{"start":{"line":492,"column":20},"end":{"line":492,"column":53}},"type":"cond-expr","locations":[{"start":{"line":492,"column":38},"end":{"line":492,"column":42}},{"start":{"line":492,"column":42},"end":{"line":492,"column":53}}]},"98":{"loc":{"start":{"line":492,"column":20},"end":{"line":492,"column":42}},"type":"binary-expr","locations":[{"start":{"line":492,"column":20},"end":{"line":492,"column":42}},{"start":{"line":492,"column":38},"end":{"line":492,"column":42}}]},"99":{"loc":{"start":{"line":492,"column":20},"end":{"line":492,"column":38}},"type":"cond-expr","locations":[{"start":{"line":492,"column":27},"end":{"line":492,"column":29}},{"start":{"line":492,"column":20},"end":{"line":492,"column":38}}]},"100":{"loc":{"start":{"line":492,"column":20},"end":{"line":492,"column":29}},"type":"binary-expr","locations":[{"start":{"line":492,"column":20},"end":{"line":492,"column":29}},{"start":{"line":492,"column":20},"end":{"line":492,"column":29}}]},"101":{"loc":{"start":{"line":495,"column":24},"end":{"line":495,"column":44}},"type":"if","locations":[{"start":{"line":495,"column":24},"end":{"line":495,"column":44}},{"start":{},"end":{}}]},"102":{"loc":{"start":{"line":496,"column":8},"end":{"line":496,"column":15}},"type":"if","locations":[{"start":{"line":496,"column":8},"end":{"line":496,"column":15}},{"start":{},"end":{}}]},"103":{"loc":{"start":{"line":507,"column":6},"end":{"line":509,"column":7}},"type":"if","locations":[{"start":{"line":507,"column":6},"end":{"line":509,"column":7}},{"start":{},"end":{}}]},"104":{"loc":{"start":{"line":507,"column":10},"end":{"line":507,"column":65}},"type":"binary-expr","locations":[{"start":{"line":507,"column":10},"end":{"line":507,"column":36}},{"start":{"line":507,"column":40},"end":{"line":507,"column":65}}]},"105":{"loc":{"start":{"line":515,"column":8},"end":{"line":515,"column":77}},"type":"cond-expr","locations":[{"start":{"line":515,"column":37},"end":{"line":515,"column":46}},{"start":{"line":515,"column":49},"end":{"line":515,"column":77}}]},"106":{"loc":{"start":{"line":521,"column":15},"end":{"line":521,"column":33}},"type":"cond-expr","locations":[{"start":{"line":521,"column":27},"end":{"line":521,"column":31}},{"start":{"line":521,"column":31},"end":{"line":521,"column":33}}]},"107":{"loc":{"start":{"line":521,"column":15},"end":{"line":521,"column":31}},"type":"binary-expr","locations":[{"start":{"line":521,"column":15},"end":{"line":521,"column":31}},{"start":{"line":521,"column":27},"end":{"line":521,"column":31}}]},"108":{"loc":{"start":{"line":521,"column":15},"end":{"line":521,"column":27}},"type":"cond-expr","locations":[{"start":{"line":521,"column":21},"end":{"line":521,"column":23}},{"start":{"line":521,"column":15},"end":{"line":521,"column":27}}]},"109":{"loc":{"start":{"line":521,"column":15},"end":{"line":521,"column":23}},"type":"binary-expr","locations":[{"start":{"line":521,"column":15},"end":{"line":521,"column":23}},{"start":{"line":521,"column":15},"end":{"line":521,"column":23}}]},"110":{"loc":{"start":{"line":524,"column":4},"end":{"line":526,"column":5}},"type":"if","locations":[{"start":{"line":524,"column":4},"end":{"line":526,"column":5}},{"start":{},"end":{}}]},"111":{"loc":{"start":{"line":529,"column":13},"end":{"line":529,"column":49}},"type":"cond-expr","locations":[{"start":{"line":529,"column":30},"end":{"line":529,"column":37}},{"start":{"line":529,"column":40},"end":{"line":529,"column":49}}]},"112":{"loc":{"start":{"line":535,"column":2},"end":{"line":537,"column":3}},"type":"if","locations":[{"start":{"line":535,"column":2},"end":{"line":537,"column":3}},{"start":{},"end":{}}]},"113":{"loc":{"start":{"line":558,"column":2},"end":{"line":560,"column":3}},"type":"if","locations":[{"start":{"line":558,"column":2},"end":{"line":560,"column":3}},{"start":{},"end":{}}]},"114":{"loc":{"start":{"line":562,"column":9},"end":{"line":562,"column":37}},"type":"cond-expr","locations":[{"start":{"line":562,"column":17},"end":{"line":562,"column":25}},{"start":{"line":562,"column":28},"end":{"line":562,"column":37}}]},"115":{"loc":{"start":{"line":566,"column":17},"end":{"line":566,"column":43}},"type":"cond-expr","locations":[{"start":{"line":566,"column":37},"end":{"line":566,"column":41}},{"start":{"line":566,"column":41},"end":{"line":566,"column":43}}]},"116":{"loc":{"start":{"line":566,"column":17},"end":{"line":566,"column":41}},"type":"binary-expr","locations":[{"start":{"line":566,"column":17},"end":{"line":566,"column":41}},{"start":{"line":566,"column":37},"end":{"line":566,"column":41}}]},"117":{"loc":{"start":{"line":566,"column":17},"end":{"line":566,"column":37}},"type":"cond-expr","locations":[{"start":{"line":566,"column":29},"end":{"line":566,"column":31}},{"start":{"line":566,"column":29},"end":{"line":566,"column":37}}]},"118":{"loc":{"start":{"line":566,"column":17},"end":{"line":566,"column":31}},"type":"binary-expr","locations":[{"start":{"line":566,"column":17},"end":{"line":566,"column":31}},{"start":{"line":566,"column":29},"end":{"line":566,"column":31}}]},"119":{"loc":{"start":{"line":567,"column":22},"end":{"line":567,"column":53}},"type":"cond-expr","locations":[{"start":{"line":567,"column":47},"end":{"line":567,"column":51}},{"start":{"line":567,"column":51},"end":{"line":567,"column":53}}]},"120":{"loc":{"start":{"line":567,"column":22},"end":{"line":567,"column":51}},"type":"binary-expr","locations":[{"start":{"line":567,"column":22},"end":{"line":567,"column":51}},{"start":{"line":567,"column":47},"end":{"line":567,"column":51}}]},"121":{"loc":{"start":{"line":567,"column":22},"end":{"line":567,"column":47}},"type":"cond-expr","locations":[{"start":{"line":567,"column":34},"end":{"line":567,"column":36}},{"start":{"line":567,"column":34},"end":{"line":567,"column":47}}]},"122":{"loc":{"start":{"line":567,"column":22},"end":{"line":567,"column":36}},"type":"binary-expr","locations":[{"start":{"line":567,"column":22},"end":{"line":567,"column":36}},{"start":{"line":567,"column":34},"end":{"line":567,"column":36}}]},"123":{"loc":{"start":{"line":573,"column":4},"end":{"line":578,"column":5}},"type":"if","locations":[{"start":{"line":573,"column":4},"end":{"line":578,"column":5}},{"start":{},"end":{}}]},"124":{"loc":{"start":{"line":575,"column":6},"end":{"line":577,"column":7}},"type":"if","locations":[{"start":{"line":575,"column":6},"end":{"line":577,"column":7}},{"start":{},"end":{}}]},"125":{"loc":{"start":{"line":582,"column":4},"end":{"line":584,"column":5}},"type":"if","locations":[{"start":{"line":582,"column":4},"end":{"line":584,"column":5}},{"start":{},"end":{}}]},"126":{"loc":{"start":{"line":586,"column":9},"end":{"line":586,"column":61}},"type":"cond-expr","locations":[{"start":{"line":586,"column":48},"end":{"line":586,"column":52}},{"start":{"line":586,"column":52},"end":{"line":586,"column":61}}]},"127":{"loc":{"start":{"line":586,"column":9},"end":{"line":586,"column":52}},"type":"binary-expr","locations":[{"start":{"line":586,"column":9},"end":{"line":586,"column":52}},{"start":{"line":586,"column":48},"end":{"line":586,"column":52}}]},"128":{"loc":{"start":{"line":586,"column":29},"end":{"line":586,"column":47}},"type":"cond-expr","locations":[{"start":{"line":586,"column":41},"end":{"line":586,"column":43}},{"start":{"line":586,"column":41},"end":{"line":586,"column":47}}]},"129":{"loc":{"start":{"line":586,"column":29},"end":{"line":586,"column":43}},"type":"binary-expr","locations":[{"start":{"line":586,"column":29},"end":{"line":586,"column":43}},{"start":{"line":586,"column":41},"end":{"line":586,"column":43}}]},"130":{"loc":{"start":{"line":598,"column":18},"end":{"line":598,"column":66}},"type":"cond-expr","locations":[{"start":{"line":598,"column":47},"end":{"line":598,"column":53}},{"start":{"line":598,"column":56},"end":{"line":598,"column":66}}]},"131":{"loc":{"start":{"line":601,"column":26},"end":{"line":601,"column":52}},"type":"cond-expr","locations":[{"start":{"line":601,"column":46},"end":{"line":601,"column":50}},{"start":{"line":601,"column":50},"end":{"line":601,"column":52}}]},"132":{"loc":{"start":{"line":601,"column":26},"end":{"line":601,"column":50}},"type":"binary-expr","locations":[{"start":{"line":601,"column":26},"end":{"line":601,"column":50}},{"start":{"line":601,"column":46},"end":{"line":601,"column":50}}]},"133":{"loc":{"start":{"line":601,"column":26},"end":{"line":601,"column":46}},"type":"cond-expr","locations":[{"start":{"line":601,"column":34},"end":{"line":601,"column":36}},{"start":{"line":601,"column":34},"end":{"line":601,"column":46}}]},"134":{"loc":{"start":{"line":601,"column":26},"end":{"line":601,"column":36}},"type":"binary-expr","locations":[{"start":{"line":601,"column":26},"end":{"line":601,"column":36}},{"start":{"line":601,"column":34},"end":{"line":601,"column":36}}]},"135":{"loc":{"start":{"line":603,"column":6},"end":{"line":603,"column":35}},"type":"cond-expr","locations":[{"start":{"line":603,"column":25},"end":{"line":603,"column":27}},{"start":{"line":603,"column":25},"end":{"line":603,"column":35}}]},"136":{"loc":{"start":{"line":603,"column":6},"end":{"line":603,"column":27}},"type":"binary-expr","locations":[{"start":{"line":603,"column":6},"end":{"line":603,"column":27}},{"start":{"line":603,"column":25},"end":{"line":603,"column":27}}]},"137":{"loc":{"start":{"line":604,"column":6},"end":{"line":604,"column":33}},"type":"cond-expr","locations":[{"start":{"line":604,"column":25},"end":{"line":604,"column":27}},{"start":{"line":604,"column":25},"end":{"line":604,"column":33}}]},"138":{"loc":{"start":{"line":604,"column":6},"end":{"line":604,"column":27}},"type":"binary-expr","locations":[{"start":{"line":604,"column":6},"end":{"line":604,"column":27}},{"start":{"line":604,"column":25},"end":{"line":604,"column":27}}]},"139":{"loc":{"start":{"line":606,"column":51},"end":{"line":606,"column":66}},"type":"cond-expr","locations":[{"start":{"line":606,"column":51},"end":{"line":606,"column":60}},{"start":{"line":606,"column":64},"end":{"line":606,"column":66}}]},"140":{"loc":{"start":{"line":606,"column":51},"end":{"line":606,"column":64}},"type":"binary-expr","locations":[{"start":{"line":606,"column":51},"end":{"line":606,"column":64}},{"start":{"line":606,"column":51},"end":{"line":606,"column":64}}]},"141":{"loc":{"start":{"line":608,"column":8},"end":{"line":611,"column":9}},"type":"if","locations":[{"start":{"line":608,"column":8},"end":{"line":611,"column":9}},{"start":{},"end":{}}]},"142":{"loc":{"start":{"line":610,"column":34},"end":{"line":610,"column":69}},"type":"binary-expr","locations":[{"start":{"line":610,"column":34},"end":{"line":610,"column":64}},{"start":{"line":610,"column":68},"end":{"line":610,"column":69}}]},"143":{"loc":{"start":{"line":615,"column":22},"end":{"line":615,"column":57}},"type":"cond-expr","locations":[{"start":{"line":615,"column":51},"end":{"line":615,"column":55}},{"start":{"line":615,"column":55},"end":{"line":615,"column":57}}]},"144":{"loc":{"start":{"line":615,"column":22},"end":{"line":615,"column":55}},"type":"binary-expr","locations":[{"start":{"line":615,"column":22},"end":{"line":615,"column":55}},{"start":{"line":615,"column":51},"end":{"line":615,"column":55}}]},"145":{"loc":{"start":{"line":615,"column":22},"end":{"line":615,"column":51}},"type":"cond-expr","locations":[{"start":{"line":615,"column":32},"end":{"line":615,"column":34}},{"start":{"line":615,"column":32},"end":{"line":615,"column":51}}]},"146":{"loc":{"start":{"line":615,"column":22},"end":{"line":615,"column":34}},"type":"binary-expr","locations":[{"start":{"line":615,"column":22},"end":{"line":615,"column":34}},{"start":{"line":615,"column":32},"end":{"line":615,"column":34}}]},"147":{"loc":{"start":{"line":618,"column":21},"end":{"line":618,"column":50}},"type":"cond-expr","locations":[{"start":{"line":618,"column":38},"end":{"line":618,"column":40}},{"start":{"line":618,"column":38},"end":{"line":618,"column":50}}]},"148":{"loc":{"start":{"line":618,"column":21},"end":{"line":618,"column":40}},"type":"binary-expr","locations":[{"start":{"line":618,"column":21},"end":{"line":618,"column":40}},{"start":{"line":618,"column":38},"end":{"line":618,"column":40}}]},"149":{"loc":{"start":{"line":618,"column":21},"end":{"line":618,"column":38}},"type":"cond-expr","locations":[{"start":{"line":618,"column":31},"end":{"line":618,"column":33}},{"start":{"line":618,"column":21},"end":{"line":618,"column":38}}]},"150":{"loc":{"start":{"line":618,"column":21},"end":{"line":618,"column":33}},"type":"binary-expr","locations":[{"start":{"line":618,"column":21},"end":{"line":618,"column":33}},{"start":{"line":618,"column":21},"end":{"line":618,"column":33}}]},"151":{"loc":{"start":{"line":619,"column":17},"end":{"line":621,"column":38}},"type":"cond-expr","locations":[{"start":{"line":620,"column":6},"end":{"line":620,"column":33}},{"start":{"line":621,"column":7},"end":{"line":621,"column":37}}]},"152":{"loc":{"start":{"line":621,"column":7},"end":{"line":621,"column":37}},"type":"cond-expr","locations":[{"start":{"line":621,"column":24},"end":{"line":621,"column":28}},{"start":{"line":621,"column":28},"end":{"line":621,"column":37}}]},"153":{"loc":{"start":{"line":621,"column":7},"end":{"line":621,"column":28}},"type":"binary-expr","locations":[{"start":{"line":621,"column":7},"end":{"line":621,"column":28}},{"start":{"line":621,"column":24},"end":{"line":621,"column":28}}]},"154":{"loc":{"start":{"line":621,"column":7},"end":{"line":621,"column":24}},"type":"cond-expr","locations":[{"start":{"line":621,"column":17},"end":{"line":621,"column":19}},{"start":{"line":621,"column":17},"end":{"line":621,"column":24}}]},"155":{"loc":{"start":{"line":621,"column":7},"end":{"line":621,"column":19}},"type":"binary-expr","locations":[{"start":{"line":621,"column":7},"end":{"line":621,"column":19}},{"start":{"line":621,"column":17},"end":{"line":621,"column":19}}]},"156":{"loc":{"start":{"line":624,"column":13},"end":{"line":624,"column":63}},"type":"binary-expr","locations":[{"start":{"line":624,"column":13},"end":{"line":624,"column":50}},{"start":{"line":624,"column":54},"end":{"line":624,"column":63}}]},"157":{"loc":{"start":{"line":625,"column":27},"end":{"line":625,"column":37}},"type":"binary-expr","locations":[{"start":{"line":625,"column":27},"end":{"line":625,"column":32}},{"start":{"line":625,"column":36},"end":{"line":625,"column":37}}]},"158":{"loc":{"start":{"line":631,"column":2},"end":{"line":631,"column":null}},"type":"if","locations":[{"start":{"line":631,"column":2},"end":{"line":631,"column":null}},{"start":{},"end":{}}]},"159":{"loc":{"start":{"line":633,"column":2},"end":{"line":635,"column":3}},"type":"if","locations":[{"start":{"line":633,"column":2},"end":{"line":635,"column":3}},{"start":{},"end":{}}]},"160":{"loc":{"start":{"line":636,"column":20},"end":{"line":636,"column":46}},"type":"cond-expr","locations":[{"start":{"line":636,"column":40},"end":{"line":636,"column":44}},{"start":{"line":636,"column":44},"end":{"line":636,"column":46}}]},"161":{"loc":{"start":{"line":636,"column":20},"end":{"line":636,"column":44}},"type":"binary-expr","locations":[{"start":{"line":636,"column":20},"end":{"line":636,"column":44}},{"start":{"line":636,"column":40},"end":{"line":636,"column":44}}]},"162":{"loc":{"start":{"line":638,"column":2},"end":{"line":640,"column":3}},"type":"if","locations":[{"start":{"line":638,"column":2},"end":{"line":640,"column":3}},{"start":{},"end":{}}]},"163":{"loc":{"start":{"line":647,"column":18},"end":{"line":647,"column":36}},"type":"cond-expr","locations":[{"start":{"line":647,"column":30},"end":{"line":647,"column":32}},{"start":{"line":647,"column":30},"end":{"line":647,"column":36}}]},"164":{"loc":{"start":{"line":647,"column":18},"end":{"line":647,"column":32}},"type":"binary-expr","locations":[{"start":{"line":647,"column":18},"end":{"line":647,"column":32}},{"start":{"line":647,"column":30},"end":{"line":647,"column":32}}]},"165":{"loc":{"start":{"line":648,"column":2},"end":{"line":650,"column":3}},"type":"if","locations":[{"start":{"line":648,"column":2},"end":{"line":650,"column":3}},{"start":{},"end":{}}]},"166":{"loc":{"start":{"line":651,"column":22},"end":{"line":651,"column":57}},"type":"cond-expr","locations":[{"start":{"line":651,"column":51},"end":{"line":651,"column":55}},{"start":{"line":651,"column":55},"end":{"line":651,"column":57}}]},"167":{"loc":{"start":{"line":651,"column":22},"end":{"line":651,"column":55}},"type":"binary-expr","locations":[{"start":{"line":651,"column":22},"end":{"line":651,"column":55}},{"start":{"line":651,"column":51},"end":{"line":651,"column":55}}]},"168":{"loc":{"start":{"line":651,"column":22},"end":{"line":651,"column":51}},"type":"cond-expr","locations":[{"start":{"line":651,"column":32},"end":{"line":651,"column":34}},{"start":{"line":651,"column":32},"end":{"line":651,"column":51}}]},"169":{"loc":{"start":{"line":651,"column":22},"end":{"line":651,"column":34}},"type":"binary-expr","locations":[{"start":{"line":651,"column":22},"end":{"line":651,"column":34}},{"start":{"line":651,"column":32},"end":{"line":651,"column":34}}]},"170":{"loc":{"start":{"line":654,"column":28},"end":{"line":654,"column":66}},"type":"cond-expr","locations":[{"start":{"line":654,"column":57},"end":{"line":654,"column":59}},{"start":{"line":654,"column":57},"end":{"line":654,"column":66}}]},"171":{"loc":{"start":{"line":654,"column":28},"end":{"line":654,"column":59}},"type":"binary-expr","locations":[{"start":{"line":654,"column":28},"end":{"line":654,"column":59}},{"start":{"line":654,"column":57},"end":{"line":654,"column":59}}]},"172":{"loc":{"start":{"line":654,"column":28},"end":{"line":654,"column":57}},"type":"cond-expr","locations":[{"start":{"line":654,"column":45},"end":{"line":654,"column":47}},{"start":{"line":654,"column":45},"end":{"line":654,"column":57}}]},"173":{"loc":{"start":{"line":654,"column":28},"end":{"line":654,"column":47}},"type":"binary-expr","locations":[{"start":{"line":654,"column":28},"end":{"line":654,"column":47}},{"start":{"line":654,"column":45},"end":{"line":654,"column":47}}]},"174":{"loc":{"start":{"line":654,"column":28},"end":{"line":654,"column":45}},"type":"cond-expr","locations":[{"start":{"line":654,"column":38},"end":{"line":654,"column":40}},{"start":{"line":654,"column":28},"end":{"line":654,"column":45}}]},"175":{"loc":{"start":{"line":654,"column":28},"end":{"line":654,"column":40}},"type":"binary-expr","locations":[{"start":{"line":654,"column":28},"end":{"line":654,"column":40}},{"start":{"line":654,"column":28},"end":{"line":654,"column":40}}]},"176":{"loc":{"start":{"line":655,"column":2},"end":{"line":657,"column":3}},"type":"if","locations":[{"start":{"line":655,"column":2},"end":{"line":657,"column":3}},{"start":{},"end":{}}]},"177":{"loc":{"start":{"line":658,"column":2},"end":{"line":660,"column":3}},"type":"if","locations":[{"start":{"line":658,"column":2},"end":{"line":660,"column":3}},{"start":{},"end":{}}]},"178":{"loc":{"start":{"line":658,"column":7},"end":{"line":658,"column":33}},"type":"cond-expr","locations":[{"start":{"line":658,"column":24},"end":{"line":658,"column":26}},{"start":{"line":658,"column":24},"end":{"line":658,"column":33}}]},"179":{"loc":{"start":{"line":658,"column":7},"end":{"line":658,"column":26}},"type":"binary-expr","locations":[{"start":{"line":658,"column":7},"end":{"line":658,"column":26}},{"start":{"line":658,"column":24},"end":{"line":658,"column":26}}]},"180":{"loc":{"start":{"line":658,"column":7},"end":{"line":658,"column":24}},"type":"cond-expr","locations":[{"start":{"line":658,"column":17},"end":{"line":658,"column":19}},{"start":{"line":658,"column":7},"end":{"line":658,"column":24}}]},"181":{"loc":{"start":{"line":658,"column":7},"end":{"line":658,"column":19}},"type":"binary-expr","locations":[{"start":{"line":658,"column":7},"end":{"line":658,"column":19}},{"start":{"line":658,"column":7},"end":{"line":658,"column":19}}]},"182":{"loc":{"start":{"line":696,"column":17},"end":{"line":696,"column":null}},"type":"switch","locations":[{"start":{"line":696,"column":17},"end":{"line":696,"column":null}}]},"183":{"loc":{"start":{"line":671,"column":2},"end":{"line":673,"column":3}},"type":"if","locations":[{"start":{"line":671,"column":2},"end":{"line":673,"column":3}},{"start":{},"end":{}}]},"184":{"loc":{"start":{"line":682,"column":11},"end":{"line":682,"column":56}},"type":"binary-expr","locations":[{"start":{"line":682,"column":11},"end":{"line":682,"column":29}},{"start":{"line":682,"column":33},"end":{"line":682,"column":56}}]},"185":{"loc":{"start":{"line":682,"column":11},"end":{"line":682,"column":29}},"type":"cond-expr","locations":[{"start":{"line":682,"column":23},"end":{"line":682,"column":25}},{"start":{"line":682,"column":23},"end":{"line":682,"column":29}}]},"186":{"loc":{"start":{"line":682,"column":11},"end":{"line":682,"column":25}},"type":"binary-expr","locations":[{"start":{"line":682,"column":11},"end":{"line":682,"column":25}},{"start":{"line":682,"column":23},"end":{"line":682,"column":25}}]},"187":{"loc":{"start":{"line":684,"column":2},"end":{"line":686,"column":3}},"type":"if","locations":[{"start":{"line":684,"column":2},"end":{"line":686,"column":3}},{"start":{},"end":{}}]},"188":{"loc":{"start":{"line":697,"column":2},"end":{"line":702,"column":3}},"type":"if","locations":[{"start":{"line":697,"column":2},"end":{"line":702,"column":3}},{"start":{},"end":{}}]},"189":{"loc":{"start":{"line":704,"column":20},"end":{"line":704,"column":null}},"type":"if","locations":[{"start":{"line":704,"column":20},"end":{"line":704,"column":null}},{"start":{},"end":{}}]},"190":{"loc":{"start":{"line":705,"column":20},"end":{"line":705,"column":48}},"type":"cond-expr","locations":[{"start":{"line":705,"column":32},"end":{"line":705,"column":34}},{"start":{"line":705,"column":32},"end":{"line":705,"column":48}}]},"191":{"loc":{"start":{"line":705,"column":20},"end":{"line":705,"column":34}},"type":"binary-expr","locations":[{"start":{"line":705,"column":20},"end":{"line":705,"column":34}},{"start":{"line":705,"column":32},"end":{"line":705,"column":34}}]},"192":{"loc":{"start":{"line":722,"column":18},"end":{"line":722,"column":null}},"type":"switch","locations":[{"start":{"line":722,"column":18},"end":{"line":722,"column":null}}]},"193":{"loc":{"start":{"line":723,"column":2},"end":{"line":726,"column":3}},"type":"if","locations":[{"start":{"line":723,"column":2},"end":{"line":726,"column":3}},{"start":{},"end":{}}]},"194":{"loc":{"start":{"line":723,"column":6},"end":{"line":723,"column":39}},"type":"binary-expr","locations":[{"start":{"line":723,"column":6},"end":{"line":723,"column":14}},{"start":{"line":723,"column":18},"end":{"line":723,"column":39}}]},"195":{"loc":{"start":{"line":735,"column":11},"end":{"line":735,"column":42}},"type":"cond-expr","locations":[{"start":{"line":735,"column":36},"end":{"line":735,"column":40}},{"start":{"line":735,"column":40},"end":{"line":735,"column":42}}]},"196":{"loc":{"start":{"line":735,"column":11},"end":{"line":735,"column":40}},"type":"binary-expr","locations":[{"start":{"line":735,"column":11},"end":{"line":735,"column":40}},{"start":{"line":735,"column":36},"end":{"line":735,"column":40}}]}},"s":{"0":9,"1":9,"2":9,"3":9,"4":9,"5":9,"6":9,"7":9,"8":9,"9":9,"10":9,"11":9,"12":9,"13":9,"14":9,"15":9,"16":9,"17":9,"18":9,"19":9,"20":9,"21":9,"22":9,"23":9,"24":9,"25":9,"26":9,"27":9,"28":9,"29":9,"30":9,"31":9,"32":9,"33":9,"34":9,"35":9,"36":9,"37":9,"38":9,"39":9,"40":9,"41":9,"42":9,"43":9,"44":9,"45":9,"46":9,"47":9,"48":9,"49":128,"50":64,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":22,"70":22,"71":44,"72":44,"73":44,"74":44,"75":44,"76":0,"77":0,"78":0,"79":22,"80":0,"81":0,"82":0,"83":0,"84":0,"85":9,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":22,"107":0,"108":22,"109":22,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":9,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":21,"178":21,"179":0,"180":21,"181":21,"182":21,"183":0,"184":0,"185":21,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":21,"311":0,"312":21,"313":21,"314":21,"315":21,"316":21,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0},"f":{"0":64,"1":0,"2":0,"3":22,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":22,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":21,"26":21,"27":0,"28":21,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":21,"49":0,"50":0},"b":{"0":[64,0],"1":[0,64],"2":[64,64],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[22,0],"12":[22,22],"13":[22,0],"14":[22,22],"15":[0,44],"16":[44,44],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0,0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0,0],"31":[0,0],"32":[0,0],"33":[0,0],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,0],"39":[0,0],"40":[0,0],"41":[0,0],"42":[0,0],"43":[0,0,0,0],"44":[0,0],"45":[0,0],"46":[0,0],"47":[0,0],"48":[0,0],"49":[0,0],"50":[0,0],"51":[0,0],"52":[0,22],"53":[22,0],"54":[0,0],"55":[0,0],"56":[0,0],"57":[0,0],"58":[0,0],"59":[0,0],"60":[0,0],"61":[0,0],"62":[0,0,0],"63":[0,0],"64":[0,0],"65":[0,0],"66":[0,0],"67":[0,0],"68":[0,0],"69":[0,0],"70":[0,0],"71":[0,0],"72":[0,0],"73":[0,0],"74":[0,0],"75":[21,21],"76":[0],"77":[0,0],"78":[0,0],"79":[0,0],"80":[0,0],"81":[0,0],"82":[0,0],"83":[0,0],"84":[0,0],"85":[0,0],"86":[0,0],"87":[0,0],"88":[0],"89":[0,0],"90":[0,0],"91":[0,0],"92":[0,0],"93":[0,0],"94":[0,0],"95":[0,0],"96":[0,0],"97":[0,0],"98":[0,0],"99":[0,0],"100":[0,0],"101":[0,0],"102":[0,0],"103":[0,0],"104":[0,0],"105":[0,0],"106":[0,0],"107":[0,0],"108":[0,0],"109":[0,0],"110":[0,0],"111":[0,0],"112":[0,0],"113":[0,0],"114":[0,0],"115":[0,0],"116":[0,0],"117":[0,0],"118":[0,0],"119":[0,0],"120":[0,0],"121":[0,0],"122":[0,0],"123":[0,0],"124":[0,0],"125":[0,0],"126":[0,0],"127":[0,0],"128":[0,0],"129":[0,0],"130":[0,0],"131":[0,0],"132":[0,0],"133":[0,0],"134":[0,0],"135":[0,0],"136":[0,0],"137":[0,0],"138":[0,0],"139":[0,0],"140":[0,0],"141":[0,0],"142":[0,0],"143":[0,0],"144":[0,0],"145":[0,0],"146":[0,0],"147":[0,0],"148":[0,0],"149":[0,0],"150":[0,0],"151":[0,0],"152":[0,0],"153":[0,0],"154":[0,0],"155":[0,0],"156":[0,0],"157":[0,0],"158":[0,0],"159":[0,0],"160":[0,0],"161":[0,0],"162":[0,0],"163":[0,0],"164":[0,0],"165":[0,0],"166":[0,0],"167":[0,0],"168":[0,0],"169":[0,0],"170":[0,0],"171":[0,0],"172":[0,0],"173":[0,0],"174":[0,0],"175":[0,0],"176":[0,0],"177":[0,0],"178":[0,0],"179":[0,0],"180":[0,0],"181":[0,0],"182":[0],"183":[0,21],"184":[0,0],"185":[0,0],"186":[0,0],"187":[0,0],"188":[0,0],"189":[0,0],"190":[0,0],"191":[0,0],"192":[0],"193":[0,0],"194":[0,0],"195":[0,0],"196":[0,0]}} +,"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/tests/test-setup.ts": {"path":"/__w/backlog/backlog/work/runner-container-hooks/packages/k8s/tests/test-setup.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":24}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":28}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":35}},"4":{"start":{"line":7,"column":11},"end":{"line":7,"column":31}},"5":{"start":{"line":9,"column":0},"end":{"line":9,"column":null}},"6":{"start":{"line":11,"column":15},"end":{"line":11,"column":46}},"7":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"8":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"9":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"10":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"11":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"12":{"start":{"line":26,"column":8},"end":{"line":53,"column":null}},"13":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"14":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"15":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"16":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"17":{"start":{"line":31,"column":4},"end":{"line":31,"column":null}},"18":{"start":{"line":33,"column":4},"end":{"line":33,"column":null}},"19":{"start":{"line":34,"column":4},"end":{"line":34,"column":null}},"20":{"start":{"line":35,"column":4},"end":{"line":35,"column":null}},"21":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"22":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"23":{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},"24":{"start":{"line":42,"column":4},"end":{"line":45,"column":null}},"25":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"26":{"start":{"line":49,"column":6},"end":{"line":49,"column":null}},"27":{"start":{"line":51,"column":6},"end":{"line":51,"column":null}},"28":{"start":{"line":55,"column":8},"end":{"line":62,"column":null}},"29":{"start":{"line":57,"column":6},"end":{"line":57,"column":null}},"30":{"start":{"line":58,"column":6},"end":{"line":58,"column":null}},"31":{"start":{"line":64,"column":8},"end":{"line":87,"column":null}},"32":{"start":{"line":65,"column":4},"end":{"line":75,"column":null}},"33":{"start":{"line":72,"column":8},"end":{"line":74,"column":9}},"34":{"start":{"line":73,"column":10},"end":{"line":73,"column":null}},"35":{"start":{"line":76,"column":4},"end":{"line":86,"column":null}},"36":{"start":{"line":83,"column":8},"end":{"line":85,"column":9}},"37":{"start":{"line":84,"column":10},"end":{"line":84,"column":null}},"38":{"start":{"line":88,"column":2},"end":{"line":92,"column":null}},"39":{"start":{"line":89,"column":21},"end":{"line":89,"column":66}},"40":{"start":{"line":90,"column":4},"end":{"line":90,"column":null}},"41":{"start":{"line":91,"column":4},"end":{"line":91,"column":null}},"42":{"start":{"line":94,"column":2},"end":{"line":97,"column":null}},"43":{"start":{"line":95,"column":21},"end":{"line":95,"column":54}},"44":{"start":{"line":96,"column":4},"end":{"line":96,"column":null}},"45":{"start":{"line":99,"column":8},"end":{"line":121,"column":null}},"46":{"start":{"line":100,"column":10},"end":{"line":104,"column":null}},"47":{"start":{"line":106,"column":10},"end":{"line":119,"column":null}},"48":{"start":{"line":120,"column":4},"end":{"line":120,"column":null}},"49":{"start":{"line":123,"column":2},"end":{"line":138,"column":null}},"50":{"start":{"line":124,"column":23},"end":{"line":128,"column":null}},"51":{"start":{"line":131,"column":4},"end":{"line":131,"column":null}},"52":{"start":{"line":132,"column":4},"end":{"line":132,"column":null}},"53":{"start":{"line":133,"column":4},"end":{"line":135,"column":null}},"54":{"start":{"line":134,"column":6},"end":{"line":134,"column":null}},"55":{"start":{"line":137,"column":4},"end":{"line":137,"column":null}},"56":{"start":{"line":140,"column":2},"end":{"line":150,"column":null}},"57":{"start":{"line":141,"column":26},"end":{"line":145,"column":null}},"58":{"start":{"line":148,"column":4},"end":{"line":148,"column":null}},"59":{"start":{"line":149,"column":4},"end":{"line":149,"column":null}},"60":{"start":{"line":152,"column":2},"end":{"line":164,"column":null}},"61":{"start":{"line":153,"column":29},"end":{"line":157,"column":null}},"62":{"start":{"line":160,"column":4},"end":{"line":160,"column":null}},"63":{"start":{"line":161,"column":4},"end":{"line":161,"column":null}},"64":{"start":{"line":162,"column":4},"end":{"line":162,"column":null}},"65":{"start":{"line":163,"column":4},"end":{"line":163,"column":null}},"66":{"start":{"line":165,"column":0},"end":{"line":165,"column":null}},"67":{"start":{"line":13,"column":13},"end":{"line":13,"column":23}}},"fnMap":{"0":{"name":"(anonymous_22)","decl":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"loc":{"start":{"line":13,"column":0},"end":{"line":165,"column":1}}},"1":{"name":"TestHelper","decl":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"loc":{"start":{"line":19,"column":2},"end":{"line":24,"column":3}}},"2":{"name":"(anonymous_24)","decl":{"start":{"line":26,"column":2},"end":{"line":26,"column":8}},"loc":{"start":{"line":26,"column":2},"end":{"line":53,"column":null}}},"3":{"name":"(anonymous_27)","decl":{"start":{"line":55,"column":2},"end":{"line":55,"column":8}},"loc":{"start":{"line":55,"column":2},"end":{"line":62,"column":null}}},"4":{"name":"(anonymous_30)","decl":{"start":{"line":64,"column":2},"end":{"line":64,"column":8}},"loc":{"start":{"line":64,"column":2},"end":{"line":87,"column":null}}},"5":{"name":"(anonymous_33)","decl":{"start":{"line":71,"column":13},"end":{"line":71,"column":14}},"loc":{"start":{"line":71,"column":38},"end":{"line":75,"column":7}}},"6":{"name":"(anonymous_34)","decl":{"start":{"line":82,"column":13},"end":{"line":82,"column":14}},"loc":{"start":{"line":82,"column":38},"end":{"line":86,"column":7}}},"7":{"name":"(anonymous_35)","decl":{"start":{"line":88,"column":2},"end":{"line":88,"column":12}},"loc":{"start":{"line":88,"column":30},"end":{"line":92,"column":3}}},"8":{"name":"(anonymous_36)","decl":{"start":{"line":94,"column":2},"end":{"line":94,"column":12}},"loc":{"start":{"line":94,"column":29},"end":{"line":97,"column":3}}},"9":{"name":"(anonymous_37)","decl":{"start":{"line":99,"column":2},"end":{"line":99,"column":8}},"loc":{"start":{"line":99,"column":2},"end":{"line":121,"column":null}}},"10":{"name":"(anonymous_40)","decl":{"start":{"line":123,"column":2},"end":{"line":123,"column":25}},"loc":{"start":{"line":123,"column":2},"end":{"line":138,"column":3}}},"11":{"name":"(anonymous_41)","decl":{"start":{"line":133,"column":37},"end":{"line":133,"column":38}},"loc":{"start":{"line":133,"column":38},"end":{"line":135,"column":5}}},"12":{"name":"(anonymous_42)","decl":{"start":{"line":140,"column":2},"end":{"line":140,"column":28}},"loc":{"start":{"line":140,"column":2},"end":{"line":150,"column":3}}},"13":{"name":"(anonymous_43)","decl":{"start":{"line":152,"column":2},"end":{"line":152,"column":31}},"loc":{"start":{"line":152,"column":2},"end":{"line":164,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":65,"column":4},"end":{"line":75,"column":null}},"type":"switch","locations":[{"start":{"line":65,"column":4},"end":{"line":75,"column":null}}]},"1":{"loc":{"start":{"line":72,"column":8},"end":{"line":74,"column":9}},"type":"if","locations":[{"start":{"line":72,"column":8},"end":{"line":74,"column":9}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":83,"column":8},"end":{"line":85,"column":9}},"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":85,"column":9}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":89,"column":44},"end":{"line":89,"column":64}},"type":"binary-expr","locations":[{"start":{"line":89,"column":44},"end":{"line":89,"column":52}},{"start":{"line":89,"column":56},"end":{"line":89,"column":64}}]}},"s":{"0":6,"1":6,"2":6,"3":6,"4":6,"5":6,"6":6,"7":6,"8":46,"9":46,"10":46,"11":46,"12":6,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":6,"29":0,"30":0,"31":6,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":6,"39":0,"40":0,"41":0,"42":6,"43":0,"44":0,"45":6,"46":0,"47":0,"48":0,"49":6,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":6,"57":0,"58":0,"59":0,"60":6,"61":0,"62":0,"63":0,"64":0,"65":0,"66":6,"67":6},"f":{"0":6,"1":46,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[0,0]}} +} diff --git a/packages/k8s/coverage/lcov-report/base.css b/packages/k8s/coverage/lcov-report/base.css new file mode 100644 index 00000000..f418035b --- /dev/null +++ b/packages/k8s/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/packages/k8s/coverage/lcov-report/block-navigation.js b/packages/k8s/coverage/lcov-report/block-navigation.js new file mode 100644 index 00000000..530d1ed2 --- /dev/null +++ b/packages/k8s/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/packages/k8s/coverage/lcov-report/favicon.png b/packages/k8s/coverage/lcov-report/favicon.png new file mode 100644 index 00000000..c1525b81 Binary files /dev/null and b/packages/k8s/coverage/lcov-report/favicon.png differ diff --git a/packages/k8s/coverage/lcov-report/index.html b/packages/k8s/coverage/lcov-report/index.html new file mode 100644 index 00000000..0ed37af4 --- /dev/null +++ b/packages/k8s/coverage/lcov-report/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 50.57% + Statements + 923/1825 +
+ + +
+ 39.26% + Branches + 578/1472 +
+ + +
+ 42.62% + Functions + 104/244 +
+ + +
+ 52.11% + Lines + 849/1629 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src/hooks +
+
70.5%251/35653.64%162/30280%24/3071.68%238/332
src/k8s +
+
53.94%472/87554.1%323/59747.69%62/13054.59%428/784
src/k8s/utils +
+
33.65%177/52616.43%93/56622.85%16/7036.09%161/446
tests +
+
33.82%23/680%0/714.28%2/1432.83%22/67
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/prettify.css b/packages/k8s/coverage/lcov-report/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/packages/k8s/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/packages/k8s/coverage/lcov-report/prettify.js b/packages/k8s/coverage/lcov-report/prettify.js new file mode 100644 index 00000000..b3225238 --- /dev/null +++ b/packages/k8s/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/packages/k8s/coverage/lcov-report/sort-arrow-sprite.png b/packages/k8s/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 00000000..6ed68316 Binary files /dev/null and b/packages/k8s/coverage/lcov-report/sort-arrow-sprite.png differ diff --git a/packages/k8s/coverage/lcov-report/sorter.js b/packages/k8s/coverage/lcov-report/sorter.js new file mode 100644 index 00000000..4ed70ae5 --- /dev/null +++ b/packages/k8s/coverage/lcov-report/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/packages/k8s/coverage/lcov-report/src/hooks/cleanup-job.ts.html b/packages/k8s/coverage/lcov-report/src/hooks/cleanup-job.ts.html new file mode 100644 index 00000000..eecd245d --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/hooks/cleanup-job.ts.html @@ -0,0 +1,145 @@ + + + + + + Code coverage report for src/hooks/cleanup-job.ts + + + + + + + + + +
+
+

All files / src/hooks cleanup-job.ts

+
+ +
+ 88.88% + Statements + 8/9 +
+ + +
+ 66.66% + Branches + 2/3 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 88.88% + Lines + 8/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +217x +7x +7x +7x +  +  +  +  +  +  +7x +21x +  +42x +  +  +  +  +42x +  + 
import * as core from '@actions/core'
+import { formatError } from '../k8s/utils'
+import { prunePods, pruneSecrets } from '../k8s'
+import {
+  collectAndPushNpuMetrics,
+  NPU_COLLECT_TIMEOUT_MS,
+  npuMetricsEnabled,
+  withTimeout
+} from '../k8s/utils/npu-metrics'
+ 
+export async function cleanupJob(): Promise<void> {
+  if (InpuMetricsEnabled()) {
+    try {
+      await withTimeout(collectAndPushNpuMetrics(), NPU_COLLECT_TIMEOUT_MS)
+    } catch (err) {
+      core.debug(`npu-metrics: collection failed: ${formatError(err)}`)
+    }
+  }
+  await Promise.all([prunePods(), pruneSecrets()])
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/src/hooks/constants.ts.html b/packages/k8s/coverage/lcov-report/src/hooks/constants.ts.html new file mode 100644 index 00000000..f3494292 --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/hooks/constants.ts.html @@ -0,0 +1,280 @@ + + + + + + Code coverage report for src/hooks/constants.ts + + + + + + + + + +
+
+

All files / src/hooks constants.ts

+
+ +
+ 100% + Statements + 32/32 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 10/10 +
+ + +
+ 100% + Lines + 31/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +6615x +  +15x +105x +105x +74x +  +  +  +31x +  +  +15x +11x +  +  +  +  +  +15x +17x +  +  +  +  +  +15x +4x +4x +3x +  +1x +  +  +15x +3x +  +  +  +  +  +15x +15x +15x +15x +15x +  +15x +  +  +67x +  +  +15x +4x +  +  +15x +3x +  +  +15x +1x +  +15x + 
import { v4 as uuidv4 } from 'uuid'
+ 
+export function getRunnerPodName(): string {
+  const name = process.env.ACTIONS_RUNNER_POD_NAME
+  if (!name) {
+    throw new Error(
+      "'ACTIONS_RUNNER_POD_NAME' env is required, please contact your self hosted runner administrator"
+    )
+  }
+  return name
+}
+ 
+export function getJobPodName(): string {
+  return `${getRunnerPodName().substring(
+    0,
+    MAX_POD_NAME_LENGTH - '-workflow'.length
+  )}-workflow`
+}
+ 
+export function getStepPodName(): string {
+  return `${getRunnerPodName().substring(
+    0,
+    MAX_POD_NAME_LENGTH - ('-step-'.length + STEP_POD_NAME_SUFFIX_LENGTH)
+  )}-step-${uuidv4().substring(0, STEP_POD_NAME_SUFFIX_LENGTH)}`
+}
+ 
+export function getVolumeClaimName(): string {
+  const name = process.env.ACTIONS_RUNNER_CLAIM_NAME
+  if (!name) {
+    return `${getRunnerPodName()}-work`
+  }
+  return name
+}
+ 
+export function getSecretName(): string {
+  return `${getRunnerPodName().substring(
+    0,
+    MAX_POD_NAME_LENGTH - ('-secret-'.length + STEP_POD_NAME_SUFFIX_LENGTH)
+  )}-secret-${uuidv4().substring(0, STEP_POD_NAME_SUFFIX_LENGTH)}`
+}
+ 
+export const MAX_POD_NAME_LENGTH = 63
+export const STEP_POD_NAME_SUFFIX_LENGTH = 8
+export const CONTAINER_EXTENSION_PREFIX = '$'
+export const JOB_CONTAINER_NAME = 'job'
+export const JOB_CONTAINER_EXTENSION_NAME = '$job'
+ 
+export class RunnerInstanceLabel {
+  private podName: string
+  constructor() {
+    this.podName = getRunnerPodName()
+  }
+ 
+  get key(): string {
+    return 'runner-pod'
+  }
+ 
+  get value(): string {
+    return this.podName
+  }
+ 
+  toString(): string {
+    return `runner-pod=${this.podName}`
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/src/hooks/index.html b/packages/k8s/coverage/lcov-report/src/hooks/index.html new file mode 100644 index 00000000..4a67a23a --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/hooks/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for src/hooks + + + + + + + + + +
+
+

All files src/hooks

+
+ +
+ 70.5% + Statements + 251/356 +
+ + +
+ 53.64% + Branches + 162/302 +
+ + +
+ 80% + Functions + 24/30 +
+ + +
+ 71.68% + Lines + 238/332 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cleanup-job.ts +
+
88.88%8/966.66%2/3100%1/188.88%8/9
constants.ts +
+
100%32/32100%4/4100%10/10100%31/31
index.ts +
+
100%4/4100%0/0100%0/0100%4/4
prepare-job.ts +
+
86.57%129/14971.27%134/18888.88%8/988.8%119/134
run-container-step.ts +
+
29.46%33/1129.89%9/9128.57%2/731.13%33/106
run-script-step.ts +
+
90%45/5081.25%13/16100%3/389.58%43/48
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/src/hooks/index.ts.html b/packages/k8s/coverage/lcov-report/src/hooks/index.ts.html new file mode 100644 index 00000000..f8db3058 --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/hooks/index.ts.html @@ -0,0 +1,97 @@ + + + + + + Code coverage report for src/hooks/index.ts + + + + + + + + + +
+
+

All files / src/hooks index.ts

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +57x +7x +7x +7x + 
export * from './cleanup-job'
+export * from './prepare-job'
+export * from './run-script-step'
+export * from './run-container-step'
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/src/hooks/prepare-job.ts.html b/packages/k8s/coverage/lcov-report/src/hooks/prepare-job.ts.html new file mode 100644 index 00000000..b5b281b4 --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/hooks/prepare-job.ts.html @@ -0,0 +1,1174 @@ + + + + + + Code coverage report for src/hooks/prepare-job.ts + + + + + + + + + +
+
+

All files / src/hooks prepare-job.ts

+
+ +
+ 86.57% + Statements + 129/149 +
+ + +
+ 71.27% + Branches + 134/188 +
+ + +
+ 88.88% + Functions + 8/9 +
+ + +
+ 88.8% + Lines + 119/134 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +3648x +  +8x +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +8x +8x +  +8x +  +  +  +10x +1x +  +  +18x +  +9x +  +9x +9x +8x +  +  +  +  +  +8x +  +  +9x +9x +9x +1x +2x +2x +2x +  +  +1x +1x +2x +2x +2x +  +  +2x +2x +  +  +  +  +2x +2x +2x +  +  +  +9x +1x +  +  +8x +  +8x +  +  +  +  +  +  +  +4x +2x +  +  +  +  +  +  +2x +2x +  +  +  +  +  +  +2x +2x +  +  +2x +2x +  +  +  +2x +  +  +1x +1x +  +  +1x +1x +1x +1x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +2x +  +  +6x +  +  +6x +  +  +  +6x +6x +1x +  +5x +  +  +5x +  +  +  +  +10x +  +  +  +  +  +  +2x +  +  +  +1x +1x +  +  +8x +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +4x +  +4x +  +  +  +  +1x +1x +1x +  +3x +3x +  +  +  +  +  +  +  +  +  +3x +  +  +3x +  +  +  +  +  +  +  +3x +1x +  +3x +1x +1x +1x +  +  +  +  +  +1x +  +  +  +  +  +3x +  +1x +  +  +  +1x +3x +  +2x +2x +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +3x +  +  +8x +  +  +29x +  +  +21x +1x +1x +  +  +21x +  +  +  +  +21x +1x +  +  +21x +18x +  +  +21x +10x +  +  +21x +21x +  +  +3x +2x +  +  +  +21x +  +  +  +  +21x +20x +  +  +  +  +  +21x +  +21x +20x +  +  +1x +1x +  +  +1x +1x +  +  +1x +  + 
import * as core from '@actions/core'
+import * as k8s from '@kubernetes/client-node'
+import {
+  JobContainerInfo,
+  ContextPorts,
+  PrepareJobArgs,
+  writeToResponseFile,
+  ServiceContainerInfo
+} from 'hooklib'
+import {
+  containerPorts,
+  createJobPod,
+  isPodContainerAlpine,
+  prunePods,
+  waitForPodPhases,
+  getPrepareJobTimeoutSeconds,
+  execCpToPod,
+  execPodStep
+} from '../k8s'
+import {
+  CONTAINER_VOLUMES,
+  DEFAULT_CONTAINER_ENTRY_POINT,
+  DEFAULT_CONTAINER_ENTRY_POINT_ARGS,
+  formatError,
+  generateContainerName,
+  mergeContainerWithOptions,
+  readExtensionFromFile,
+  PodPhase,
+  fixArgs,
+  prepareJobScript
+} from '../k8s/utils'
+import {
+  CONTAINER_EXTENSION_PREFIX,
+  getJobPodName,
+  JOB_CONTAINER_NAME
+} from './constants'
+import { maybeInjectNpuMetrics } from '../k8s/utils/npu-metrics'
+import { dirname } from 'path'
+ 
+export async function prepareJob(
+  args: PrepareJobArgs,
+  responseFile
+): Promise<void> {
+  if (!args.container) {
+    throw new Error('Job Container is required.')
+  }
+ 
+  await prunePods()
+ 
+  const extension = readExtensionFromFile()
+ 
+  let container: k8s.V1Container | undefined = undefined
+  if (args.container?.image) {
+    container = createContainerSpec(
+      args.container,
+      JOB_CONTAINER_NAME,
+      true,
+      extension
+    )
+    maybeInjectNpuMetrics(container)
+  }
+ 
+  let services: k8s.V1Container[] = []
+  let serviceNames: string[] = []
+  if (args.services?.length) {
+    const occurrences = new Map<string, number>()
+    for (const s of args.services) {
+      const base = generateContainerName(s.image)
+      occurrences.set(base, (occurrences.get(base) || 0) + 1)
+    }
+ 
+    const indices = new Map<string, number>()
+    services = args.services.map(service => {
+      const base = generateContainerName(service.image)
+      const total = occurrences.get(base) || 0
+      const idx = indices.get(base) || 0
+ 
+      let name: string
+      if (total > 1) {
+        name = `${base}-${idx}`
+      } else E{
+        name = base
+      }
+ 
+      indices.set(base, idx + 1)
+      serviceNames.push(name)
+      return createContainerSpec(service, name, false, extension)
+    })
+  }
+ 
+  if (!container && !services?.length) {
+    throw new Error('No containers exist, skipping hook invocation')
+  }
+ 
+  let createdPod: k8s.V1Pod | undefined = undefined
+  try {
+    createdPod = await createJobPod(
+      getJobPodName(),
+      container,
+      services,
+      args.container.registry,
+      extension
+    )
+  } catch (err) {
+    await prunePods()
+    core.debug(`createPod failed: ${JSON.stringify(err)}`)
+    // The k8s client throws HttpException whose message is a multi-line string
+    // containing the raw HTTP dump. Extract the human-readable "message" field
+    // from the embedded JSON body so the log shows something like:
+    //   failed to create job pod:
+    //     spec.volumes[5].name: Duplicate value: "bad-hostpath"
+    // instead of the full HTTP dump.
+    const raw = err instanceof Error ? err.message : String(err)
+    let detail = raw
+    // The k8s HttpException message is a multi-line dump:
+    //   HTTP-Code: 422
+    //   Message: Unknown API Status Code!
+    //   Body: "{\"kind\":\"Status\",\"message\":\"...\\n\"}"
+    //   Headers: {...}
+    // Extract the Body JSON string, unescape it, and pull out "message".
+    try {
+      const bodyStart = raw.indexOf('Body: "')
+      // The boundary may be '"\nHeaders:' (real newline) or the literal
+      // string ends before Headers — use the last '"' before 'Headers:' as fallback
+      const headersIdx = raw.indexOf('Headers:')
+      const bodyEnd =
+        headersIdx !== -1
+          ? raw.lastIndexOf('"', headersIdx) // last " before Headers:
+          : raw.indexOf('"\nHeaders:')
+      if (bodyStart !== -1 && bodyEnd !== -1 && bodyEnd > bodyStart) {
+        // Body content is a JSON string literal (without surrounding quotes).
+        // Wrap it in quotes and JSON.parse to properly unescape \" \\ \n \t etc.
+        const escaped = raw.substring(bodyStart + 7, bodyEnd)
+        const bodyStr = JSON.parse('"' + escaped + '"')
+        // bodyStr may be plain text (e.g. 502 Bad Gateway) instead of JSON.
+        // Parse separately so a non-JSON body still yields a friendly message.
+        try {
+          const parsed = JSON.parse(bodyStr)
+          Eif (typeof parsed?.message === 'string') {
+            detail = parsed.message
+          }
+        } catch {
+          detail = bodyStr
+        }
+      }
+    } catch {
+      // Parsing failed — fall through and show the raw string
+    }
+    const errorMessage = [
+      'failed to create job pod:',
+      `  ✗ ${detail}`,
+      '-'.repeat(60),
+      '  → Pod spec was rejected by the k8s API. Check:',
+      '    - resources.requests does not exceed resources.limits',
+      '    - volumeMounts reference a volume defined in spec.volumes',
+      '    - envFrom / valueFrom reference existing Secrets / ConfigMaps',
+      '    - Field types match the k8s schema (kubectl explain pod.spec.containers)'
+    ].join('\n')
+    throw new Error(errorMessage)
+  }
+ 
+  Iif (!createdPod?.metadata?.name) {
+    throw new Error('created pod should have metadata.name')
+  }
+  core.debug(
+    `Job pod created, waiting for it to come online ${createdPod?.metadata?.name}`
+  )
+ 
+  const runnerWorkspaceEnv = process.env.RUNNER_WORKSPACE
+  if (!runnerWorkspaceEnv) {
+    throw new Error('RUNNER_WORKSPACE environment variable is not set')
+  }
+  const runnerWorkspace = dirname(runnerWorkspaceEnv)
+ 
+  let prepareScript: { containerPath: string; runnerPath: string } | undefined
+  Iif (args.container?.userMountVolumes?.length) {
+    prepareScript = prepareJobScript(args.container.userMountVolumes || [])
+  }
+ 
+  try {
+    await waitForPodPhases(
+      createdPod.metadata.name,
+      new Set([PodPhase.RUNNING]),
+      new Set([PodPhase.PENDING]),
+      getPrepareJobTimeoutSeconds()
+    )
+  } catch (err) {
+    await prunePods()
+    // Unwrap nested "Error: " prefix so the message renders as:
+    //   pod failed to come online:
+    //   <detail from waitForPodPhases, already formatted with sections>
+    const detail = err instanceof Error ? err.message : String(err)
+    throw new Error(`pod failed to come online:\n${detail}`)
+  }
+ 
+  await execCpToPod(createdPod.metadata.name, runnerWorkspace, '/__w')
+ 
+  if (EprepareScript) {
+    await execPodStep(
+      ['sh', '-e', prepareScript.containerPath],
+      createdPod.metadata.name,
+      JOB_CONTAINER_NAME
+    )
+ 
+    const promises: Promise<void>[] = []
+    for (const vol of args?.container?.userMountVolumes || []) {
+      promises.push(
+        execCpToPod(
+          createdPod.metadata.name,
+          vol.sourceVolumePath,
+          vol.targetVolumePath
+        )
+      )
+    }
+    await Promise.all(promises)
+  }
+ 
+  core.debug('Job pod is ready for traffic')
+ 
+  let isAlpine = false
+  try {
+    isAlpine = await isPodContainerAlpine(
+      createdPod.metadata.name,
+      JOB_CONTAINER_NAME
+    )
+  } catch (err) {
+    const message = formatError(err)
+    core.debug(`Failed to determine if the pod is alpine: ${message}`)
+    throw new Error(`failed to determine if the pod is alpine: ${message}`)
+  }
+  core.debug(`Setting isAlpine to ${isAlpine}`)
+  generateResponseFile(responseFile, args, createdPod, isAlpine, serviceNames)
+}
+ 
+function generateResponseFile(
+  responseFile: string,
+  args: PrepareJobArgs,
+  appPod: k8s.V1Pod,
+  isAlpine: boolean,
+  serviceNames?: string[]
+): void {
+  Iif (!appPod.metadata?.name) {
+    throw new Error('app pod must have metadata.name specified')
+  }
+  const response = {
+    state: {
+      jobPod: appPod.metadata.name
+    },
+    context: {},
+    isAlpine
+  }
+ 
+  const mainContainer = appPod.spec?.containers?.find(
+    c => c.name === JOB_CONTAINER_NAME
+  )
+  if (mainContainer) {
+    const mainContainerContextPorts: ContextPorts = {}
+    Eif (mainContainer?.ports) {
+      for (const port of mainContainer.ports) {
+        mainContainerContextPorts[port.containerPort] =
+          mainContainerContextPorts.hostPort
+      }
+    }
+ 
+    response.context['container'] = {
+      image: mainContainer.image,
+      ports: mainContainerContextPorts
+    }
+  }
+ 
+  if (args.services?.length) {
+    const serviceContainerNames =
+      serviceNames && serviceNames.length
+        ? serviceNames
+        : args.services?.map(s => generateContainerName(s.image)) || []
+ 
+    response.context['services'] = appPod?.spec?.containers
+      ?.filter(c => serviceContainerNames.includes(c.name))
+      .map(c => {
+        const ctxPorts: ContextPorts = {}
+        Iif (c.ports?.length) {
+          for (const port of c.ports) {
+            if (port.containerPort && port.hostPort) {
+              ctxPorts[port.containerPort.toString()] = port.hostPort.toString()
+            }
+          }
+        }
+ 
+        return {
+          image: c.image,
+          ports: ctxPorts
+        }
+      })
+  }
+ 
+  writeToResponseFile(responseFile, JSON.stringify(response))
+}
+ 
+export function createContainerSpec(
+  container: JobContainerInfo | ServiceContainerInfo,
+  name: string,
+  jobContainer = false,
+  extension?: k8s.V1PodTemplateSpec
+): k8s.V1Container {
+  if (!container.entryPoint && jobContainer) {
+    container.entryPoint = DEFAULT_CONTAINER_ENTRY_POINT
+    container.entryPointArgs = DEFAULT_CONTAINER_ENTRY_POINT_ARGS
+  }
+ 
+  const podContainer = {
+    name,
+    image: container.image,
+    ports: containerPorts(container)
+  } as k8s.V1Container
+  if (container['workingDirectory']) {
+    podContainer.workingDir = container['workingDirectory']
+  }
+ 
+  if (container.entryPoint) {
+    podContainer.command = [container.entryPoint]
+  }
+ 
+  if (container.entryPointArgs && container.entryPointArgs.length > 0) {
+    podContainer.args = fixArgs(container.entryPointArgs)
+  }
+ 
+  podContainer.env = []
+  for (const [key, value] of Object.entries(
+    container['environmentVariables'] || {}
+  )) {
+    if (value && key !== 'HOME') {
+      podContainer.env.push({ name: key, value })
+    }
+  }
+ 
+  podContainer.env.push({
+    name: 'GITHUB_ACTIONS',
+    value: 'true'
+  })
+ 
+  if (!('CI' in (container['environmentVariables'] || {}))) {
+    podContainer.env.push({
+      name: 'CI',
+      value: 'true'
+    })
+  }
+ 
+  podContainer.volumeMounts = CONTAINER_VOLUMES
+ 
+  if (!extension) {
+    return podContainer
+  }
+ 
+  const from = extension.spec?.containers?.find(
+    c => c.name === CONTAINER_EXTENSION_PREFIX + name
+  )
+ 
+  Eif (from) {
+    mergeContainerWithOptions(podContainer, from)
+  }
+ 
+  return podContainer
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/src/hooks/run-container-step.ts.html b/packages/k8s/coverage/lcov-report/src/hooks/run-container-step.ts.html new file mode 100644 index 00000000..4ce7862b --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/hooks/run-container-step.ts.html @@ -0,0 +1,898 @@ + + + + + + Code coverage report for src/hooks/run-container-step.ts + + + + + + + + + +
+
+

All files / src/hooks run-container-step.ts

+
+ +
+ 29.46% + Statements + 33/112 +
+ + +
+ 9.89% + Branches + 9/91 +
+ + +
+ 28.57% + Functions + 2/7 +
+ + +
+ 31.13% + Lines + 33/106 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +2728x +8x +8x +  +8x +8x +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +8x +  +8x +  +  +16x +1x +  +  +15x +1x +  +  +  +  +14x +14x +14x +13x +  +  +14x +  +14x +14x +  +  +  +14x +  +14x +14x +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +14x +14x +14x +14x +14x +14x +  +14x +  +14x +14x +  +  +  +  +  +  +  +  +  +  +  + 
import * as core from '@actions/core'
+import * as fs from 'fs'
+import * as k8s from '@kubernetes/client-node'
+import { RunContainerStepArgs } from 'hooklib'
+import { dirname } from 'path'
+import {
+  createContainerStepPod,
+  deletePod,
+  describePodFailure,
+  execCpFromPod,
+  execCpToPod,
+  execPodStepWithOutput,
+  getContainerTerminatedErrors,
+  getPodByName,
+  getPrepareJobTimeoutSeconds,
+  getTerminatedReasonHint,
+  waitForPodPhases
+} from '../k8s'
+import {
+  CONTAINER_VOLUMES,
+  formatError,
+  mergeContainerWithOptions,
+  PodPhase,
+  readExtensionFromFile,
+  DEFAULT_CONTAINER_ENTRY_POINT_ARGS,
+  writeContainerStepScript
+} from '../k8s/utils'
+import {
+  getJobPodName,
+  getStepPodName,
+  JOB_CONTAINER_EXTENSION_NAME,
+  JOB_CONTAINER_NAME
+} from './constants'
+import { maybeInjectNpuMetrics } from '../k8s/utils/npu-metrics'
+ 
+export async function runContainerStep(
+  stepContainer: RunContainerStepArgs
+): Promise<number> {
+  if (stepContainer.dockerfile) {
+    throw new Error('Building container actions is not currently supported')
+  }
+ 
+  if (!stepContainer.entryPoint) {
+    throw new Error(
+      'failed to start the container since the entrypoint is overwritten'
+    )
+  }
+ 
+  const envs = stepContainer.environmentVariables || {}
+  envs['GITHUB_ACTIONS'] = 'true'
+  if (!('CI' in envs)) {
+    envs.CI = 'true'
+  }
+ 
+  const extension = readExtensionFromFile()
+ 
+  const container = createContainerSpec(stepContainer, extension)
+  maybeInjectNpuMetrics(container)
+ 
+  let pod: k8s.V1Pod
+  try {
+    pod = await createContainerStepPod(getStepPodName(), container, extension)
+  } catch (err) {
+    const message = formatError(err)
+    core.debug(`createContainerStepPod failed: ${message}`)
+    throw new Error(`failed to run container step: ${message}`)
+  }
+ 
+  if (!pod.metadata?.name) {
+    throw new Error(
+      `Expected job ${JSON.stringify(
+        pod
+      )} to have correctly set the metadata.name`
+    )
+  }
+  const podName = pod.metadata.name
+ 
+  try {
+    await waitForPodPhases(
+      podName,
+      new Set([PodPhase.RUNNING]),
+      new Set([PodPhase.PENDING, PodPhase.UNKNOWN]),
+      getPrepareJobTimeoutSeconds()
+    )
+ 
+    const runnerWorkspaceEnv = process.env.RUNNER_WORKSPACE
+    const githubWorkspaceEnv = process.env.GITHUB_WORKSPACE
+    if (!runnerWorkspaceEnv || !githubWorkspaceEnv) {
+      throw new Error(
+        'RUNNER_WORKSPACE or GITHUB_WORKSPACE environment variable is not set'
+      )
+    }
+    const runnerWorkspace = dirname(runnerWorkspaceEnv)
+    const githubWorkspace = githubWorkspaceEnv
+    const parts = githubWorkspace.split('/').slice(-2)
+    if (parts.length !== 2) {
+      throw new Error(`Invalid github workspace directory: ${githubWorkspace}`)
+    }
+    const relativeWorkspace = parts.join('/')
+ 
+    core.debug(
+      `Copying files from pod ${getJobPodName()} to ${runnerWorkspace}/${relativeWorkspace}`
+    )
+    await execCpFromPod(getJobPodName(), `/__w`, `${runnerWorkspace}`)
+ 
+    const { containerPath, runnerPath } = writeContainerStepScript(
+      `${runnerWorkspace}/__w/_temp`,
+      githubWorkspace,
+      stepContainer.entryPoint,
+      stepContainer.entryPointArgs,
+      envs
+    )
+ 
+    await execCpToPod(podName, `${runnerWorkspace}/__w`, '/__w')
+ 
+    fs.rmSync(`${runnerWorkspace}/__w`, { recursive: true, force: true })
+ 
+    try {
+      core.debug(`Executing container step script in pod ${podName}`)
+      const { code, output } = await execPodStepWithOutput(
+        ['sh', '-e', containerPath],
+        pod.metadata.name,
+        JOB_CONTAINER_NAME
+      )
+      if (code === 0) {
+        return 0
+      }
+      // Non-zero exit: surface a structured error so the user can tell whether
+      // it was their script or the container that failed. Read container
+      // status BEFORE deletePod runs (in the outer finally) to inspect the
+      // terminated reason, if it is already available.
+      const classification = await classifyScriptError(
+        pod.metadata.name,
+        code,
+        output
+      )
+      throw new Error(classification)
+    } catch (err) {
+      core.debug(`execPodStep failed: ${formatError(err)}`)
+      // Re-throw our classified errors verbatim; wrap anything else.
+      if (
+        err instanceof Error &&
+        (err.message.startsWith('Step failed:') ||
+          err.message.startsWith('failed to run script step'))
+      ) {
+        throw err
+      }
+      const message = formatError(err)
+      throw new Error(`failed to run container step: ${message}`)
+    } finally {
+      fs.rmSync(runnerPath, { force: true })
+    }
+  } catch (error) {
+    try {
+      const errorPod = await getPodByName(podName)
+      const terminatedErrors = getContainerTerminatedErrors(errorPod)
+      if (terminatedErrors.length > 0) {
+        const details = await describePodFailure(podName)
+        core.error(
+          `Pod ${podName} has unrecoverable container errors:\n${terminatedErrors.join('\n')}\n${details}`
+        )
+      }
+    } catch {
+      // Best-effort: pod may already be deleted or unreachable
+    }
+    core.error(`Failed to run container step: ${error}`)
+    throw error
+  } finally {
+    await deletePod(podName).catch(err => {
+      core.error(`Failed to delete step pod ${podName}: ${err}`)
+    })
+  }
+}
+ 
+// Inspect the pod's container status to determine whether a non-zero exit
+// code came from the user's script (container terminated cleanly with
+// reason=Completed) or from a container-level failure (OOMKilled, etc.).
+// The container state may not yet be 'terminated' when called (k8s updates
+// it asynchronously), so we default to treating unknown state as a script
+// issue and let the user check their script first.
+async function classifyScriptError(
+  podName: string,
+  exitCode: number,
+  tailOutput: string
+): Promise<string> {
+  const sep = '-'.repeat(60)
+  const errors: string[] = [`  ✗ exit code: ${exitCode}`]
+  const sections: string[] = []
+ 
+  try {
+    const pod = await getPodByName(podName)
+    const cs = pod.status?.containerStatuses?.find(
+      s => s.name === JOB_CONTAINER_NAME
+    )
+    const term = cs?.state?.terminated
+    if (term) {
+      const reason = term.reason ?? 'Completed'
+      const isContainerFault =
+        reason === 'OOMKilled' ||
+        reason === 'Error' ||
+        reason === 'FailedPostStartHookError' ||
+        (term.exitCode === 137 && reason !== 'Completed')
+      if (isContainerFault) {
+        const detail = term.message ? `\n    ${term.message}` : ''
+        const hint = `\n${getTerminatedReasonHint(reason, term.exitCode)}`
+        errors.push(
+          `  ✗ container "${JOB_CONTAINER_NAME}": ${reason} (exit code ${term.exitCode})${detail}${hint}`
+        )
+      } else {
+        errors.push(
+          `  → your script exited with a non-zero code; please check your script for errors`
+        )
+        sections.push(
+          `Container status: ${reason} (exit code ${term.exitCode})`
+        )
+      }
+    } else {
+      // Container state unavailable — treat as script issue by default
+      errors.push(`  → please check your script for errors`)
+    }
+    if (cs?.state?.waiting) {
+      errors.push(
+        `  ✗ container "${JOB_CONTAINER_NAME}" waiting: ${cs.state.waiting.reason ?? 'unknown'}`
+      )
+    }
+  } catch {
+    // pod already gone or API error — default hint
+    errors.push(`  → please check your script for errors`)
+  }
+ 
+  if (tailOutput) {
+    const outputLines = tailOutput
+      .split('\n')
+      .map(l => `  ${l}`)
+      .join('\n')
+    sections.push(`Last output:\n${outputLines}`)
+  }
+ 
+  let result = `failed to run script step:\n${errors.join('\n')}`
+  if (sections.length) {
+    result += `\n${sep}\n${sections.join('\n')}`
+  }
+  return result
+}
+ 
+function createContainerSpec(
+  container: RunContainerStepArgs,
+  extension?: k8s.V1PodTemplateSpec
+): k8s.V1Container {
+  const podContainer = new k8s.V1Container()
+  podContainer.name = JOB_CONTAINER_NAME
+  podContainer.image = container.image
+  podContainer.workingDir = '/__w'
+  podContainer.command = ['tail']
+  podContainer.args = DEFAULT_CONTAINER_ENTRY_POINT_ARGS
+ 
+  podContainer.volumeMounts = CONTAINER_VOLUMES
+ 
+  Eif (!extension) {
+    return podContainer
+  }
+ 
+  const from = extension.spec?.containers?.find(
+    c => c.name === JOB_CONTAINER_EXTENSION_NAME
+  )
+  if (from) {
+    mergeContainerWithOptions(podContainer, from)
+  }
+ 
+  return podContainer
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/src/hooks/run-script-step.ts.html b/packages/k8s/coverage/lcov-report/src/hooks/run-script-step.ts.html new file mode 100644 index 00000000..a728ac7c --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/hooks/run-script-step.ts.html @@ -0,0 +1,526 @@ + + + + + + Code coverage report for src/hooks/run-script-step.ts + + + + + + + + + +
+
+

All files / src/hooks run-script-step.ts

+
+ +
+ 90% + Statements + 45/50 +
+ + +
+ 81.25% + Branches + 13/16 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 89.58% + Lines + 43/48 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148  +7x +7x +  +7x +  +  +  +  +  +7x +7x +7x +  +  +  +3x +3x +  +  +  +3x +3x +3x +  +7x +  +3x +  +3x +3x +3x +  +  +7x +  +  +  +  +7x +2x +  +  +  +  +  +5x +5x +  +  +  +  +  +  +  +5x +5x +5x +5x +  +10x +  +  +  +  +  +  +  +  +10x +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +10x +  +  +  +  +  +  +  +  +  +  +  +5x +5x +  +5x +  +  +  +  +4x +3x +  +  +4x +4x +  +  +  +3x +  +1x +1x +  +5x +5x +  +  +  +  +  +  +1x +  +  +2x +  +  +  +  +  +  +  +  + 
/* eslint-disable @typescript-eslint/no-unused-vars */
+import * as fs from 'fs'
+import * as core from '@actions/core'
+import { RunScriptStepArgs } from 'hooklib'
+import {
+  execCpFromPod,
+  execCpToPod,
+  execPodStep,
+  execPodStepWithOutput
+} from '../k8s'
+import { formatError, writeRunScript } from '../k8s/utils'
+import { JOB_CONTAINER_NAME } from './constants'
+import { dirname } from 'path'
+import * as shlex from 'shlex'
+ 
+function formatScriptError(exitCode: number, tailOutput: string): string {
+  const sep = '-'.repeat(60)
+  const errors = [
+    `  ✗ exit code: ${exitCode}`,
+    `  → your script exited with a non-zero code; please check your script for errors`
+  ]
+  const sections: string[] = []
+  Eif (tailOutput) {
+    const outputLines = tailOutput
+      .split('\n')
+      .map(l => `  ${l}`)
+      .join('\n')
+    sections.push(`Last output:\n${outputLines}`)
+  }
+  let result = `failed to run script step:\n${errors.join('\n')}`
+  Eif (sections.length) result += `\n${sep}\n${sections.join('\n')}`
+  return result
+}
+ 
+export async function runScriptStep(
+  args: RunScriptStepArgs,
+  state
+): Promise<void> {
+  // Validate that pod was created successfully (prepareJob succeeded)
+  if (!state?.jobPod) {
+    throw new Error(
+      'jobPod must be set - ensure prepareJob completed successfully before running script steps'
+    )
+  }
+ 
+  // Write the entrypoint first. This will be later coppied to the workflow pod
+  const { entryPoint, entryPointArgs, environmentVariables } = args
+  const { containerPath, runnerPath } = writeRunScript(
+    args.workingDirectory,
+    entryPoint,
+    entryPointArgs,
+    args.prependPath,
+    environmentVariables
+  )
+ 
+  const workdir = dirname(process.env.RUNNER_WORKSPACE as string)
+  const runnerTemp = `${workdir}/_temp`
+  const containerTemp = '/__w/_temp'
+  const containerTempSrc = '/__w/_temp_pre'
+  // Ensure base and staging dirs exist before copying
+  await execPodStep(
+    [
+      'sh',
+      '-c',
+      'mkdir -p /__w && mkdir -p /__w/_temp && mkdir -p /__w/_temp_pre'
+    ],
+    state.jobPod,
+    JOB_CONTAINER_NAME
+  )
+  await execCpToPod(state.jobPod, runnerTemp, containerTempSrc)
+ 
+  // Copy GitHub directories from temp to /github
+  // Merge strategy:
+  // - Overwrite files in _runner_file_commands
+  // - Append files not already present elsewhere
+  const mergeCommands = [
+    'set -e',
+    'mkdir -p /__w/_temp /__w/_temp_pre',
+    'SRC=/__w/_temp_pre',
+    'DST=/__w/_temp',
+    // Overwrite _runner_file_commands
+    'cp -a "$SRC/_runner_file_commands/." "$DST/_runner_file_commands"',
+    `find "$SRC" -type f ! -path "*/_runner_file_commands/*" -exec sh -c '
+    rel="\${1#$2/}"
+    target="$3/$rel"
+    mkdir -p "$(dirname "$target")"
+    cp -a "$1" "$target"
+  ' _ {} "$SRC" "$DST" \\;`,
+    // Remove _temp_pre after merging
+    'rm -rf /__w/_temp_pre'
+  ]
+ 
+  try {
+    await execPodStep(
+      ['sh', '-c', mergeCommands.join(' && ')],
+      state.jobPod,
+      JOB_CONTAINER_NAME
+    )
+  } catch (err) {
+    const message = formatError(err)
+    core.debug(`Failed to merge temp directories: ${message}`)
+    throw new Error(`failed to merge temp dirs: ${message}`)
+  }
+ 
+  // Execute the entrypoint script
+  args.entryPoint = 'sh'
+  args.entryPointArgs = ['-e', containerPath]
+  try {
+    const { code, output } = await execPodStepWithOutput(
+      [args.entryPoint, ...args.entryPointArgs],
+      state.jobPod,
+      JOB_CONTAINER_NAME
+    )
+    if (code !== 0) {
+      throw new Error(formatScriptError(code, output))
+    }
+  } catch (err) {
+    core.debug(`execPodStep failed: ${formatError(err)}`)
+    if (
+      err instanceof Error &&
+      err.message.startsWith('failed to run script step')
+    ) {
+      throw err
+    }
+    const message = formatError(err)
+    throw new Error(`failed to run script step: ${message}`)
+  } finally {
+    try {
+      fs.rmSync(runnerPath, { force: true })
+    } catch (removeErr) {
+      core.debug(`Failed to remove file ${runnerPath}: ${removeErr}`)
+    }
+  }
+ 
+  try {
+    core.debug(
+      `Copying from job pod '${state.jobPod}' ${containerTemp} to ${runnerTemp}`
+    )
+    await execCpFromPod(
+      state.jobPod,
+      `${containerTemp}/_runner_file_commands`,
+      `${workdir}/_temp`
+    )
+  } catch (error) {
+    core.warning('Failed to copy _temp from pod')
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/src/k8s/heartbeat.ts.html b/packages/k8s/coverage/lcov-report/src/k8s/heartbeat.ts.html new file mode 100644 index 00000000..086546fd --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/k8s/heartbeat.ts.html @@ -0,0 +1,493 @@ + + + + + + Code coverage report for src/k8s/heartbeat.ts + + + + + + + + + +
+
+

All files / src/k8s heartbeat.ts

+
+ +
+ 85.71% + Statements + 60/70 +
+ + +
+ 78.12% + Branches + 25/32 +
+ + +
+ 91.66% + Functions + 11/12 +
+ + +
+ 85.29% + Lines + 58/68 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +13714x +  +  +  +  +  +  +  +  +  +14x +  +  +  +8x +8x +  +  +14x +8x +8x +8x +14x +  +  +8x +8x +  +  +14x +22x +22x +  +  +  +22x +  +  +14x +8x +  +  +8x +8x +8x +  +8x +4x +4x +  +  +  +14x +8x +  +  +8x +  +8x +5x +1x +1x +  +5x +1x +  +  +1x +1x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +8x +  +8x +1x +  +  +1x +1x +  +  +  +8x +  +  +  +  +8x +1x +1x +  +  +  +8x +29x +  +16x +  +13x +12x +12x +12x +4x +4x +  +12x +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +14x + 
import * as core from '@actions/core'
+ 
+export interface HeartbeatWebSocket {
+  readyState: number
+  ping(): void
+  close(): void
+  on(event: string, listener: (...args: any[]) => void): this
+  once(event: string, listener: (...args: any[]) => void): this
+}
+ 
+export function parsePositiveMsEnv(
+  value: string | undefined,
+  fallback: number
+): number {
+  const parsed = Number.parseInt(value ?? '', 10)
+  return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback
+}
+ 
+export class WebSocketHeartbeat {
+  private pingInterval: ReturnType<typeof setInterval> | null = null
+  private pongTimeout: ReturnType<typeof setTimeout> | null = null
+  private lastHeartbeatLog = 0
+  private static readonly LOG_INTERVAL_MS = 2 * 60 * 1000
+ 
+  constructor(
+    private readonly pingPeriodMs: number,
+    private readonly pongDeadlineMs: number
+  ) {}
+ 
+  private shouldLog(): boolean {
+    const now = Date.now()
+    Iif (now - this.lastHeartbeatLog >= WebSocketHeartbeat.LOG_INTERVAL_MS) {
+      this.lastHeartbeatLog = now
+      return true
+    }
+    return false
+  }
+ 
+  stop(): void {
+    Iif (this.shouldLog()) {
+      core.debug('[Heartbeat] stopping heartbeat')
+    }
+    Eif (this.pingInterval) {
+      clearInterval(this.pingInterval)
+      this.pingInterval = null
+    }
+    if (this.pongTimeout) {
+      clearTimeout(this.pongTimeout)
+      this.pongTimeout = null
+    }
+  }
+ 
+  start(ws: HeartbeatWebSocket, reject: (err: Error) => void): void {
+    core.debug(
+      `[Heartbeat] Starting with period=${this.pingPeriodMs}ms, deadline=${this.pongDeadlineMs}ms`
+    )
+    this.lastHeartbeatLog = Date.now()
+ 
+    const resetPongTimeout = (): void => {
+      if (this.pongTimeout) {
+        clearTimeout(this.pongTimeout)
+        this.pongTimeout = null
+      }
+      this.pongTimeout = setTimeout(() => {
+        core.warning(
+          `[Heartbeat] No pong received in ${this.pongDeadlineMs}ms, closing stale connection`
+        )
+        this.stop()
+        try {
+          ws.close()
+        } catch {
+          // ignore errors closing an already-closing socket
+        }
+        reject(
+          new Error(
+            `WebSocket heartbeat timeout: no pong within ${this.pongDeadlineMs}ms`
+          )
+        )
+      }, this.pongDeadlineMs)
+    }
+ 
+    // Arm the deadline only after the first ping is sent, not immediately on
+    // start, so a slow CONNECTING socket cannot time out before any exchange.
+    let deadlineArmed = false
+ 
+    ws.on('pong', () => {
+      Iif (this.shouldLog()) {
+        core.debug('[Heartbeat] Pong received')
+      }
+      Eif (deadlineArmed) {
+        resetPongTimeout()
+      }
+    })
+ 
+    ws.on('error', (err: Error) => {
+      core.error(`[Heartbeat] WebSocket error: ${err.message}`)
+      this.stop()
+    })
+ 
+    ws.on('close', () => {
+      core.debug('[Heartbeat] WebSocket closed, stopping heartbeat')
+      this.stop()
+    })
+ 
+    // WebSocket readyState: 0 = CONNECTING, 1 = OPEN, 2 = CLOSING, 3 = CLOSED
+    this.pingInterval = setInterval(() => {
+      if (ws.readyState === 0) {
+        // Still connecting — skip this tick but keep the interval alive
+        return
+      }
+      if (ws.readyState === 1) {
+        try {
+          ws.ping()
+          if (!deadlineArmed) {
+            deadlineArmed = true
+            resetPongTimeout()
+          }
+          Iif (this.shouldLog()) {
+            core.debug('[Heartbeat] Ping sent')
+          }
+        } catch (err) {
+          core.error(`[Heartbeat] Ping failed: ${err}`)
+          this.stop()
+        }
+      } else {
+        // CLOSING (2) or CLOSED (3)
+        Iif (this.shouldLog()) {
+          core.debug(
+            `[Heartbeat] WebSocket closing/closed (readyState=${ws.readyState}), stopping heartbeat`
+          )
+        }
+        this.stop()
+      }
+    }, this.pingPeriodMs)
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/src/k8s/index.html b/packages/k8s/coverage/lcov-report/src/k8s/index.html new file mode 100644 index 00000000..7abfc014 --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/k8s/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/k8s + + + + + + + + + +
+
+

All files src/k8s

+
+ +
+ 53.94% + Statements + 472/875 +
+ + +
+ 54.1% + Branches + 323/597 +
+ + +
+ 47.69% + Functions + 62/130 +
+ + +
+ 54.59% + Lines + 428/784 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
heartbeat.ts +
+
85.71%60/7078.12%25/3291.66%11/1285.29%58/68
index.ts +
+
51.18%412/80552.74%298/56543.22%51/11851.67%370/716
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/src/k8s/index.ts.html b/packages/k8s/coverage/lcov-report/src/k8s/index.ts.html new file mode 100644 index 00000000..b4e20d9b --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/k8s/index.ts.html @@ -0,0 +1,5599 @@ + + + + + + Code coverage report for src/k8s/index.ts + + + + + + + + + +
+
+

All files / src/k8s index.ts

+
+ +
+ 51.18% + Statements + 412/805 +
+ + +
+ 52.74% + Branches + 298/565 +
+ + +
+ 43.22% + Functions + 51/118 +
+ + +
+ 51.67% + Lines + 370/716 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533 +1534 +1535 +1536 +1537 +1538 +1539 +1540 +1541 +1542 +1543 +1544 +1545 +1546 +1547 +1548 +1549 +1550 +1551 +1552 +1553 +1554 +1555 +1556 +1557 +1558 +1559 +1560 +1561 +1562 +1563 +1564 +1565 +1566 +1567 +1568 +1569 +1570 +1571 +1572 +1573 +1574 +1575 +1576 +1577 +1578 +1579 +1580 +1581 +1582 +1583 +1584 +1585 +1586 +1587 +1588 +1589 +1590 +1591 +1592 +1593 +1594 +1595 +1596 +1597 +1598 +1599 +1600 +1601 +1602 +1603 +1604 +1605 +1606 +1607 +1608 +1609 +1610 +1611 +1612 +1613 +1614 +1615 +1616 +1617 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628 +1629 +1630 +1631 +1632 +1633 +1634 +1635 +1636 +1637 +1638 +1639 +1640 +1641 +1642 +1643 +1644 +1645 +1646 +1647 +1648 +1649 +1650 +1651 +1652 +1653 +1654 +1655 +1656 +1657 +1658 +1659 +1660 +1661 +1662 +1663 +1664 +1665 +1666 +1667 +1668 +1669 +1670 +1671 +1672 +1673 +1674 +1675 +1676 +1677 +1678 +1679 +1680 +1681 +1682 +1683 +1684 +1685 +1686 +1687 +1688 +1689 +1690 +1691 +1692 +1693 +1694 +1695 +1696 +1697 +1698 +1699 +1700 +1701 +1702 +1703 +1704 +1705 +1706 +1707 +1708 +1709 +1710 +1711 +1712 +1713 +1714 +1715 +1716 +1717 +1718 +1719 +1720 +1721 +1722 +1723 +1724 +1725 +1726 +1727 +1728 +1729 +1730 +1731 +1732 +1733 +1734 +1735 +1736 +1737 +1738 +1739 +1740 +1741 +1742 +1743 +1744 +1745 +1746 +1747 +1748 +1749 +1750 +1751 +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761 +1762 +1763 +1764 +1765 +1766 +1767 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1775 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1784 +1785 +1786 +1787 +1788 +1789 +1790 +1791 +1792 +1793 +1794 +1795 +1796 +1797 +1798 +1799 +1800 +1801 +1802 +1803 +1804 +1805 +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817 +1818 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828 +1829 +1830 +1831 +1832 +1833 +1834 +1835 +1836 +1837 +1838 +183913x +13x +13x +13x +13x +13x +13x +13x +13x +  +13x +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +13x +13x +  +  +13x +  +13x +  +13x +13x +13x +  +13x +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +13x +  +  +7x +7x +  +  +7x +7x +36x +36x +36x +  +  +  +7x +7x +35x +35x +35x +70x +  +  +7x +7x +3x +3x +3x +6x +  +  +7x +7x +  +  +  +7x +  +  +  +  +  +7x +  +35x +35x +35x +35x +  +  +  +  +  +7x +  +3x +3x +3x +3x +  +  +  +  +  +  +  +  +  +7x +4x +4x +  +  +7x +7x +  +  +  +  +  +  +  +  +  +  +5x +5x +5x +3x +  +  +  +  +2x +2x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +1x +  +1x +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +3x +  +3x +90x +  +90x +  +  +90x +  +  +  +  +  +  +  +90x +90x +180x +90x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +90x +  +  +  +90x +90x +90x +3x +  +  +  +174x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +2x +2x +  +  +  +  +  +  +  +2x +  +  +  +2x +60x +  +  +60x +60x +60x +60x +  +  +  +  +  +  +  +60x +60x +  +120x +  +  +  +  +60x +60x +60x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +60x +  +  +  +60x +60x +60x +2x +  +  +  +116x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +3x +3x +  +3x +  +  +  +3x +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +13x +21x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +13x +  +  +  +  +  +13x +28x +28x +26x +  +2x +3x +3x +3x +3x +  +  +2x +  +  +  +  +  +13x +23x +23x +21x +  +2x +3x +3x +3x +3x +  +  +2x +  +  +13x +  +24x +24x +21x +  +3x +7x +7x +7x +4x +  +  +3x +  +  +  +  +  +  +  +  +13x +  +  +19x +58x +  +  +  +  +  +  +  +  +  +  +  +13x +17x +17x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +4x +  +  +  +  +  +  +  +3x +  +1x +  +1x +  +  +  +13x +18x +18x +18x +  +  +  +36x +14x +14x +9x +9x +9x +9x +  +  +18x +  +  +13x +  +  +  +11x +3x +  +8x +2x +  +6x +5x +  +1x +  +  +  +  +  +1x +  +3x +  +  +1x +  +  +13x +21x +21x +21x +  +  +  +42x +17x +17x +11x +11x +11x +11x +  +  +21x +  +  +  +10x +  +4x +  +  +  +  +  +  +1x +  +  +  +  +  +  +4x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +13x +21x +21x +  +  +  +  +  +21x +  +  +  +19x +  +2x +  +  +  +  +2x +  +  +19x +19x +19x +19x +  +  +  +  +3x +  +  +  +  +16x +  +  +  +5x +  +  +  +  +5x +  +11x +1x +  +10x +10x +10x +10x +10x +10x +  +19x +  +  +  +  +  +  +  +  +13x +  +  +9x +  +1x +  +  +  +  +8x +8x +  +  +8x +8x +  +  +8x +8x +1x +  +  +  +8x +1x +1x +1x +1x +  +  +8x +  +  +8x +8x +  +  +  +8x +8x +3x +3x +  +  +2x +1x +1x +  +  +  +  +3x +  +3x +1x +1x +1x +  +  +  +  +8x +2x +  +  +  +8x +8x +3x +  +  +8x +  +  +8x +  +  +  +  +  +  +  +  +8x +  +  +  +6x +  +2x +  +  +  +  +2x +  +  +6x +6x +3x +  +  +3x +  +  +  +3x +  +3x +3x +3x +3x +  +3x +  +  +  +  +3x +  +  +  +  +  +  +  +  +13x +6x +  +  +  +  +  +  +  +  +13x +  +  +  +  +6x +  +6x +  +6x +  +  +  +6x +  +  +  +  +  +6x +  +  +  +  +  +  +  +13x +  +  +  +18x +  +10x +10x +15x +15x +  +15x +  +  +  +  +6x +  +  +  +  +  +12x +  +2x +  +  +  +  +  +4x +  +9x +9x +3x +  +  +  +  +  +  +  +10x +2x +2x +2x +  +  +  +  +2x +  +  +  +  +  +  +  +4x +5x +3x +3x +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +5x +  +5x +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +24x +  +  +  +  +  +13x +  +  +  +  +  +  +  +13x +16x +3x +  +13x +  +  +  +3x +  +  +  +1x +1x +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +21x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +276x +213x +  +  +63x +63x +63x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +13x +13x +13x +13x +3x +  +  +  +13x +14x +7x +  +7x +7x +2x +  +5x +5x +  +5x +  +  +  +13x +  +13x +  +  +21x +21x +21x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +  +  +13x +  +  +  +  +  +  +13x +21x +  +  +  +  +  + 
import * as core from '@actions/core'
+import * as fs from 'fs'
+import * as path from 'path'
+import { spawn } from 'child_process'
+import * as k8s from '@kubernetes/client-node'
+import tar from 'tar-fs'
+import * as stream from 'stream'
+import { WritableStreamBuffer } from 'stream-buffers'
+import { createHash } from 'crypto'
+import type { ContainerInfo, Registry } from 'hooklib'
+import {
+  getSecretName,
+  JOB_CONTAINER_NAME,
+  RunnerInstanceLabel
+} from '../hooks/constants'
+import {
+  PodPhase,
+  formatError,
+  mergePodSpecWithOptions,
+  mergeObjectMeta,
+  fixArgs,
+  listDirAllCommand,
+  sleep,
+  EXTERNALS_VOLUME_NAME,
+  GITHUB_VOLUME_NAME,
+  WORK_VOLUME
+} from './utils'
+import * as shlex from 'shlex'
+import { parsePositiveMsEnv, WebSocketHeartbeat } from './heartbeat'
+import type { HeartbeatWebSocket } from './heartbeat'
+ 
+const kc = new k8s.KubeConfig()
+ 
+kc.loadFromDefault()
+ 
+const k8sApi = kc.makeApiClient(k8s.CoreV1Api)
+const k8sBatchV1Api = kc.makeApiClient(k8s.BatchV1Api)
+const k8sAuthorizationV1Api = kc.makeApiClient(k8s.AuthorizationV1Api)
+ 
+const DEFAULT_WAIT_FOR_POD_TIME_SECONDS = 10 * 60 // 10 min
+ 
+export const requiredPermissions = [
+  {
+    group: '',
+    verbs: ['get', 'list', 'create', 'delete'],
+    resource: 'pods',
+    subresource: ''
+  },
+  {
+    group: '',
+    verbs: ['get', 'create'],
+    resource: 'pods',
+    subresource: 'exec'
+  },
+  {
+    group: '',
+    verbs: ['get', 'list', 'watch'],
+    resource: 'pods',
+    subresource: 'log'
+  },
+  {
+    group: '',
+    verbs: ['create', 'delete', 'get', 'list'],
+    resource: 'secrets',
+    subresource: ''
+  }
+]
+ 
+export async function createJobPod(
+  name: string,
+  jobContainer?: k8s.V1Container,
+  services?: k8s.V1Container[],
+  registry?: Registry,
+  extension?: k8s.V1PodTemplateSpec
+): Promise<k8s.V1Pod> {
+  const containers: k8s.V1Container[] = []
+  if (jobContainer) {
+    containers.push(jobContainer)
+  }
+  if (services?.length) {
+    containers.push(...services)
+  }
+ 
+  const appPod = new k8s.V1Pod()
+ 
+  appPod.apiVersion = 'v1'
+  appPod.kind = 'Pod'
+ 
+  appPod.metadata = new k8s.V1ObjectMeta()
+  appPod.metadata.name = name
+ 
+  const instanceLabel = new RunnerInstanceLabel()
+  appPod.metadata.labels = {
+    [instanceLabel.key]: instanceLabel.value
+  }
+  appPod.metadata.annotations = {}
+ 
+  appPod.spec = new k8s.V1PodSpec()
+  appPod.spec.containers = containers
+  appPod.spec.securityContext = {
+    fsGroup: 1001
+  }
+ 
+  // Extract working directory from GITHUB_WORKSPACE
+  // GITHUB_WORKSPACE is like /__w/repo-name/repo-name
+  const githubWorkspace = process.env.GITHUB_WORKSPACE
+  const workingDirPath = githubWorkspace?.split('/').slice(-2).join('/') ?? ''
+ 
+  const initCommands = [
+    'mkdir -p /mnt/externals',
+    'mkdir -p /mnt/work',
+    'mkdir -p /mnt/github',
+    'mv /home/runner/externals/* /mnt/externals/'
+  ]
+ 
+  if (workingDirPath) {
+    initCommands.push(`mkdir -p /mnt/work/${workingDirPath}`)
+  }
+ 
+  appPod.spec.initContainers = [
+    {
+      name: 'fs-init',
+      image:
+        process.env.ACTIONS_RUNNER_IMAGE ||
+        'ghcr.io/actions/actions-runner:latest',
+      command: ['sh', '-c', initCommands.join(' && ')],
+      securityContext: {
+        runAsGroup: 1001,
+        runAsUser: 1001
+      },
+      volumeMounts: [
+        {
+          name: EXTERNALS_VOLUME_NAME,
+          mountPath: '/mnt/externals'
+        },
+        {
+          name: WORK_VOLUME,
+          mountPath: '/mnt/work'
+        },
+        {
+          name: GITHUB_VOLUME_NAME,
+          mountPath: '/mnt/github'
+        }
+      ]
+    }
+  ]
+ 
+  appPod.spec.restartPolicy = 'Never'
+ 
+  appPod.spec.volumes = [
+    {
+      name: EXTERNALS_VOLUME_NAME,
+      emptyDir: {}
+    },
+    {
+      name: GITHUB_VOLUME_NAME,
+      emptyDir: {}
+    },
+    {
+      name: WORK_VOLUME,
+      emptyDir: {}
+    }
+  ]
+ 
+  if (registry) {
+    const secret = await createDockerSecret(registry)
+    if (!secret?.metadata?.name) {
+      throw new Error(`created secret does not have secret.metadata.name`)
+    }
+    const secretReference = new k8s.V1LocalObjectReference()
+    secretReference.name = secret.metadata.name
+    appPod.spec.imagePullSecrets = [secretReference]
+  }
+ 
+  if (extension?.metadata) {
+    mergeObjectMeta(appPod, extension.metadata)
+  }
+ 
+  if (extension?.spec) {
+    mergePodSpecWithOptions(appPod.spec, extension.spec)
+  }
+ 
+  return await k8sApi.createNamespacedPod({
+    namespace: namespace(),
+    body: appPod
+  })
+}
+ 
+export async function createContainerStepPod(
+  name: string,
+  container: k8s.V1Container,
+  extension?: k8s.V1PodTemplateSpec
+): Promise<k8s.V1Pod> {
+  const appPod = new k8s.V1Pod()
+ 
+  appPod.apiVersion = 'v1'
+  appPod.kind = 'Pod'
+ 
+  appPod.metadata = new k8s.V1ObjectMeta()
+  appPod.metadata.name = name
+ 
+  const instanceLabel = new RunnerInstanceLabel()
+  appPod.metadata.labels = {
+    [instanceLabel.key]: instanceLabel.value
+  }
+  appPod.metadata.annotations = {}
+ 
+  appPod.spec = new k8s.V1PodSpec()
+  appPod.spec.containers = [container]
+ 
+  appPod.spec.restartPolicy = 'Never'
+ 
+  appPod.spec.volumes = [
+    {
+      name: EXTERNALS_VOLUME_NAME,
+      emptyDir: {}
+    },
+    {
+      name: GITHUB_VOLUME_NAME,
+      emptyDir: {}
+    },
+    {
+      name: WORK_VOLUME,
+      emptyDir: {}
+    }
+  ]
+ 
+  if (extension?.metadata) {
+    mergeObjectMeta(appPod, extension.metadata)
+  }
+ 
+  if (extension?.spec) {
+    mergePodSpecWithOptions(appPod.spec, extension.spec)
+  }
+ 
+  return await k8sApi.createNamespacedPod({
+    namespace: namespace(),
+    body: appPod
+  })
+}
+ 
+export async function deletePod(name: string): Promise<void> {
+  await k8sApi.deleteNamespacedPod({
+    name,
+    namespace: namespace(),
+    gracePeriodSeconds: 0
+  })
+}
+ 
+export async function execPodStep(
+  command: string[],
+  podName: string,
+  containerName: string,
+  stdin?: stream.Readable
+): Promise<number> {
+  const exec = new k8s.Exec(kc)
+  core.debug(
+    `[execPodStep] Starting: cmd="${command[0]}" (${command.length} args), pod=${podName}, container=${containerName}`
+  )
+ 
+  command = fixArgs(command)
+ 
+  const DEFAULT_PING_PERIOD_MS = 5000
+  const pingPeriodMs = parsePositiveMsEnv(
+    process.env.ACTIONS_RUNNER_HEARTBEAT_PERIOD_MS,
+    DEFAULT_PING_PERIOD_MS
+  )
+  const pongDeadlineMs = parsePositiveMsEnv(
+    process.env.ACTIONS_RUNNER_HEARTBEAT_DEADLINE_MS,
+    pingPeriodMs * 12 + 1000
+  )
+  core.debug(
+    `[execPodStep] Heartbeat config: pingPeriodMs=${pingPeriodMs}, pongDeadlineMs=${pongDeadlineMs}`
+  )
+ 
+  const heartbeat = new WebSocketHeartbeat(pingPeriodMs, pongDeadlineMs)
+ 
+  return new Promise<number>((resolve, reject) => {
+    core.debug('[execPodStep] About to call exec.exec')
+    let ws: HeartbeatWebSocket | null = null
+ 
+    exec
+      .exec(
+        namespace(),
+        podName,
+        containerName,
+        command,
+        process.stdout,
+        process.stderr,
+        stdin ?? null,
+        false /* tty */,
+        async resp => {
+          core.debug(
+            `[execPodStep] execPodStep response: ${JSON.stringify(resp)}`
+          )
+ 
+          heartbeat.stop()
+ 
+          // Close WebSocket and wait for it before resolving/rejecting
+          const closeWebSocket = async (): Promise<void> => {
+            const socket = ws
+            if (
+              socket &&
+              (socket.readyState === 1 || socket.readyState === 0)
+            ) {
+              return new Promise<void>(closeResolve => {
+                const closeTimeout = setTimeout(() => {
+                  core.warning(
+                    '[execPodStep] WebSocket close timeout, forcing cleanup'
+                  )
+                  closeResolve()
+                }, 5000)
+ 
+                socket.once('close', () => {
+                  clearTimeout(closeTimeout)
+                  core.debug('[execPodStep] WebSocket closed cleanly')
+                  closeResolve()
+                })
+                socket.close()
+              })
+            }
+          }
+ 
+          if (resp.status === 'Success') {
+            core.debug(`[execPodStep] Success, code: ${resp.code}`)
+            await closeWebSocket()
+            resolve(resp.code || 0)
+          } else {
+            core.debug(
+              `[execPodStep] Failure: ${JSON.stringify({ message: resp?.message, details: resp?.details })}`
+            )
+            await closeWebSocket()
+            reject(new Error(resp?.message || 'execPodStep failed'))
+          }
+        }
+      )
+      .then(websocket => {
+        core.debug('[execPodStep] exec.exec resolved, ws object received')
+        ws = websocket
+        if (ws) {
+          heartbeat.start(ws, reject)
+        } else {
+          core.warning('[Heartbeat] WebSocket is null, heartbeat not started')
+        }
+      })
+      .catch(async e => {
+        heartbeat.stop()
+        core.error(`[execPodStep] exec.exec threw error: ${e}`)
+ 
+        // Close WebSocket before rejecting with timeout protection
+        const socket = ws
+        if (socket && (socket.readyState === 1 || socket.readyState === 0)) {
+          await new Promise<void>(closeResolve => {
+            const closeTimeout = setTimeout(() => {
+              core.warning(
+                '[execPodStep] WebSocket close timeout in error handler'
+              )
+              closeResolve()
+            }, 5000)
+ 
+            socket.once('close', () => {
+              clearTimeout(closeTimeout)
+              closeResolve()
+            })
+            socket.close()
+          })
+        }
+ 
+        reject(e)
+      })
+  })
+}
+ 
+// Variant of execPodStep that also captures the last `tailLines` lines of
+// combined stdout/stderr so callers can surface the script's own output on
+// failure. Returns the exit code plus the tail (empty string on success or if
+// nothing was emitted). The original streams are still tee'd to
+// process.stdout/process.stderr so GitHub Actions logs are unchanged.
+export async function execPodStepWithOutput(
+  command: string[],
+  podName: string,
+  containerName: string,
+  tailLines = 20,
+  stdin?: stream.Readable
+): Promise<{ code: number; output: string }> {
+  const exec = new k8s.Exec(kc)
+  command = fixArgs(command)
+ 
+  // Ring buffer of the last N non-empty lines (cap to keep memory bounded).
+  const buffer: string[] = []
+  const push = (line: string): void => {
+    Iif (line.length === 0) return
+    buffer.push(line)
+    if (buffer.length > tailLines) buffer.shift()
+  }
+ 
+  // Separate pending buffers per stream to prevent stdout/stderr interleaving.
+  let pendingOut = ''
+  const ingestOut = (chunk: Buffer | string): void => {
+    pendingOut += chunk.toString('utf8')
+    const lines = pendingOut.split(/\r?\n/)
+    pendingOut = lines.pop() ?? ''
+    for (const line of lines) push(line)
+  }
+ 
+  let pendingErr = ''
+  const ingestErr = (chunk: Buffer | string): void => {
+    pendingErr += chunk.toString('utf8')
+    const lines = pendingErr.split(/\r?\n/)
+    pendingErr = lines.pop() ?? ''
+    for (const line of lines) push(line)
+  }
+ 
+  const flushPending = (): void => {
+    Iif (pendingOut) {
+      push(pendingOut)
+      pendingOut = ''
+    }
+    Iif (pendingErr) {
+      push(pendingErr)
+      pendingErr = ''
+    }
+  }
+ 
+  const capture = new stream.Writable({
+    write(chunk: Buffer | string, _enc, cb) {
+      try {
+        ingestOut(chunk)
+        process.stdout.write(chunk)
+        cb()
+      } catch (e) {
+        cb(e as Error)
+      }
+    }
+  })
+  const captureErr = new stream.Writable({
+    write(chunk: Buffer | string, _enc, cb) {
+      try {
+        ingestErr(chunk)
+        process.stderr.write(chunk)
+        cb()
+      } catch (e) {
+        cb(e as Error)
+      }
+    }
+  })
+ 
+  // Parse an exit code from a k8s exec error/status message.
+  // Handles both "command terminated with exit code N" and
+  // "command terminated with non-zero exit code: command terminated with exit code N".
+  const parseExitCode = (msg: string | undefined): number | null => {
+    const m = msg?.match(/exit code[:\s]+(\d+)/i)
+    return m ? parseInt(m[1], 10) : null
+  }
+ 
+  return await new Promise(function (resolve, reject) {
+    exec
+      .exec(
+        namespace(),
+        podName,
+        containerName,
+        command,
+        capture,
+        captureErr,
+        stdin ?? null,
+        false /* tty */,
+        resp => {
+          core.debug(`execPodStepWithOutput response: ${JSON.stringify(resp)}`)
+          flushPending()
+          if (resp.status === 'Success') {
+            resolve({ code: resp.code || 0, output: buffer.join('\n') })
+          } else {
+            // k8s exec returns status='Failure' for non-zero script exit.
+            // resp.code may be undefined depending on k8s version; fall back
+            // to parsing the exit code from the message string.
+            const code = parseExitCode(resp?.message)
+            if (code !== null) {
+              resolve({ code, output: buffer.join('\n') })
+            } else {
+              reject(new Error(resp?.message || 'execPodStepWithOutput failed'))
+            }
+          }
+        }
+      )
+      .catch(e => {
+        // In @kubernetes/client-node v1.x the promise returned by exec()
+        // itself rejects for non-zero exits (the status callback may or may
+        // not fire first). Detect this case via the error message so the
+        // caller can classify the error instead of treating it as a hook
+        // failure. Genuine failures (connection drop, etc.) still reject.
+        flushPending()
+        const errMsg = e instanceof Error ? e.message : String(e)
+        const code = parseExitCode(errMsg)
+        if (code !== null) {
+          resolve({ code, output: buffer.join('\n') })
+        } else {
+          reject(e)
+        }
+      })
+  })
+}
+ 
+export async function execCalculateOutputHashSorted(
+  podName: string,
+  containerName: string,
+  command: string[]
+): Promise<{ hash: string; lines: string[] }> {
+  const exec = new k8s.Exec(kc)
+ 
+  let output = ''
+  const outputWriter = new stream.Writable({
+    write(chunk, _enc, cb) {
+      try {
+        output += chunk.toString('utf8')
+        cb()
+      } catch (e) {
+        cb(e as Error)
+      }
+    }
+  })
+ 
+  await new Promise<void>((resolve, reject) => {
+    exec
+      .exec(
+        namespace(),
+        podName,
+        containerName,
+        command,
+        outputWriter, // capture stdout
+        process.stderr,
+        null,
+        false /* tty */,
+        resp => {
+          core.debug(`internalExecOutput response: ${JSON.stringify(resp)}`)
+          if (resp.status === 'Success') {
+            resolve()
+          } else {
+            core.debug(
+              JSON.stringify({
+                message: resp?.message,
+                details: resp?.details
+              })
+            )
+            reject(new Error(resp?.message || 'internalExecOutput failed'))
+          }
+        }
+      )
+      .catch(e => reject(e))
+  })
+ 
+  outputWriter.end()
+ 
+  // Sort lines for consistent ordering across platforms
+  const lines = output
+    .split('\n')
+    .filter(line => line.length > 0)
+    .sort()
+  const sortedOutput = lines.join('\n') + '\n'
+ 
+  const hash = createHash('sha256')
+  hash.update(sortedOutput)
+  return { hash: hash.digest('hex'), lines }
+}
+ 
+export async function localCalculateOutputHashSorted(
+  commands: string[]
+): Promise<{ hash: string; lines: string[] }> {
+  return await new Promise<{ hash: string; lines: string[] }>(
+    (resolve, reject) => {
+      const child = spawn(commands[0], commands.slice(1), {
+        stdio: ['ignore', 'pipe', 'ignore']
+      })
+ 
+      let output = ''
+      child.stdout.on('data', chunk => {
+        output += chunk.toString('utf8')
+      })
+      child.on('error', reject)
+      child.on('close', (code: number) => {
+        if (code === 0) {
+          // Sort lines for consistent ordering across distributions/platforms
+          const lines = output
+            .split('\n')
+            .filter(line => line.length > 0)
+            .sort()
+          const sortedOutput = lines.join('\n') + '\n'
+ 
+          const hash = createHash('sha256')
+          hash.update(sortedOutput)
+          resolve({ hash: hash.digest('hex'), lines })
+        } else {
+          reject(new Error(`child process exited with code ${code}`))
+        }
+      })
+    }
+  )
+}
+ 
+export async function execCpToPod(
+  podName: string,
+  runnerPath: string,
+  containerPath: string
+): Promise<void> {
+  core.debug(`Copying ${runnerPath} to pod ${podName} at ${containerPath}`)
+ 
+  let attempt = 0
+  while (Itrue) {
+    try {
+      const exec = new k8s.Exec(kc)
+      // Use tar to extract with --no-same-owner to avoid ownership issues.
+      // Then use find to fix permissions. The -m flag helps but we also need to fix permissions after.
+      const command = [
+        'sh',
+        '-c',
+        `tar xf - --no-same-owner -C ${shlex.quote(containerPath)} 2>/dev/null; ` +
+          `find ${shlex.quote(containerPath)} -type f -exec chmod u+rw {} \\; 2>/dev/null; ` +
+          `find ${shlex.quote(containerPath)} -type d -exec chmod u+rwx {} \\; 2>/dev/null; ` +
+          `sync 2>/dev/null || true`
+      ]
+      const readStream = tar.pack(runnerPath)
+      const errStream = new WritableStreamBuffer()
+      await new Promise((resolve, reject) => {
+        exec
+          .exec(
+            namespace(),
+            podName,
+            JOB_CONTAINER_NAME,
+            command,
+            null,
+            errStream,
+            readStream,
+            false,
+            async status => {
+              if (errStream.size()) {
+                return reject(
+                  new Error(
+                    `Error from execCpToPod - status: ${status.status}, details: \n ${errStream.getContentsAsString()}`
+                  )
+                )
+              }
+              resolve(status)
+            }
+          )
+          .catch(e => reject(e))
+      })
+      break
+    } catch (error) {
+      core.debug(`cpToPod: Attempt ${attempt + 1} failed: ${error}`)
+      attempt++
+      if (attempt >= 30) {
+        throw new Error(
+          `cpToPod failed after ${attempt} attempts: ${formatError(error)}`
+        )
+      }
+      await sleep(1000)
+    }
+  }
+ 
+  let attempts = 15
+  const delay = 1000
+  for (let i = 0; i < attempts; i++) {
+    try {
+      const { hash: want, lines: wantLines } =
+        await localCalculateOutputHashSorted([
+          'sh',
+          '-c',
+          listDirAllCommand(runnerPath)
+        ])
+ 
+      const { hash: got, lines: gotLines } =
+        await execCalculateOutputHashSorted(podName, JOB_CONTAINER_NAME, [
+          'sh',
+          '-c',
+          listDirAllCommand(containerPath)
+        ])
+ 
+      if (got !== want) {
+        core.debug(
+          `[cpToPod hash mismatch attempt ${i + 1}/${attempts}] want='${want}' got='${got}'`
+        )
+        core.debug(
+          `[cpToPod] runner file count=${wantLines.length} pod file count=${gotLines.length}`
+        )
+        const wantMap = new Map(
+          wantLines.map(l => [l.replace(/^\d+ /, ''), l.split(' ')[0]])
+        )
+        const gotMap = new Map(
+          gotLines.map(l => [l.replace(/^\d+ /, ''), l.split(' ')[0]])
+        )
+        const onlyInWant = wantLines.filter(
+          l => !gotMap.has(l.replace(/^\d+ /, ''))
+        )
+        const onlyInGot = gotLines.filter(
+          l => !wantMap.has(l.replace(/^\d+ /, ''))
+        )
+        const sizeDiff = wantLines
+          .filter(l => {
+            const name = l.replace(/^\d+ /, '')
+            return gotMap.has(name) && gotMap.get(name) !== wantMap.get(name)
+          })
+          .map(l => {
+            const name = l.replace(/^\d+ /, '')
+            return `${name}: runner=${wantMap.get(name)} pod=${gotMap.get(name)}`
+          })
+        core.debug(`[cpToPod] only in runner: ${JSON.stringify(onlyInWant)}`)
+        core.debug(`[cpToPod] only in pod:    ${JSON.stringify(onlyInGot)}`)
+        core.debug(`[cpToPod] size mismatch:  ${JSON.stringify(sizeDiff)}`)
+        await sleep(delay)
+        continue
+      }
+ 
+      break
+    } catch (error) {
+      core.debug(`Attempt ${i + 1} failed: ${error}`)
+      await sleep(delay)
+    }
+  }
+}
+ 
+export async function execCpFromPod(
+  podName: string,
+  containerPath: string,
+  parentRunnerPath: string
+): Promise<void> {
+  const targetRunnerPath = `${parentRunnerPath}/${path.basename(containerPath)}`
+  core.debug(
+    `Copying from pod ${podName} ${containerPath} to ${targetRunnerPath}`
+  )
+ 
+  // Clear target before extracting so deleted-on-pod files don't linger locally.
+  // tar.extract() appends into the destination; without this, stale files (e.g.
+  // git-credentials removed by checkout cleanup inside the pod) cause a permanent
+  // hash mismatch that no amount of retrying can resolve.
+  Iif (fs.existsSync(targetRunnerPath)) {
+    fs.rmSync(targetRunnerPath, { recursive: true, force: true })
+  }
+ 
+  let attempt = 0
+  while (Itrue) {
+    try {
+      // make temporary directory
+      const exec = new k8s.Exec(kc)
+      const containerPaths = containerPath.split('/')
+      const dirname = containerPaths.pop() as string
+      const command = [
+        'tar',
+        'cf',
+        '-',
+        '-C',
+        containerPaths.join('/') || '/',
+        dirname
+      ]
+      const writerStream = tar.extract(parentRunnerPath)
+      const errStream = new WritableStreamBuffer()
+ 
+      await new Promise((resolve, reject) => {
+        // Resolve only after writerStream finishes flushing to disk.
+        // The k8s status callback fires when the pod-side tar process exits,
+        // but tar-fs may still be writing buffered data to the local filesystem.
+        // Waiting for 'finish' ensures all files are on disk before hash check.
+        writerStream.on('finish', resolve)
+        writerStream.on('error', reject)
+        exec
+          .exec(
+            namespace(),
+            podName,
+            JOB_CONTAINER_NAME,
+            command,
+            writerStream,
+            errStream,
+            null,
+            false,
+            async (_s: k8s.V1Status) => {
+              if (errStream.size()) {
+                return reject(
+                  new Error(
+                    `Error from cpFromPod - details: \n ${errStream.getContentsAsString()}`
+                  )
+                )
+              }
+            }
+          )
+          .catch(e => reject(e))
+      })
+      break
+    } catch (error) {
+      core.debug(`Attempt ${attempt + 1} failed: ${error}`)
+      attempt++
+      if (attempt >= 30) {
+        throw new Error(
+          `execCpFromPod failed after ${attempt} attempts: ${formatError(error)}`
+        )
+      }
+      await sleep(1000)
+    }
+  }
+ 
+  let attempts = 15
+  const delay = 1000
+  for (let i = 0; i < attempts; i++) {
+    try {
+      const { hash: want, lines: wantLines } =
+        await execCalculateOutputHashSorted(podName, JOB_CONTAINER_NAME, [
+          'sh',
+          '-c',
+          listDirAllCommand(containerPath)
+        ])
+ 
+      const { hash: got, lines: gotLines } =
+        await localCalculateOutputHashSorted([
+          'sh',
+          '-c',
+          listDirAllCommand(targetRunnerPath)
+        ])
+ 
+      if (got !== want) {
+        core.debug(
+          `[cpFromPod hash mismatch attempt ${i + 1}/${attempts}] want='${want}' got='${got}'`
+        )
+        core.debug(
+          `[cpFromPod] pod file count=${wantLines.length} runner file count=${gotLines.length}`
+        )
+        const wantMap = new Map(
+          wantLines.map(l => [l.replace(/^\d+ /, ''), l.split(' ')[0]])
+        )
+        const gotMap = new Map(
+          gotLines.map(l => [l.replace(/^\d+ /, ''), l.split(' ')[0]])
+        )
+        const onlyInWant = wantLines.filter(
+          l => !gotMap.has(l.replace(/^\d+ /, ''))
+        )
+        const onlyInGot = gotLines.filter(
+          l => !wantMap.has(l.replace(/^\d+ /, ''))
+        )
+        const sizeDiff = wantLines
+          .filter(l => {
+            const name = l.replace(/^\d+ /, '')
+            return gotMap.has(name) && gotMap.get(name) !== wantMap.get(name)
+          })
+          .map(l => {
+            const name = l.replace(/^\d+ /, '')
+            return `${name}: pod=${wantMap.get(name)} runner=${gotMap.get(name)}`
+          })
+        core.debug(`[cpFromPod] only in pod:    ${JSON.stringify(onlyInWant)}`)
+        core.debug(`[cpFromPod] only in runner: ${JSON.stringify(onlyInGot)}`)
+        core.debug(`[cpFromPod] size mismatch:  ${JSON.stringify(sizeDiff)}`)
+        await sleep(delay)
+        continue
+      }
+ 
+      break
+    } catch (error) {
+      core.debug(`Attempt ${i + 1} failed: ${error}`)
+      await sleep(delay)
+    }
+  }
+}
+ 
+export async function waitForJobToComplete(jobName: string): Promise<void> {
+  const backOffManager = new BackOffManager()
+  while (Itrue) {
+    try {
+      if (await isJobSucceeded(jobName)) {
+        return
+      }
+    } catch (error) {
+      throw new Error(`job ${jobName} has failed: ${formatError(error)}`)
+    }
+    await backOffManager.backOff()
+  }
+}
+ 
+export async function createDockerSecret(
+  registry: Registry
+): Promise<k8s.V1Secret> {
+  const authContent = {
+    auths: {
+      [registry.serverUrl || 'https://index.docker.io/v1/']: {
+        username: registry.username,
+        password: registry.password,
+        auth: Buffer.from(`${registry.username}:${registry.password}`).toString(
+          'base64'
+        )
+      }
+    }
+  }
+ 
+  const runnerInstanceLabel = new RunnerInstanceLabel()
+ 
+  const secretName = getSecretName()
+  const secret = new k8s.V1Secret()
+  secret.immutable = true
+  secret.apiVersion = 'v1'
+  secret.metadata = new k8s.V1ObjectMeta()
+  secret.metadata.name = secretName
+  secret.metadata.namespace = namespace()
+  secret.metadata.labels = {
+    [runnerInstanceLabel.key]: runnerInstanceLabel.value
+  }
+  secret.type = 'kubernetes.io/dockerconfigjson'
+  secret.kind = 'Secret'
+  secret.data = {
+    '.dockerconfigjson': Buffer.from(JSON.stringify(authContent)).toString(
+      'base64'
+    )
+  }
+ 
+  return await k8sApi.createNamespacedSecret({
+    namespace: namespace(),
+    body: secret
+  })
+}
+ 
+export async function createSecretForEnvs(envs: {
+  [key: string]: string
+}): Promise<string> {
+  const runnerInstanceLabel = new RunnerInstanceLabel()
+ 
+  const secret = new k8s.V1Secret()
+  const secretName = getSecretName()
+  secret.immutable = true
+  secret.apiVersion = 'v1'
+  secret.metadata = new k8s.V1ObjectMeta()
+  secret.metadata.name = secretName
+ 
+  secret.metadata.labels = {
+    [runnerInstanceLabel.key]: runnerInstanceLabel.value
+  }
+  secret.kind = 'Secret'
+  secret.data = {}
+  for (const [key, value] of Object.entries(envs)) {
+    secret.data[key] = Buffer.from(value).toString('base64')
+  }
+ 
+  await k8sApi.createNamespacedSecret({
+    namespace: namespace(),
+    body: secret
+  })
+  return secretName
+}
+ 
+export async function deleteSecret(name: string): Promise<void> {
+  await k8sApi.deleteNamespacedSecret({
+    name,
+    namespace: namespace()
+  })
+}
+ 
+export async function pruneSecrets(): Promise<void> {
+  const secretList = await k8sApi.listNamespacedSecret({
+    namespace: namespace(),
+    labelSelector: new RunnerInstanceLabel().toString()
+  })
+  if (!secretList.items.length) {
+    return
+  }
+ 
+  await Promise.all(
+    secretList.items.map(
+      async secret =>
+        secret.metadata?.name && (await deleteSecret(secret.metadata.name))
+    )
+  )
+}
+ 
+export const UNRECOVERABLE_WAITING_REASONS = new Set([
+  // k8s has already retried image pull multiple times with exponential backoff.
+  // ErrImagePull is excluded: it fires on the first failure (could be a transient
+  // TLS timeout or network blip) and k8s will naturally promote it to
+  // ImagePullBackOff after a moment. Fast-failing on ErrImagePull would kill
+  // jobs that would have succeeded on the next pull attempt.
+  'ImagePullBackOff',
+  // Image name is syntactically invalid — cannot self-heal without a config fix.
+  'InvalidImageName',
+  // Container spec is invalid (bad env vars, resource limits, securityContext) —
+  // cannot self-heal without a config fix.
+  'CreateContainerConfigError'
+  // CreateContainerError is excluded: it is sometimes emitted transiently by the
+  // container runtime (e.g. during a node-level runtime restart). It can
+  // self-resolve on the next kubelet retry cycle.
+])
+ 
+// Pod *event* reasons (from the event stream, not container status) that
+// indicate a permanent failure the pod will never recover from on its own.
+// These surface as Warning events on the pod (visible via `kubectl describe`)
+// rather than in container.status.state.waiting.reason, so they need a separate
+// list + a separate (async) detection path.
+//
+//   - FailedMount: a volume cannot be mounted (e.g. hostPath `type: Directory`
+//     pointing at a path that does not exist on the node, missing PVC, missing
+//     Secret/ConfigMap volume). The container stays in `ContainerCreating`
+//     waiting state, which is NOT in UNRECOVERABLE_WAITING_REASONS, so without
+//     this check the hook polls until the 3600s timeout.
+//   - FailedBinding: a PVC could not be bound (no matching PV, storage class
+//     misconfiguration). Usually paired with FailedMount once the pod retries.
+//
+// FailedScheduling is included but gated by PERMANENT_SCHEDULING_PATTERNS:
+// only messages that positively identify a permanent configuration error
+// trigger fast-fail. Resource shortages ("Insufficient cpu/memory/gpu")
+// are silently skipped so the pod keeps queuing until the timeout.
+export const UNRECOVERABLE_EVENT_REASONS = new Set([
+  'FailedMount',
+  'FailedBinding',
+  'FailedScheduling'
+])
+ 
+// Patterns that POSITIVELY IDENTIFY a permanent, unrecoverable scheduling
+// failure in a FailedScheduling event message. Fast-fail fires ONLY when
+// one of these matches. Anything else (resource shortages, unknown format,
+// absent message) is treated as transient — the pod keeps queuing.
+//
+// Permanent examples (WILL fast-fail):
+//   "0/3 nodes: 3 node(s) didn't match Pod's node affinity/selector."
+//   "0/3 nodes: 3 node(s) had untolerated taint {gpu: true}."
+//   "0/3 nodes: persistentvolumeclaim "my-pvc" not found."
+//
+// Transient examples (will NOT fast-fail, keep queuing):
+//   "0/3 nodes: 3 Insufficient nvidia.com/gpu."
+//   "0/3 nodes: 3 Insufficient memory."
+//   "0/1 nodes are available"  ← ambiguous, unknown
+//
+// Extend at runtime via env var ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS
+// (comma-separated regex strings; cannot remove built-in entries).
+export const PERMANENT_SCHEDULING_PATTERNS: readonly RegExp[] = [
+  // Node selector / affinity label mismatch — no node carries the required
+  // labels. Will not self-resolve without a pod-spec or node-label change.
+  /node\(s\) didn't match Pod's node affinity\/selector/i,
+  /node\(s\) didn't match node affinity/i,
+  // Untolerated taint — every node carries a taint the pod does not tolerate.
+  // Will not self-resolve without adding a toleration or removing the taint.
+  /node\(s\) had untolerated taint/i,
+  // PVC referenced in the pod spec does not exist in the namespace. The
+  // scheduler refuses to place the pod until the PVC is created. The workflow
+  // job spec is wrong — it won't self-resolve.
+  /persistentvolumeclaim "[^"]+" not found/i
+]
+ 
+export const UNRECOVERABLE_TERMINATED_REASONS = new Set([
+  'OOMKilled',
+  'Error',
+  'FailedPostStartHookError'
+])
+ 
+// Maximum number of Warning events to include in a pod's failure description so
+// that the GitHub Actions log is not flooded.
+const MAX_DIAGNOSTIC_EVENTS = 10
+ 
+// The fast-fail whitelist can be extended (not narrowed) from the environment so
+// operators can add deterministic terminal reasons without a code change. This
+// reuses the same env-var configuration pattern as the prepare-job timeout. When
+// the variable is unset, behaviour is identical to the built-in defaults.
+export function getUnrecoverableWaitingReasons(): Set<string> {
+  const extra = process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_WAITING_REASONS']
+  if (!extra) {
+    return UNRECOVERABLE_WAITING_REASONS
+  }
+  const reasons = new Set(UNRECOVERABLE_WAITING_REASONS)
+  for (const reason of extra.split(',')) {
+    const trimmed = reason.trim()
+    Eif (trimmed) {
+      reasons.add(trimmed)
+    }
+  }
+  return reasons
+}
+ 
+// Mirrors getUnrecoverableWaitingReasons() but for pod *event* reasons. The
+// env var ACTIONS_RUNNER_K8S_UNRECOVERABLE_EVENT_REASONS adds to (never removes
+// from) the built-in UNRECOVERABLE_EVENT_REASONS set.
+export function getUnrecoverableEventReasons(): Set<string> {
+  const extra = process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_EVENT_REASONS']
+  if (!extra) {
+    return UNRECOVERABLE_EVENT_REASONS
+  }
+  const reasons = new Set(UNRECOVERABLE_EVENT_REASONS)
+  for (const reason of extra.split(',')) {
+    const trimmed = reason.trim()
+    Eif (trimmed) {
+      reasons.add(trimmed)
+    }
+  }
+  return reasons
+}
+ 
+export function getUnrecoverableTerminatedReasons(): Set<string> {
+  const extra =
+    process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_TERMINATED_REASONS']
+  if (!extra) {
+    return UNRECOVERABLE_TERMINATED_REASONS
+  }
+  const reasons = new Set(UNRECOVERABLE_TERMINATED_REASONS)
+  for (const reason of extra.split(',')) {
+    const trimmed = reason.trim()
+    if (trimmed) {
+      reasons.add(trimmed)
+    }
+  }
+  return reasons
+}
+ 
+// Returns true when a FailedScheduling event message positively identifies a
+// permanent configuration error that will not self-resolve. Returns false
+// (treat as transient, keep queuing) for:
+//   - absent/empty messages   → unknown, assume transient
+//   - resource shortages      → Insufficient cpu/memory/gpu/etc.
+//   - any unrecognised format → unknown, assume transient
+export function isPermanentSchedulingFailure(
+  message: string | undefined
+): boolean {
+  if (!message) return false
+  return getPermanentSchedulingPatterns().some(p => p.test(message))
+}
+ 
+// Returns PERMANENT_SCHEDULING_PATTERNS extended by any extra patterns from
+// ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS (comma-separated regexes).
+// Invalid regex strings are skipped with a warning.
+// The compiled result is cached: env var changes during a single process are
+// rare (effectively never in a runner job), but this avoids repeated split +
+// RegExp construction on every FailedScheduling poll iteration.
+let _cachedSchedulingPatterns: readonly RegExp[] | undefined
+let _lastSchedulingPatternsEnv: string | undefined
+ 
+export function getPermanentSchedulingPatterns(): readonly RegExp[] {
+  const extra = process.env['ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS']
+  Eif (!extra) return PERMANENT_SCHEDULING_PATTERNS
+  if (_cachedSchedulingPatterns && _lastSchedulingPatternsEnv === extra) {
+    return _cachedSchedulingPatterns
+  }
+  const patterns: RegExp[] = [...PERMANENT_SCHEDULING_PATTERNS]
+  for (const raw of extra.split(',')) {
+    const trimmed = raw.trim()
+    if (!trimmed) continue
+    try {
+      patterns.push(new RegExp(trimmed, 'i'))
+    } catch {
+      core.warning(
+        `ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS: invalid regex "${trimmed}", skipped`
+      )
+    }
+  }
+  _lastSchedulingPatternsEnv = extra
+  _cachedSchedulingPatterns = patterns
+  return patterns
+}
+ 
+function getWaitingReasonHint(reason: string): string {
+  switch (reason) {
+    case 'ImagePullBackOff':
+      return [
+        `  → Image pull has failed repeatedly (k8s retried with exponential backoff). Check:`,
+        `    - Image name and tag are correct and exist in the registry`,
+        `    - If private registry: imagePullSecret is configured and credentials are valid`,
+        `    - Network connectivity from the node to the registry (DNS, firewall, proxy, TLS)`,
+        `    Run: kubectl describe pod <pod> | grep -A10 "Events"`
+      ].join('\n')
+    case 'InvalidImageName':
+      return `  → Image name is malformed. Check the workflow/job container image configuration.`
+    case 'CreateContainerConfigError':
+      return `  → Container config is invalid. Check env vars, resource limits, and securityContext in the job spec.`
+    default:
+      return `  → Check pod events with: kubectl describe pod <pod>`
+  }
+}
+ 
+export function getContainerErrors(pod: k8s.V1Pod): string[] {
+  const errors: string[] = []
+  const unrecoverableReasons = getUnrecoverableWaitingReasons()
+  const allStatuses = [
+    ...(pod.status?.initContainerStatuses ?? []),
+    ...(pod.status?.containerStatuses ?? [])
+  ]
+  for (const cs of allStatuses) {
+    const waiting = cs.state?.waiting
+    if (waiting?.reason && unrecoverableReasons.has(waiting.reason)) {
+      const reason = `  ✗ container "${cs.name}": ${waiting.reason}`
+      const detail = waiting.message ? `\n    ${waiting.message}` : ''
+      const hint = `\n${getWaitingReasonHint(waiting.reason)}`
+      errors.push(`${reason}${detail}${hint}`)
+    }
+  }
+  return errors
+}
+ 
+export function getTerminatedReasonHint(
+  reason: string,
+  exitCode: number | undefined
+): string {
+  if (reason === 'OOMKilled') {
+    return `  → Container exceeded its memory limit and was killed by the OOM killer.\n    Increase the memory limit in the job spec or reduce memory usage in the script.`
+  }
+  if (reason === 'FailedPostStartHookError') {
+    return `  → The postStart lifecycle hook failed. Check the hook command and its exit code.`
+  }
+  if (reason === 'Error') {
+    switch (exitCode) {
+      case 137:
+        return `  → Exit code 137: process was killed (SIGKILL). Likely OOM or forceful termination.\n    Check memory usage and resource limits.`
+      case 139:
+        return `  → Exit code 139: segmentation fault (SIGSEGV). The process crashed due to a memory access error.`
+      case 126:
+        return `  → Exit code 126: permission denied. The script or binary is not executable.\n    Check file permissions inside the container image.`
+      case 127:
+        return `  → Exit code 127: command not found. The script or binary does not exist in the container.\n    Check the image contents and the command/entrypoint configuration.`
+      default:
+        return `  → Script or process exited with a non-zero code (${exitCode ?? 'unknown'}).\n    Check the step output above for error messages.\n    Common causes: script logic errors, missing dependencies, unhandled exceptions.`
+    }
+  }
+  return `  → Check pod logs with: kubectl logs <pod> -c ${reason}`
+}
+ 
+export function getContainerTerminatedErrors(pod: k8s.V1Pod): string[] {
+  const errors: string[] = []
+  const unrecoverableReasons = getUnrecoverableTerminatedReasons()
+  const allStatuses = [
+    ...(pod.status?.initContainerStatuses ?? []),
+    ...(pod.status?.containerStatuses ?? [])
+  ]
+  for (const cs of allStatuses) {
+    const terminated = cs.state?.terminated
+    if (terminated?.reason && unrecoverableReasons.has(terminated.reason)) {
+      const reason = `  ✗ container "${cs.name}": ${terminated.reason} (exit code ${terminated.exitCode})`
+      const detail = terminated.message ? `\n    ${terminated.message}` : ''
+      const hint = `\n${getTerminatedReasonHint(terminated.reason, terminated.exitCode)}`
+      errors.push(`${reason}${detail}${hint}`)
+    }
+  }
+  return errors
+}
+ 
+function getEventReasonHint(reason: string): string {
+  switch (reason) {
+    case 'FailedMount':
+      return [
+        `  → A volume could not be mounted. Check:`,
+        `    - PVC is bound (kubectl get pvc)`,
+        `    - Secret/ConfigMap referenced in the volume exists`,
+        `    - hostPath directories exist on the scheduled node`
+      ].join('\n')
+    case 'FailedBinding':
+      return [
+        `  → A PVC could not be bound to a PV. Check:`,
+        `    - StorageClass exists and has a provisioner`,
+        `    - Sufficient capacity is available`,
+        `    - Access mode (ReadWriteOnce/ReadWriteMany) matches available PVs`
+      ].join('\n')
+    case 'FailedScheduling':
+      return [
+        `  → Pod cannot be scheduled due to a permanent configuration error. Check:`,
+        `    - nodeSelector / nodeAffinity labels match at least one node`,
+        `    - All tolerations are present for node taints`,
+        `    - PVCs referenced in the pod spec exist in the namespace`
+      ].join('\n')
+    default:
+      return `  → Check pod events with: kubectl describe pod <pod>`
+  }
+}
+ 
+// Inspects the pod's Warning events for reasons in UNRECOVERABLE_EVENT_REASONS.
+// For FailedScheduling, only fast-fails when the message positively matches
+// a known-permanent configuration error (see PERMANENT_SCHEDULING_PATTERNS).
+// Resource shortages ("Insufficient cpu/memory/gpu") are silently skipped so
+// the pod keeps queuing until the timeout. Best-effort: if events cannot be
+// listed (e.g. the optional 'events' RBAC permission is missing) it returns []
+// instead of blocking container-level fast-fail detection. Deduplicates by
+// reason so a repeatedly-retried event is reported once.
+export async function getPodEventErrors(podName: string): Promise<string[]> {
+  const unrecoverableReasons = getUnrecoverableEventReasons()
+  Iif (unrecoverableReasons.size === 0) {
+    return []
+  }
+ 
+  let items: k8s.CoreV1Event[]
+  try {
+    const result = await k8sApi.listNamespacedEvent({
+      namespace: namespace(),
+      fieldSelector: `involvedObject.name=${podName}`
+    })
+    items = result.items ?? []
+  } catch (err) {
+    core.debug(
+      `Could not list events for pod ${podName} during fast-fail check: ${
+        err instanceof Error ? err.message : String(err)
+      }`
+    )
+    return []
+  }
+ 
+  const errors: string[] = []
+  const seenReasons = new Set<string>()
+  for (const e of items) {
+    if (
+      e.type !== 'Warning' ||
+      !e.reason ||
+      !unrecoverableReasons.has(e.reason)
+    ) {
+      continue
+    }
+    // FailedScheduling: only fast-fail when the message positively matches a
+    // known-permanent config error. Resource shortages and unknown messages
+    // are treated as transient — let the pod keep queuing.
+    if (
+      e.reason === 'FailedScheduling' &&
+      !isPermanentSchedulingFailure(e.message)
+    ) {
+      core.debug(
+        `[fast-fail] Skipping FailedScheduling (not a recognised permanent error): ${
+          e.message ?? '(no message)'
+        }`
+      )
+      continue
+    }
+    if (seenReasons.has(e.reason)) {
+      continue
+    }
+    seenReasons.add(e.reason)
+    const count = e.count && e.count > 1 ? ` (x${e.count})` : ''
+    const reason = `  ✗ event: ${e.reason}${count}`
+    const detail = e.message ? `\n    ${e.message}` : ''
+    const hint = getEventReasonHint(e.reason)
+    errors.push(`${reason}${detail}\n${hint}`)
+  }
+  return errors
+}
+ 
+// describePodFailure aggregates everything that might explain why a pod is not
+// healthy into a single human-readable string. It makes NO success/failure
+// judgement of its own (a terminated exitCode=0 container is just reported as
+// such) -- callers decide what is "bad". It never throws: if it cannot read the
+// pod or list events it returns/embeds a best-effort note instead, so it is safe
+// to call from any error path.
+export async function describePodFailure(podName: string): Promise<string> {
+  let pod: k8s.V1Pod
+  try {
+    pod = await readPod(podName)
+  } catch (err) {
+    return `Could not read pod ${podName} for diagnostics: ${
+      err instanceof Error ? err.message : String(err)
+    }`
+  }
+ 
+  const sections: string[] = []
+  const status = pod.status
+ 
+  // --- Pod-level status ---
+  const podLines: string[] = []
+  const phaseLabel = status?.phase
+    ? `${status.phase}${status.reason ? ` (${status.reason})` : ''}`
+    : 'Unknown'
+  podLines.push(`Pod status: ${phaseLabel}`)
+  if (status?.message) {
+    podLines.push(`  ${status.message}`)
+  }
+ 
+  // Surface conditions that are False (e.g. PodScheduled=False from FailedScheduling)
+  for (const cond of status?.conditions ?? []) {
+    Eif (cond.status === 'False') {
+      const reason = cond.reason ? ` (${cond.reason})` : ''
+      const msg = cond.message ? `: ${cond.message}` : ''
+      podLines.push(`  ✗ ${cond.type}=False${reason}${msg}`)
+    }
+  }
+  sections.push(podLines.join('\n'))
+ 
+  // --- Container-level status (non-zero exits and non-unrecoverable waits) ---
+  const unrecoverableReasons = getUnrecoverableWaitingReasons()
+  const allStatuses = [
+    ...(status?.initContainerStatuses ?? []),
+    ...(status?.containerStatuses ?? [])
+  ]
+  const containerLines: string[] = []
+  for (const cs of allStatuses) {
+    const waiting = cs.state?.waiting
+    if (waiting?.reason) {
+      // Skip reasons already surfaced by getContainerErrors() in the caller's
+      // first line to avoid printing the same error twice.
+      if (!unrecoverableReasons.has(waiting.reason)) {
+        const msg = waiting.message ? `\n    ${waiting.message}` : ''
+        containerLines.push(
+          `  ✗ container "${cs.name}" waiting: ${waiting.reason}${msg}`
+        )
+      }
+    }
+    const terminated = cs.state?.terminated
+    // Only surface non-zero exits; exit 0 (e.g. fs-init Completed) is noise.
+    if (terminated && terminated.exitCode !== 0) {
+      const reason = terminated.reason ?? 'Unknown'
+      const msg = terminated.message ? `\n    ${terminated.message}` : ''
+      containerLines.push(
+        `  ✗ container "${cs.name}" terminated: ${reason} (exit code ${terminated.exitCode})${msg}`
+      )
+    }
+  }
+  if (containerLines.length) {
+    sections.push(`Container details:\n${containerLines.join('\n')}`)
+  }
+ 
+  // --- Warning events ---
+  const eventLines = await describePodWarningEvents(podName)
+  if (eventLines.length) {
+    sections.push(`Recent warning events:\n${eventLines.join('\n')}`)
+  }
+ 
+  Iif (!sections.length) {
+    return `No additional diagnostic information available for pod ${podName}`
+  }
+  return sections.join('\n\n')
+}
+ 
+// Reads the most recent Warning events for a pod. Best-effort: listing events
+// requires the optional "events" get/list permission, so any error (including
+// RBAC Forbidden) is swallowed and an empty list is returned.
+async function describePodWarningEvents(podName: string): Promise<string[]> {
+  let items: k8s.CoreV1Event[]
+  try {
+    const result = await k8sApi.listNamespacedEvent({
+      namespace: namespace(),
+      fieldSelector: `involvedObject.name=${podName}`
+    })
+    items = result.items ?? []
+  } catch (err) {
+    core.debug(
+      `Could not list events for pod ${podName} (the 'events' permission may be missing): ${
+        err instanceof Error ? err.message : String(err)
+      }`
+    )
+    return []
+  }
+ 
+  const warnings = items.filter(e => e.type === 'Warning')
+  if (!warnings.length) {
+    return []
+  }
+ 
+  const eventTime = (e: k8s.CoreV1Event): number => {
+    const t = e.lastTimestamp ?? e.eventTime ?? e.firstTimestamp
+    return t ? new Date(t).getTime() : 0
+  }
+  warnings.sort((a, b) => eventTime(a) - eventTime(b))
+ 
+  const recent = warnings.slice(-MAX_DIAGNOSTIC_EVENTS)
+  const lines = recent.map(e => {
+    const count = e.count && e.count > 1 ? ` (x${e.count})` : ''
+    return `  [${e.reason ?? 'Warning'}]${count} ${e.message ?? ''}`.trimEnd()
+  })
+  Iif (warnings.length > recent.length) {
+    lines.unshift(
+      `  (showing ${recent.length} of ${warnings.length} warning events)`
+    )
+  }
+  return lines
+}
+ 
+// Inspects the pod's status.conditions for scheduling failures. FailedScheduling
+// is intentionally excluded from fast-fail detection (see UNRECOVERABLE_EVENT_REASONS
+// comment) — scheduling failures are transient resource waits that should queue
+// until the timeout, not terminate early. This function always returns [] as a
+// result, but is kept so checkUnrecoverableErrors compiles and the dedup logic
+// remains intact for future use.
+export function getPodConditionErrors(_p: k8s.V1Pod): string[] {
+  return []
+}
+ 
+// Aggregates the three independent error-detection sources (container waiting
+// reasons, pod Warning events, and pod conditions) into a single list, applying
+// the cross-source deduplication rule (FailedScheduling event + Unschedulable
+// condition = same failure, report once). Returns [] when no unrecoverable
+// error is detected. The caller decides what to do with the list -- typically
+// attach describePodFailure diagnostics and throw.
+export async function checkUnrecoverableErrors(
+  pod: k8s.V1Pod,
+  podName: string
+): Promise<string[]> {
+  // Deterministic terminal errors on a container (e.g. ImagePullBackOff).
+  const containerErrors = getContainerErrors(pod)
+  // Terminated container errors (e.g. OOMKilled, non-zero exit) with hints.
+  const terminatedErrors = getContainerTerminatedErrors(pod)
+  // Best-effort: returns [] when the optional events RBAC permission is absent.
+  const eventErrors = await getPodEventErrors(podName)
+  // Conditions are set near-instantly by the scheduler while events may take
+  // a few extra seconds to propagate, so always run the check. Deduplicate
+  // against events so the same FailedScheduling isn't printed twice.
+  const conditionErrors = getPodConditionErrors(pod).filter(
+    c =>
+      !eventErrors.some(
+        e => e.includes('FailedScheduling') && c.includes('Unschedulable')
+      )
+  )
+  return [
+    ...containerErrors,
+    ...terminatedErrors,
+    ...eventErrors,
+    ...conditionErrors
+  ]
+}
+ 
+export async function waitForPodPhases(
+  podName: string,
+  awaitingPhases: Set<PodPhase>,
+  backOffPhases: Set<PodPhase>,
+  maxTimeSeconds = DEFAULT_WAIT_FOR_POD_TIME_SECONDS
+): Promise<void> {
+  const backOffManager = new BackOffManager(maxTimeSeconds)
+  let phase: PodPhase = PodPhase.UNKNOWN
+  while (Itrue) {
+    let pod: k8s.V1Pod
+    try {
+      pod = await readPod(podName)
+    } catch (err) {
+      // Transient API error (network blip, API server busy): log and back off
+      // rather than crashing the loop. The timeout will eventually fire if the
+      // pod stays permanently unreadable (e.g. RBAC issue).
+      core.warning(
+        `[waitForPodPhases] Could not read pod ${podName}, will retry after backoff: ${
+          err instanceof Error ? err.message : String(err)
+        }`
+      )
+      try {
+        await backOffManager.backOff()
+      } catch {
+        throw new Error(
+          `Pod ${podName} timed out after ${maxTimeSeconds}s (pod read failed: ${
+            err instanceof Error ? err.message : String(err)
+          })\n${'-'.repeat(60)}\n(pod was unreadable; no further diagnostics available)`
+        )
+      }
+      continue
+    }
+    phase = parsePodPhase(pod)
+    if (awaitingPhases.has(phase)) {
+      return
+    }
+ 
+    // The pod reached a phase we are not willing to keep waiting on
+    // (a terminal/unhealthy phase). First check for unrecoverable
+    // container-level errors (e.g. OOMKilled, non-zero exit) so they are
+    // reported with actionable hints. Fall back to the generic "is unhealthy"
+    // message when no specific error is found.
+    if (!backOffPhases.has(phase)) {
+      const errors = await checkUnrecoverableErrors(pod, podName)
+      const details = await describePodFailure(podName)
+      Iif (errors.length > 0) {
+        throw new Error(
+          `Pod ${podName} has unrecoverable errors:\n${errors.join('\n')}\n${'-'.repeat(60)}\n${details}`
+        )
+      }
+      throw new Error(
+        `Pod ${podName} is unhealthy (phase: ${phase})\n${'-'.repeat(60)}\n${details}`
+      )
+    }
+ 
+    // Still in a back-off phase, but a deterministic unrecoverable error
+    // was detected (container / event / condition). Fail fast with
+    // diagnostics instead of waiting out the full timeout.
+    const errors = await checkUnrecoverableErrors(pod, podName)
+    if (errors.length > 0) {
+      const details = await describePodFailure(podName)
+      throw new Error(
+        `Pod ${podName} has unrecoverable errors:\n${errors.join('\n')}\n${'-'.repeat(60)}\n${details}`
+      )
+    }
+ 
+    try {
+      await backOffManager.backOff()
+    } catch (_err) {
+      // BackOffManager throws "backoff timeout" when maxTimeSeconds is exceeded.
+      // Don't surface that bare message: collect diagnostics first so the user
+      // can see WHY the pod never became ready.
+      const details = await describePodFailure(podName)
+      throw new Error(
+        `Pod ${podName} timed out after ${maxTimeSeconds}s (phase: ${phase})\n${'-'.repeat(60)}\n${details}`
+      )
+    }
+  }
+}
+ 
+export function getPrepareJobTimeoutSeconds(): number {
+  const envTimeoutSeconds =
+    process.env['ACTIONS_RUNNER_PREPARE_JOB_TIMEOUT_SECONDS']
+ 
+  Eif (!envTimeoutSeconds) {
+    return DEFAULT_WAIT_FOR_POD_TIME_SECONDS
+  }
+ 
+  const timeoutSeconds = parseInt(envTimeoutSeconds, 10)
+  if (!timeoutSeconds || timeoutSeconds <= 0) {
+    core.warning(
+      `Prepare job timeout is invalid ("${timeoutSeconds}"): use an int > 0`
+    )
+    return DEFAULT_WAIT_FOR_POD_TIME_SECONDS
+  }
+ 
+  return timeoutSeconds
+}
+ 
+async function readPod(podName: string): Promise<k8s.V1Pod> {
+  return await k8sApi.readNamespacedPod({
+    name: podName,
+    namespace: namespace()
+  })
+}
+ 
+const podPhaseLookup = new Set<string>([
+  PodPhase.PENDING,
+  PodPhase.RUNNING,
+  PodPhase.SUCCEEDED,
+  PodPhase.FAILED,
+  PodPhase.UNKNOWN
+])
+ 
+export function parsePodPhase(pod: k8s.V1Pod): PodPhase {
+  if (!pod.status?.phase || !podPhaseLookup.has(pod.status.phase)) {
+    return PodPhase.UNKNOWN
+  }
+  return pod.status.phase as PodPhase
+}
+ 
+async function isJobSucceeded(name: string): Promise<boolean> {
+  const job = await k8sBatchV1Api.readNamespacedJob({
+    name,
+    namespace: namespace()
+  })
+  Eif (job.status?.failed) {
+    throw new Error(`job ${name} has failed`)
+  }
+  return !!job.status?.succeeded
+}
+ 
+export async function getPodLogs(
+  podName: string,
+  containerName: string
+): Promise<void> {
+  const log = new k8s.Log(kc)
+  const logStream = new stream.PassThrough()
+  logStream.on('data', chunk => {
+    // use write rather than console.log to prevent double line feed
+    process.stdout.write(chunk)
+  })
+ 
+  await log.log(namespace(), podName, containerName, logStream, {
+    follow: true,
+    pretty: false,
+    timestamps: false
+  })
+  await new Promise((resolve, reject) => {
+    logStream.on('end', () => resolve(null))
+    logStream.on('error', err => {
+      process.stderr.write(err.message)
+      reject(err)
+    })
+  })
+}
+ 
+export async function prunePods(): Promise<void> {
+  const podList = await k8sApi.listNamespacedPod({
+    namespace: namespace(),
+    labelSelector: new RunnerInstanceLabel().toString()
+  })
+  if (!podList.items.length) {
+    return
+  }
+ 
+  await Promise.all(
+    podList.items.map(
+      async pod => pod.metadata?.name && (await deletePod(pod.metadata.name))
+    )
+  )
+}
+ 
+export async function getPodStatus(
+  name: string
+): Promise<k8s.V1PodStatus | undefined> {
+  const pod = await k8sApi.readNamespacedPod({
+    name,
+    namespace: namespace()
+  })
+  return pod.status
+}
+ 
+export async function isAuthPermissionsOK(): Promise<boolean> {
+  const sar = new k8s.V1SelfSubjectAccessReview()
+  const asyncs: Promise<k8s.V1SelfSubjectAccessReview>[] = []
+  for (const resource of requiredPermissions) {
+    for (const verb of resource.verbs) {
+      sar.spec = new k8s.V1SelfSubjectAccessReviewSpec()
+      sar.spec.resourceAttributes = new k8s.V1ResourceAttributes()
+      sar.spec.resourceAttributes.verb = verb
+      sar.spec.resourceAttributes.namespace = namespace()
+      sar.spec.resourceAttributes.group = resource.group
+      sar.spec.resourceAttributes.resource = resource.resource
+      sar.spec.resourceAttributes.subresource = resource.subresource
+      asyncs.push(
+        k8sAuthorizationV1Api.createSelfSubjectAccessReview({ body: sar })
+      )
+    }
+  }
+  const responses = await Promise.all(asyncs)
+  return responses.every(resp => resp.status?.allowed)
+}
+ 
+export async function isPodContainerAlpine(
+  podName: string,
+  containerName: string
+): Promise<boolean> {
+  let isAlpine = true
+  try {
+    await execPodStep(
+      [
+        'sh',
+        '-c',
+        `[ $(cat /etc/*release* | grep -i -e "^ID=*alpine*" -c) != 0 ] || exit 1`
+      ],
+      podName,
+      containerName
+    )
+  } catch {
+    isAlpine = false
+  }
+ 
+  return isAlpine
+}
+ 
+export function namespace(): string {
+  if (process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE']) {
+    return process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE']
+  }
+ 
+  const context = kc.getContexts().find(ctx => ctx.namespace)
+  Eif (context?.namespace) {
+    return context.namespace
+  }
+ 
+  // When running in-cluster the kubeconfig context has no namespace field;
+  // read it from the mounted ServiceAccount file instead.
+  const saNamespaceFile =
+    '/var/run/secrets/kubernetes.io/serviceaccount/namespace'
+  try {
+    const ns = fs.readFileSync(saNamespaceFile, 'utf8').trim()
+    if (ns) {
+      return ns
+    }
+  } catch {
+    // not running in-cluster, fall through to error
+  }
+ 
+  throw new Error(
+    'Failed to determine namespace. Set the ACTIONS_RUNNER_KUBERNETES_NAMESPACE environment variable or ensure the kubeconfig context includes a namespace.'
+  )
+}
+ 
+class BackOffManager {
+  private backOffSeconds = 1
+  totalTime = 0
+  constructor(private throwAfterSeconds?: number) {
+    if (!throwAfterSeconds || throwAfterSeconds < 0) {
+      this.throwAfterSeconds = undefined
+    }
+  }
+ 
+  async backOff(): Promise<void> {
+    await new Promise(resolve =>
+      setTimeout(resolve, this.backOffSeconds * 1000)
+    )
+    this.totalTime += this.backOffSeconds
+    if (this.throwAfterSeconds && this.throwAfterSeconds < this.totalTime) {
+      throw new Error('backoff timeout')
+    }
+    Eif (this.backOffSeconds < 20) {
+      this.backOffSeconds *= 2
+    }
+    Iif (this.backOffSeconds > 20) {
+      this.backOffSeconds = 20
+    }
+  }
+}
+ 
+export function containerPorts(
+  container: ContainerInfo
+): k8s.V1ContainerPort[] {
+  const ports: k8s.V1ContainerPort[] = []
+  Eif (!container.portMappings?.length) {
+    return ports
+  }
+  for (const portDefinition of container.portMappings) {
+    const portProtoSplit = portDefinition.split('/')
+    if (portProtoSplit.length > 2) {
+      throw new Error(`Unexpected port format: ${portDefinition}`)
+    }
+ 
+    const port = new k8s.V1ContainerPort()
+    port.protocol =
+      portProtoSplit.length === 2 ? portProtoSplit[1].toUpperCase() : 'TCP'
+ 
+    const portSplit = portProtoSplit[0].split(':')
+    if (portSplit.length > 2) {
+      throw new Error('ports should have at most one ":" separator')
+    }
+ 
+    const parsePort = (p: string): number => {
+      const num = Number(p)
+      if (!Number.isInteger(num) || num < 1 || num > 65535) {
+        throw new Error(`invalid container port: ${p}`)
+      }
+      return num
+    }
+ 
+    if (portSplit.length === 1) {
+      port.containerPort = parsePort(portSplit[0])
+    } else {
+      port.hostPort = parsePort(portSplit[0])
+      port.containerPort = parsePort(portSplit[1])
+    }
+ 
+    ports.push(port)
+  }
+  return ports
+}
+ 
+export async function getPodByName(name): Promise<k8s.V1Pod> {
+  return await k8sApi.readNamespacedPod({
+    name,
+    namespace: namespace()
+  })
+}
+ 
+export async function getSecretByName(name: string): Promise<k8s.V1Secret> {
+  return await k8sApi.readNamespacedSecret({
+    name,
+    namespace: namespace()
+  })
+}
+ 
+export async function listPodsByRunnerInstance(): Promise<k8s.V1Pod[]> {
+  const podList = await k8sApi.listNamespacedPod({
+    namespace: namespace(),
+    labelSelector: new RunnerInstanceLabel().toString()
+  })
+  return podList.items ?? []
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/src/k8s/utils/index.html b/packages/k8s/coverage/lcov-report/src/k8s/utils/index.html new file mode 100644 index 00000000..aa7bf026 --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/k8s/utils/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/k8s/utils + + + + + + + + + +
+
+

All files src/k8s/utils

+
+ +
+ 33.65% + Statements + 177/526 +
+ + +
+ 16.43% + Branches + 93/566 +
+ + +
+ 22.85% + Functions + 16/70 +
+ + +
+ 36.09% + Lines + 161/446 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.ts +
+
57.38%101/17643.85%75/17147.36%9/1960.66%91/150
npu-metrics.ts +
+
21.71%76/3504.55%18/39513.72%7/5123.64%70/296
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/src/k8s/utils/index.ts.html b/packages/k8s/coverage/lcov-report/src/k8s/utils/index.ts.html new file mode 100644 index 00000000..c916746e --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/k8s/utils/index.ts.html @@ -0,0 +1,1159 @@ + + + + + + Code coverage report for src/k8s/utils/index.ts + + + + + + + + + +
+
+

All files / src/k8s/utils index.ts

+
+ +
+ 57.38% + Statements + 101/176 +
+ + +
+ 43.85% + Branches + 75/171 +
+ + +
+ 47.36% + Functions + 9/19 +
+ + +
+ 60.66% + Lines + 91/150 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359  +14x +14x +14x +14x +14x +14x +  +  +14x +14x +  +14x +14x +  +14x +14x +14x +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +14x +12x +12x +  +12x +2x +  +  +10x +  +  +  +  +  +  +  +  +  +  +14x +  +  +  +6x +6x +2x +1x +  +2x +4x +1x +1x +3x +1x +1x +2x +  +  +2x +1x +1x +  +1x +  +  +  +  +14x +  +  +  +4x +4x +1x +  +1x +  +  +3x +1x +1x +  +2x +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +14x +23x +23x +23x +  +  +  +  +  +  +  +  +14x +  +  +  +14x +14x +14x +14x +14x +14x +14x +  +  +  +3x +3x +  +  +3x +3x +  +  +14x +  +  +17x +3x +  +14x +  +  +14x +  +  +  +14x +  +  +  +  +  +  +  +  +  +14x +63x +2x +  +  +  +  +  +61x +  +61x +3x +3x +3x +3x +  +  +  +  +  +58x +47x +  +  +11x +  +  +  +  +6x +6x +3x +  +3x +3x +  +2x +  +  +  +  +  +5x +  + 
import * as k8s from '@kubernetes/client-node'
+import * as fs from 'fs'
+import * as yaml from 'js-yaml'
+import * as core from '@actions/core'
+import { v1 as uuidv4 } from 'uuid'
+import { CONTAINER_EXTENSION_PREFIX } from '../../hooks/constants'
+import * as shlex from 'shlex'
+import { Mount } from 'hooklib'
+ 
+export const DEFAULT_CONTAINER_ENTRY_POINT_ARGS = [`-f`, `/dev/null`]
+export const DEFAULT_CONTAINER_ENTRY_POINT = 'tail'
+ 
+export const ENV_HOOK_TEMPLATE_PATH = 'ACTIONS_RUNNER_CONTAINER_HOOK_TEMPLATE'
+export const ENV_USE_KUBE_SCHEDULER = 'ACTIONS_RUNNER_USE_KUBE_SCHEDULER'
+ 
+export const EXTERNALS_VOLUME_NAME = 'externals'
+export const GITHUB_VOLUME_NAME = 'github'
+export const WORK_VOLUME = 'work'
+ 
+export const CONTAINER_VOLUMES: k8s.V1VolumeMount[] = [
+  {
+    name: EXTERNALS_VOLUME_NAME,
+    mountPath: '/__e'
+  },
+  {
+    name: WORK_VOLUME,
+    mountPath: '/__w'
+  },
+  {
+    name: GITHUB_VOLUME_NAME,
+    mountPath: '/github'
+  }
+]
+ 
+export function prepareJobScript(userVolumeMounts: Mount[]): {
+  containerPath: string
+  runnerPath: string
+} {
+  let mountDirs = userVolumeMounts
+    .map(m => shlex.quote(m.targetVolumePath))
+    .join(' ')
+ 
+  const content = `#!/bin/sh -l
+set -e
+cp -R /__w/_temp/_github_home /github/home
+cp -R /__w/_temp/_github_workflow /github/workflow
+mkdir -p ${mountDirs}
+`
+ 
+  const filename = `${uuidv4()}.sh`
+  const entryPointPath = `${process.env.RUNNER_TEMP}/${filename}`
+  fs.writeFileSync(entryPointPath, content)
+  return {
+    containerPath: `/__w/_temp/${filename}`,
+    runnerPath: entryPointPath
+  }
+}
+ 
+export function writeRunScript(
+  workingDirectory: string,
+  entryPoint: string,
+  entryPointArgs?: string[],
+  prependPath?: string[],
+  environmentVariables?: { [key: string]: string }
+): { containerPath: string; runnerPath: string } {
+  let exportPath = ''
+  if (prependPath?.length) {
+    // TODO: remove compatibility with typeof prependPath === 'string' as we bump to next major version, the hooks will lose PrependPath compat with runners 2.293.0 and older
+    const prepend =
+      typeof prependPath === 'string' ? prependPath : prependPath.join(':')
+    exportPath = `export PATH=${prepend}:$PATH`
+  }
+ 
+  let environmentPrefix = scriptEnv(environmentVariables)
+ 
+  const content = `#!/bin/sh -l
+set -e
+rm "$0" # remove script after running
+${exportPath}
+cd ${workingDirectory} && \
+exec ${environmentPrefix} ${entryPoint} ${
+    entryPointArgs?.length ? entryPointArgs.join(' ') : ''
+  }
+`
+  const filename = `${uuidv4()}.sh`
+  const entryPointPath = `${process.env.RUNNER_TEMP}/${filename}`
+  fs.writeFileSync(entryPointPath, content)
+  return {
+    containerPath: `/__w/_temp/${filename}`,
+    runnerPath: entryPointPath
+  }
+}
+ 
+export function writeContainerStepScript(
+  dst: string,
+  workingDirectory: string,
+  entryPoint: string,
+  entryPointArgs?: string[],
+  environmentVariables?: { [key: string]: string }
+): { containerPath: string; runnerPath: string } {
+  let environmentPrefix = scriptEnv(environmentVariables)
+ 
+  const parts = workingDirectory.split('/').slice(-2)
+  if (parts.length !== 2) {
+    throw new Error(`Invalid working directory: ${workingDirectory}`)
+  }
+ 
+  const content = `#!/bin/sh -l
+rm "$0" # remove script after running
+mv /__w/_temp/_github_home /github/home && \
+mv /__w/_temp/_github_workflow /github/workflow && \
+mv /__w/_temp/_runner_file_commands /github/file_commands || true && \
+mv ${shlex.quote('/__w/' + parts.join('/') + '/')} /github/workspace && \
+cd /github/workspace && \
+exec ${environmentPrefix} ${shlex.quote(entryPoint)} ${
+    entryPointArgs?.length ? entryPointArgs.map(shlex.quote).join(' ') : ''
+  }
+`
+  const filename = `${uuidv4()}.sh`
+  const entryPointPath = `${dst}/${filename}`
+  core.debug(`Writing container step script to ${entryPointPath}`)
+  fs.writeFileSync(entryPointPath, content)
+  return {
+    containerPath: `/__w/_temp/${filename}`,
+    runnerPath: entryPointPath
+  }
+}
+ 
+function scriptEnv(envs?: { [key: string]: string }): string {
+  if (!envs || !Object.entries(envs).length) {
+    return ''
+  }
+  const envBuffer: string[] = []
+  for (const [key, value] of Object.entries(envs)) {
+    if (
+      key.includes(`=`) ||
+      key.includes(`'`) ||
+      key.includes(`"`) ||
+      key.includes(`$`)
+    ) {
+      throw new Error(
+        `environment key ${key} is invalid - the key must not contain =, $, ', or "`
+      )
+    }
+    envBuffer.push(
+      `"${key}=${value
+        .replace(/\\/g, '\\\\')
+        .replace(/"/g, '\\"')
+        .replace(/\$/g, '\\$')
+        .replace(/`/g, '\\`')}"`
+    )
+  }
+ 
+  if (!envBuffer?.length) {
+    return ''
+  }
+ 
+  return `env ${envBuffer.join(' ')} `
+}
+ 
+export function generateContainerName(image: string): string {
+  const nameWithTag = image.split('/').pop()
+  const name = nameWithTag?.split(':')[0]
+ 
+  if (!name) {
+    throw new Error(`Image definition '${image}' is invalid`)
+  }
+ 
+  return name
+}
+ 
+// Overwrite or append based on container options
+//
+// Keep in mind, envs and volumes could be passed as fields in container definition
+// so default volume mounts and envs are appended first, and then create options are used
+// to append more values
+//
+// Rest of the fields are just applied
+// For example, container.createOptions.container.image is going to overwrite container.image field
+export function mergeContainerWithOptions(
+  base: k8s.V1Container,
+  from: k8s.V1Container
+): void {
+  for (const [key, value] of Object.entries(from)) {
+    if (key === 'name') {
+      if (value !== CONTAINER_EXTENSION_PREFIX + base.name) {
+        core.warning("Skipping name override: name can't be overwritten")
+      }
+      continue
+    } else if (key === 'image') {
+      core.warning("Skipping image override: image can't be overwritten")
+      continue
+    } else if (key === 'env') {
+      const envs = value as k8s.V1EnvVar[]
+      base.env = mergeLists(base.env, envs)
+    } else Iif (key === 'volumeMounts' && value) {
+      const volumeMounts = value as k8s.V1VolumeMount[]
+      base.volumeMounts = mergeLists(base.volumeMounts, volumeMounts)
+    } else if (key === 'ports' && value) {
+      const ports = value as k8s.V1ContainerPort[]
+      base.ports = mergeLists(base.ports, ports)
+    } else {
+      base[key] = value
+    }
+  }
+}
+ 
+export function mergePodSpecWithOptions(
+  base: k8s.V1PodSpec,
+  from: k8s.V1PodSpec
+): void {
+  for (const [key, value] of Object.entries(from)) {
+    if (key === 'containers') {
+      base.containers.push(
+        ...from.containers.filter(
+          e => !e.name?.startsWith(CONTAINER_EXTENSION_PREFIX)
+        )
+      )
+    } else if (key === 'volumes' && value) {
+      const volumes = value as k8s.V1Volume[]
+      base.volumes = mergeLists(base.volumes, volumes)
+    } else {
+      base[key] = value
+    }
+  }
+}
+ 
+export function mergeObjectMeta(
+  base: { metadata?: k8s.V1ObjectMeta },
+  from: k8s.V1ObjectMeta
+): void {
+  if (!base.metadata?.labels || !base.metadata?.annotations) {
+    throw new Error(
+      "Can't merge metadata: base.metadata or base.annotations field is undefined"
+    )
+  }
+  if (from?.labels) {
+    for (const [key, value] of Object.entries(from.labels)) {
+      if (base.metadata?.labels?.[key]) {
+        core.warning(`Label ${key} is already defined and will be overwritten`)
+      }
+      base.metadata.labels[key] = value
+    }
+  }
+ 
+  if (from?.annotations) {
+    for (const [key, value] of Object.entries(from.annotations)) {
+      if (base.metadata?.annotations?.[key]) {
+        core.warning(
+          `Annotation ${key} is already defined and will be overwritten`
+        )
+      }
+      base.metadata.annotations[key] = value
+    }
+  }
+}
+ 
+export function readExtensionFromFile(): k8s.V1PodTemplateSpec | undefined {
+  const filePath = process.env[ENV_HOOK_TEMPLATE_PATH]
+  Eif (!filePath) {
+    return undefined
+  }
+  const doc = yaml.load(fs.readFileSync(filePath, 'utf8'))
+  if (!doc || typeof doc !== 'object') {
+    throw new Error(`Failed to parse ${filePath}`)
+  }
+  return doc as k8s.V1PodTemplateSpec
+}
+ 
+export function useKubeScheduler(): boolean {
+  return process.env[ENV_USE_KUBE_SCHEDULER] === 'true'
+}
+ 
+export enum PodPhase {
+  PENDING = 'Pending',
+  RUNNING = 'Running',
+  SUCCEEDED = 'Succeeded',
+  FAILED = 'Failed',
+  UNKNOWN = 'Unknown',
+  COMPLETED = 'Completed'
+}
+ 
+function mergeLists<T>(base?: T[], from?: T[]): T[] {
+  const b: T[] = base || []
+  Iif (!from?.length) {
+    return b
+  }
+  b.push(...from)
+  return b
+}
+ 
+export function fixArgs(args: string[]): string[] {
+  // Preserve shell command strings passed via `sh -c` without re-tokenizing.
+  // Retokenizing would split the script into multiple args, breaking `sh -c`.
+  if (args.length >= 2 && args[0] === 'sh' && args[1] === '-c') {
+    return args
+  }
+  return shlex.split(args.join(' '))
+}
+ 
+export async function sleep(ms: number): Promise<void> {
+  return new Promise(resolve => setTimeout(resolve, ms))
+}
+ 
+export function listDirAllCommand(dir: string): string {
+  return `cd ${shlex.quote(dir)} && find . -type f -not -path '*/_runner_hook_responses*' -exec stat -c '%s %n' {} \\;`
+}
+ 
+// Safely turn an unknown thrown value into a diagnostic string without
+// throwing. The previous `JSON.stringify(err)` pattern crashed with
+// `TypeError: Converting circular structure to JSON` when err was a
+// @kubernetes/client-node HTTP error (its response embeds a
+// TLSSocket <-> HTTPParser cycle). The thrown TypeError shadowed the
+// original failure in every catch block that used it (issue #329).
+export function formatError(err: unknown): string {
+  if (err === null || err === undefined) {
+    return String(err)
+  }
+ 
+  // @kubernetes/client-node API errors expose the actual server message
+  // under response.body — prefer that when available.
+  const body =
+    (err as { response?: { body?: unknown } })?.response?.body ??
+    (err as { body?: unknown })?.body
+  if (body && typeof body === 'object') {
+    const msg = (body as { message?: unknown }).message
+    const reason = (body as { reason?: unknown }).reason
+    Eif (typeof msg === 'string') {
+      return typeof reason === 'string' && reason.length > 0
+        ? `${msg} (reason: ${reason})`
+        : msg
+    }
+  }
+ 
+  if (err instanceof Error) {
+    return err.message
+  }
+ 
+  if (typeof err === 'object') {
+    // Non-Error objects sometimes carry a top-level message (axios-style
+    // errors, hand-rolled error-likes). Extract before the JSON.stringify
+    // branch so a circular ref doesn't reduce the diagnostic to
+    // "[object Object]".
+    const msg = (err as { message?: unknown }).message
+    if (typeof msg === 'string') {
+      return msg
+    }
+    try {
+      return JSON.stringify(err)
+    } catch {
+      return String(err)
+    }
+  }
+ 
+  // Primitives serialise more readably via String() than JSON.stringify
+  // (which would quote strings and refuse to handle symbols).
+  return String(err)
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/src/k8s/utils/npu-metrics.ts.html b/packages/k8s/coverage/lcov-report/src/k8s/utils/npu-metrics.ts.html new file mode 100644 index 00000000..0eca1983 --- /dev/null +++ b/packages/k8s/coverage/lcov-report/src/k8s/utils/npu-metrics.ts.html @@ -0,0 +1,2359 @@ + + + + + + Code coverage report for src/k8s/utils/npu-metrics.ts + + + + + + + + + +
+
+

All files / src/k8s/utils npu-metrics.ts

+
+ +
+ 21.71% + Statements + 76/350 +
+ + +
+ 4.55% + Branches + 18/395 +
+ + +
+ 13.72% + Functions + 7/51 +
+ + +
+ 23.64% + Lines + 70/296 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +7599x +  +9x +9x +9x +9x +9x +9x +  +  +  +  +  +  +  +9x +9x +9x +9x +  +9x +9x +9x +  +9x +9x +9x +9x +  +9x +9x +9x +  +9x +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +128x +  +64x +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +22x +44x +44x +  +  +  +  +  +22x +  +  +9x +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +22x +  +  +22x +22x +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +9x +  +  +  +9x +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +9x +  +  +  +21x +21x +21x +  +21x +21x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +21x +  +  +21x +  +21x +  +21x +21x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as core from '@actions/core'
+import * as k8s from '@kubernetes/client-node'
+import * as https from 'https'
+import * as http from 'http'
+import { URL } from 'url'
+import { getRunnerPodName, JOB_CONTAINER_NAME } from '../../hooks/constants'
+import { formatError } from './index'
+import {
+  execPodStepWithOutput,
+  getPodByName,
+  getSecretByName,
+  listPodsByRunnerInstance,
+  namespace
+} from '../index'
+ 
+export const NPU_METRICS_MARKER = 'NPU_METRICS_V1'
+export const ENV_NPU_METRICS_ENABLED = 'ACTIONS_RUNNER_NPU_METRICS'
+export const ENV_NPU_SAMPLE_INTERVAL = 'NPU_SAMPLE_INTERVAL'
+export const ENV_NPU_IDLE_THRESHOLD = 'NPU_IDLE_THRESHOLD'
+ 
+export const DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS = 1
+export const MIN_NPU_SAMPLE_INTERVAL_SECONDS = 0.2
+export const DEFAULT_NPU_IDLE_THRESHOLD_PERCENT = 5
+ 
+export const NPU_SAMPLES_FILE = '/tmp/npu-samples.jsonl'
+export const NPU_TERMINATION_LOG = '/dev/termination-log'
+export const NPU_SAMPLES_MAX_BYTES = 4 * 1024 * 1024
+export const NPU_AGGREGATE_MAX_BYTES = 4096
+ 
+export const NPU_METRICS_SECRET_NAME = 'npu-metrics-pushgw'
+export const NPU_METRICS_PUSH_JOB = 'npu-job-record'
+export const NPU_COLLECT_TIMEOUT_MS = 10_000
+ 
+const NPU_RESOURCE_REGEX = /^huawei\.com\/(ascend\S*)$/i
+const SCALE_SET_NAME_REGEX = /^linux-[a-z0-9]+-[a-z0-9]+-\d+-([a-z][a-z0-9-]*)$/
+ 
+export interface NpuCardAggregate {
+  card: string
+  samples: number
+  peakUtil: number
+  avgUtil: number
+  peakHbm: number
+  firstTs: number
+  lastTs: number
+}
+ 
+export interface NpuAggregatePayload {
+  version: string
+  ts: number
+  cards: NpuCardAggregate[]
+}
+ 
+export interface NpuPushConfig {
+  url: string
+  username?: string
+  password?: string
+}
+ 
+export interface NpuJobLabels {
+  cluster: string
+  namespace: string
+  pod: string
+  podType: string
+  repo: string
+  runId: string
+  npuType: string
+  cardsRequested: string
+  result: string
+}
+ 
+export function npuMetricsEnabled(
+  Eenv: Record<string, string | undefined> = process.env
+): boolean {
+  return (
+    (env[ENV_NPU_METRICS_ENABLED] ?? '').trim().toLowerCase() !== 'disabled'
+  )
+}
+ 
+export function getNpuSampleIntervalSeconds(
+  env: Record<string, string | undefined> = process.env
+): number {
+  const raw = env[ENV_NPU_SAMPLE_INTERVAL]
+  if (!raw) {
+    return DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS
+  }
+  const parsed = Number(raw)
+  if (!Number.isFinite(parsed) || parsed <= 0) {
+    core.warning(
+      `NPU_SAMPLE_INTERVAL is invalid ("${raw}"): use ${DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS}`
+    )
+    return DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS
+  }
+  return Math.max(parsed, MIN_NPU_SAMPLE_INTERVAL_SECONDS)
+}
+ 
+export function getIdleThresholdPercent(
+  env: Record<string, string | undefined> = process.env
+): number {
+  const raw = env[ENV_NPU_IDLE_THRESHOLD]
+  if (!raw) {
+    return DEFAULT_NPU_IDLE_THRESHOLD_PERCENT
+  }
+  const parsed = Number(raw)
+  if (!Number.isFinite(parsed) || parsed < 0) {
+    core.warning(
+      `NPU_IDLE_THRESHOLD is invalid ("${raw}"): use ${DEFAULT_NPU_IDLE_THRESHOLD_PERCENT}`
+    )
+    return DEFAULT_NPU_IDLE_THRESHOLD_PERCENT
+  }
+  return parsed
+}
+ 
+export function containerHasNpuRequest(container: k8s.V1Container): boolean {
+  const resources = [container.resources?.requests, container.resources?.limits]
+  for (const entry of resources) {
+    for (const key of Object.keys(entry ?? {})) {
+      if (NPU_RESOURCE_REGEX.test(key)) {
+        return true
+      }
+    }
+  }
+  return false
+}
+ 
+export function hasNpuRequest(spec: k8s.V1PodSpec | undefined): boolean {
+  return (spec?.containers ?? []).some(c => containerHasNpuRequest(c))
+}
+ 
+function listNpuCardsCommand(): string {
+  return `ls /dev/davinci[0-9]* 2>/dev/null | sed 's|.*/davinci||' | sort -n | uniq | tr '\\n' ' '`
+}
+ 
+export function buildNpuSamplerScript(
+  intervalSeconds = DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS
+): string {
+  return [
+    `# ${NPU_METRICS_MARKER} sampler (detached, best-effort)`,
+    `F=${NPU_SAMPLES_FILE}`,
+    `CARDS=$(${listNpuCardsCommand()})`,
+    `[ -z "$CARDS" ] && exit 0`,
+    `while :; do`,
+    `  NOW=$(date +%s)`,
+    `  for C in $CARDS; do`,
+    `    OUT=$(npu-smi info -t usages -i "$C" 2>/dev/null) || continue`,
+    `    U=$(printf '%s\\n' "$OUT" | awk '{l=$0; gsub(/[ \\t\\r]/, "", l)} l ~ /AICore/ { if (match(l, /[0-9.]+%?$/)) { v = substr(l, RSTART, RLENGTH); sub(/%$/, "", v); print v; exit } }')`,
+    `    H=$(printf '%s\\n' "$OUT" | awk '{l=$0; gsub(/[ \\t\\r]/, "", l)} l ~ /HBM/ { if (match(l, /[0-9.]+%?$/)) { v = substr(l, RSTART, RLENGTH); sub(/%$/, "", v); print v; exit } }')`,
+    `    printf '{"ts":%s,"card":%s,"util":%s,"hbm":%s}\\n' "$NOW" "$C" "\${U:-0}" "\${H:-0}" >> "$F" 2>/dev/null || true`,
+    `  done`,
+    `  SZ=$(wc -c < "$F" 2>/dev/null || echo 0)`,
+    `  if [ "$SZ" -gt ${NPU_SAMPLES_MAX_BYTES} ]; then`,
+    `    tail -n 2000 "$F" > "$F.r" 2>/dev/null && mv "$F.r" "$F" || true`,
+    `  fi`,
+    `  sleep ${intervalSeconds}`,
+    `done`
+  ].join('\n')
+}
+ 
+const AGGREGATE_AWK = [
+  `BEGIN {`,
+  `  n = split(cards, a, " ")`,
+  `  for (i = 1; i <= n; i++) { cnt[a[i]] = 0; pu[a[i]] = 0; ph[a[i]] = 0; su[a[i]] = 0; fs[a[i]] = 0; ls[a[i]] = 0 }`,
+  `}`,
+  `{`,
+  `  ts = $0; sub(/.*"ts":/, "", ts); sub(/[^0-9].*/, "", ts)`,
+  `  c = $0;  sub(/.*"card":/, "", c); sub(/[^0-9].*/, "", c)`,
+  `  u = $0; sub(/.*"util":/, "", u); sub(/[^0-9.].*/, "", u)`,
+  `  h = $0; sub(/.*"hbm":/, "", h); sub(/[^0-9.].*/, "", h)`,
+  `  if (c == "") next`,
+  `  cnt[c]++`,
+  `  if (ts != "") { t = ts + 0; if (fs[c] == 0 || t < fs[c]) fs[c] = t; if (t > ls[c]) ls[c] = t }`,
+  `  if (u + 0 > pu[c]) pu[c] = u + 0`,
+  `  if (h + 0 > ph[c]) ph[c] = h + 0`,
+  `  su[c] += u + 0`,
+  `}`,
+  `END {`,
+  `  printf "{\\"v\\":\\"${NPU_METRICS_MARKER}\\",\\"ts\\":%d,\\"cards\\":[", now`,
+  `  sep = ""`,
+  `  for (c in cnt) {`,
+  `    au = cnt[c] > 0 ? su[c] / cnt[c] : 0`,
+  `    printf "%s{\\"c\\":\\"%s\\",\\"n\\":%d,\\"pu\\":%.1f,\\"au\\":%.1f,\\"ph\\":%.1f,\\"fs\\":%d,\\"ls\\":%d}", sep, c, cnt[c], pu[c], au, ph[c], fs[c], ls[c]`,
+  `    sep = ","`,
+  `  }`,
+  `  printf "]}\\n"`,
+  `}`
+].join('\n')
+ 
+export function buildNpuAggregateScript(): string {
+  return [
+    `# ${NPU_METRICS_MARKER} aggregate`,
+    `F=${NPU_SAMPLES_FILE}`,
+    `CARDS=$(${listNpuCardsCommand()})`,
+    `NOW=$(date +%s)`,
+    `touch "$F" 2>/dev/null || true`,
+    `awk -v now="$NOW" -v cards="$CARDS" '${AGGREGATE_AWK}' "$F" 2>/dev/null`
+  ].join('\n')
+}
+ 
+function commandHasMarker(command: string[] | undefined): boolean {
+  return (command ?? []).join(' ').includes(NPU_METRICS_MARKER)
+}
+ 
+function appendExecCommand(
+  existing: string[] | undefined,
+  appendLines: string[]
+): string[] {
+  if (
+    existing &&
+    existing.length >= 3 &&
+    /(^|\/)sh$/.test(existing[0]) &&
+    existing[1] === '-c'
+  ) {
+    return [
+      existing[0],
+      existing[1],
+      [...existing.slice(2), ...appendLines].join('\n')
+    ]
+  }
+  const prefix = (existing ?? []).map(
+    part => `'${part.replace(/'/g, "'\\''")}'`
+  )
+  return ['sh', '-c', [prefix.join(' '), ...appendLines].join('\n')]
+}
+ 
+export function injectNpuMetrics(
+  container: k8s.V1Container,
+  intervalSeconds = DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS
+): boolean {
+  const lifecycle = container.lifecycle ?? {}
+  if (
+    commandHasMarker(lifecycle.postStart?.exec?.command) ||
+    commandHasMarker(lifecycle.preStop?.exec?.command)
+  ) {
+    return false
+  }
+ 
+  if (
+    (lifecycle.postStart && !lifecycle.postStart.exec) ||
+    (lifecycle.preStop && !lifecycle.preStop.exec)
+  ) {
+    core.warning(
+      'npu-metrics: container already has a non-exec lifecycle handler, skip injection'
+    )
+    return false
+  }
+ 
+  const samplerLine = `(${buildNpuSamplerScript(intervalSeconds)}) >/dev/null 2>&1 &`
+  const aggregateLine = `{ ( ${buildNpuAggregateScript()} ) | head -c ${NPU_AGGREGATE_MAX_BYTES} > ${NPU_TERMINATION_LOG}; } 2>/dev/null || true`
+ 
+  lifecycle.postStart = {
+    exec: {
+      command: appendExecCommand(lifecycle.postStart?.exec?.command, [
+        `# ${NPU_METRICS_MARKER} postStart: start detached npu sampler`,
+        samplerLine
+      ])
+    }
+  }
+  lifecycle.preStop = {
+    exec: {
+      command: appendExecCommand(lifecycle.preStop?.exec?.command, [
+        `# ${NPU_METRICS_MARKER} preStop: write npu aggregate to termination log`,
+        aggregateLine
+      ])
+    }
+  }
+  container.lifecycle = lifecycle
+  return true
+}
+ 
+export function maybeInjectNpuMetrics(container: k8s.V1Container): boolean {
+  Iif (!npuMetricsEnabled()) {
+    return false
+  }
+  Eif (!containerHasNpuRequest(container)) {
+    return false
+  }
+  return injectNpuMetrics(container)
+}
+ 
+export function parseNpuAggregate(
+  raw: string | undefined
+): NpuAggregatePayload | undefined {
+  if (!raw) {
+    return undefined
+  }
+  const start = raw.indexOf('{"v":')
+  if (start === -1) {
+    return undefined
+  }
+  const candidates = [raw.slice(start)]
+  const end = raw.lastIndexOf('}')
+  if (end > start) {
+    candidates.push(raw.slice(start, end + 1))
+  }
+  for (const candidate of candidates) {
+    let parsed: any
+    try {
+      parsed = JSON.parse(candidate)
+    } catch {
+      continue
+    }
+    if (parsed?.v !== NPU_METRICS_MARKER || !Array.isArray(parsed.cards)) {
+      continue
+    }
+    const cards: NpuCardAggregate[] = []
+    for (const c of parsed.cards) {
+      if (c === null || typeof c !== 'object' || c.c === undefined) {
+        continue
+      }
+      cards.push({
+        card: String(c.c),
+        samples: Number(c.n) || 0,
+        peakUtil: Number(c.pu) || 0,
+        avgUtil: Number(c.au) || 0,
+        peakHbm: Number(c.ph) || 0,
+        firstTs: Number(c.fs) || 0,
+        lastTs: Number(c.ls) || 0
+      })
+    }
+    return { version: parsed.v, ts: Number(parsed.ts) || 0, cards }
+  }
+  return undefined
+}
+ 
+export function isIdleRecord(
+  cards: NpuCardAggregate[],
+  threshold = DEFAULT_NPU_IDLE_THRESHOLD_PERCENT
+): boolean {
+  if (!cards.length) {
+    return false
+  }
+  return cards.every(c => c.peakUtil < threshold && c.avgUtil < threshold)
+}
+ 
+export function escapePromLabelValue(value: string): string {
+  return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n')
+}
+ 
+export function formatPromLabels(labels: Record<string, string>): string {
+  return Object.entries(labels)
+    .filter(([, v]) => v !== undefined)
+    .map(([k, v]) => `${k}="${escapePromLabelValue(v)}"`)
+    .join(',')
+}
+ 
+const NPU_JOB_METRIC_LABEL_KEYS = [
+  'cluster',
+  'namespace',
+  'repo',
+  'run_id',
+  'pod',
+  'pod_type',
+  'card',
+  'npu_type',
+  'cards_requested',
+  'result',
+  'idle'
+]
+ 
+export function buildNpuJobMetricsBody(
+  labels: NpuJobLabels,
+  cards: NpuCardAggregate[],
+  idleThreshold = DEFAULT_NPU_IDLE_THRESHOLD_PERCENT
+): string {
+  const base: Record<string, string> = {
+    cluster: labels.cluster,
+    namespace: labels.namespace,
+    repo: labels.repo,
+    run_id: labels.runId,
+    pod: labels.pod,
+    pod_type: labels.podType,
+    npu_type: labels.npuType,
+    cards_requested: labels.cardsRequested,
+    result: labels.result
+  }
+  const idle = isIdleRecord(cards, idleThreshold) ? 'true' : 'false'
+  const lines: string[] = []
+  lines.push('# TYPE custom_npu_job_peak_util_percent gauge')
+  lines.push('# TYPE custom_npu_job_avg_util_percent gauge')
+  lines.push('# TYPE custom_npu_job_duration_seconds gauge')
+  lines.push('# TYPE custom_npu_job_sample_count gauge')
+  for (const card of cards) {
+    const cardLabels = { ...base, card: card.card, idle }
+    const l = formatPromLabels(
+      Object.fromEntries(
+        NPU_JOB_METRIC_LABEL_KEYS.map(k => [k, cardLabels[k]])
+      ) as Record<string, string>
+    )
+    lines.push(`custom_npu_job_peak_util_percent{${l}} ${card.peakUtil}`)
+    lines.push(`custom_npu_job_avg_util_percent{${l}} ${card.avgUtil}`)
+    const duration = Math.max(card.lastTs - card.firstTs, 0)
+    lines.push(`custom_npu_job_duration_seconds{${l}} ${duration}`)
+    lines.push(`custom_npu_job_sample_count{${l}} ${card.samples}`)
+  }
+  lines.push('# TYPE custom_npu_job_push_total counter')
+  lines.push(
+    `custom_npu_job_push_total{cluster="${escapePromLabelValue(labels.cluster)}",namespace="${escapePromLabelValue(labels.namespace)}",status="success"} 1`
+  )
+  return lines.join('\n') + '\n'
+}
+ 
+export function buildNpuPushFailedBody(labels: NpuJobLabels): string {
+  return (
+    `# TYPE custom_npu_job_push_total counter\n` +
+    `custom_npu_job_push_total{cluster="${escapePromLabelValue(labels.cluster)}",namespace="${escapePromLabelValue(labels.namespace)}",status="failed"} 1\n`
+  )
+}
+ 
+export function buildPushgatewayPath(
+  cluster: string,
+  ns: string,
+  pod: string
+): string {
+  return `/metrics/job/${NPU_METRICS_PUSH_JOB}/cluster/${encodeURIComponent(
+    cluster
+  )}/ns/${encodeURIComponent(ns)}/pod/${encodeURIComponent(pod)}`
+}
+ 
+export async function withTimeout<T>(
+  promise: Promise<T>,
+  timeoutMs: number
+): Promise<T> {
+  return await new Promise<T>((resolve, reject) => {
+    const timer = setTimeout(() => reject(new Error('timeout')), timeoutMs)
+    promise.then(
+      value => {
+        clearTimeout(timer)
+        resolve(value)
+      },
+      err => {
+        clearTimeout(timer)
+        reject(err)
+      }
+    )
+  })
+}
+ 
+export interface PushRequest {
+  url: string
+  method: string
+  body: string
+  username?: string
+  password?: string
+  timeoutMs?: number
+}
+ 
+export type RequestFn = (req: PushRequest) => Promise<{ statusCode: number }>
+ 
+export async function nodeRequest(req: PushRequest): Promise<{
+  statusCode: number
+}> {
+  const target = new URL(req.url)
+  const client = target.protocol === 'http:' ? http : https
+  const headers: Record<string, string> = {
+    'Content-Type': 'text/plain'
+  }
+  if (req.username !== undefined || req.password !== undefined) {
+    const basic = Buffer.from(
+      `${req.username ?? ''}:${req.password ?? ''}`
+    ).toString('base64')
+    headers['Authorization'] = `Basic ${basic}`
+  }
+  return await new Promise((resolve, reject) => {
+    const request = client.request(
+      target,
+      {
+        method: req.method,
+        headers,
+        timeout: req.timeoutMs ?? 5000,
+        rejectUnauthorized: false
+      },
+      response => {
+        response.resume()
+        response.on('end', () =>
+          resolve({ statusCode: response.statusCode ?? 0 })
+        )
+      }
+    )
+    request.on('timeout', () => request.destroy(new Error('request timeout')))
+    request.on('error', reject)
+    request.end(req.body)
+  })
+}
+ 
+export async function pushToPushgateway(
+  config: NpuPushConfig,
+  path: string,
+  body: string,
+  options?: { retries?: number; retryDelayMs?: number; requestFn?: RequestFn }
+): Promise<void> {
+  const retries = options?.retries ?? 2
+  const retryDelayMs = options?.retryDelayMs ?? 1000
+  const requestFn = options?.requestFn ?? nodeRequest
+  const url = `${config.url.replace(/\/+$/, '')}${path}`
+  let lastError: unknown
+  for (let attempt = 0; attempt <= retries; attempt++) {
+    if (attempt > 0) {
+      await new Promise(resolve => setTimeout(resolve, retryDelayMs))
+    }
+    try {
+      const response = await requestFn({
+        url,
+        method: 'POST',
+        body,
+        username: config.username,
+        password: config.password
+      })
+      if (response.statusCode >= 200 && response.statusCode < 300) {
+        return
+      }
+      lastError = new Error(`pushgateway returned ${response.statusCode}`)
+    } catch (err) {
+      lastError = err
+    }
+  }
+  throw lastError instanceof Error ? lastError : new Error(String(lastError))
+}
+ 
+export function decodePushSecret(
+  secret: k8s.V1Secret | undefined
+): NpuPushConfig | undefined {
+  const data = secret?.data ?? {}
+  const decode = (key: string): string | undefined => {
+    const encoded = data[key]
+    if (!encoded) {
+      return undefined
+    }
+    try {
+      const decoded = Buffer.from(encoded, 'base64').toString('utf8')
+      return decoded.length ? decoded : undefined
+    } catch {
+      return undefined
+    }
+  }
+  const url = decode('PUSHGATEWAY_URL')
+  if (!url) {
+    return undefined
+  }
+  return {
+    url,
+    username: decode('PUSHGATEWAY_USER'),
+    password: decode('PUSHGATEWAY_PASSWORD')
+  }
+}
+ 
+export async function readNpuPushConfig(): Promise<NpuPushConfig | undefined> {
+  try {
+    const secret = await getSecretByName(NPU_METRICS_SECRET_NAME)
+    return decodePushSecret(secret)
+  } catch (err) {
+    core.debug(
+      `npu-metrics: secret ${NPU_METRICS_SECRET_NAME} unavailable, skip push: ${formatError(err)}`
+    )
+    return undefined
+  }
+}
+ 
+function parseScaleSetSuffix(value: string | undefined): string | undefined {
+  if (!value) {
+    return undefined
+  }
+  const match = value.match(SCALE_SET_NAME_REGEX)
+  return match ? match[1] : undefined
+}
+ 
+export function extractClusterFromRunnerPod(pod: k8s.V1Pod): string {
+  const labels = pod.metadata?.labels ?? {}
+  const annotations = pod.metadata?.annotations ?? {}
+  const entries: [string, string][] = [
+    ...Object.entries(labels),
+    ...Object.entries(annotations)
+  ]
+  for (const [key, value] of entries) {
+    if (/scale[-_]?set|runner[-_]?deployment/i.test(key)) {
+      const suffix = parseScaleSetSuffix(value)
+      if (suffix) {
+        return suffix
+      }
+    }
+  }
+  for (const [, value] of entries) {
+    const suffix = parseScaleSetSuffix(value)
+    if (suffix) {
+      return suffix
+    }
+  }
+  return parseScaleSetSuffix(pod.metadata?.name) ?? 'unknown'
+}
+ 
+export function resolveNpuLabelsFromPod(
+  pod: k8s.V1Pod,
+  podName: string
+): {
+  podType: string
+  npuType: string
+  cardsRequested: string
+  result: string
+} {
+  const podType = podName.includes('-step-') ? 'step' : 'workflow'
+  const npuTypes = new Set<string>()
+  let cards = 0
+  for (const container of pod.spec?.containers ?? []) {
+    for (const resources of [
+      container.resources?.requests,
+      container.resources?.limits
+    ]) {
+      for (const [key, quantity] of Object.entries(resources ?? {})) {
+        const match = key.match(NPU_RESOURCE_REGEX)
+        if (match) {
+          npuTypes.add(match[1])
+          cards = Math.max(cards, parseInt(String(quantity), 10) || 0)
+        }
+      }
+    }
+  }
+  const mainStatus = (pod.status?.containerStatuses ?? []).find(
+    s => s.name === JOB_CONTAINER_NAME
+  )
+  const terminated = mainStatus?.state?.terminated
+  const result = terminated
+    ? String(terminated.exitCode)
+    : (pod.status?.phase ?? 'unknown')
+  return {
+    podType,
+    npuType: Array.from(npuTypes).sort().join(',') || 'unknown',
+    cardsRequested: String(cards || 0),
+    result
+  }
+}
+ 
+export function repoFromEnv(
+  env: Record<string, string | undefined> = process.env
+): string {
+  if (env.GITHUB_REPOSITORY) {
+    return env.GITHUB_REPOSITORY
+  }
+  const workspace = env.GITHUB_WORKSPACE ?? ''
+  const parts = workspace.split('/').filter(p => p.length > 0)
+  if (parts.length >= 2) {
+    return `${parts[parts.length - 2]}/${parts[parts.length - 1]}`
+  }
+  return 'unknown'
+}
+ 
+export async function collectNpuAggregateFromPod(
+  pod: k8s.V1Pod
+): Promise<NpuAggregatePayload | undefined> {
+  const podName = pod.metadata?.name
+  if (!podName) {
+    return undefined
+  }
+  const mainStatus = (pod.status?.containerStatuses ?? []).find(
+    s => s.name === JOB_CONTAINER_NAME
+  )
+  const terminatedMessage = mainStatus?.state?.terminated?.message
+  if (terminatedMessage) {
+    return parseNpuAggregate(terminatedMessage)
+  }
+  if (!mainStatus?.state?.running) {
+    return undefined
+  }
+  const { output } = await execPodStepWithOutput(
+    ['sh', '-c', buildNpuAggregateScript()],
+    podName,
+    JOB_CONTAINER_NAME,
+    5
+  )
+  return parseNpuAggregate(output)
+}
+ 
+export async function collectAndPushNpuMetrics(): Promise<void> {
+  Iif (!npuMetricsEnabled()) {
+    return
+  }
+  let pods: k8s.V1Pod[] = []
+  try {
+    pods = await listPodsByRunnerInstance()
+  } catch (err) {
+    core.debug(`npu-metrics: pod list failed: ${formatError(err)}`)
+    return
+  }
+  const npuPods = pods.filter(
+    pod => pod.metadata?.name && hasNpuRequest(pod.spec)
+  )
+  if (!npuPods.length) {
+    return
+  }
+ 
+  let cluster = 'unknown'
+  try {
+    const runnerPod = await getPodByName(getRunnerPodName())
+    cluster = extractClusterFromRunnerPod(runnerPod)
+  } catch (err) {
+    core.debug(`npu-metrics: cluster label unresolved: ${formatError(err)}`)
+  }
+ 
+  const config = await readNpuPushConfig()
+  if (!config) {
+    core.debug(
+      `npu-metrics: push config missing (secret ${NPU_METRICS_SECRET_NAME}), skip push`
+    )
+    return
+  }
+ 
+  for (const pod of npuPods) {
+    const podName = pod.metadata?.name as string
+    try {
+      await collectAndPushForPod(pod, podName, cluster, config)
+    } catch (err) {
+      core.debug(
+        `npu-metrics: collection failed for ${podName}: ${formatError(err)}`
+      )
+    }
+  }
+}
+ 
+async function collectAndPushForPod(
+  pod: k8s.V1Pod,
+  podName: string,
+  cluster: string,
+  config: NpuPushConfig
+): Promise<void> {
+  const payload = await collectNpuAggregateFromPod(pod)
+  if (!payload || !payload.cards.length) {
+    core.debug(`npu-metrics: no aggregate payload for ${podName}, skip`)
+    return
+  }
+ 
+  const npuInfo = resolveNpuLabelsFromPod(pod, podName)
+  const labels: NpuJobLabels = {
+    cluster,
+    namespace: namespace(),
+    pod: podName,
+    podType: npuInfo.podType,
+    repo: repoFromEnv(),
+    runId: process.env.GITHUB_RUN_ID ?? '',
+    npuType: npuInfo.npuType,
+    cardsRequested: npuInfo.cardsRequested,
+    result: npuInfo.result
+  }
+ 
+  const body = buildNpuJobMetricsBody(
+    labels,
+    payload.cards,
+    getIdleThresholdPercent()
+  )
+  const path = buildPushgatewayPath(labels.cluster, labels.namespace, podName)
+  try {
+    await pushToPushgateway(config, path, body)
+    core.debug(`npu-metrics: pushed job record for ${podName}`)
+  } catch (err) {
+    core.warning(`npu-metrics: push failed for ${podName}: ${formatError(err)}`)
+    try {
+      await pushToPushgateway(config, path, buildNpuPushFailedBody(labels))
+    } catch {
+      // pushgateway unreachable, nothing else to record
+    }
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/tests/index.html b/packages/k8s/coverage/lcov-report/tests/index.html new file mode 100644 index 00000000..bf4c502f --- /dev/null +++ b/packages/k8s/coverage/lcov-report/tests/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for tests + + + + + + + + + +
+
+

All files tests

+
+ +
+ 33.82% + Statements + 23/68 +
+ + +
+ 0% + Branches + 0/7 +
+ + +
+ 14.28% + Functions + 2/14 +
+ + +
+ 32.83% + Lines + 22/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
test-setup.ts +
+
33.82%23/680%0/714.28%2/1432.83%22/67
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov-report/tests/test-setup.ts.html b/packages/k8s/coverage/lcov-report/tests/test-setup.ts.html new file mode 100644 index 00000000..ae914717 --- /dev/null +++ b/packages/k8s/coverage/lcov-report/tests/test-setup.ts.html @@ -0,0 +1,580 @@ + + + + + + Code coverage report for tests/test-setup.ts + + + + + + + + + +
+
+

All files / tests test-setup.ts

+
+ +
+ 33.82% + Statements + 23/68 +
+ + +
+ 0% + Branches + 0/7 +
+ + +
+ 14.28% + Functions + 2/14 +
+ + +
+ 32.83% + Lines + 22/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +1666x +6x +  +6x +6x +  +6x +  +6x +  +6x +  +6x +  +  +  +  +  +  +46x +46x +46x +46x +  +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +  +  +  +6x +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +6x + 
import * as k8s from '@kubernetes/client-node'
+import * as fs from 'fs'
+import { HookData } from 'hooklib/lib'
+import * as path from 'path'
+import { v4 as uuidv4 } from 'uuid'
+ 
+const kc = new k8s.KubeConfig()
+ 
+kc.loadFromDefault()
+ 
+const k8sApi = kc.makeApiClient(k8s.CoreV1Api)
+ 
+export class TestHelper {
+  private tempDirPath: string
+  private podName: string
+  private runnerWorkdir: string
+  private runnerTemp: string
+ 
+  constructor() {
+    this.tempDirPath = `${__dirname}/_temp/runner`
+    this.runnerWorkdir = `${this.tempDirPath}/_work`
+    this.runnerTemp = `${this.tempDirPath}/_work/_temp`
+    this.podName = uuidv4().replace(/-/g, '')
+  }
+ 
+  async initialize(): Promise<void> {
+    process.env['ACTIONS_RUNNER_POD_NAME'] = `${this.podName}`
+    process.env['RUNNER_WORKSPACE'] = `${this.runnerWorkdir}/repo`
+    process.env['RUNNER_TEMP'] = `${this.runnerTemp}`
+    process.env['GITHUB_WORKSPACE'] = `${this.runnerWorkdir}/repo/repo`
+    process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default'
+ 
+    fs.mkdirSync(`${this.runnerWorkdir}/repo/repo`, { recursive: true })
+    fs.mkdirSync(`${this.tempDirPath}/externals`, { recursive: true })
+    fs.mkdirSync(this.runnerTemp, { recursive: true })
+    fs.mkdirSync(`${this.runnerTemp}/_github_workflow`, { recursive: true })
+    fs.mkdirSync(`${this.runnerTemp}/_github_home`, { recursive: true })
+    fs.mkdirSync(`${this.runnerTemp}/_runner_file_commands`, {
+      recursive: true
+    })
+ 
+    fs.copyFileSync(
+      path.resolve(`${__dirname}/../../../examples/example-script.sh`),
+      `${this.runnerTemp}/example-script.sh`
+    )
+ 
+    await this.cleanupK8sResources()
+    try {
+      await this.createTestJobPod()
+    } catch (e) {
+      console.log(e)
+    }
+  }
+ 
+  async cleanup(): Promise<void> {
+    try {
+      await this.cleanupK8sResources()
+      fs.rmSync(this.tempDirPath, { recursive: true })
+    } catch {
+      // Ignore errors during cleanup
+    }
+  }
+ 
+  async cleanupK8sResources(): Promise<void> {
+    await k8sApi
+      .deleteNamespacedPod({
+        name: this.podName,
+        namespace: 'default',
+        gracePeriodSeconds: 0
+      })
+      .catch((e: k8s.ApiException<any>) => {
+        if (e.code !== 404) {
+          console.error(JSON.stringify(e))
+        }
+      })
+    await k8sApi
+      .deleteNamespacedPod({
+        name: `${this.podName}-workflow`,
+        namespace: 'default',
+        gracePeriodSeconds: 0
+      })
+      .catch((e: k8s.ApiException<any>) => {
+        if (e.code !== 404) {
+          console.error(JSON.stringify(e))
+        }
+      })
+  }
+  createFile(fileName?: string): string {
+    const filePath = `${this.tempDirPath}/${fileName || uuidv4()}`
+    fs.writeFileSync(filePath, '')
+    return filePath
+  }
+ 
+  removeFile(fileName: string): void {
+    const filePath = `${this.tempDirPath}/${fileName}`
+    fs.rmSync(filePath)
+  }
+ 
+  async createTestJobPod(): Promise<void> {
+    const container = {
+      name: 'runner',
+      image: 'ghcr.io/actions/actions-runner:latest',
+      imagePullPolicy: 'IfNotPresent'
+    } as k8s.V1Container
+ 
+    const pod: k8s.V1Pod = {
+      metadata: {
+        name: this.podName
+      },
+      spec: {
+        restartPolicy: 'Never',
+        containers: [container],
+        securityContext: {
+          runAsUser: 1001,
+          runAsGroup: 1001,
+          fsGroup: 1001
+        }
+      }
+    } as k8s.V1Pod
+    await k8sApi.createNamespacedPod({ namespace: 'default', body: pod })
+  }
+ 
+  getPrepareJobDefinition(): HookData {
+    const prepareJob = JSON.parse(
+      fs.readFileSync(
+        path.resolve(__dirname + '/../../../examples/prepare-job.json'),
+        'utf8'
+      )
+    )
+ 
+    prepareJob.args.container.userMountVolumes = undefined
+    prepareJob.args.container.registry = null
+    prepareJob.args.services.forEach(s => {
+      s.registry = null
+    })
+ 
+    return prepareJob
+  }
+ 
+  getRunScriptStepDefinition(): HookData {
+    const runScriptStep = JSON.parse(
+      fs.readFileSync(
+        path.resolve(__dirname + '/../../../examples/run-script-step.json'),
+        'utf8'
+      )
+    )
+ 
+    runScriptStep.args.entryPointArgs[1] = `/__w/_temp/example-script.sh`
+    return runScriptStep
+  }
+ 
+  getRunContainerStepDefinition(): HookData {
+    const runContainerStep = JSON.parse(
+      fs.readFileSync(
+        path.resolve(__dirname + '/../../../examples/run-container-step.json'),
+        'utf8'
+      )
+    )
+ 
+    runContainerStep.args.entryPointArgs[1] = `/__w/_temp/example-script.sh`
+    runContainerStep.args.userMountVolumes = undefined
+    runContainerStep.args.registry = null
+    return runContainerStep
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/packages/k8s/coverage/lcov.info b/packages/k8s/coverage/lcov.info new file mode 100644 index 00000000..e2164134 --- /dev/null +++ b/packages/k8s/coverage/lcov.info @@ -0,0 +1,3688 @@ +TN: +SF:src/hooks/cleanup-job.ts +FN:11,cleanupJob +FNF:1 +FNH:1 +FNDA:21,cleanupJob +DA:1,7 +DA:2,7 +DA:3,7 +DA:4,7 +DA:11,7 +DA:12,21 +DA:14,42 +DA:16,0 +DA:19,42 +LF:9 +LH:8 +BRDA:19,0,0,21 +BRDA:12,1,0,0 +BRDA:12,1,1,21 +BRF:3 +BRH:2 +end_of_record +TN: +SF:src/hooks/constants.ts +FN:3,getRunnerPodName +FN:13,getJobPodName +FN:20,getStepPodName +FN:27,getVolumeClaimName +FN:35,getSecretName +FN:48,(anonymous_5) +FN:50,RunnerInstanceLabel +FN:54,(anonymous_7) +FN:58,(anonymous_8) +FN:62,(anonymous_9) +FNF:10 +FNH:10 +FNDA:105,getRunnerPodName +FNDA:11,getJobPodName +FNDA:17,getStepPodName +FNDA:4,getVolumeClaimName +FNDA:3,getSecretName +FNDA:15,(anonymous_5) +FNDA:67,RunnerInstanceLabel +FNDA:4,(anonymous_7) +FNDA:3,(anonymous_8) +FNDA:1,(anonymous_9) +DA:1,15 +DA:3,15 +DA:4,105 +DA:5,105 +DA:6,74 +DA:10,31 +DA:13,15 +DA:14,11 +DA:20,15 +DA:21,17 +DA:27,15 +DA:28,4 +DA:29,4 +DA:30,3 +DA:32,1 +DA:35,15 +DA:36,3 +DA:42,15 +DA:43,15 +DA:44,15 +DA:45,15 +DA:46,15 +DA:48,15 +DA:51,67 +DA:54,15 +DA:55,4 +DA:58,15 +DA:59,3 +DA:62,15 +DA:63,1 +DA:65,15 +LF:31 +LH:31 +BRDA:5,0,0,74 +BRDA:5,0,1,31 +BRDA:29,1,0,3 +BRDA:29,1,1,1 +BRF:4 +BRH:4 +end_of_record +TN: +SF:src/hooks/index.ts +FNF:0 +FNH:0 +DA:1,7 +DA:2,7 +DA:3,7 +DA:4,7 +LF:4 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/hooks/prepare-job.ts +FN:40,prepareJob +FN:73,(anonymous_25) +FN:235,generateResponseFile +FN:254,(anonymous_27) +FN:275,(anonymous_28) +FN:278,(anonymous_29) +FN:279,(anonymous_30) +FN:299,createContainerSpec +FN:355,(anonymous_32) +FNF:9 +FNH:8 +FNDA:10,prepareJob +FNDA:2,(anonymous_25) +FNDA:3,generateResponseFile +FNDA:1,(anonymous_27) +FNDA:0,(anonymous_28) +FNDA:3,(anonymous_29) +FNDA:2,(anonymous_30) +FNDA:21,createContainerSpec +FNDA:1,(anonymous_32) +DA:1,8 +DA:3,8 +DA:10,8 +DA:20,8 +DA:32,8 +DA:37,8 +DA:38,8 +DA:40,8 +DA:44,10 +DA:45,1 +DA:48,18 +DA:50,9 +DA:52,9 +DA:53,9 +DA:54,8 +DA:60,8 +DA:63,9 +DA:64,9 +DA:65,9 +DA:66,1 +DA:67,2 +DA:68,2 +DA:69,2 +DA:72,1 +DA:73,1 +DA:74,2 +DA:75,2 +DA:76,2 +DA:79,2 +DA:80,2 +DA:82,0 +DA:85,2 +DA:86,2 +DA:87,2 +DA:91,9 +DA:92,1 +DA:95,8 +DA:97,8 +DA:105,4 +DA:106,2 +DA:113,2 +DA:114,2 +DA:121,2 +DA:122,2 +DA:125,2 +DA:126,2 +DA:130,2 +DA:133,1 +DA:134,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:143,0 +DA:149,2 +DA:159,2 +DA:162,6 +DA:163,0 +DA:165,6 +DA:169,6 +DA:170,6 +DA:171,1 +DA:173,5 +DA:176,5 +DA:177,0 +DA:181,10 +DA:188,2 +DA:192,1 +DA:193,1 +DA:196,8 +DA:198,8 +DA:199,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:215,0 +DA:218,4 +DA:220,4 +DA:222,4 +DA:227,1 +DA:228,1 +DA:229,1 +DA:231,3 +DA:232,3 +DA:242,3 +DA:243,0 +DA:245,3 +DA:253,3 +DA:254,1 +DA:256,3 +DA:257,1 +DA:258,1 +DA:259,1 +DA:260,0 +DA:265,1 +DA:271,3 +DA:273,1 +DA:275,0 +DA:277,1 +DA:278,3 +DA:280,2 +DA:281,2 +DA:282,0 +DA:283,0 +DA:284,0 +DA:289,2 +DA:296,3 +DA:299,8 +DA:302,29 +DA:305,21 +DA:306,1 +DA:307,1 +DA:310,21 +DA:315,21 +DA:316,1 +DA:319,21 +DA:320,18 +DA:323,21 +DA:324,10 +DA:327,21 +DA:328,21 +DA:331,3 +DA:332,2 +DA:336,21 +DA:341,21 +DA:342,20 +DA:348,21 +DA:350,21 +DA:351,20 +DA:354,1 +DA:355,1 +DA:358,1 +DA:359,1 +DA:362,1 +LF:134 +LH:119 +BRDA:196,0,0,4 +BRDA:44,1,0,1 +BRDA:44,1,1,9 +BRDA:53,2,0,8 +BRDA:53,2,1,1 +BRDA:53,3,0,0 +BRDA:53,3,1,9 +BRDA:53,4,0,9 +BRDA:53,4,1,9 +BRDA:65,5,0,1 +BRDA:65,5,1,8 +BRDA:65,6,0,0 +BRDA:65,6,1,9 +BRDA:65,7,0,9 +BRDA:65,7,1,9 +BRDA:69,8,0,2 +BRDA:69,8,1,1 +BRDA:75,9,0,2 +BRDA:75,9,1,0 +BRDA:76,10,0,2 +BRDA:76,10,1,1 +BRDA:79,11,0,2 +BRDA:79,11,1,0 +BRDA:91,12,0,1 +BRDA:91,12,1,8 +BRDA:91,13,0,9 +BRDA:91,13,1,1 +BRDA:91,14,0,0 +BRDA:91,14,1,1 +BRDA:91,15,0,1 +BRDA:91,15,1,1 +BRDA:113,16,0,2 +BRDA:113,16,1,0 +BRDA:127,17,0,1 +BRDA:127,17,1,1 +BRDA:130,18,0,1 +BRDA:130,18,1,1 +BRDA:130,19,0,2 +BRDA:130,19,1,1 +BRDA:130,19,2,1 +BRDA:139,20,0,1 +BRDA:139,20,1,0 +BRDA:139,21,0,0 +BRDA:139,21,1,1 +BRDA:139,22,0,1 +BRDA:139,22,1,1 +BRDA:162,23,0,0 +BRDA:162,23,1,6 +BRDA:162,24,0,0 +BRDA:162,24,1,6 +BRDA:162,25,0,6 +BRDA:162,25,1,6 +BRDA:162,26,0,0 +BRDA:162,26,1,6 +BRDA:162,27,0,6 +BRDA:162,27,1,6 +BRDA:166,28,0,0 +BRDA:166,28,1,6 +BRDA:166,29,0,6 +BRDA:166,29,1,6 +BRDA:166,30,0,0 +BRDA:166,30,1,6 +BRDA:166,31,0,6 +BRDA:166,31,1,6 +BRDA:170,32,0,1 +BRDA:170,32,1,5 +BRDA:176,33,0,0 +BRDA:176,33,1,5 +BRDA:176,34,0,0 +BRDA:176,34,1,5 +BRDA:176,35,0,5 +BRDA:176,35,1,5 +BRDA:176,36,0,0 +BRDA:176,36,1,5 +BRDA:176,37,0,5 +BRDA:176,37,1,5 +BRDA:177,38,0,0 +BRDA:177,38,1,0 +BRDA:192,39,0,1 +BRDA:192,39,1,0 +BRDA:198,40,0,4 +BRDA:198,40,1,0 +BRDA:206,41,0,0 +BRDA:206,41,1,0 +BRDA:206,42,0,0 +BRDA:206,42,1,0 +BRDA:206,43,0,0 +BRDA:206,43,1,0 +BRDA:206,44,0,0 +BRDA:206,44,1,0 +BRDA:206,45,0,0 +BRDA:206,45,1,0 +BRDA:242,46,0,0 +BRDA:242,46,1,3 +BRDA:242,47,0,0 +BRDA:242,47,1,3 +BRDA:242,48,0,3 +BRDA:242,48,1,3 +BRDA:253,49,0,2 +BRDA:253,49,1,1 +BRDA:253,50,0,3 +BRDA:253,50,1,3 +BRDA:253,51,0,2 +BRDA:253,51,1,1 +BRDA:253,52,0,3 +BRDA:253,52,1,3 +BRDA:256,53,0,1 +BRDA:256,53,1,2 +BRDA:258,54,0,1 +BRDA:258,54,1,0 +BRDA:258,55,0,0 +BRDA:258,55,1,1 +BRDA:258,56,0,1 +BRDA:258,56,1,1 +BRDA:271,57,0,1 +BRDA:271,57,1,2 +BRDA:271,58,0,0 +BRDA:271,58,1,3 +BRDA:271,59,0,3 +BRDA:271,59,1,3 +BRDA:273,60,0,1 +BRDA:273,60,1,0 +BRDA:273,61,0,1 +BRDA:273,61,1,1 +BRDA:275,62,0,0 +BRDA:275,62,1,0 +BRDA:275,63,0,0 +BRDA:275,63,1,0 +BRDA:275,64,0,0 +BRDA:275,64,1,0 +BRDA:277,65,0,0 +BRDA:277,65,1,1 +BRDA:277,66,0,1 +BRDA:277,66,1,1 +BRDA:277,67,0,0 +BRDA:277,67,1,1 +BRDA:277,68,0,1 +BRDA:277,68,1,1 +BRDA:277,69,0,0 +BRDA:277,69,1,1 +BRDA:277,70,0,1 +BRDA:277,70,1,1 +BRDA:281,71,0,0 +BRDA:281,71,1,2 +BRDA:281,72,0,0 +BRDA:281,72,1,2 +BRDA:281,73,0,2 +BRDA:281,73,1,2 +BRDA:283,74,0,0 +BRDA:283,74,1,0 +BRDA:283,75,0,0 +BRDA:283,75,1,0 +BRDA:302,76,0,8 +BRDA:302,76,1,13 +BRDA:305,77,0,1 +BRDA:305,77,1,20 +BRDA:305,78,0,21 +BRDA:305,78,1,4 +BRDA:315,79,0,1 +BRDA:315,79,1,20 +BRDA:319,80,0,18 +BRDA:319,80,1,3 +BRDA:323,81,0,10 +BRDA:323,81,1,11 +BRDA:323,82,0,21 +BRDA:323,82,1,10 +BRDA:329,83,0,21 +BRDA:329,83,1,9 +BRDA:331,84,0,2 +BRDA:331,84,1,1 +BRDA:331,85,0,3 +BRDA:331,85,1,3 +BRDA:341,86,0,20 +BRDA:341,86,1,1 +BRDA:341,87,0,21 +BRDA:341,87,1,9 +BRDA:350,88,0,20 +BRDA:350,88,1,1 +BRDA:354,89,0,0 +BRDA:354,89,1,1 +BRDA:354,90,0,1 +BRDA:354,90,1,1 +BRDA:354,91,0,0 +BRDA:354,91,1,1 +BRDA:354,92,0,1 +BRDA:354,92,1,1 +BRDA:358,93,0,1 +BRDA:358,93,1,0 +BRF:188 +BRH:134 +end_of_record +TN: +SF:src/hooks/run-container-step.ts +FN:36,runContainerStep +FN:169,(anonymous_25) +FN:181,classifyScriptError +FN:193,(anonymous_29) +FN:234,(anonymous_30) +FN:246,createContainerSpec +FN:264,(anonymous_32) +FNF:7 +FNH:2 +FNDA:16,runContainerStep +FNDA:0,(anonymous_25) +FNDA:0,classifyScriptError +FNDA:0,(anonymous_29) +FNDA:0,(anonymous_30) +FNDA:14,createContainerSpec +FNDA:0,(anonymous_32) +DA:1,8 +DA:2,8 +DA:3,8 +DA:5,8 +DA:6,8 +DA:19,8 +DA:28,8 +DA:34,8 +DA:36,8 +DA:39,16 +DA:40,1 +DA:43,15 +DA:44,1 +DA:49,14 +DA:50,14 +DA:51,14 +DA:52,13 +DA:55,14 +DA:57,14 +DA:58,14 +DA:62,14 +DA:64,14 +DA:65,14 +DA:66,14 +DA:69,0 +DA:70,0 +DA:76,0 +DA:79,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:99,0 +DA:101,0 +DA:104,0 +DA:106,0 +DA:114,0 +DA:116,0 +DA:119,0 +DA:120,0 +DA:125,0 +DA:126,0 +DA:132,0 +DA:137,0 +DA:139,0 +DA:141,0 +DA:146,0 +DA:148,0 +DA:149,0 +DA:151,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:166,0 +DA:167,0 +DA:169,0 +DA:170,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:210,0 +DA:213,0 +DA:219,0 +DA:221,0 +DA:222,0 +DA:228,0 +DA:231,0 +DA:232,0 +DA:234,0 +DA:236,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:243,0 +DA:250,14 +DA:251,14 +DA:252,14 +DA:253,14 +DA:254,14 +DA:255,14 +DA:257,14 +DA:259,14 +DA:260,14 +DA:263,0 +DA:264,0 +DA:266,0 +DA:267,0 +DA:270,0 +LF:106 +LH:33 +BRDA:169,0,0,0 +BRDA:39,1,0,1 +BRDA:39,1,1,15 +BRDA:43,2,0,1 +BRDA:43,2,1,14 +BRDA:49,3,0,14 +BRDA:49,3,1,5 +BRDA:51,4,0,13 +BRDA:51,4,1,1 +BRDA:69,5,0,0 +BRDA:69,5,1,0 +BRDA:69,6,0,0 +BRDA:69,6,1,0 +BRDA:69,7,0,0 +BRDA:69,7,1,0 +BRDA:88,8,0,0 +BRDA:88,8,1,0 +BRDA:88,9,0,0 +BRDA:88,9,1,0 +BRDA:96,10,0,0 +BRDA:96,10,1,0 +BRDA:125,11,0,0 +BRDA:125,11,1,0 +BRDA:141,12,0,0 +BRDA:141,12,1,0 +BRDA:142,13,0,0 +BRDA:142,13,1,0 +BRDA:142,13,2,0 +BRDA:157,14,0,0 +BRDA:157,14,1,0 +BRDA:192,15,0,0 +BRDA:192,15,1,0 +BRDA:192,16,0,0 +BRDA:192,16,1,0 +BRDA:192,17,0,0 +BRDA:192,17,1,0 +BRDA:192,18,0,0 +BRDA:192,18,1,0 +BRDA:195,19,0,0 +BRDA:195,19,1,0 +BRDA:195,20,0,0 +BRDA:195,20,1,0 +BRDA:195,21,0,0 +BRDA:195,21,1,0 +BRDA:195,22,0,0 +BRDA:195,22,1,0 +BRDA:196,23,0,0 +BRDA:196,23,1,0 +BRDA:197,24,0,0 +BRDA:197,24,1,0 +BRDA:197,25,0,0 +BRDA:197,25,1,0 +BRDA:199,26,0,0 +BRDA:199,26,1,0 +BRDA:199,26,2,0 +BRDA:199,26,3,0 +BRDA:199,26,4,0 +BRDA:203,27,0,0 +BRDA:203,27,1,0 +BRDA:204,28,0,0 +BRDA:204,28,1,0 +BRDA:221,29,0,0 +BRDA:221,29,1,0 +BRDA:221,30,0,0 +BRDA:221,30,1,0 +BRDA:221,31,0,0 +BRDA:221,31,1,0 +BRDA:221,32,0,0 +BRDA:221,32,1,0 +BRDA:221,33,0,0 +BRDA:221,33,1,0 +BRDA:223,34,0,0 +BRDA:223,34,1,0 +BRDA:223,35,0,0 +BRDA:223,35,1,0 +BRDA:231,36,0,0 +BRDA:231,36,1,0 +BRDA:240,37,0,0 +BRDA:240,37,1,0 +BRDA:259,38,0,14 +BRDA:259,38,1,0 +BRDA:263,39,0,0 +BRDA:263,39,1,0 +BRDA:263,40,0,0 +BRDA:263,40,1,0 +BRDA:263,41,0,0 +BRDA:263,41,1,0 +BRDA:263,42,0,0 +BRDA:263,42,1,0 +BRDA:266,43,0,0 +BRDA:266,43,1,0 +BRF:91 +BRH:9 +end_of_record +TN: +SF:src/hooks/run-script-step.ts +FN:16,formatScriptError +FN:26,(anonymous_24) +FN:35,runScriptStep +FNF:3 +FNH:3 +FNDA:3,formatScriptError +FNDA:7,(anonymous_24) +FNDA:7,runScriptStep +DA:2,7 +DA:3,7 +DA:5,7 +DA:11,7 +DA:12,7 +DA:13,7 +DA:17,3 +DA:18,3 +DA:22,3 +DA:23,3 +DA:24,3 +DA:26,7 +DA:28,3 +DA:30,3 +DA:31,3 +DA:32,3 +DA:35,7 +DA:40,7 +DA:41,2 +DA:47,5 +DA:48,5 +DA:56,5 +DA:57,5 +DA:58,5 +DA:59,5 +DA:61,10 +DA:70,10 +DA:76,5 +DA:94,10 +DA:100,0 +DA:101,0 +DA:102,0 +DA:106,5 +DA:107,5 +DA:109,5 +DA:114,4 +DA:115,3 +DA:118,4 +DA:119,4 +DA:123,3 +DA:125,1 +DA:126,1 +DA:128,5 +DA:129,5 +DA:131,0 +DA:136,1 +DA:139,2 +DA:145,0 +LF:48 +LH:43 +BRDA:23,0,0,3 +BRDA:23,0,1,0 +BRDA:31,1,0,3 +BRDA:31,1,1,0 +BRDA:40,2,0,2 +BRDA:40,2,1,5 +BRDA:40,3,0,0 +BRDA:40,3,1,7 +BRDA:40,4,0,7 +BRDA:40,4,1,7 +BRDA:114,5,0,3 +BRDA:114,5,1,1 +BRDA:119,6,0,3 +BRDA:119,6,1,1 +BRDA:120,7,0,4 +BRDA:120,7,1,4 +BRF:16 +BRH:13 +end_of_record +TN: +SF:src/k8s/heartbeat.ts +FN:11,parsePositiveMsEnv +FN:19,(anonymous_10) +FN:25,WebSocketHeartbeat +FN:30,(anonymous_12) +FN:39,(anonymous_13) +FN:53,(anonymous_14) +FN:59,(anonymous_15) +FN:64,(anonymous_16) +FN:86,(anonymous_17) +FN:95,(anonymous_18) +FN:100,(anonymous_19) +FN:106,(anonymous_20) +FNF:12 +FNH:11 +FNDA:8,parsePositiveMsEnv +FNDA:14,(anonymous_10) +FNDA:8,WebSocketHeartbeat +FNDA:22,(anonymous_12) +FNDA:8,(anonymous_13) +FNDA:8,(anonymous_14) +FNDA:5,(anonymous_15) +FNDA:1,(anonymous_16) +FNDA:1,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:1,(anonymous_19) +FNDA:29,(anonymous_20) +DA:1,14 +DA:11,14 +DA:15,8 +DA:16,8 +DA:19,14 +DA:20,8 +DA:21,8 +DA:22,8 +DA:23,14 +DA:26,8 +DA:27,8 +DA:30,14 +DA:31,22 +DA:32,22 +DA:33,0 +DA:34,0 +DA:36,22 +DA:39,14 +DA:40,8 +DA:41,0 +DA:43,8 +DA:44,8 +DA:45,8 +DA:47,8 +DA:48,4 +DA:49,4 +DA:53,14 +DA:54,8 +DA:57,8 +DA:59,8 +DA:60,5 +DA:61,1 +DA:62,1 +DA:64,5 +DA:65,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:74,1 +DA:84,8 +DA:86,8 +DA:87,1 +DA:88,0 +DA:90,1 +DA:91,1 +DA:95,8 +DA:96,0 +DA:97,0 +DA:100,8 +DA:101,1 +DA:102,1 +DA:106,8 +DA:107,29 +DA:109,16 +DA:111,13 +DA:112,12 +DA:113,12 +DA:114,12 +DA:115,4 +DA:116,4 +DA:118,12 +DA:119,0 +DA:122,0 +DA:123,0 +DA:127,1 +DA:128,0 +DA:132,1 +DA:136,14 +LF:68 +LH:58 +BRDA:15,0,0,7 +BRDA:15,0,1,1 +BRDA:15,1,0,8 +BRDA:15,1,1,8 +BRDA:16,2,0,2 +BRDA:16,2,1,6 +BRDA:16,3,0,8 +BRDA:16,3,1,4 +BRDA:32,4,0,0 +BRDA:32,4,1,22 +BRDA:40,5,0,0 +BRDA:40,5,1,8 +BRDA:43,6,0,8 +BRDA:43,6,1,0 +BRDA:47,7,0,4 +BRDA:47,7,1,4 +BRDA:60,8,0,1 +BRDA:60,8,1,4 +BRDA:87,9,0,0 +BRDA:87,9,1,1 +BRDA:90,10,0,1 +BRDA:90,10,1,0 +BRDA:107,11,0,16 +BRDA:107,11,1,13 +BRDA:111,12,0,12 +BRDA:111,12,1,1 +BRDA:114,13,0,4 +BRDA:114,13,1,8 +BRDA:118,14,0,0 +BRDA:118,14,1,12 +BRDA:127,15,0,0 +BRDA:127,15,1,1 +BRF:32 +BRH:25 +end_of_record +TN: +SF:src/k8s/index.ts +FN:69,createJobPod +FN:189,createContainerStepPod +FN:242,deletePod +FN:250,execPodStep +FN:278,(anonymous_36) +FN:292,(anonymous_37) +FN:292,(anonymous_38) +FN:300,(anonymous_40) +FN:306,(anonymous_43) +FN:307,(anonymous_44) +FN:314,(anonymous_45) +FN:337,(anonymous_46) +FN:346,(anonymous_47) +FN:346,(anonymous_48) +FN:353,(anonymous_50) +FN:354,(anonymous_51) +FN:361,(anonymous_52) +FN:379,execPodStepWithOutput +FN:391,(anonymous_56) +FN:399,(anonymous_57) +FN:407,(anonymous_58) +FN:414,(anonymous_59) +FN:426,(anonymous_60) +FN:437,(anonymous_61) +FN:451,(anonymous_62) +FN:456,(anonymous_63) +FN:467,(anonymous_64) +FN:485,(anonymous_65) +FN:503,execCalculateOutputHashSorted +FN:512,(anonymous_69) +FN:522,(anonymous_70) +FN:533,(anonymous_71) +FN:548,(anonymous_72) +FN:556,(anonymous_73) +FN:565,localCalculateOutputHashSorted +FN:569,(anonymous_77) +FN:575,(anonymous_78) +FN:579,(anonymous_79) +FN:584,(anonymous_80) +FN:599,execCpToPod +FN:622,(anonymous_86) +FN:633,(anonymous_87) +FN:633,(anonymous_88) +FN:644,(anonymous_90) +FN:685,(anonymous_93) +FN:688,(anonymous_94) +FN:691,(anonymous_95) +FN:694,(anonymous_96) +FN:697,(anonymous_97) +FN:701,(anonymous_98) +FN:720,execCpFromPod +FN:756,(anonymous_104) +FN:773,(anonymous_105) +FN:773,(anonymous_106) +FN:783,(anonymous_108) +FN:824,(anonymous_111) +FN:827,(anonymous_112) +FN:830,(anonymous_113) +FN:833,(anonymous_114) +FN:836,(anonymous_115) +FN:840,(anonymous_116) +FN:859,waitForJobToComplete +FN:873,createDockerSecret +FN:914,createSecretForEnvs +FN:942,deleteSecret +FN:949,pruneSecrets +FN:960,(anonymous_132) +FN:960,(anonymous_133) +FN:1052,getUnrecoverableWaitingReasons +FN:1070,getUnrecoverableEventReasons +FN:1085,getUnrecoverableTerminatedReasons +FN:1107,isPermanentSchedulingFailure +FN:1111,(anonymous_139) +FN:1123,getPermanentSchedulingPatterns +FN:1146,getWaitingReasonHint +FN:1165,getContainerErrors +FN:1184,getTerminatedReasonHint +FN:1211,getContainerTerminatedErrors +FN:1230,getEventReasonHint +FN:1266,getPodEventErrors +FN:1331,describePodFailure +FN:1412,describePodWarningEvents +FN:1429,(anonymous_155) +FN:1434,(anonymous_156) +FN:1438,(anonymous_157) +FN:1441,(anonymous_158) +FN:1459,getPodConditionErrors +FN:1469,checkUnrecoverableErrors +FN:1483,(anonymous_163) +FN:1485,(anonymous_164) +FN:1496,waitForPodPhases +FN:1576,getPrepareJobTimeoutSeconds +FN:1595,readPod +FN:1610,parsePodPhase +FN:1617,isJobSucceeded +FN:1628,getPodLogs +FN:1634,(anonymous_179) +FN:1644,(anonymous_180) +FN:1645,(anonymous_181) +FN:1646,(anonymous_182) +FN:1653,prunePods +FN:1664,(anonymous_186) +FN:1664,(anonymous_187) +FN:1669,getPodStatus +FN:1679,isAuthPermissionsOK +FN:1697,(anonymous_195) +FN:1700,isPodContainerAlpine +FN:1722,namespace +FN:1727,(anonymous_200) +FN:1750,(anonymous_201) +FN:1753,BackOffManager +FN:1759,(anonymous_203) +FN:1760,(anonymous_206) +FN:1776,containerPorts +FN:1798,(anonymous_208) +FN:1818,getPodByName +FN:1825,getSecretByName +FN:1832,listPodsByRunnerInstance +FNF:118 +FNH:51 +FNDA:0,createJobPod +FNDA:0,createContainerStepPod +FNDA:0,deletePod +FNDA:0,execPodStep +FNDA:0,(anonymous_36) +FNDA:0,(anonymous_37) +FNDA:0,(anonymous_38) +FNDA:0,(anonymous_40) +FNDA:0,(anonymous_43) +FNDA:0,(anonymous_44) +FNDA:0,(anonymous_45) +FNDA:0,(anonymous_46) +FNDA:0,(anonymous_47) +FNDA:0,(anonymous_48) +FNDA:0,(anonymous_50) +FNDA:0,(anonymous_51) +FNDA:0,(anonymous_52) +FNDA:7,execPodStepWithOutput +FNDA:36,(anonymous_56) +FNDA:35,(anonymous_57) +FNDA:3,(anonymous_58) +FNDA:7,(anonymous_59) +FNDA:35,(anonymous_60) +FNDA:3,(anonymous_61) +FNDA:4,(anonymous_62) +FNDA:7,(anonymous_63) +FNDA:5,(anonymous_64) +FNDA:2,(anonymous_65) +FNDA:0,execCalculateOutputHashSorted +FNDA:0,(anonymous_69) +FNDA:0,(anonymous_70) +FNDA:0,(anonymous_71) +FNDA:0,(anonymous_72) +FNDA:0,(anonymous_73) +FNDA:0,localCalculateOutputHashSorted +FNDA:0,(anonymous_77) +FNDA:0,(anonymous_78) +FNDA:0,(anonymous_79) +FNDA:0,(anonymous_80) +FNDA:3,execCpToPod +FNDA:90,(anonymous_86) +FNDA:0,(anonymous_87) +FNDA:0,(anonymous_88) +FNDA:90,(anonymous_90) +FNDA:0,(anonymous_93) +FNDA:0,(anonymous_94) +FNDA:0,(anonymous_95) +FNDA:0,(anonymous_96) +FNDA:0,(anonymous_97) +FNDA:0,(anonymous_98) +FNDA:2,execCpFromPod +FNDA:60,(anonymous_104) +FNDA:0,(anonymous_105) +FNDA:0,(anonymous_106) +FNDA:60,(anonymous_108) +FNDA:0,(anonymous_111) +FNDA:0,(anonymous_112) +FNDA:0,(anonymous_113) +FNDA:0,(anonymous_114) +FNDA:0,(anonymous_115) +FNDA:0,(anonymous_116) +FNDA:3,waitForJobToComplete +FNDA:0,createDockerSecret +FNDA:0,createSecretForEnvs +FNDA:0,deleteSecret +FNDA:21,pruneSecrets +FNDA:0,(anonymous_132) +FNDA:0,(anonymous_133) +FNDA:28,getUnrecoverableWaitingReasons +FNDA:23,getUnrecoverableEventReasons +FNDA:24,getUnrecoverableTerminatedReasons +FNDA:19,isPermanentSchedulingFailure +FNDA:58,(anonymous_139) +FNDA:17,getPermanentSchedulingPatterns +FNDA:9,getWaitingReasonHint +FNDA:18,getContainerErrors +FNDA:11,getTerminatedReasonHint +FNDA:21,getContainerTerminatedErrors +FNDA:10,getEventReasonHint +FNDA:21,getPodEventErrors +FNDA:9,describePodFailure +FNDA:8,describePodWarningEvents +FNDA:4,(anonymous_155) +FNDA:0,(anonymous_156) +FNDA:0,(anonymous_157) +FNDA:3,(anonymous_158) +FNDA:6,getPodConditionErrors +FNDA:6,checkUnrecoverableErrors +FNDA:0,(anonymous_163) +FNDA:0,(anonymous_164) +FNDA:10,waitForPodPhases +FNDA:5,getPrepareJobTimeoutSeconds +FNDA:24,readPod +FNDA:16,parsePodPhase +FNDA:3,isJobSucceeded +FNDA:0,getPodLogs +FNDA:0,(anonymous_179) +FNDA:0,(anonymous_180) +FNDA:0,(anonymous_181) +FNDA:0,(anonymous_182) +FNDA:21,prunePods +FNDA:0,(anonymous_186) +FNDA:0,(anonymous_187) +FNDA:0,getPodStatus +FNDA:0,isAuthPermissionsOK +FNDA:0,(anonymous_195) +FNDA:0,isPodContainerAlpine +FNDA:276,namespace +FNDA:63,(anonymous_200) +FNDA:13,(anonymous_201) +FNDA:13,BackOffManager +FNDA:7,(anonymous_203) +FNDA:7,(anonymous_206) +FNDA:21,containerPorts +FNDA:0,(anonymous_208) +FNDA:0,getPodByName +FNDA:0,getSecretByName +FNDA:21,listPodsByRunnerInstance +DA:1,13 +DA:2,13 +DA:3,13 +DA:4,13 +DA:5,13 +DA:6,13 +DA:7,13 +DA:8,13 +DA:9,13 +DA:11,13 +DA:16,13 +DA:28,13 +DA:29,13 +DA:32,13 +DA:34,13 +DA:36,13 +DA:37,13 +DA:38,13 +DA:40,13 +DA:42,13 +DA:69,13 +DA:76,0 +DA:77,0 +DA:78,0 +DA:80,0 +DA:81,0 +DA:84,0 +DA:86,0 +DA:87,0 +DA:89,0 +DA:90,0 +DA:92,0 +DA:93,0 +DA:96,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:106,0 +DA:107,0 +DA:109,0 +DA:116,0 +DA:117,0 +DA:120,0 +DA:148,0 +DA:150,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:175,0 +DA:176,0 +DA:179,0 +DA:180,0 +DA:183,0 +DA:189,13 +DA:194,0 +DA:196,0 +DA:197,0 +DA:199,0 +DA:200,0 +DA:202,0 +DA:203,0 +DA:206,0 +DA:208,0 +DA:209,0 +DA:211,0 +DA:213,0 +DA:228,0 +DA:229,0 +DA:232,0 +DA:233,0 +DA:236,0 +DA:242,13 +DA:243,0 +DA:250,13 +DA:256,0 +DA:257,0 +DA:261,0 +DA:263,0 +DA:264,0 +DA:268,0 +DA:272,0 +DA:276,0 +DA:278,0 +DA:279,0 +DA:280,0 +DA:282,0 +DA:292,0 +DA:293,0 +DA:297,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:306,0 +DA:307,0 +DA:308,0 +DA:311,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:317,0 +DA:319,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:327,0 +DA:329,0 +DA:332,0 +DA:333,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:343,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:358,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:365,0 +DA:369,0 +DA:379,13 +DA:383,13 +DA:386,7 +DA:387,7 +DA:390,7 +DA:391,7 +DA:392,36 +DA:393,36 +DA:394,36 +DA:398,7 +DA:399,7 +DA:400,35 +DA:401,35 +DA:402,35 +DA:403,70 +DA:406,7 +DA:407,7 +DA:408,3 +DA:409,3 +DA:410,3 +DA:411,6 +DA:414,7 +DA:415,7 +DA:416,0 +DA:417,0 +DA:419,7 +DA:420,0 +DA:421,0 +DA:425,7 +DA:427,35 +DA:428,35 +DA:429,35 +DA:430,35 +DA:432,0 +DA:436,7 +DA:438,3 +DA:439,3 +DA:440,3 +DA:441,3 +DA:443,0 +DA:451,7 +DA:452,4 +DA:453,4 +DA:456,7 +DA:457,7 +DA:468,5 +DA:469,5 +DA:470,5 +DA:471,3 +DA:476,2 +DA:477,2 +DA:478,1 +DA:480,1 +DA:491,2 +DA:492,2 +DA:493,2 +DA:494,2 +DA:495,1 +DA:497,1 +DA:503,13 +DA:508,0 +DA:510,0 +DA:511,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:517,0 +DA:522,0 +DA:523,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:538,0 +DA:544,0 +DA:548,0 +DA:551,0 +DA:554,0 +DA:556,0 +DA:558,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:565,13 +DA:568,0 +DA:570,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:578,0 +DA:579,0 +DA:580,0 +DA:582,0 +DA:584,0 +DA:586,0 +DA:588,0 +DA:589,0 +DA:590,0 +DA:592,0 +DA:599,13 +DA:604,3 +DA:606,3 +DA:607,90 +DA:609,90 +DA:612,90 +DA:620,90 +DA:621,90 +DA:622,180 +DA:623,90 +DA:633,0 +DA:634,0 +DA:635,0 +DA:641,0 +DA:644,90 +DA:648,90 +DA:649,90 +DA:650,90 +DA:651,3 +DA:655,174 +DA:659,0 +DA:660,0 +DA:661,0 +DA:663,0 +DA:664,0 +DA:670,0 +DA:671,0 +DA:677,0 +DA:678,0 +DA:681,0 +DA:684,0 +DA:685,0 +DA:687,0 +DA:688,0 +DA:690,0 +DA:691,0 +DA:693,0 +DA:694,0 +DA:696,0 +DA:698,0 +DA:699,0 +DA:702,0 +DA:703,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:708,0 +DA:714,0 +DA:715,0 +DA:720,13 +DA:725,2 +DA:726,2 +DA:734,2 +DA:735,0 +DA:738,2 +DA:739,60 +DA:742,60 +DA:743,60 +DA:744,60 +DA:745,60 +DA:753,60 +DA:754,60 +DA:756,120 +DA:761,60 +DA:762,60 +DA:763,60 +DA:773,0 +DA:774,0 +DA:775,0 +DA:783,60 +DA:787,60 +DA:788,60 +DA:789,60 +DA:790,2 +DA:794,116 +DA:798,0 +DA:799,0 +DA:800,0 +DA:802,0 +DA:803,0 +DA:809,0 +DA:810,0 +DA:816,0 +DA:817,0 +DA:820,0 +DA:823,0 +DA:824,0 +DA:826,0 +DA:827,0 +DA:829,0 +DA:830,0 +DA:832,0 +DA:833,0 +DA:835,0 +DA:837,0 +DA:838,0 +DA:841,0 +DA:842,0 +DA:844,0 +DA:845,0 +DA:846,0 +DA:847,0 +DA:853,0 +DA:854,0 +DA:859,13 +DA:860,3 +DA:861,3 +DA:863,3 +DA:864,0 +DA:867,3 +DA:869,0 +DA:873,13 +DA:876,0 +DA:888,0 +DA:890,0 +DA:891,0 +DA:892,0 +DA:893,0 +DA:894,0 +DA:895,0 +DA:896,0 +DA:897,0 +DA:900,0 +DA:901,0 +DA:902,0 +DA:908,0 +DA:914,13 +DA:917,0 +DA:919,0 +DA:920,0 +DA:921,0 +DA:922,0 +DA:923,0 +DA:924,0 +DA:926,0 +DA:929,0 +DA:930,0 +DA:931,0 +DA:932,0 +DA:935,0 +DA:939,0 +DA:942,13 +DA:943,0 +DA:949,13 +DA:950,21 +DA:954,0 +DA:955,0 +DA:958,0 +DA:960,0 +DA:961,0 +DA:966,13 +DA:1001,13 +DA:1024,13 +DA:1038,13 +DA:1046,13 +DA:1052,13 +DA:1053,28 +DA:1054,28 +DA:1055,26 +DA:1057,2 +DA:1058,3 +DA:1059,3 +DA:1060,3 +DA:1061,3 +DA:1064,2 +DA:1070,13 +DA:1071,23 +DA:1072,23 +DA:1073,21 +DA:1075,2 +DA:1076,3 +DA:1077,3 +DA:1078,3 +DA:1079,3 +DA:1082,2 +DA:1085,13 +DA:1087,24 +DA:1088,24 +DA:1089,21 +DA:1091,3 +DA:1092,7 +DA:1093,7 +DA:1094,7 +DA:1095,4 +DA:1098,3 +DA:1107,13 +DA:1110,19 +DA:1111,58 +DA:1123,13 +DA:1124,17 +DA:1125,17 +DA:1126,0 +DA:1127,0 +DA:1129,0 +DA:1130,0 +DA:1131,0 +DA:1132,0 +DA:1133,0 +DA:1134,0 +DA:1136,0 +DA:1141,0 +DA:1142,0 +DA:1143,0 +DA:1147,9 +DA:1149,4 +DA:1157,3 +DA:1159,1 +DA:1161,1 +DA:1165,13 +DA:1166,18 +DA:1167,18 +DA:1168,18 +DA:1172,36 +DA:1173,14 +DA:1174,14 +DA:1175,9 +DA:1176,9 +DA:1177,9 +DA:1178,9 +DA:1181,18 +DA:1184,13 +DA:1188,11 +DA:1189,3 +DA:1191,8 +DA:1192,2 +DA:1194,6 +DA:1195,5 +DA:1197,1 +DA:1199,0 +DA:1201,0 +DA:1203,1 +DA:1205,3 +DA:1208,1 +DA:1211,13 +DA:1212,21 +DA:1213,21 +DA:1214,21 +DA:1218,42 +DA:1219,17 +DA:1220,17 +DA:1221,11 +DA:1222,11 +DA:1223,11 +DA:1224,11 +DA:1227,21 +DA:1231,10 +DA:1233,4 +DA:1240,1 +DA:1247,4 +DA:1254,1 +DA:1266,13 +DA:1267,21 +DA:1268,21 +DA:1269,0 +DA:1274,21 +DA:1278,19 +DA:1280,2 +DA:1285,2 +DA:1288,19 +DA:1289,19 +DA:1290,19 +DA:1291,19 +DA:1296,3 +DA:1301,16 +DA:1305,5 +DA:1310,5 +DA:1312,11 +DA:1313,1 +DA:1315,10 +DA:1316,10 +DA:1317,10 +DA:1318,10 +DA:1319,10 +DA:1320,10 +DA:1322,19 +DA:1331,13 +DA:1334,9 +DA:1336,1 +DA:1341,8 +DA:1342,8 +DA:1345,8 +DA:1346,8 +DA:1349,8 +DA:1350,8 +DA:1351,1 +DA:1355,8 +DA:1356,1 +DA:1357,1 +DA:1358,1 +DA:1359,1 +DA:1362,8 +DA:1365,8 +DA:1366,8 +DA:1370,8 +DA:1371,8 +DA:1372,3 +DA:1373,3 +DA:1376,2 +DA:1377,1 +DA:1378,1 +DA:1383,3 +DA:1385,3 +DA:1386,1 +DA:1387,1 +DA:1388,1 +DA:1393,8 +DA:1394,2 +DA:1398,8 +DA:1399,8 +DA:1400,3 +DA:1403,8 +DA:1404,0 +DA:1406,8 +DA:1415,8 +DA:1419,6 +DA:1421,2 +DA:1426,2 +DA:1429,6 +DA:1430,6 +DA:1431,3 +DA:1434,3 +DA:1435,0 +DA:1436,0 +DA:1438,3 +DA:1440,3 +DA:1441,3 +DA:1442,3 +DA:1443,3 +DA:1445,3 +DA:1446,0 +DA:1450,3 +DA:1459,13 +DA:1460,6 +DA:1469,13 +DA:1474,6 +DA:1476,6 +DA:1478,6 +DA:1482,6 +DA:1484,0 +DA:1485,0 +DA:1488,6 +DA:1496,13 +DA:1500,18 +DA:1502,10 +DA:1503,10 +DA:1504,15 +DA:1505,15 +DA:1507,15 +DA:1512,6 +DA:1518,12 +DA:1520,2 +DA:1526,4 +DA:1528,9 +DA:1529,9 +DA:1530,3 +DA:1538,10 +DA:1539,2 +DA:1540,2 +DA:1541,2 +DA:1542,0 +DA:1546,2 +DA:1554,4 +DA:1555,5 +DA:1556,3 +DA:1557,3 +DA:1563,2 +DA:1568,0 +DA:1569,0 +DA:1576,13 +DA:1578,5 +DA:1580,5 +DA:1581,5 +DA:1584,0 +DA:1585,0 +DA:1586,0 +DA:1589,0 +DA:1592,0 +DA:1596,24 +DA:1602,13 +DA:1610,13 +DA:1611,16 +DA:1612,3 +DA:1614,13 +DA:1618,3 +DA:1622,1 +DA:1623,1 +DA:1625,0 +DA:1628,13 +DA:1632,0 +DA:1633,0 +DA:1634,0 +DA:1636,0 +DA:1639,0 +DA:1644,0 +DA:1645,0 +DA:1646,0 +DA:1647,0 +DA:1648,0 +DA:1653,13 +DA:1654,21 +DA:1658,0 +DA:1659,0 +DA:1662,0 +DA:1664,0 +DA:1669,13 +DA:1672,0 +DA:1676,0 +DA:1679,13 +DA:1680,0 +DA:1681,0 +DA:1682,0 +DA:1683,0 +DA:1684,0 +DA:1685,0 +DA:1686,0 +DA:1687,0 +DA:1688,0 +DA:1689,0 +DA:1690,0 +DA:1691,0 +DA:1696,0 +DA:1697,0 +DA:1700,13 +DA:1704,0 +DA:1706,0 +DA:1716,0 +DA:1719,0 +DA:1722,13 +DA:1723,276 +DA:1724,213 +DA:1727,63 +DA:1728,63 +DA:1729,63 +DA:1735,0 +DA:1736,0 +DA:1737,0 +DA:1738,0 +DA:1739,0 +DA:1745,0 +DA:1750,13 +DA:1751,13 +DA:1752,13 +DA:1753,13 +DA:1754,13 +DA:1755,3 +DA:1759,13 +DA:1760,14 +DA:1761,7 +DA:1763,7 +DA:1764,7 +DA:1765,2 +DA:1767,5 +DA:1768,5 +DA:1770,5 +DA:1771,0 +DA:1774,13 +DA:1776,13 +DA:1779,21 +DA:1780,21 +DA:1781,21 +DA:1783,0 +DA:1784,0 +DA:1785,0 +DA:1786,0 +DA:1789,0 +DA:1790,0 +DA:1793,0 +DA:1794,0 +DA:1795,0 +DA:1798,0 +DA:1799,0 +DA:1800,0 +DA:1801,0 +DA:1803,0 +DA:1806,0 +DA:1807,0 +DA:1809,0 +DA:1810,0 +DA:1813,0 +DA:1815,0 +DA:1818,13 +DA:1819,0 +DA:1825,13 +DA:1826,0 +DA:1832,13 +DA:1833,21 +DA:1837,0 +LF:716 +LH:370 +BRDA:183,0,0,0 +BRDA:77,1,0,0 +BRDA:77,1,1,0 +BRDA:80,2,0,0 +BRDA:80,2,1,0 +BRDA:80,3,0,0 +BRDA:80,3,1,0 +BRDA:80,4,0,0 +BRDA:80,4,1,0 +BRDA:107,5,0,0 +BRDA:107,5,1,0 +BRDA:107,6,0,0 +BRDA:107,6,1,0 +BRDA:107,7,0,0 +BRDA:107,7,1,0 +BRDA:107,8,0,0 +BRDA:107,8,1,0 +BRDA:116,9,0,0 +BRDA:116,9,1,0 +BRDA:124,10,0,0 +BRDA:124,10,1,0 +BRDA:165,11,0,0 +BRDA:165,11,1,0 +BRDA:167,12,0,0 +BRDA:167,12,1,0 +BRDA:167,13,0,0 +BRDA:167,13,1,0 +BRDA:167,14,0,0 +BRDA:167,14,1,0 +BRDA:167,15,0,0 +BRDA:167,15,1,0 +BRDA:167,16,0,0 +BRDA:167,16,1,0 +BRDA:175,17,0,0 +BRDA:175,17,1,0 +BRDA:175,18,0,0 +BRDA:175,18,1,0 +BRDA:175,19,0,0 +BRDA:175,19,1,0 +BRDA:179,20,0,0 +BRDA:179,20,1,0 +BRDA:179,21,0,0 +BRDA:179,21,1,0 +BRDA:179,22,0,0 +BRDA:179,22,1,0 +BRDA:236,23,0,0 +BRDA:228,24,0,0 +BRDA:228,24,1,0 +BRDA:228,25,0,0 +BRDA:228,25,1,0 +BRDA:228,26,0,0 +BRDA:228,26,1,0 +BRDA:232,27,0,0 +BRDA:232,27,1,0 +BRDA:232,28,0,0 +BRDA:232,28,1,0 +BRDA:232,29,0,0 +BRDA:232,29,1,0 +BRDA:243,30,0,0 +BRDA:290,31,0,0 +BRDA:290,31,1,0 +BRDA:290,32,0,0 +BRDA:290,32,1,0 +BRDA:302,33,0,0 +BRDA:302,33,1,0 +BRDA:303,34,0,0 +BRDA:303,34,1,0 +BRDA:303,34,2,0 +BRDA:324,35,0,0 +BRDA:324,35,1,0 +BRDA:327,36,0,0 +BRDA:327,36,1,0 +BRDA:330,37,0,0 +BRDA:330,37,1,0 +BRDA:330,38,0,0 +BRDA:330,38,1,0 +BRDA:330,39,0,0 +BRDA:330,39,1,0 +BRDA:330,40,0,0 +BRDA:330,40,1,0 +BRDA:333,41,0,0 +BRDA:333,41,1,0 +BRDA:333,42,0,0 +BRDA:333,42,1,0 +BRDA:333,43,0,0 +BRDA:333,43,1,0 +BRDA:340,44,0,0 +BRDA:340,44,1,0 +BRDA:352,45,0,0 +BRDA:352,45,1,0 +BRDA:352,46,0,0 +BRDA:352,46,1,0 +BRDA:352,46,2,0 +BRDA:383,47,0,6 +BRDA:383,47,1,1 +BRDA:456,48,0,7 +BRDA:392,49,0,0 +BRDA:392,49,1,36 +BRDA:394,50,0,25 +BRDA:394,50,1,11 +BRDA:402,51,0,35 +BRDA:402,51,1,0 +BRDA:402,52,0,35 +BRDA:402,52,1,35 +BRDA:410,53,0,3 +BRDA:410,53,1,0 +BRDA:410,54,0,3 +BRDA:410,54,1,3 +BRDA:415,55,0,0 +BRDA:415,55,1,7 +BRDA:419,56,0,0 +BRDA:419,56,1,7 +BRDA:452,57,0,0 +BRDA:452,57,1,4 +BRDA:452,58,0,4 +BRDA:452,58,1,4 +BRDA:453,59,0,2 +BRDA:453,59,1,2 +BRDA:465,60,0,0 +BRDA:465,60,1,7 +BRDA:465,61,0,7 +BRDA:465,61,1,7 +BRDA:470,62,0,3 +BRDA:470,62,1,2 +BRDA:471,63,0,3 +BRDA:471,63,1,3 +BRDA:476,64,0,0 +BRDA:476,64,1,2 +BRDA:476,65,0,2 +BRDA:476,65,1,2 +BRDA:477,66,0,1 +BRDA:477,66,1,1 +BRDA:480,67,0,1 +BRDA:480,67,1,0 +BRDA:480,68,0,0 +BRDA:480,68,1,1 +BRDA:480,69,0,1 +BRDA:480,69,1,1 +BRDA:492,70,0,2 +BRDA:492,70,1,0 +BRDA:494,71,0,1 +BRDA:494,71,1,1 +BRDA:535,72,0,0 +BRDA:535,72,1,0 +BRDA:540,73,0,0 +BRDA:540,73,1,0 +BRDA:540,74,0,0 +BRDA:540,74,1,0 +BRDA:541,75,0,0 +BRDA:541,75,1,0 +BRDA:541,76,0,0 +BRDA:541,76,1,0 +BRDA:544,77,0,0 +BRDA:544,77,1,0 +BRDA:544,78,0,0 +BRDA:544,78,1,0 +BRDA:544,79,0,0 +BRDA:544,79,1,0 +BRDA:568,80,0,0 +BRDA:568,80,1,0 +BRDA:580,81,0,0 +BRDA:580,81,1,0 +BRDA:634,82,0,0 +BRDA:634,82,1,0 +BRDA:650,83,0,3 +BRDA:650,83,1,87 +BRDA:607,84,0,0 +BRDA:607,84,1,90 +BRDA:677,85,0,0 +BRDA:677,85,1,0 +BRDA:699,86,0,0 +BRDA:699,86,1,0 +BRDA:661,87,0,0 +BRDA:661,87,1,0 +BRDA:734,88,0,0 +BRDA:734,88,1,2 +BRDA:750,89,0,60 +BRDA:750,89,1,0 +BRDA:774,90,0,0 +BRDA:774,90,1,0 +BRDA:789,91,0,2 +BRDA:789,91,1,58 +BRDA:739,92,0,0 +BRDA:739,92,1,60 +BRDA:816,93,0,0 +BRDA:816,93,1,0 +BRDA:838,94,0,0 +BRDA:838,94,1,0 +BRDA:800,95,0,0 +BRDA:800,95,1,0 +BRDA:869,96,0,0 +BRDA:861,97,0,0 +BRDA:861,97,1,3 +BRDA:863,98,0,0 +BRDA:863,98,1,0 +BRDA:908,99,0,0 +BRDA:878,100,0,0 +BRDA:878,100,1,0 +BRDA:943,101,0,0 +BRDA:950,102,0,21 +BRDA:954,103,0,0 +BRDA:954,103,1,0 +BRDA:961,104,0,0 +BRDA:961,105,0,0 +BRDA:961,105,1,0 +BRDA:961,106,0,0 +BRDA:961,106,1,0 +BRDA:1054,107,0,26 +BRDA:1054,107,1,2 +BRDA:1060,108,0,3 +BRDA:1060,108,1,0 +BRDA:1072,109,0,21 +BRDA:1072,109,1,2 +BRDA:1078,110,0,3 +BRDA:1078,110,1,0 +BRDA:1088,111,0,21 +BRDA:1088,111,1,3 +BRDA:1094,112,0,4 +BRDA:1094,112,1,3 +BRDA:1110,113,0,2 +BRDA:1110,113,1,17 +BRDA:1125,114,0,17 +BRDA:1125,114,1,0 +BRDA:1126,115,0,0 +BRDA:1126,115,1,0 +BRDA:1126,116,0,0 +BRDA:1126,116,1,0 +BRDA:1132,117,0,0 +BRDA:1132,117,1,0 +BRDA:1147,118,0,4 +BRDA:1147,118,1,3 +BRDA:1147,118,2,1 +BRDA:1147,118,3,1 +BRDA:1169,119,0,1 +BRDA:1169,119,1,17 +BRDA:1169,120,0,18 +BRDA:1169,120,1,18 +BRDA:1169,121,0,1 +BRDA:1169,121,1,17 +BRDA:1169,122,0,18 +BRDA:1169,122,1,18 +BRDA:1170,123,0,12 +BRDA:1170,123,1,6 +BRDA:1170,124,0,18 +BRDA:1170,124,1,18 +BRDA:1170,125,0,1 +BRDA:1170,125,1,17 +BRDA:1170,126,0,18 +BRDA:1170,126,1,18 +BRDA:1173,127,0,0 +BRDA:1173,127,1,14 +BRDA:1173,128,0,14 +BRDA:1173,128,1,14 +BRDA:1174,129,0,9 +BRDA:1174,129,1,5 +BRDA:1174,130,0,14 +BRDA:1174,130,1,13 +BRDA:1174,131,0,1 +BRDA:1174,131,1,13 +BRDA:1174,132,0,14 +BRDA:1174,132,1,14 +BRDA:1176,133,0,2 +BRDA:1176,133,1,7 +BRDA:1188,134,0,3 +BRDA:1188,134,1,8 +BRDA:1191,135,0,2 +BRDA:1191,135,1,6 +BRDA:1194,136,0,5 +BRDA:1194,136,1,1 +BRDA:1195,137,0,1 +BRDA:1195,137,1,0 +BRDA:1195,137,2,0 +BRDA:1195,137,3,1 +BRDA:1195,137,4,3 +BRDA:1205,138,0,3 +BRDA:1205,138,1,0 +BRDA:1205,139,0,3 +BRDA:1205,139,1,3 +BRDA:1215,140,0,1 +BRDA:1215,140,1,20 +BRDA:1215,141,0,21 +BRDA:1215,141,1,21 +BRDA:1215,142,0,1 +BRDA:1215,142,1,20 +BRDA:1215,143,0,21 +BRDA:1215,143,1,21 +BRDA:1216,144,0,15 +BRDA:1216,144,1,6 +BRDA:1216,145,0,21 +BRDA:1216,145,1,21 +BRDA:1216,146,0,1 +BRDA:1216,146,1,20 +BRDA:1216,147,0,21 +BRDA:1216,147,1,21 +BRDA:1219,148,0,0 +BRDA:1219,148,1,17 +BRDA:1219,149,0,17 +BRDA:1219,149,1,17 +BRDA:1220,150,0,11 +BRDA:1220,150,1,6 +BRDA:1220,151,0,17 +BRDA:1220,151,1,13 +BRDA:1220,152,0,4 +BRDA:1220,152,1,13 +BRDA:1220,153,0,17 +BRDA:1220,153,1,17 +BRDA:1222,154,0,2 +BRDA:1222,154,1,9 +BRDA:1231,155,0,4 +BRDA:1231,155,1,1 +BRDA:1231,155,2,4 +BRDA:1231,155,3,1 +BRDA:1268,156,0,0 +BRDA:1268,156,1,21 +BRDA:1278,157,0,19 +BRDA:1278,157,1,0 +BRDA:1278,158,0,19 +BRDA:1278,158,1,19 +BRDA:1282,159,0,2 +BRDA:1282,159,1,0 +BRDA:1291,160,0,3 +BRDA:1291,160,1,16 +BRDA:1292,161,0,19 +BRDA:1292,161,1,18 +BRDA:1292,161,2,18 +BRDA:1301,162,0,5 +BRDA:1301,162,1,11 +BRDA:1302,163,0,16 +BRDA:1302,163,1,9 +BRDA:1307,164,0,4 +BRDA:1307,164,1,1 +BRDA:1307,165,0,5 +BRDA:1307,165,1,5 +BRDA:1312,166,0,1 +BRDA:1312,166,1,10 +BRDA:1316,167,0,2 +BRDA:1316,167,1,8 +BRDA:1316,168,0,10 +BRDA:1316,168,1,3 +BRDA:1318,169,0,10 +BRDA:1318,169,1,0 +BRDA:1337,170,0,1 +BRDA:1337,170,1,0 +BRDA:1346,171,0,8 +BRDA:1346,171,1,0 +BRDA:1346,172,0,0 +BRDA:1346,172,1,8 +BRDA:1346,173,0,8 +BRDA:1346,173,1,8 +BRDA:1347,174,0,1 +BRDA:1347,174,1,7 +BRDA:1350,175,0,1 +BRDA:1350,175,1,7 +BRDA:1350,176,0,0 +BRDA:1350,176,1,8 +BRDA:1350,177,0,8 +BRDA:1350,177,1,8 +BRDA:1355,178,0,1 +BRDA:1355,178,1,7 +BRDA:1355,179,0,8 +BRDA:1355,179,1,8 +BRDA:1355,180,0,0 +BRDA:1355,180,1,8 +BRDA:1355,181,0,8 +BRDA:1355,181,1,8 +BRDA:1356,182,0,1 +BRDA:1356,182,1,0 +BRDA:1357,183,0,1 +BRDA:1357,183,1,0 +BRDA:1358,184,0,1 +BRDA:1358,184,1,0 +BRDA:1367,185,0,0 +BRDA:1367,185,1,8 +BRDA:1367,186,0,8 +BRDA:1367,186,1,8 +BRDA:1367,187,0,0 +BRDA:1367,187,1,8 +BRDA:1367,188,0,8 +BRDA:1367,188,1,8 +BRDA:1368,189,0,3 +BRDA:1368,189,1,5 +BRDA:1368,190,0,8 +BRDA:1368,190,1,8 +BRDA:1368,191,0,0 +BRDA:1368,191,1,8 +BRDA:1368,192,0,8 +BRDA:1368,192,1,8 +BRDA:1372,193,0,0 +BRDA:1372,193,1,3 +BRDA:1372,194,0,3 +BRDA:1372,194,1,3 +BRDA:1373,195,0,2 +BRDA:1373,195,1,1 +BRDA:1373,196,0,1 +BRDA:1373,196,1,2 +BRDA:1373,197,0,3 +BRDA:1373,197,1,3 +BRDA:1376,198,0,1 +BRDA:1376,198,1,1 +BRDA:1377,199,0,0 +BRDA:1377,199,1,1 +BRDA:1383,200,0,0 +BRDA:1383,200,1,3 +BRDA:1383,201,0,3 +BRDA:1383,201,1,3 +BRDA:1385,202,0,1 +BRDA:1385,202,1,2 +BRDA:1385,203,0,3 +BRDA:1385,203,1,1 +BRDA:1386,204,0,1 +BRDA:1386,204,1,0 +BRDA:1386,205,0,1 +BRDA:1386,205,1,1 +BRDA:1387,206,0,0 +BRDA:1387,206,1,1 +BRDA:1393,207,0,2 +BRDA:1393,207,1,6 +BRDA:1399,208,0,3 +BRDA:1399,208,1,5 +BRDA:1403,209,0,0 +BRDA:1403,209,1,8 +BRDA:1419,210,0,6 +BRDA:1419,210,1,0 +BRDA:1419,211,0,6 +BRDA:1419,211,1,6 +BRDA:1423,212,0,2 +BRDA:1423,212,1,0 +BRDA:1430,213,0,3 +BRDA:1430,213,1,3 +BRDA:1435,214,0,0 +BRDA:1435,214,1,0 +BRDA:1435,215,0,0 +BRDA:1435,215,1,0 +BRDA:1435,216,0,0 +BRDA:1435,216,1,0 +BRDA:1435,217,0,0 +BRDA:1435,217,1,0 +BRDA:1436,218,0,0 +BRDA:1436,218,1,0 +BRDA:1442,219,0,2 +BRDA:1442,219,1,1 +BRDA:1442,220,0,3 +BRDA:1442,220,1,2 +BRDA:1443,221,0,3 +BRDA:1443,221,1,0 +BRDA:1443,222,0,3 +BRDA:1443,222,1,3 +BRDA:1443,223,0,3 +BRDA:1443,223,1,0 +BRDA:1443,224,0,3 +BRDA:1443,224,1,3 +BRDA:1445,225,0,0 +BRDA:1445,225,1,3 +BRDA:1485,226,0,0 +BRDA:1485,226,1,0 +BRDA:1500,227,0,8 +BRDA:1500,227,1,2 +BRDA:1526,228,0,4 +BRDA:1526,228,1,4 +BRDA:1504,229,0,0 +BRDA:1504,229,1,15 +BRDA:1514,230,0,6 +BRDA:1514,230,1,0 +BRDA:1522,231,0,2 +BRDA:1522,231,1,0 +BRDA:1529,232,0,3 +BRDA:1529,232,1,6 +BRDA:1538,233,0,4 +BRDA:1538,233,1,2 +BRDA:1541,234,0,0 +BRDA:1541,234,1,2 +BRDA:1555,235,0,1 +BRDA:1555,235,1,3 +BRDA:1580,236,0,5 +BRDA:1580,236,1,0 +BRDA:1585,237,0,0 +BRDA:1585,237,1,0 +BRDA:1585,238,0,0 +BRDA:1585,238,1,0 +BRDA:1596,239,0,24 +BRDA:1596,239,1,24 +BRDA:1611,240,0,3 +BRDA:1611,240,1,13 +BRDA:1611,241,0,16 +BRDA:1611,241,1,14 +BRDA:1611,242,0,1 +BRDA:1611,242,1,15 +BRDA:1611,243,0,16 +BRDA:1611,243,1,16 +BRDA:1618,244,0,3 +BRDA:1622,245,0,1 +BRDA:1622,245,1,0 +BRDA:1622,246,0,0 +BRDA:1622,246,1,1 +BRDA:1622,247,0,1 +BRDA:1622,247,1,1 +BRDA:1625,248,0,0 +BRDA:1625,248,1,0 +BRDA:1625,249,0,0 +BRDA:1625,249,1,0 +BRDA:1654,250,0,21 +BRDA:1658,251,0,0 +BRDA:1658,251,1,0 +BRDA:1664,252,0,0 +BRDA:1664,253,0,0 +BRDA:1664,253,1,0 +BRDA:1664,254,0,0 +BRDA:1664,254,1,0 +BRDA:1672,255,0,0 +BRDA:1697,256,0,0 +BRDA:1697,256,1,0 +BRDA:1697,257,0,0 +BRDA:1697,257,1,0 +BRDA:1719,258,0,0 +BRDA:1723,259,0,213 +BRDA:1723,259,1,63 +BRDA:1728,260,0,63 +BRDA:1728,260,1,0 +BRDA:1728,261,0,0 +BRDA:1728,261,1,63 +BRDA:1728,262,0,63 +BRDA:1728,262,1,63 +BRDA:1738,263,0,0 +BRDA:1738,263,1,0 +BRDA:1754,264,0,3 +BRDA:1754,264,1,10 +BRDA:1754,265,0,13 +BRDA:1754,265,1,10 +BRDA:1760,266,0,7 +BRDA:1764,267,0,2 +BRDA:1764,267,1,5 +BRDA:1764,268,0,7 +BRDA:1764,268,1,7 +BRDA:1767,269,0,5 +BRDA:1767,269,1,0 +BRDA:1770,270,0,0 +BRDA:1770,270,1,5 +BRDA:1780,271,0,21 +BRDA:1780,271,1,0 +BRDA:1780,272,0,11 +BRDA:1780,272,1,10 +BRDA:1780,273,0,21 +BRDA:1780,273,1,21 +BRDA:1785,274,0,0 +BRDA:1785,274,1,0 +BRDA:1791,275,0,0 +BRDA:1791,275,1,0 +BRDA:1794,276,0,0 +BRDA:1794,276,1,0 +BRDA:1800,277,0,0 +BRDA:1800,277,1,0 +BRDA:1800,278,0,0 +BRDA:1800,278,1,0 +BRDA:1800,278,2,0 +BRDA:1806,279,0,0 +BRDA:1806,279,1,0 +BRDA:1819,280,0,0 +BRDA:1819,280,1,0 +BRDA:1826,281,0,0 +BRDA:1826,281,1,0 +BRDA:1833,282,0,21 +BRDA:1837,283,0,0 +BRDA:1837,283,1,0 +BRDA:1837,284,0,0 +BRDA:1837,284,1,0 +BRF:565 +BRH:298 +end_of_record +TN: +SF:src/k8s/utils/index.ts +FN:35,prepareJobScript +FN:40,(anonymous_23) +FN:59,writeRunScript +FN:94,writeContainerStepScript +FN:129,scriptEnv +FN:161,generateContainerName +FN:180,mergeContainerWithOptions +FN:208,mergePodSpecWithOptions +FN:216,(anonymous_30) +FN:228,mergeObjectMeta +FN:258,readExtensionFromFile +FN:270,useKubeScheduler +FN:274,(anonymous_34) +FN:283,mergeLists +FN:292,fixArgs +FN:301,sleep +FN:302,(anonymous_40) +FN:305,listDirAllCommand +FN:315,formatError +FNF:19 +FNH:9 +FNDA:0,prepareJobScript +FNDA:0,(anonymous_23) +FNDA:0,writeRunScript +FNDA:0,writeContainerStepScript +FNDA:0,scriptEnv +FNDA:12,generateContainerName +FNDA:2,mergeContainerWithOptions +FNDA:1,mergePodSpecWithOptions +FNDA:1,(anonymous_30) +FNDA:0,mergeObjectMeta +FNDA:23,readExtensionFromFile +FNDA:0,useKubeScheduler +FNDA:14,(anonymous_34) +FNDA:3,mergeLists +FNDA:17,fixArgs +FNDA:0,sleep +FNDA:0,(anonymous_40) +FNDA:0,listDirAllCommand +FNDA:63,formatError +DA:2,14 +DA:3,14 +DA:4,14 +DA:5,14 +DA:6,14 +DA:7,14 +DA:10,14 +DA:11,14 +DA:13,14 +DA:14,14 +DA:16,14 +DA:17,14 +DA:18,14 +DA:20,14 +DA:35,14 +DA:39,0 +DA:40,0 +DA:43,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:59,14 +DA:66,0 +DA:67,0 +DA:70,0 +DA:71,0 +DA:74,0 +DA:76,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:94,14 +DA:101,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:108,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:130,0 +DA:131,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:141,0 +DA:145,0 +DA:154,0 +DA:155,0 +DA:158,0 +DA:161,14 +DA:162,12 +DA:163,12 +DA:165,12 +DA:166,2 +DA:169,10 +DA:180,14 +DA:184,6 +DA:185,6 +DA:186,2 +DA:187,1 +DA:189,2 +DA:190,4 +DA:191,1 +DA:192,1 +DA:193,3 +DA:194,1 +DA:195,1 +DA:196,2 +DA:197,0 +DA:198,0 +DA:199,2 +DA:200,1 +DA:201,1 +DA:203,1 +DA:208,14 +DA:212,4 +DA:213,4 +DA:214,1 +DA:216,1 +DA:219,3 +DA:220,1 +DA:221,1 +DA:223,2 +DA:228,14 +DA:232,0 +DA:233,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:242,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:253,0 +DA:258,14 +DA:259,23 +DA:260,23 +DA:261,23 +DA:263,0 +DA:264,0 +DA:265,0 +DA:267,0 +DA:270,14 +DA:271,0 +DA:274,14 +DA:275,14 +DA:276,14 +DA:277,14 +DA:278,14 +DA:279,14 +DA:280,14 +DA:284,3 +DA:285,3 +DA:286,0 +DA:288,3 +DA:289,3 +DA:292,14 +DA:295,17 +DA:296,3 +DA:298,14 +DA:301,14 +DA:302,0 +DA:305,14 +DA:306,0 +DA:315,14 +DA:316,63 +DA:317,2 +DA:323,61 +DA:325,61 +DA:326,3 +DA:327,3 +DA:328,3 +DA:329,3 +DA:335,58 +DA:336,47 +DA:339,11 +DA:344,6 +DA:345,6 +DA:346,3 +DA:348,3 +DA:349,3 +DA:351,2 +DA:357,5 +LF:150 +LH:91 +BRDA:67,0,0,0 +BRDA:67,0,1,0 +BRDA:67,1,0,0 +BRDA:67,1,1,0 +BRDA:67,2,0,0 +BRDA:67,2,1,0 +BRDA:70,3,0,0 +BRDA:70,3,1,0 +BRDA:82,4,0,0 +BRDA:82,4,1,0 +BRDA:82,5,0,0 +BRDA:82,5,1,0 +BRDA:82,6,0,0 +BRDA:82,6,1,0 +BRDA:104,7,0,0 +BRDA:104,7,1,0 +BRDA:116,8,0,0 +BRDA:116,8,1,0 +BRDA:116,9,0,0 +BRDA:116,9,1,0 +BRDA:116,10,0,0 +BRDA:116,10,1,0 +BRDA:130,11,0,0 +BRDA:130,11,1,0 +BRDA:130,12,0,0 +BRDA:130,12,1,0 +BRDA:135,13,0,0 +BRDA:135,13,1,0 +BRDA:136,14,0,0 +BRDA:136,14,1,0 +BRDA:136,14,2,0 +BRDA:136,14,3,0 +BRDA:154,15,0,0 +BRDA:154,15,1,0 +BRDA:154,16,0,0 +BRDA:154,16,1,0 +BRDA:154,17,0,0 +BRDA:154,17,1,0 +BRDA:163,18,0,0 +BRDA:163,18,1,12 +BRDA:163,19,0,12 +BRDA:163,19,1,12 +BRDA:165,20,0,2 +BRDA:165,20,1,10 +BRDA:185,21,0,2 +BRDA:185,21,1,4 +BRDA:186,22,0,1 +BRDA:186,22,1,1 +BRDA:190,23,0,1 +BRDA:190,23,1,3 +BRDA:193,24,0,1 +BRDA:193,24,1,2 +BRDA:196,25,0,0 +BRDA:196,25,1,2 +BRDA:196,26,0,2 +BRDA:196,26,1,0 +BRDA:199,27,0,1 +BRDA:199,27,1,1 +BRDA:199,28,0,2 +BRDA:199,28,1,1 +BRDA:213,29,0,1 +BRDA:213,29,1,3 +BRDA:216,30,0,0 +BRDA:216,30,1,1 +BRDA:216,31,0,1 +BRDA:216,31,1,1 +BRDA:219,32,0,1 +BRDA:219,32,1,2 +BRDA:219,33,0,3 +BRDA:219,33,1,1 +BRDA:232,34,0,0 +BRDA:232,34,1,0 +BRDA:232,35,0,0 +BRDA:232,35,1,0 +BRDA:232,36,0,0 +BRDA:232,36,1,0 +BRDA:232,37,0,0 +BRDA:232,37,1,0 +BRDA:232,38,0,0 +BRDA:232,38,1,0 +BRDA:232,39,0,0 +BRDA:232,39,1,0 +BRDA:237,40,0,0 +BRDA:237,40,1,0 +BRDA:237,41,0,0 +BRDA:237,41,1,0 +BRDA:237,42,0,0 +BRDA:237,42,1,0 +BRDA:239,43,0,0 +BRDA:239,43,1,0 +BRDA:239,44,0,0 +BRDA:239,44,1,0 +BRDA:239,45,0,0 +BRDA:239,45,1,0 +BRDA:239,46,0,0 +BRDA:239,46,1,0 +BRDA:239,47,0,0 +BRDA:239,47,1,0 +BRDA:246,48,0,0 +BRDA:246,48,1,0 +BRDA:246,49,0,0 +BRDA:246,49,1,0 +BRDA:246,50,0,0 +BRDA:246,50,1,0 +BRDA:248,51,0,0 +BRDA:248,51,1,0 +BRDA:248,52,0,0 +BRDA:248,52,1,0 +BRDA:248,53,0,0 +BRDA:248,53,1,0 +BRDA:248,54,0,0 +BRDA:248,54,1,0 +BRDA:248,55,0,0 +BRDA:248,55,1,0 +BRDA:260,56,0,23 +BRDA:260,56,1,0 +BRDA:264,57,0,0 +BRDA:264,57,1,0 +BRDA:264,58,0,0 +BRDA:264,58,1,0 +BRDA:274,59,0,14 +BRDA:274,59,1,14 +BRDA:284,60,0,3 +BRDA:284,60,1,1 +BRDA:285,61,0,0 +BRDA:285,61,1,3 +BRDA:285,62,0,0 +BRDA:285,62,1,3 +BRDA:285,63,0,3 +BRDA:285,63,1,3 +BRDA:295,64,0,3 +BRDA:295,64,1,14 +BRDA:295,65,0,17 +BRDA:295,65,1,14 +BRDA:295,65,2,3 +BRDA:316,66,0,2 +BRDA:316,66,1,61 +BRDA:316,67,0,63 +BRDA:316,67,1,62 +BRDA:323,68,0,2 +BRDA:323,68,1,59 +BRDA:323,69,0,61 +BRDA:323,69,1,61 +BRDA:323,70,0,57 +BRDA:323,70,1,4 +BRDA:323,71,0,61 +BRDA:323,71,1,61 +BRDA:323,72,0,0 +BRDA:323,72,1,61 +BRDA:323,73,0,61 +BRDA:323,73,1,61 +BRDA:324,74,0,0 +BRDA:324,74,1,59 +BRDA:324,75,0,59 +BRDA:324,75,1,59 +BRDA:325,76,0,3 +BRDA:325,76,1,58 +BRDA:325,77,0,61 +BRDA:325,77,1,3 +BRDA:328,78,0,3 +BRDA:328,78,1,0 +BRDA:329,79,0,1 +BRDA:329,79,1,2 +BRDA:329,80,0,3 +BRDA:329,80,1,1 +BRDA:335,81,0,47 +BRDA:335,81,1,11 +BRDA:339,82,0,6 +BRDA:339,82,1,5 +BRDA:345,83,0,3 +BRDA:345,83,1,3 +BRF:171 +BRH:75 +end_of_record +TN: +SF:src/k8s/utils/npu-metrics.ts +FN:71,npuMetricsEnabled +FN:79,getNpuSampleIntervalSeconds +FN:96,getIdleThresholdPercent +FN:113,containerHasNpuRequest +FN:125,hasNpuRequest +FN:126,(anonymous_30) +FN:129,listNpuCardsCommand +FN:133,buildNpuSamplerScript +FN:187,buildNpuAggregateScript +FN:198,commandHasMarker +FN:202,appendExecCommand +FN:219,(anonymous_36) +FN:224,injectNpuMetrics +FN:269,maybeInjectNpuMetrics +FN:279,parseNpuAggregate +FN:324,isIdleRecord +FN:331,(anonymous_41) +FN:334,escapePromLabelValue +FN:338,formatPromLabels +FN:340,(anonymous_44) +FN:341,(anonymous_45) +FN:359,buildNpuJobMetricsBody +FN:385,(anonymous_48) +FN:401,buildNpuPushFailedBody +FN:408,buildPushgatewayPath +FN:418,withTimeout +FN:422,(anonymous_54) +FN:423,(anonymous_55) +FN:425,(anonymous_56) +FN:429,(anonymous_57) +FN:448,nodeRequest +FN:462,(anonymous_61) +FN:471,(anonymous_62) +FN:473,(anonymous_63) +FN:478,(anonymous_64) +FN:484,pushToPushgateway +FN:497,(anonymous_68) +FN:518,decodePushSecret +FN:522,(anonymous_70) +FN:545,readNpuPushConfig +FN:557,parseScaleSetSuffix +FN:565,extractClusterFromRunnerPod +FN:589,resolveNpuLabelsFromPod +FN:616,(anonymous_77) +FN:630,repoFromEnv +FN:637,(anonymous_79) +FN:644,collectNpuAggregateFromPod +FN:652,(anonymous_83) +FN:670,collectAndPushNpuMetrics +FN:682,(anonymous_87) +FN:716,collectAndPushForPod +FNF:51 +FNH:7 +FNDA:64,npuMetricsEnabled +FNDA:0,getNpuSampleIntervalSeconds +FNDA:0,getIdleThresholdPercent +FNDA:22,containerHasNpuRequest +FNDA:0,hasNpuRequest +FNDA:0,(anonymous_30) +FNDA:0,listNpuCardsCommand +FNDA:0,buildNpuSamplerScript +FNDA:0,buildNpuAggregateScript +FNDA:0,commandHasMarker +FNDA:0,appendExecCommand +FNDA:0,(anonymous_36) +FNDA:0,injectNpuMetrics +FNDA:22,maybeInjectNpuMetrics +FNDA:0,parseNpuAggregate +FNDA:0,isIdleRecord +FNDA:0,(anonymous_41) +FNDA:0,escapePromLabelValue +FNDA:0,formatPromLabels +FNDA:0,(anonymous_44) +FNDA:0,(anonymous_45) +FNDA:0,buildNpuJobMetricsBody +FNDA:0,(anonymous_48) +FNDA:0,buildNpuPushFailedBody +FNDA:0,buildPushgatewayPath +FNDA:21,withTimeout +FNDA:21,(anonymous_54) +FNDA:0,(anonymous_55) +FNDA:21,(anonymous_56) +FNDA:0,(anonymous_57) +FNDA:0,nodeRequest +FNDA:0,(anonymous_61) +FNDA:0,(anonymous_62) +FNDA:0,(anonymous_63) +FNDA:0,(anonymous_64) +FNDA:0,pushToPushgateway +FNDA:0,(anonymous_68) +FNDA:0,decodePushSecret +FNDA:0,(anonymous_70) +FNDA:0,readNpuPushConfig +FNDA:0,parseScaleSetSuffix +FNDA:0,extractClusterFromRunnerPod +FNDA:0,resolveNpuLabelsFromPod +FNDA:0,(anonymous_77) +FNDA:0,repoFromEnv +FNDA:0,(anonymous_79) +FNDA:0,collectNpuAggregateFromPod +FNDA:0,(anonymous_83) +FNDA:21,collectAndPushNpuMetrics +FNDA:0,(anonymous_87) +FNDA:0,collectAndPushForPod +DA:1,9 +DA:3,9 +DA:4,9 +DA:5,9 +DA:6,9 +DA:7,9 +DA:8,9 +DA:16,9 +DA:17,9 +DA:18,9 +DA:19,9 +DA:21,9 +DA:22,9 +DA:23,9 +DA:25,9 +DA:26,9 +DA:27,9 +DA:28,9 +DA:30,9 +DA:31,9 +DA:32,9 +DA:34,9 +DA:35,9 +DA:71,9 +DA:72,128 +DA:74,64 +DA:79,9 +DA:80,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:91,0 +DA:93,0 +DA:96,9 +DA:97,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:108,0 +DA:110,0 +DA:113,9 +DA:114,22 +DA:115,44 +DA:116,44 +DA:117,0 +DA:118,0 +DA:122,22 +DA:125,9 +DA:126,0 +DA:130,0 +DA:133,9 +DA:134,0 +DA:136,0 +DA:158,9 +DA:187,9 +DA:188,0 +DA:199,0 +DA:206,0 +DA:212,0 +DA:218,0 +DA:219,0 +DA:221,0 +DA:224,9 +DA:226,0 +DA:228,0 +DA:229,0 +DA:233,0 +DA:236,0 +DA:240,0 +DA:243,0 +DA:246,0 +DA:247,0 +DA:249,0 +DA:257,0 +DA:265,0 +DA:266,0 +DA:269,9 +DA:270,22 +DA:271,0 +DA:273,22 +DA:274,22 +DA:276,0 +DA:279,9 +DA:282,0 +DA:283,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:299,0 +DA:301,0 +DA:302,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:309,0 +DA:319,0 +DA:321,0 +DA:324,9 +DA:326,0 +DA:328,0 +DA:329,0 +DA:331,0 +DA:334,9 +DA:335,0 +DA:338,9 +DA:339,0 +DA:340,0 +DA:341,0 +DA:345,9 +DA:359,9 +DA:362,0 +DA:364,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:385,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:394,0 +DA:395,0 +DA:398,0 +DA:401,9 +DA:402,0 +DA:408,9 +DA:413,0 +DA:418,9 +DA:422,21 +DA:423,21 +DA:424,21 +DA:426,21 +DA:427,21 +DA:430,0 +DA:431,0 +DA:448,9 +DA:451,0 +DA:452,0 +DA:453,0 +DA:456,0 +DA:457,0 +DA:460,0 +DA:462,0 +DA:463,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:484,9 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:495,0 +DA:496,0 +DA:497,0 +DA:500,0 +DA:507,0 +DA:508,0 +DA:510,0 +DA:512,0 +DA:515,0 +DA:518,9 +DA:521,0 +DA:522,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:527,0 +DA:528,0 +DA:529,0 +DA:531,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:538,0 +DA:545,9 +DA:547,0 +DA:548,0 +DA:550,0 +DA:553,0 +DA:558,0 +DA:559,0 +DA:561,0 +DA:562,0 +DA:565,9 +DA:566,0 +DA:567,0 +DA:568,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:586,0 +DA:589,9 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:602,0 +DA:606,0 +DA:607,0 +DA:608,0 +DA:609,0 +DA:610,0 +DA:615,0 +DA:616,0 +DA:618,0 +DA:619,0 +DA:622,0 +DA:630,9 +DA:631,0 +DA:633,0 +DA:634,0 +DA:636,0 +DA:637,0 +DA:638,0 +DA:639,0 +DA:641,0 +DA:644,9 +DA:647,0 +DA:648,0 +DA:649,0 +DA:651,0 +DA:652,0 +DA:654,0 +DA:655,0 +DA:656,0 +DA:658,0 +DA:659,0 +DA:661,0 +DA:667,0 +DA:670,9 +DA:671,21 +DA:672,0 +DA:674,21 +DA:676,21 +DA:678,21 +DA:679,21 +DA:681,0 +DA:682,0 +DA:684,0 +DA:685,0 +DA:688,0 +DA:690,0 +DA:691,0 +DA:693,0 +DA:696,0 +DA:697,0 +DA:698,0 +DA:701,0 +DA:704,0 +DA:705,0 +DA:707,0 +DA:709,0 +DA:722,0 +DA:723,0 +DA:724,0 +DA:725,0 +DA:728,0 +DA:729,0 +DA:741,0 +DA:746,0 +DA:748,0 +DA:749,0 +DA:751,0 +DA:753,0 +LF:296 +LH:70 +BRDA:72,0,0,64 +BRDA:72,0,1,0 +BRDA:75,1,0,0 +BRDA:75,1,1,64 +BRDA:75,2,0,64 +BRDA:75,2,1,64 +BRDA:80,3,0,0 +BRDA:80,3,1,0 +BRDA:83,4,0,0 +BRDA:83,4,1,0 +BRDA:87,5,0,0 +BRDA:87,5,1,0 +BRDA:87,6,0,0 +BRDA:87,6,1,0 +BRDA:97,7,0,0 +BRDA:97,7,1,0 +BRDA:100,8,0,0 +BRDA:100,8,1,0 +BRDA:104,9,0,0 +BRDA:104,9,1,0 +BRDA:104,10,0,0 +BRDA:104,10,1,0 +BRDA:114,11,0,22 +BRDA:114,11,1,0 +BRDA:114,12,0,22 +BRDA:114,12,1,22 +BRDA:114,13,0,22 +BRDA:114,13,1,0 +BRDA:114,14,0,22 +BRDA:114,14,1,22 +BRDA:116,15,0,0 +BRDA:116,15,1,44 +BRDA:116,16,0,44 +BRDA:116,16,1,44 +BRDA:117,17,0,0 +BRDA:117,17,1,0 +BRDA:126,18,0,0 +BRDA:126,18,1,0 +BRDA:126,19,0,0 +BRDA:126,19,1,0 +BRDA:126,20,0,0 +BRDA:126,20,1,0 +BRDA:126,21,0,0 +BRDA:126,21,1,0 +BRDA:134,22,0,0 +BRDA:134,22,1,0 +BRDA:199,23,0,0 +BRDA:199,23,1,0 +BRDA:199,24,0,0 +BRDA:199,24,1,0 +BRDA:206,25,0,0 +BRDA:206,25,1,0 +BRDA:207,26,0,0 +BRDA:207,26,1,0 +BRDA:207,26,2,0 +BRDA:207,26,3,0 +BRDA:218,27,0,0 +BRDA:218,27,1,0 +BRDA:218,28,0,0 +BRDA:218,28,1,0 +BRDA:226,29,0,0 +BRDA:226,29,1,0 +BRDA:228,30,0,0 +BRDA:228,30,1,0 +BRDA:228,31,0,0 +BRDA:228,31,1,0 +BRDA:229,32,0,0 +BRDA:229,32,1,0 +BRDA:230,33,0,0 +BRDA:230,33,1,0 +BRDA:230,34,0,0 +BRDA:230,34,1,0 +BRDA:230,35,0,0 +BRDA:230,35,1,0 +BRDA:230,36,0,0 +BRDA:230,36,1,0 +BRDA:230,37,0,0 +BRDA:230,37,1,0 +BRDA:231,38,0,0 +BRDA:231,38,1,0 +BRDA:231,39,0,0 +BRDA:231,39,1,0 +BRDA:231,40,0,0 +BRDA:231,40,1,0 +BRDA:231,41,0,0 +BRDA:231,41,1,0 +BRDA:236,42,0,0 +BRDA:236,42,1,0 +BRDA:237,43,0,0 +BRDA:237,43,1,0 +BRDA:237,43,2,0 +BRDA:237,43,3,0 +BRDA:251,44,0,0 +BRDA:251,44,1,0 +BRDA:251,45,0,0 +BRDA:251,45,1,0 +BRDA:251,46,0,0 +BRDA:251,46,1,0 +BRDA:251,47,0,0 +BRDA:251,47,1,0 +BRDA:259,48,0,0 +BRDA:259,48,1,0 +BRDA:259,49,0,0 +BRDA:259,49,1,0 +BRDA:259,50,0,0 +BRDA:259,50,1,0 +BRDA:259,51,0,0 +BRDA:259,51,1,0 +BRDA:270,52,0,0 +BRDA:270,52,1,22 +BRDA:273,53,0,22 +BRDA:273,53,1,0 +BRDA:282,54,0,0 +BRDA:282,54,1,0 +BRDA:286,55,0,0 +BRDA:286,55,1,0 +BRDA:291,56,0,0 +BRDA:291,56,1,0 +BRDA:301,57,0,0 +BRDA:301,57,1,0 +BRDA:301,58,0,0 +BRDA:301,58,1,0 +BRDA:301,59,0,0 +BRDA:301,59,1,0 +BRDA:301,60,0,0 +BRDA:301,60,1,0 +BRDA:306,61,0,0 +BRDA:306,61,1,0 +BRDA:306,62,0,0 +BRDA:306,62,1,0 +BRDA:306,62,2,0 +BRDA:311,63,0,0 +BRDA:311,63,1,0 +BRDA:312,64,0,0 +BRDA:312,64,1,0 +BRDA:313,65,0,0 +BRDA:313,65,1,0 +BRDA:314,66,0,0 +BRDA:314,66,1,0 +BRDA:315,67,0,0 +BRDA:315,67,1,0 +BRDA:316,68,0,0 +BRDA:316,68,1,0 +BRDA:319,69,0,0 +BRDA:319,69,1,0 +BRDA:326,70,0,0 +BRDA:326,70,1,0 +BRDA:328,71,0,0 +BRDA:328,71,1,0 +BRDA:331,72,0,0 +BRDA:331,72,1,0 +BRDA:362,73,0,0 +BRDA:362,73,1,0 +BRDA:375,74,0,0 +BRDA:375,74,1,0 +BRDA:422,75,0,21 +BRDA:422,75,1,21 +BRDA:462,76,0,0 +BRDA:452,77,0,0 +BRDA:452,77,1,0 +BRDA:456,78,0,0 +BRDA:456,78,1,0 +BRDA:456,79,0,0 +BRDA:456,79,1,0 +BRDA:458,80,0,0 +BRDA:458,80,1,0 +BRDA:458,81,0,0 +BRDA:458,81,1,0 +BRDA:458,82,0,0 +BRDA:458,82,1,0 +BRDA:458,83,0,0 +BRDA:458,83,1,0 +BRDA:468,84,0,0 +BRDA:468,84,1,0 +BRDA:468,85,0,0 +BRDA:468,85,1,0 +BRDA:474,86,0,0 +BRDA:474,86,1,0 +BRDA:474,87,0,0 +BRDA:474,87,1,0 +BRDA:515,88,0,0 +BRDA:490,89,0,0 +BRDA:490,89,1,0 +BRDA:490,90,0,0 +BRDA:490,90,1,0 +BRDA:490,91,0,0 +BRDA:490,91,1,0 +BRDA:490,92,0,0 +BRDA:490,92,1,0 +BRDA:491,93,0,0 +BRDA:491,93,1,0 +BRDA:491,94,0,0 +BRDA:491,94,1,0 +BRDA:491,95,0,0 +BRDA:491,95,1,0 +BRDA:491,96,0,0 +BRDA:491,96,1,0 +BRDA:492,97,0,0 +BRDA:492,97,1,0 +BRDA:492,98,0,0 +BRDA:492,98,1,0 +BRDA:492,99,0,0 +BRDA:492,99,1,0 +BRDA:492,100,0,0 +BRDA:492,100,1,0 +BRDA:495,101,0,0 +BRDA:495,101,1,0 +BRDA:496,102,0,0 +BRDA:496,102,1,0 +BRDA:507,103,0,0 +BRDA:507,103,1,0 +BRDA:507,104,0,0 +BRDA:507,104,1,0 +BRDA:515,105,0,0 +BRDA:515,105,1,0 +BRDA:521,106,0,0 +BRDA:521,106,1,0 +BRDA:521,107,0,0 +BRDA:521,107,1,0 +BRDA:521,108,0,0 +BRDA:521,108,1,0 +BRDA:521,109,0,0 +BRDA:521,109,1,0 +BRDA:524,110,0,0 +BRDA:524,110,1,0 +BRDA:529,111,0,0 +BRDA:529,111,1,0 +BRDA:535,112,0,0 +BRDA:535,112,1,0 +BRDA:558,113,0,0 +BRDA:558,113,1,0 +BRDA:562,114,0,0 +BRDA:562,114,1,0 +BRDA:566,115,0,0 +BRDA:566,115,1,0 +BRDA:566,116,0,0 +BRDA:566,116,1,0 +BRDA:566,117,0,0 +BRDA:566,117,1,0 +BRDA:566,118,0,0 +BRDA:566,118,1,0 +BRDA:567,119,0,0 +BRDA:567,119,1,0 +BRDA:567,120,0,0 +BRDA:567,120,1,0 +BRDA:567,121,0,0 +BRDA:567,121,1,0 +BRDA:567,122,0,0 +BRDA:567,122,1,0 +BRDA:573,123,0,0 +BRDA:573,123,1,0 +BRDA:575,124,0,0 +BRDA:575,124,1,0 +BRDA:582,125,0,0 +BRDA:582,125,1,0 +BRDA:586,126,0,0 +BRDA:586,126,1,0 +BRDA:586,127,0,0 +BRDA:586,127,1,0 +BRDA:586,128,0,0 +BRDA:586,128,1,0 +BRDA:586,129,0,0 +BRDA:586,129,1,0 +BRDA:598,130,0,0 +BRDA:598,130,1,0 +BRDA:601,131,0,0 +BRDA:601,131,1,0 +BRDA:601,132,0,0 +BRDA:601,132,1,0 +BRDA:601,133,0,0 +BRDA:601,133,1,0 +BRDA:601,134,0,0 +BRDA:601,134,1,0 +BRDA:603,135,0,0 +BRDA:603,135,1,0 +BRDA:603,136,0,0 +BRDA:603,136,1,0 +BRDA:604,137,0,0 +BRDA:604,137,1,0 +BRDA:604,138,0,0 +BRDA:604,138,1,0 +BRDA:606,139,0,0 +BRDA:606,139,1,0 +BRDA:606,140,0,0 +BRDA:606,140,1,0 +BRDA:608,141,0,0 +BRDA:608,141,1,0 +BRDA:610,142,0,0 +BRDA:610,142,1,0 +BRDA:615,143,0,0 +BRDA:615,143,1,0 +BRDA:615,144,0,0 +BRDA:615,144,1,0 +BRDA:615,145,0,0 +BRDA:615,145,1,0 +BRDA:615,146,0,0 +BRDA:615,146,1,0 +BRDA:618,147,0,0 +BRDA:618,147,1,0 +BRDA:618,148,0,0 +BRDA:618,148,1,0 +BRDA:618,149,0,0 +BRDA:618,149,1,0 +BRDA:618,150,0,0 +BRDA:618,150,1,0 +BRDA:619,151,0,0 +BRDA:619,151,1,0 +BRDA:621,152,0,0 +BRDA:621,152,1,0 +BRDA:621,153,0,0 +BRDA:621,153,1,0 +BRDA:621,154,0,0 +BRDA:621,154,1,0 +BRDA:621,155,0,0 +BRDA:621,155,1,0 +BRDA:624,156,0,0 +BRDA:624,156,1,0 +BRDA:625,157,0,0 +BRDA:625,157,1,0 +BRDA:631,158,0,0 +BRDA:631,158,1,0 +BRDA:633,159,0,0 +BRDA:633,159,1,0 +BRDA:636,160,0,0 +BRDA:636,160,1,0 +BRDA:636,161,0,0 +BRDA:636,161,1,0 +BRDA:638,162,0,0 +BRDA:638,162,1,0 +BRDA:647,163,0,0 +BRDA:647,163,1,0 +BRDA:647,164,0,0 +BRDA:647,164,1,0 +BRDA:648,165,0,0 +BRDA:648,165,1,0 +BRDA:651,166,0,0 +BRDA:651,166,1,0 +BRDA:651,167,0,0 +BRDA:651,167,1,0 +BRDA:651,168,0,0 +BRDA:651,168,1,0 +BRDA:651,169,0,0 +BRDA:651,169,1,0 +BRDA:654,170,0,0 +BRDA:654,170,1,0 +BRDA:654,171,0,0 +BRDA:654,171,1,0 +BRDA:654,172,0,0 +BRDA:654,172,1,0 +BRDA:654,173,0,0 +BRDA:654,173,1,0 +BRDA:654,174,0,0 +BRDA:654,174,1,0 +BRDA:654,175,0,0 +BRDA:654,175,1,0 +BRDA:655,176,0,0 +BRDA:655,176,1,0 +BRDA:658,177,0,0 +BRDA:658,177,1,0 +BRDA:658,178,0,0 +BRDA:658,178,1,0 +BRDA:658,179,0,0 +BRDA:658,179,1,0 +BRDA:658,180,0,0 +BRDA:658,180,1,0 +BRDA:658,181,0,0 +BRDA:658,181,1,0 +BRDA:696,182,0,0 +BRDA:671,183,0,0 +BRDA:671,183,1,21 +BRDA:682,184,0,0 +BRDA:682,184,1,0 +BRDA:682,185,0,0 +BRDA:682,185,1,0 +BRDA:682,186,0,0 +BRDA:682,186,1,0 +BRDA:684,187,0,0 +BRDA:684,187,1,0 +BRDA:697,188,0,0 +BRDA:697,188,1,0 +BRDA:704,189,0,0 +BRDA:704,189,1,0 +BRDA:705,190,0,0 +BRDA:705,190,1,0 +BRDA:705,191,0,0 +BRDA:705,191,1,0 +BRDA:722,192,0,0 +BRDA:723,193,0,0 +BRDA:723,193,1,0 +BRDA:723,194,0,0 +BRDA:723,194,1,0 +BRDA:735,195,0,0 +BRDA:735,195,1,0 +BRDA:735,196,0,0 +BRDA:735,196,1,0 +BRF:395 +BRH:18 +end_of_record +TN: +SF:tests/test-setup.ts +FN:13,(anonymous_22) +FN:19,TestHelper +FN:26,(anonymous_24) +FN:55,(anonymous_27) +FN:64,(anonymous_30) +FN:71,(anonymous_33) +FN:82,(anonymous_34) +FN:88,(anonymous_35) +FN:94,(anonymous_36) +FN:99,(anonymous_37) +FN:123,(anonymous_40) +FN:133,(anonymous_41) +FN:140,(anonymous_42) +FN:152,(anonymous_43) +FNF:14 +FNH:2 +FNDA:6,(anonymous_22) +FNDA:46,TestHelper +FNDA:0,(anonymous_24) +FNDA:0,(anonymous_27) +FNDA:0,(anonymous_30) +FNDA:0,(anonymous_33) +FNDA:0,(anonymous_34) +FNDA:0,(anonymous_35) +FNDA:0,(anonymous_36) +FNDA:0,(anonymous_37) +FNDA:0,(anonymous_40) +FNDA:0,(anonymous_41) +FNDA:0,(anonymous_42) +FNDA:0,(anonymous_43) +DA:1,6 +DA:2,6 +DA:4,6 +DA:5,6 +DA:7,6 +DA:9,6 +DA:11,6 +DA:13,6 +DA:20,46 +DA:21,46 +DA:22,46 +DA:23,46 +DA:26,6 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:42,0 +DA:47,0 +DA:49,0 +DA:51,0 +DA:55,6 +DA:57,0 +DA:58,0 +DA:64,6 +DA:65,0 +DA:72,0 +DA:73,0 +DA:76,0 +DA:83,0 +DA:84,0 +DA:88,6 +DA:89,0 +DA:90,0 +DA:91,0 +DA:94,6 +DA:95,0 +DA:96,0 +DA:99,6 +DA:100,0 +DA:106,0 +DA:120,0 +DA:123,6 +DA:124,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:137,0 +DA:140,6 +DA:141,0 +DA:148,0 +DA:149,0 +DA:152,6 +DA:153,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:165,6 +LF:67 +LH:22 +BRDA:65,0,0,0 +BRDA:72,1,0,0 +BRDA:72,1,1,0 +BRDA:83,2,0,0 +BRDA:83,2,1,0 +BRDA:89,3,0,0 +BRDA:89,3,1,0 +BRF:7 +BRH:0 +end_of_record diff --git a/packages/k8s/jest.config.js b/packages/k8s/jest.config.js index d5faddca..1db6c963 100644 --- a/packages/k8s/jest.config.js +++ b/packages/k8s/jest.config.js @@ -1,13 +1,26 @@ -// eslint-disable-next-line import/no-commonjs module.exports = { clearMocks: true, + preset: 'ts-jest', moduleFileExtensions: ['js', 'ts'], testEnvironment: 'node', testMatch: ['**/*-test.ts'], testRunner: 'jest-circus/runner', + verbose: true, transform: { - '^.+\\.ts$': 'ts-jest' + '^.+\\.ts$': [ + 'ts-jest', + { + tsconfig: 'tsconfig.test.json' + } + ], + // Transform ESM modules to CommonJS + '^.+\\.(js|mjs)$': ['babel-jest', { + presets: [['@babel/preset-env', { targets: { node: 'current' } }]] + }] }, - setupFilesAfterEnv: ['./jest.setup.js'], - verbose: true + transformIgnorePatterns: [ + // Transform these ESM packages + 'node_modules/(?!(shlex|@kubernetes/client-node|openid-client|oauth4webapi|jose|uuid)/)' + ], + setupFilesAfterEnv: ['./jest.setup.js'] } diff --git a/packages/k8s/package-lock.json b/packages/k8s/package-lock.json index 079716a8..ac6bd613 100644 --- a/packages/k8s/package-lock.json +++ b/packages/k8s/package-lock.json @@ -1,7 +1,7 @@ { "name": "kubehooks", "version": "0.1.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9,6781 +9,5317 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@actions/core": "^1.9.1", - "@actions/exec": "^1.1.1", - "@actions/io": "^1.1.2", - "@kubernetes/client-node": "^0.22.2", + "@actions/core": "^2.0.2", + "@actions/exec": "^3.0.0", + "@actions/io": "^3.0.2", + "@kubernetes/client-node": "^1.3.0", "hooklib": "file:../hooklib", - "js-yaml": "^4.1.0", - "shlex": "^2.1.2" + "js-yaml": "^5.0.0", + "shlex": "^3.0.0", + "stream-buffers": "^3.0.2", + "tar-fs": "^3.1.2", + "uuid": "^14.0.1" }, "devDependencies": { - "@types/jest": "^27.4.1", - "@types/node": "^17.0.23", - "@vercel/ncc": "^0.33.4", - "jest": "^27.5.1", - "ts-jest": "^27.1.4", - "typescript": "^4.6.3" + "@babel/core": "^7.29.0", + "@babel/preset-env": "^7.29.5", + "@types/jest": "^30.0.0", + "@types/node": "^24.3.0", + "@vercel/ncc": "^0.44.0", + "babel-jest": "^30.4.1", + "jest": "^30.4.2", + "ts-jest": "^29.4.11", + "typescript": "^5.9.2" } }, - "../hooklib": { - "version": "0.1.0", + "node_modules/@actions/core": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-2.0.3.tgz", + "integrity": "sha512-Od9Thc3T1mQJYddvVPM4QGiLUewdh+3txmDYHHxoNdkqysR1MbCT+rFOtNUxYAz+7+6RIsqipVahY2GJqGPyxA==", "license": "MIT", "dependencies": { - "@actions/core": "^1.9.1" - }, - "devDependencies": { - "@types/node": "^17.0.23", - "@typescript-eslint/parser": "^5.18.0", - "@zeit/ncc": "^0.22.3", - "eslint": "^8.12.0", - "eslint-plugin-github": "^4.3.6", - "prettier": "^2.6.2", - "typescript": "^4.6.3" + "@actions/exec": "^2.0.0", + "@actions/http-client": "^3.0.2" } }, - "node_modules/@actions/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz", - "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", + "node_modules/@actions/core/node_modules/@actions/exec": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-2.0.0.tgz", + "integrity": "sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw==", + "license": "MIT", "dependencies": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" + "@actions/io": "^2.0.0" } }, - "node_modules/@actions/core/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } + "node_modules/@actions/core/node_modules/@actions/io": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-2.0.0.tgz", + "integrity": "sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==", + "license": "MIT" }, "node_modules/@actions/exec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", - "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-3.0.0.tgz", + "integrity": "sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==", + "license": "MIT", "dependencies": { - "@actions/io": "^1.0.1" + "@actions/io": "^3.0.2" } }, "node_modules/@actions/http-client": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", - "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.2.tgz", + "integrity": "sha512-JP38FYYpyqvUsz+Igqlc/JG6YO9PaKuvqjM3iGvaLqFnJ7TFmcLyy2IDrY0bI0qCQug8E9K+elv5ZNfw62ZJzA==", + "license": "MIT", "dependencies": { - "tunnel": "^0.0.6" + "tunnel": "^0.0.6", + "undici": "^6.23.0" } }, "node_modules/@actions/io": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.2.tgz", - "integrity": "sha512-d+RwPlMp+2qmBfeLYPLXuSRykDIFEwdTA0MMxzS9kh4kvP1ftrc/9fzy6pX6qAjthdXruHQ6/6kjT/DNo5ALuw==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-3.0.2.tgz", + "integrity": "sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==", + "license": "MIT" }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@babel/core/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@babel/core/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/core/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=6.9.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/core": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", - "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.0", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", - "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", - "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.2" + "@babel/helper-annotate-as-pure": "^7.29.7", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "node_modules/@babel/helper-module-transforms/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", - "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/helper-module-transforms/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-wrap-function": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/types": "^7.29.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/helper-wrap-function": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", - "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@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.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", + "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^7.0.4" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", "dev": true, + "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", "dev": true, + "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, + "license": "MIT", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "dev": true, + "license": "MIT", "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@jsep-plugin/assignment": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", - "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 10.16.0" + "node": ">=6.9.0" }, "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jsep-plugin/regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", - "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", - "engines": { - "node": ">= 10.16.0" + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@kubernetes/client-node": { - "version": "0.22.2", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.22.2.tgz", - "integrity": "sha512-PPyzUVunPtgISnWNkCTSLp1SoZ3I13XOanrc8XAQRKp8XTnDF7VT9Sf3/haFmgnpONe4ORCtqrWueGp5fl8yzw==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", "dependencies": { - "byline": "^5.0.0", - "isomorphic-ws": "^5.0.0", - "js-yaml": "^4.1.0", - "jsonpath-plus": "^10.0.0", - "request": "^2.88.0", - "rfc4648": "^1.3.0", - "stream-buffers": "^3.0.2", - "tar": "^7.0.0", - "tslib": "^2.4.1", - "ws": "^8.18.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "optionalDependencies": { - "openid-client": "^6.1.3" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@kubernetes/client-node/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "engines": { - "node": ">=10.0.0" + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "license": "MIT", "dependencies": { - "type-detect": "4.0.8" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", "dev": true, + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", - "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.3.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "*" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ==", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "node_modules/@types/node": { - "version": "17.0.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.36.tgz", - "integrity": "sha512-V3orv+ggDsWVHP99K3JlwtH20R7J4IhI1Kksgc+64q5VxgfRkQG8Ws3MFm/FZOKDYGy9feGFlZ70/HpCNe9QaA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", - "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/@vercel/ncc": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.33.4.tgz", - "integrity": "sha512-ln18hs7dMffelP47tpkaR+V5Tj6coykNyxJrlcmCormPqRQjB/Gv4cu2FfBG+PMzIfdZp2CLDsrrB1NPU22Qhg==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "bin": { - "ncc": "dist/ncc/cli.js" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "4" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">= 6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", + "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", + "dev": true, + "license": "MIT", "dependencies": { - "safer-buffer": "~2.1.0" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, "engines": { - "node": ">=0.8" + "node": ">=6.9.0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dev": true, - "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" + "node": ">=6.9.0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", "dev": true, + "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" + "@babel/core": "^7.0.0-0" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "fast-json-stable-stringify": "2.x" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" } }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "dev": true, + "license": "MIT", "dependencies": { - "node-int64": "^0.4.0" + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001344", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", - "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/template": "^7.29.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ci-info": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", - "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@babel/plugin-transform-destructuring/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/@babel/plugin-transform-destructuring/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": ">=6.9.0" } }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/plugin-transform-destructuring/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@babel/plugin-transform-destructuring/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { - "node": ">= 0.8" + "node": ">=6.9.0" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.1" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", + "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", "dev": true, + "license": "MIT", "dependencies": { - "cssom": "~0.3.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", + "dev": true, + "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=0.10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", "dev": true, + "license": "MIT", "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=6.0" + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "node_modules/@babel/plugin-transform-for-of/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "node_modules/@babel/plugin-transform-for-of/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" } }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "node_modules/@babel/plugin-transform-for-of/node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "dev": true, + "license": "MIT", "dependencies": { - "webidl-conversions": "^5.0.0" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "node_modules/@babel/plugin-transform-for-of/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "node_modules/@babel/plugin-transform-for-of/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.141", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz", - "integrity": "sha512-mfBcbqc0qc6RlxrsIgLG2wCqkiPAjEezHxGTu7p3dHHFOurH4EjS9rFZndX5axC8264rI1Pcbw8uQP39oZckeA==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">=6.9.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", "dev": true, + "license": "MIT", "dependencies": { - "bser": "2.1.1" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", "dev": true, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", + "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", + "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">=14" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=6.9.0" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=6.9.0" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=8.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "*" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", + "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/@babel/plugin-transform-object-rest-spread/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">= 0.4.0" + "node": ">=6.9.0" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@babel/plugin-transform-object-rest-spread/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/hooklib": { - "resolved": "../hooklib", - "link": true - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "node_modules/@babel/plugin-transform-object-rest-spread/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "whatwg-encoding": "^1.0.5" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "node_modules/@babel/plugin-transform-object-rest-spread/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", + "dev": true, + "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", "dev": true, + "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/@babel/plugin-transform-optional-chaining/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/@babel/plugin-transform-optional-chaining/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.19" + "node": ">=6.9.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/@babel/plugin-transform-optional-chaining/node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "dev": true, + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "node_modules/@babel/plugin-transform-optional-chaining/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "node_modules/@babel/plugin-transform-optional-chaining/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=0.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isomorphic-ws": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", - "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", "peerDependencies": { - "ws": "*" + "@babel/core": "^7.0.0-0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", "dev": true, + "license": "MIT", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", + "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", "dev": true, + "license": "MIT", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", + "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "@babel/helper-plugin-utils": "^7.29.7" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=6.9.0" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - }, - "bin": { - "jest": "bin/jest.js" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", + "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "node_modules/@babel/plugin-transform-spread/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" } }, - "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dev": true, - "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, + "node_modules/@babel/plugin-transform-spread/node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "node_modules/@babel/plugin-transform-spread/node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "node_modules/@babel/plugin-transform-spread/node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" } }, - "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "node_modules/@babel/plugin-transform-spread/node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "detect-newline": "^3.0.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" } }, - "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", "dev": true, + "license": "MIT", "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "node_modules/@babel/preset-env": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", + "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "@babel/compat-data": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.29.7", + "@babel/plugin-syntax-import-attributes": "^7.29.7", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.29.7", + "@babel/plugin-transform-async-generator-functions": "^7.29.7", + "@babel/plugin-transform-async-to-generator": "^7.29.7", + "@babel/plugin-transform-block-scoped-functions": "^7.29.7", + "@babel/plugin-transform-block-scoping": "^7.29.7", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-class-static-block": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", + "@babel/plugin-transform-computed-properties": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-dotall-regex": "^7.29.7", + "@babel/plugin-transform-duplicate-keys": "^7.29.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-dynamic-import": "^7.29.7", + "@babel/plugin-transform-explicit-resource-management": "^7.29.7", + "@babel/plugin-transform-exponentiation-operator": "^7.29.7", + "@babel/plugin-transform-export-namespace-from": "^7.29.7", + "@babel/plugin-transform-for-of": "^7.29.7", + "@babel/plugin-transform-function-name": "^7.29.7", + "@babel/plugin-transform-json-strings": "^7.29.7", + "@babel/plugin-transform-literals": "^7.29.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-modules-amd": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-modules-systemjs": "^7.29.7", + "@babel/plugin-transform-modules-umd": "^7.29.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-new-target": "^7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", + "@babel/plugin-transform-numeric-separator": "^7.29.7", + "@babel/plugin-transform-object-rest-spread": "^7.29.7", + "@babel/plugin-transform-object-super": "^7.29.7", + "@babel/plugin-transform-optional-catch-binding": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/plugin-transform-private-methods": "^7.29.7", + "@babel/plugin-transform-private-property-in-object": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-regenerator": "^7.29.7", + "@babel/plugin-transform-regexp-modifiers": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/plugin-transform-spread": "^7.29.7", + "@babel/plugin-transform-sticky-regex": "^7.29.7", + "@babel/plugin-transform-template-literals": "^7.29.7", + "@babel/plugin-transform-typeof-symbol": "^7.29.7", + "@babel/plugin-transform-unicode-escapes": "^7.29.7", + "@babel/plugin-transform-unicode-property-regex": "^7.29.7", + "@babel/plugin-transform-unicode-regex": "^7.29.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "node": ">=6.9.0" }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, - "engines": { - "node": ">=6" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=6.9.0" } }, - "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" } }, - "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "tslib": "^2.4.0" } }, - "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "tslib": "^2.4.0" } }, - "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=12" } }, - "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { - "semver": "bin/semver.js" - }, + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "node_modules/@jest/console": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.4.1.tgz", + "integrity": "sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", + "@jest/types": "30.4.1", "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "chalk": "^4.1.2", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", + "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "node_modules/@jest/core": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.4.2.tgz", + "integrity": "sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" + "@jest/console": "30.4.1", + "@jest/pattern": "30.4.0", + "@jest/reporters": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.4.1", + "jest-config": "30.4.2", + "jest-haste-map": "30.4.1", + "jest-message-util": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-resolve-dependencies": "30.4.2", + "jest-runner": "30.4.2", + "jest-runtime": "30.4.2", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "jest-watcher": "30.4.1", + "pretty-format": "30.4.1", + "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/@jest/diff-sequences": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz", + "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "node_modules/@jest/environment": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.4.1.tgz", + "integrity": "sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/fake-timers": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" + "jest-mock": "30.4.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "node_modules/@jest/expect": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.4.1.tgz", + "integrity": "sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "expect": "30.4.1", + "jest-snapshot": "30.4.1" }, "engines": { - "node": ">= 10.13.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/@jest/expect-utils": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.4.1.tgz", + "integrity": "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@jest/get-type": "30.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jose": { - "version": "5.9.6", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.6.tgz", - "integrity": "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/panva" + "node_modules/@jest/fake-timers": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.4.1.tgz", + "integrity": "sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@sinonjs/fake-timers": "^15.4.0", + "@types/node": "*", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/@jest/globals": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.4.1.tgz", + "integrity": "sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==", + "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "@jest/environment": "30.4.1", + "@jest/expect": "30.4.1", + "@jest/types": "30.4.1", + "jest-mock": "30.4.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" + "node_modules/@jest/pattern": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.4.0" }, "engines": { - "node": ">=10" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.4.1.tgz", + "integrity": "sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", + "jest-worker": "30.4.1", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "canvas": "^2.5.0" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "canvas": { + "node-notifier": { "optional": true } } }, - "node_modules/jsdom/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "node_modules/@jest/schemas": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, + "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": ">= 6" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jsep": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", - "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "node_modules/@jest/snapshot-utils": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.4.1.tgz", + "integrity": "sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, "engines": { - "node": ">= 10.16.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/@jest/test-result": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.4.1.tgz", + "integrity": "sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==", "dev": true, - "bin": { - "json5": "lib/cli.js" + "license": "MIT", + "dependencies": { + "@jest/console": "30.4.1", + "@jest/types": "30.4.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, "engines": { - "node": ">=6" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jsonpath-plus": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", - "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", + "node_modules/@jest/test-sequencer": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.4.1.tgz", + "integrity": "sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==", + "dev": true, "license": "MIT", "dependencies": { - "@jsep-plugin/assignment": "^1.3.0", - "@jsep-plugin/regex": "^1.0.4", - "jsep": "^1.4.0" - }, - "bin": { - "jsonpath": "bin/jsonpath-cli.js", - "jsonpath-plus": "bin/jsonpath-cli.js" + "@jest/test-result": "30.4.1", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/@jest/transform": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.4.1.tgz", + "integrity": "sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==", + "dev": true, + "license": "MIT", "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "@babel/core": "^7.27.4", + "@jest/types": "30.4.1", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-util": "30.4.1", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" }, "engines": { - "node": ">=0.6.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/@jest/types": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, "engines": { - "node": ">=6" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, - "engines": { - "node": ">=6" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" + "node_modules/@jsep-plugin/assignment": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", + "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", + "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 10.16.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "node_modules/@kubernetes/client-node": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-1.3.0.tgz", + "integrity": "sha512-IE0yrIpOT97YS5fg2QpzmPzm8Wmcdf4ueWMn+FiJSI3jgTTQT1u+LUhoYpdfhdHAVxdrNsaBg2C0UXSnOgMoCQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/js-yaml": "^4.0.1", + "@types/node": "^22.0.0", + "@types/node-fetch": "^2.6.9", + "@types/stream-buffers": "^3.0.3", + "form-data": "^4.0.0", + "hpagent": "^1.2.0", + "isomorphic-ws": "^5.0.0", + "js-yaml": "^4.1.0", + "jsonpath-plus": "^10.3.0", + "node-fetch": "^2.6.9", + "openid-client": "^6.1.3", + "rfc4648": "^1.3.0", + "socks-proxy-agent": "^8.0.4", + "stream-buffers": "^3.0.2", + "tar-fs": "^3.0.8", + "ws": "^8.18.2" + } }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, + "node_modules/@kubernetes/client-node/node_modules/@types/node": { + "version": "22.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.8.tgz", + "integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==", + "license": "MIT", "dependencies": { - "tmpl": "1.0.5" + "undici-types": "~6.21.0" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, + "node_modules/@kubernetes/client-node/node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=8.6" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } + "node_modules/@kubernetes/client-node/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "mime-db": "1.52.0" + "@tybys/wasm-util": "^0.10.3" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=6" + "node": ">=14" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@pkgr/core": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } + "node_modules/@sinclair/typebox": { + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", + "dev": true, + "license": "MIT" }, - "node_modules/minizlib": { + "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" - }, - "engines": { - "node": ">= 18" + "type-detect": "4.0.8" } }, - "node_modules/minizlib/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@sinonjs/fake-timers": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", + "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "balanced-match": "^1.0.0" + "@sinonjs/commons": "^3.0.1" } }, - "node_modules/minizlib/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "tslib": "^2.4.0" } }, - "node_modules/minizlib/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/minizlib/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@babel/types": "^7.0.0" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" + "@babel/types": "^7.28.2" } }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" }, - "node_modules/oauth4webapi": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.1.2.tgz", - "integrity": "sha512-KQZkNU+xn02lWrFu5Vjqg9E81yPtDSxUZorRHlLWVoojD+H/0GFbH59kcnz5Thdjj7c4/mYMBPj/mhvGe/kKXA==", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/panva" + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, + "license": "MIT", "dependencies": { - "wrappy": "1" + "@types/istanbul-lib-report": "*" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", "dev": true, + "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "expect": "^30.0.0", + "pretty-format": "^30.0.0" } }, - "node_modules/openid-client": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.1.3.tgz", - "integrity": "sha512-74sc0bR4ptfwCwMheLPaJHTQnds+97Yu6O8eQgoO3MRcd53xkfKyl3gNAsRsYSYoO+AVG3eCgnRMjRkZ6n2RYw==", - "optional": true, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.2.tgz", + "integrity": "sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==", + "license": "MIT", "dependencies": { - "jose": "^5.9.6", - "oauth4webapi": "^3.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/panva" + "undici-types": "~7.13.0" } }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, + "node_modules/@types/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", + "license": "MIT", "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" + "@types/node": "*", + "form-data": "^4.0.4" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, + "license": "MIT" + }, + "node_modules/@types/stream-buffers": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/stream-buffers/-/stream-buffers-3.0.7.tgz", + "integrity": "sha512-azOCy05sXVXrO+qklf0c/B07H/oHaIuDDAiHPVwlk3A9Ek+ksHyTeMajLZl3r76FxpPpxem//4Te61G1iW3Giw==", + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "@types/yargs-parser": "*" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + "node_modules/@ungap/structured-clone": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", + "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", + "dev": true, + "license": "ISC" }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", + "cpu": [ + "arm64" + ], "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", + "cpu": [ + "ppc64" + ], "dev": true, - "engines": { - "node": ">= 6" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", + "cpu": [ + "riscv64" + ], "dev": true, - "engines": { - "node": ">= 0.8.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", + "cpu": [ + "wasm32" + ], "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" }, "engines": { - "node": ">= 6" + "node": ">=14.0.0" } }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "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", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" + "node_modules/@vercel/ncc": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.44.1.tgz", + "integrity": "sha512-cUjIE5P2YY1n+Kt9rFIazMMpGoPn1Fic04rOmTkElMkiDP5oszGfERMpo2shVkFKDL7rVppdM2pqJKC59shQWQ==", + "dev": true, + "license": "MIT", + "bin": { + "ncc": "dist/ncc/cli.js" } }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", "engines": { - "node": ">= 0.12" + "node": ">= 14" } }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "type-fest": "^0.21.3" }, "engines": { - "node": ">=0.8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "color-convert": "^2.0.1" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { - "resolve-from": "^5.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true, - "engines": { - "node": ">=10" - } + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, - "node_modules/rfc4648": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.1.tgz", - "integrity": "sha512-60e/YWs2/D3MV1ErdjhJHcmlgnyLUiG4X/14dgsfm9/zmCWLN16xI6YqJYSCd/OANM7bUNzJqPY5B8/02S9Ibw==" + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/babel-jest": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.4.1.tgz", + "integrity": "sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "@jest/transform": "30.4.1", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.4.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shlex": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/shlex/-/shlex-2.1.2.tgz", - "integrity": "sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "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" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stream-buffers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", - "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" }, "engines": { - "node": ">=18" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "node_modules/babel-plugin-jest-hoist": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.4.0.tgz", + "integrity": "sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" + "@types/babel__core": "^7.20.5" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-jest": { - "version": "27.1.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz", - "integrity": "sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@types/jest": "^27.0.0", - "babel-jest": ">=27.0.0 <28", - "jest": "^27.0.0", - "typescript": ">=3.8 <5.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@types/jest": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", - "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - } - }, - "dependencies": { - "@actions/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz", - "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", - "requires": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - } - } - }, - "@actions/exec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", - "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", - "requires": { - "@actions/io": "^1.0.1" - } - }, - "@actions/http-client": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", - "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", - "requires": { - "tunnel": "^0.0.6" - } - }, - "@actions/io": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.2.tgz", - "integrity": "sha512-d+RwPlMp+2qmBfeLYPLXuSRykDIFEwdTA0MMxzS9kh4kvP1ftrc/9fzy6pX6qAjthdXruHQ6/6kjT/DNo5ALuw==" - }, - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", - "dev": true - }, - "@babel/core": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", - "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.0", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", - "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", - "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", - "dev": true, - "requires": { - "@babel/types": "^7.18.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true - }, - "@babel/helpers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", - "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" - } - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", - "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@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.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, - "@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "requires": { - "minipass": "^7.0.4" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - } - }, - "@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - } - }, - "@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - } - }, - "@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - } - }, - "@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "dev": true, - "requires": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - } - }, - "@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@jsep-plugin/assignment": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", - "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", - "requires": {} - }, - "@jsep-plugin/regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", - "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", - "requires": {} - }, - "@kubernetes/client-node": { - "version": "0.22.2", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.22.2.tgz", - "integrity": "sha512-PPyzUVunPtgISnWNkCTSLp1SoZ3I13XOanrc8XAQRKp8XTnDF7VT9Sf3/haFmgnpONe4ORCtqrWueGp5fl8yzw==", - "requires": { - "byline": "^5.0.0", - "isomorphic-ws": "^5.0.0", - "js-yaml": "^4.1.0", - "jsonpath-plus": "^10.0.0", - "openid-client": "^6.1.3", - "request": "^2.88.0", - "rfc4648": "^1.3.0", - "stream-buffers": "^3.0.2", - "tar": "^7.0.0", - "tslib": "^2.4.1", - "ws": "^8.18.0" - }, - "dependencies": { - "ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "requires": {} - } - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "@types/babel__traverse": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", - "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", "dev": true, - "requires": { - "@babel/types": "^7.3.0" + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "requires": { - "@types/node": "*" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "@types/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ==", + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, - "requires": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" } }, - "@types/node": { - "version": "17.0.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.36.tgz", - "integrity": "sha512-V3orv+ggDsWVHP99K3JlwtH20R7J4IhI1Kksgc+64q5VxgfRkQG8Ws3MFm/FZOKDYGy9feGFlZ70/HpCNe9QaA==", - "dev": true - }, - "@types/prettier": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", - "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "node_modules/babel-preset-jest": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.4.0.tgz", + "integrity": "sha512-lBY4jxsNmCnSiu7kquw8ZC9F4+XLMOKypT3RnNHPvU2Kpd4W0xaPuLr5ZkRyOsvLYAY4yaW1ZwTW4xB7NIiZzg==", "dev": true, - "requires": { - "@types/yargs-parser": "*" + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.4.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@vercel/ncc": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.33.4.tgz", - "integrity": "sha512-ln18hs7dMffelP47tpkaR+V5Tj6coykNyxJrlcmCormPqRQjB/Gv4cu2FfBG+PMzIfdZp2CLDsrrB1NPU22Qhg==", - "dev": true - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" }, - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true + "node_modules/bare-events": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", + "license": "Apache-2.0" }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, + "node_modules/bare-fs": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.5.tgz", + "integrity": "sha512-TCtu93KGLu6/aiGWzMr12TmSRS6nKdfhAnzTQRbXoSWxkbb9eRd53jQ51jG7g1gYjjtto3hbBrrhzg6djcgiKg==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true } } }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" + "node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" } }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" } }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" + "node_modules/bare-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } } }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "node_modules/bare-url": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", + "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" + "node_modules/baseline-browser-mapping": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.0.tgz", + "integrity": "sha512-oCu2wfipvX3AePSgmOuKkIywOu+8n9psz7hXYmk56ghpu3+7KzNIBopaOs4c9BrtdnTtW30unG9GTfHo7EwERQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "node_modules/browserslist": { + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } }, - "asn1": { + "node_modules/bs-logger": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dev": true, - "requires": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" } }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "license": "MIT" + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "balanced-match": { + "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "requires": { - "tweetnacl": "^0.14.3" + "node_modules/ci-info": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } + "license": "MIT" }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { - "node-int64": "^0.4.0" + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==" - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001344", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", - "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" - }, - "ci-info": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", - "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "co": { + "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" }, - "color-convert": { + "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { + "dev": true, + "license": "MIT", + "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" }, - "combined-stream": { + "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { + "license": "MIT", + "dependencies": { "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } + "license": "MIT" }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "node_modules/core-js-compat": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } }, - "cross-spawn": { + "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "requires": { + "dev": true, + "license": "MIT", + "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } } }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "requires": { - "ms": "2.1.2" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "delayed-stream": { + "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } }, - "detect-newline": { + "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, - "eastasianwidth": { + "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "electron-to-chromium": { - "version": "1.4.141", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz", - "integrity": "sha512-mfBcbqc0qc6RlxrsIgLG2wCqkiPAjEezHxGTu7p3dHHFOurH4EjS9rFZndX5axC8264rI1Pcbw8uQP39oZckeA==", - "dev": true - }, - "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/electron-to-chromium": { + "version": "1.5.395", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.395.tgz", + "integrity": "sha512-7zt9Aw+SrmxLWLN0zhaTWZQiCdryLVrYTq5R7iZakLvi2UQPYMMsROYV/2qVCzMeCiSXHwKOU+sZ4zOVVlrtKA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "is-arrayish": "^0.2.1" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "esprima": { + "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "esutils": { + "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", @@ -6793,2231 +5329,3043 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" }, - "expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" + "license": "MIT", + "engines": { + "node": ">= 0.8.0" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + "node_modules/expect": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.4.1.tgz", + "integrity": "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.4.1", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" }, - "fast-json-stable-stringify": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "requires": { - "bser": "2.1.1" - } + "license": "MIT" }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "requires": { - "to-regex-range": "^5.0.1" + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" } }, - "find-up": { + "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "requires": { - "cross-spawn": "^7.0.0", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" - } + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "optional": true + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "gensync": { + "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "get-caller-file": { + "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "get-package-type": { + "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } }, - "get-stream": { + "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "requires": { - "assert-plus": "^1.0.0" + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "requires": { - "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" + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, - "requires": { - "function-bind": "^1.1.1" + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "has-flag": { + "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "hooklib": { - "version": "file:../hooklib", - "requires": { - "@actions/core": "^1.9.1", - "@types/node": "^17.0.23", - "@typescript-eslint/parser": "^5.18.0", - "@zeit/ncc": "^0.22.3", - "eslint": "^8.12.0", - "eslint-plugin-github": "^4.3.6", - "prettier": "^2.6.2", - "typescript": "^4.6.3" - } - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "http-signature": { + "node_modules/hooklib": { + "version": "0.1.0", + "resolved": "file:../hooklib", + "license": "MIT", + "dependencies": { + "@actions/core": "^2.0.2" + } + }, + "node_modules/hpagent": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", + "license": "MIT", + "engines": { + "node": ">=14" } }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } + "license": "MIT" }, - "human-signals": { + "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" } }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } }, - "is-arrayish": { + "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, - "requires": { - "has": "^1.0.3" + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "is-generator-fn": { + "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "is-stream": { + "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" }, - "isomorphic-ws": { + "node_modules/isomorphic-ws": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", - "requires": {} - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "license": "MIT", + "peerDependencies": { + "ws": "*" + } }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } }, - "istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" } }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "requires": { + "license": "BSD-3-Clause", + "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, - "requires": { + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.4.2.tgz", + "integrity": "sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.4.2", + "@jest/types": "30.4.1", + "import-local": "^3.2.0", + "jest-cli": "30.4.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.4.1.tgz", + "integrity": "sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.4.1", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.4.2.tgz", + "integrity": "sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.4.1", + "@jest/expect": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.4.1", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-runtime": "30.4.2", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", + "p-limit": "^3.1.0", + "pretty-format": "30.4.1", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-cli": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.4.2.tgz", + "integrity": "sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.4.2", + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.4.2", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.4.2.tgz", + "integrity": "sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.4.0", + "@jest/test-sequencer": "30.4.1", + "@jest/types": "30.4.1", + "babel-jest": "30.4.1", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-circus": "30.4.2", + "jest-docblock": "30.4.0", + "jest-environment-node": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-runner": "30.4.2", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "parse-json": "^5.2.0", + "pretty-format": "30.4.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", + "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.4.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.4.0.tgz", + "integrity": "sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.4.1.tgz", + "integrity": "sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.4.1", + "chalk": "^4.1.2", + "jest-util": "30.4.1", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.4.1.tgz", + "integrity": "sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.4.1", + "@jest/fake-timers": "30.4.1", + "@jest/types": "30.4.1", + "@types/node": "*", + "jest-mock": "30.4.1", + "jest-util": "30.4.1", + "jest-validate": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.4.1.tgz", + "integrity": "sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.4.0", + "jest-util": "30.4.1", + "jest-worker": "30.4.1", + "picomatch": "^4.0.3", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" } }, - "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "node_modules/jest-leak-detector": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.4.1.tgz", + "integrity": "sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==", "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "node_modules/jest-matcher-utils": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz", + "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==", "dev": true, - "requires": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.4.1", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "node_modules/jest-message-util": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", + "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.4.1", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-util": "30.4.1", + "picomatch": "^4.0.3", + "pretty-format": "30.4.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "node_modules/jest-mock": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", + "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - } - }, - "jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dev": true, - "requires": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - } - }, - "jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dev": true, - "requires": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "jest-util": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "node_modules/jest-regex-util": { + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", "dev": true, - "requires": { - "detect-newline": "^3.0.0" + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "node_modules/jest-resolve": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.4.1.tgz", + "integrity": "sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.4.1", + "jest-validate": "30.4.1", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "node_modules/jest-resolve-dependencies": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.4.2.tgz", + "integrity": "sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ==", "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.4.0", + "jest-snapshot": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "node_modules/jest-runner": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.4.2.tgz", + "integrity": "sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==", "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", + "license": "MIT", + "dependencies": { + "@jest/console": "30.4.1", + "@jest/environment": "30.4.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.4.0", + "jest-environment-node": "30.4.1", + "jest-haste-map": "30.4.1", + "jest-leak-detector": "30.4.1", + "jest-message-util": "30.4.1", + "jest-resolve": "30.4.1", + "jest-runtime": "30.4.2", + "jest-util": "30.4.1", + "jest-watcher": "30.4.1", + "jest-worker": "30.4.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true - }, - "jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "node_modules/jest-runtime": { + "version": "30.4.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.4.2.tgz", + "integrity": "sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "license": "MIT", + "dependencies": { + "@jest/environment": "30.4.1", + "@jest/fake-timers": "30.4.1", + "@jest/globals": "30.4.1", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - } - }, - "jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dev": true, - "requires": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.4.1", + "jest-message-util": "30.4.1", + "jest-mock": "30.4.1", + "jest-regex-util": "30.4.0", + "jest-resolve": "30.4.1", + "jest-snapshot": "30.4.1", + "jest-util": "30.4.1", "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "node_modules/jest-snapshot": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.4.1.tgz", + "integrity": "sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true - }, - "jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.4.1", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.4.1", + "@jest/transform": "30.4.1", + "@jest/types": "30.4.1", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.4.1", + "graceful-fs": "^4.2.11", + "jest-diff": "30.4.1", + "jest-matcher-utils": "30.4.1", + "jest-message-util": "30.4.1", + "jest-util": "30.4.1", + "pretty-format": "30.4.1", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "node_modules/jest-util": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", + "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "license": "MIT", + "dependencies": { + "@jest/types": "30.4.1", "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - } - }, - "jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "node_modules/jest-validate": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.4.1.tgz", + "integrity": "sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw==", "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - } - }, - "jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dev": true, - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.4.1", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.4.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" + "license": "MIT", + "engines": { + "node": ">=10" }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "node_modules/jest-watcher": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.4.1.tgz", + "integrity": "sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw==", "dev": true, - "requires": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.4.1", + "@jest/types": "30.4.1", "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.4.1", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "node_modules/jest-worker": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.4.1.tgz", + "integrity": "sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.4.1", "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "supports-color": "^8.1.1" }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "jose": { - "version": "5.9.6", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.6.tgz", - "integrity": "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==", - "optional": true + "node_modules/jose": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.0.tgz", + "integrity": "sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } }, - "js-tokens": { + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } + "dev": true, + "license": "MIT" }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } + "node_modules/js-yaml": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.2.1.tgz", + "integrity": "sha512-zfLtNfQqxVqq3uaTqSkh4x4hZw3KHobGUA0fJUj4wawW8bsQLTVqpHdXSIzidh7o+4lEW36tANuAGdaFx6Zgnw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.mjs" } }, - "jsep": { + "node_modules/jsep": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", - "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==" + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + } }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } }, - "json-parse-even-better-errors": { + "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "dev": true, + "license": "MIT" }, - "json5": { + "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, - "jsonpath-plus": { + "node_modules/jsonpath-plus": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", - "requires": { + "license": "MIT", + "dependencies": { "@jsep-plugin/assignment": "^1.3.0", "@jsep-plugin/regex": "^1.0.4", "jsep": "^1.4.0" + }, + "bin": { + "jsonpath": "bin/jsonpath-cli.js", + "jsonpath-plus": "bin/jsonpath-cli.js" + }, + "engines": { + "node": ">=18.0.0" } }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { + "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "lines-and-columns": { + "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, - "locate-path": { + "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" }, - "lodash.memoize": { + "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "dev": true, + "license": "MIT" }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "requires": { - "yallist": "^4.0.0" + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" } }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "requires": { - "semver": "^6.0.0" + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "make-error": { + "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, - "makeerror": { + "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "requires": { + "license": "BSD-3-Clause", + "dependencies": { "tmpl": "1.0.5" } }, - "merge-stream": { + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } + "license": "MIT" }, - "mime-db": { + "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { + "license": "MIT", + "dependencies": { "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { + "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, - "requires": { - "brace-expansion": "^1.1.7" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "minizlib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", - "requires": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "requires": { - "glob": "^10.3.7" - } - } + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } }, - "natural-compare": { + "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } }, - "node-int64": { + "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" }, - "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", - "dev": true + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "npm-run-path": { + "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "oauth4webapi": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.1.2.tgz", - "integrity": "sha512-KQZkNU+xn02lWrFu5Vjqg9E81yPtDSxUZorRHlLWVoojD+H/0GFbH59kcnz5Thdjj7c4/mYMBPj/mhvGe/kKXA==", - "optional": true + "node_modules/oauth4webapi": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.2.tgz", + "integrity": "sha512-FzZZ+bht5X0FKe7Mwz3DAVAmlH1BV5blSak/lHMBKz0/EBMhX6B10GlQYI51+oRp8ObJaX0g6pXrAxZh5s8rjw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "openid-client": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.1.3.tgz", - "integrity": "sha512-74sc0bR4ptfwCwMheLPaJHTQnds+97Yu6O8eQgoO3MRcd53xkfKyl3gNAsRsYSYoO+AVG3eCgnRMjRkZ6n2RYw==", - "optional": true, - "requires": { - "jose": "^5.9.6", - "oauth4webapi": "^3.1.1" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "node_modules/openid-client": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.8.1.tgz", + "integrity": "sha512-VoYT6enBo6Vj2j3Q5Ec0AezS+9YGzQo1f5Xc42lreMGlfP4ljiXPKVDvCADh+XHCV/bqPu/wWSiCVXbJKvrODw==", + "license": "MIT", + "dependencies": { + "jose": "^6.1.0", + "oauth4webapi": "^3.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/panva" } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "requires": { - "p-try": "^2.0.0" + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { + "node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "p-try": { + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "package-json-from-dist": { + "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" }, - "parse-json": { + "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, - "path-scurry": { + "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "requires": { + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, - "dependencies": { - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - } + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", + "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.4.1", + "ansi-styles": "^5.2.0", + "react-is-18": "npm:react-is@^18.3.1", + "react-is-19": "npm:react-is@^19.2.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "node_modules/react-is-18": { + "name": "react-is", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true + "node_modules/react-is-19": { + "name": "react-is", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "dev": true, + "license": "MIT" }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true, - "requires": { - "find-up": "^4.0.0" - } + "license": "MIT" }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" } }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" } }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "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", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } + "node_modules/regjsparser": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", + "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" } }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, - "requires": { - "is-core-module": "^2.8.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-cwd": { + "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true - }, - "rfc4648": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.1.tgz", - "integrity": "sha512-60e/YWs2/D3MV1ErdjhJHcmlgnyLUiG4X/14dgsfm9/zmCWLN16xI6YqJYSCd/OANM7bUNzJqPY5B8/02S9Ibw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "requires": { - "glob": "^7.1.3" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "node_modules/rfc4648": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.4.tgz", + "integrity": "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==", + "license": "MIT" }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, - "requires": { - "xmlchars": "^2.2.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { + "dev": true, + "license": "MIT", + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "shlex": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/shlex/-/shlex-2.1.2.tgz", - "integrity": "sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/shlex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shlex/-/shlex-3.0.0.tgz", + "integrity": "sha512-jHPXQQk9d/QXCvJuLPYMOYWez3c43sORAgcIEoV7bFv5AJSJRAOyw5lQO12PMfd385qiLRCaDt7OtEzgrIGZUA==", + "license": "MIT" }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } }, - "source-map": { + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "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" - } - }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, - "requires": { + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "stream-buffers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", - "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==" + "node_modules/stream-buffers": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.3.tgz", + "integrity": "sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==", + "license": "Unlicense", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } }, - "string-length": { + "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "string-width": { + "node_modules/string-width-cjs": { + "name": "string-width", "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { + "dev": true, + "license": "MIT", + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" }, - "strip-ansi": { + "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { + "dev": true, + "license": "MIT", + "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { + "dev": true, + "license": "MIT", + "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "strip-json-comments": { + "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "supports-color": { + "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "supports-preserve-symlinks-flag": { + "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "requires": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" }, - "dependencies": { - "yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "node_modules/synckit": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", + "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.3.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tar-fs": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.3.tgz", + "integrity": "sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, - "test-exclude": { + "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "requires": { - "is-number": "^7.0.0" + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "ts-jest": { - "version": "27.1.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz", - "integrity": "sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" } }, - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" + "node_modules/ts-jest": { + "version": "29.4.11", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.11.tgz", + "integrity": "sha512-IrFl7l9AuB/qrNw5quqvAv/hmKMb8dhWOH4jQOGo0Oq8tCeo1O86/iTFG1FaRimgUkF13l4PcepO8ATFT6Ns4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.9", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.8.0", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <7" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "requires": { - "prelude-ls": "~1.1.2" + "license": "0BSD", + "optional": true + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "type-fest": { + "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, - "requires": { - "is-typedarray": "^1.0.0" + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici": { + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", + "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==", + "license": "MIT", + "engines": { + "node": ">=18.17" } }, - "typescript": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz", - "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", - "dev": true + "node_modules/undici-types": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", + "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", + "license": "MIT" }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "node_modules/unrs-resolver": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true + "napi-postinstall": "^0.3.4" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" + "node_modules/uuid": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" } }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" } }, - "walker": { + "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "requires": { + "license": "Apache-2.0", + "dependencies": { "makeerror": "1.0.12" } }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { + "dev": true, + "license": "ISC", + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, - "wrap-ansi": { + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "dev": true, - "requires": { - "cliui": "^7.0.2", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/packages/k8s/package.json b/packages/k8s/package.json index 28fad944..98d4e8da 100644 --- a/packages/k8s/package.json +++ b/packages/k8s/package.json @@ -13,20 +13,26 @@ "author": "", "license": "MIT", "dependencies": { - "@actions/core": "^1.9.1", - "@actions/exec": "^1.1.1", - "@actions/io": "^1.1.2", - "@kubernetes/client-node": "^0.22.2", + "@actions/core": "^2.0.2", + "@actions/exec": "^3.0.0", + "@actions/io": "^3.0.2", + "@kubernetes/client-node": "^1.3.0", "hooklib": "file:../hooklib", - "js-yaml": "^4.1.0", - "shlex": "^2.1.2" + "js-yaml": "^5.0.0", + "shlex": "^3.0.0", + "stream-buffers": "^3.0.2", + "tar-fs": "^3.1.2", + "uuid": "^14.0.1" }, "devDependencies": { - "@types/jest": "^27.4.1", - "@types/node": "^17.0.23", - "@vercel/ncc": "^0.33.4", - "jest": "^27.5.1", - "ts-jest": "^27.1.4", - "typescript": "^4.6.3" + "@babel/core": "^7.29.0", + "@babel/preset-env": "^7.29.5", + "@types/jest": "^30.0.0", + "@types/node": "^24.3.0", + "@vercel/ncc": "^0.44.0", + "babel-jest": "^30.4.1", + "jest": "^30.4.2", + "ts-jest": "^29.4.11", + "typescript": "^5.9.2" } } diff --git a/packages/k8s/src/hooks/cleanup-job.spec.ts b/packages/k8s/src/hooks/cleanup-job.spec.ts new file mode 100644 index 00000000..8e09600f --- /dev/null +++ b/packages/k8s/src/hooks/cleanup-job.spec.ts @@ -0,0 +1,69 @@ +vi.mock('@actions/core', () => ({ + debug: vi.fn(), + error: vi.fn(), + warning: vi.fn(), + info: vi.fn() +})) + +vi.mock('../k8s', () => ({ + prunePods: vi.fn().mockResolvedValue(undefined), + pruneSecrets: vi.fn().mockResolvedValue(undefined) +})) + +const collectAndPushNpuMetrics = vi.fn().mockResolvedValue(undefined) +const npuMetricsEnabled = vi.fn().mockReturnValue(true) + +vi.mock('../k8s/utils/npu-metrics', () => ({ + collectAndPushNpuMetrics: (...args: unknown[]) => + collectAndPushNpuMetrics(...args), + npuMetricsEnabled: () => npuMetricsEnabled(), + withTimeout: async (promise: Promise) => promise, + NPU_COLLECT_TIMEOUT_MS: 10000 +})) + +import { cleanupJob } from './cleanup-job' +import * as k8sMod from '../k8s' + +describe('cleanupJob', () => { + afterEach(() => { + vi.clearAllMocks() + npuMetricsEnabled.mockReturnValue(true) + collectAndPushNpuMetrics.mockResolvedValue(undefined) + }) + + it('always prunes pods and secrets', async () => { + await cleanupJob() + expect(k8sMod.prunePods).toHaveBeenCalledTimes(1) + expect(k8sMod.pruneSecrets).toHaveBeenCalledTimes(1) + }) + + it('collects npu metrics before pruning', async () => { + const order: string[] = [] + collectAndPushNpuMetrics.mockImplementation(async () => { + order.push('collect') + }) + vi.mocked(k8sMod.prunePods).mockImplementation(async () => { + order.push('prunePods') + }) + vi.mocked(k8sMod.pruneSecrets).mockImplementation(async () => { + order.push('pruneSecrets') + }) + await cleanupJob() + expect(order[0]).toBe('collect') + expect(order.slice(1).sort()).toEqual(['prunePods', 'pruneSecrets']) + }) + + it('keeps pruning when collection fails', async () => { + collectAndPushNpuMetrics.mockRejectedValue(new Error('collect exploded')) + await expect(cleanupJob()).resolves.toBeUndefined() + expect(k8sMod.prunePods).toHaveBeenCalledTimes(1) + expect(k8sMod.pruneSecrets).toHaveBeenCalledTimes(1) + }) + + it('skips collection when the feature flag is disabled', async () => { + npuMetricsEnabled.mockReturnValue(false) + await cleanupJob() + expect(collectAndPushNpuMetrics).not.toHaveBeenCalled() + expect(k8sMod.prunePods).toHaveBeenCalledTimes(1) + }) +}) diff --git a/packages/k8s/src/hooks/cleanup-job.ts b/packages/k8s/src/hooks/cleanup-job.ts index acec1064..33590208 100644 --- a/packages/k8s/src/hooks/cleanup-job.ts +++ b/packages/k8s/src/hooks/cleanup-job.ts @@ -1,5 +1,20 @@ +import * as core from '@actions/core' +import { formatError } from '../k8s/utils' import { prunePods, pruneSecrets } from '../k8s' +import { + collectAndPushNpuMetrics, + NPU_COLLECT_TIMEOUT_MS, + npuMetricsEnabled, + withTimeout +} from '../k8s/utils/npu-metrics' export async function cleanupJob(): Promise { + if (npuMetricsEnabled()) { + try { + await withTimeout(collectAndPushNpuMetrics(), NPU_COLLECT_TIMEOUT_MS) + } catch (err) { + core.debug(`npu-metrics: collection failed: ${formatError(err)}`) + } + } await Promise.all([prunePods(), pruneSecrets()]) } diff --git a/packages/k8s/src/hooks/prepare-job.ts b/packages/k8s/src/hooks/prepare-job.ts index 1dc7ad3c..7615243f 100644 --- a/packages/k8s/src/hooks/prepare-job.ts +++ b/packages/k8s/src/hooks/prepare-job.ts @@ -1,32 +1,41 @@ import * as core from '@actions/core' -import * as io from '@actions/io' import * as k8s from '@kubernetes/client-node' import { JobContainerInfo, ContextPorts, PrepareJobArgs, - writeToResponseFile + writeToResponseFile, + ServiceContainerInfo } from 'hooklib' -import path from 'path' import { containerPorts, - createPod, + createJobPod, isPodContainerAlpine, prunePods, waitForPodPhases, - getPrepareJobTimeoutSeconds + getPrepareJobTimeoutSeconds, + execCpToPod, + execPodStep } from '../k8s' import { - containerVolumes, + CONTAINER_VOLUMES, DEFAULT_CONTAINER_ENTRY_POINT, DEFAULT_CONTAINER_ENTRY_POINT_ARGS, + formatError, generateContainerName, mergeContainerWithOptions, readExtensionFromFile, PodPhase, - fixArgs + fixArgs, + prepareJobScript } from '../k8s/utils' -import { CONTAINER_EXTENSION_PREFIX, JOB_CONTAINER_NAME } from './constants' +import { + CONTAINER_EXTENSION_PREFIX, + getJobPodName, + JOB_CONTAINER_NAME +} from './constants' +import { maybeInjectNpuMetrics } from '../k8s/utils/npu-metrics' +import { dirname } from 'path' export async function prepareJob( args: PrepareJobArgs, @@ -39,29 +48,43 @@ export async function prepareJob( await prunePods() const extension = readExtensionFromFile() - await copyExternalsToRoot() let container: k8s.V1Container | undefined = undefined if (args.container?.image) { - core.debug(`Using image '${args.container.image}' for job image`) container = createContainerSpec( args.container, JOB_CONTAINER_NAME, true, extension ) + maybeInjectNpuMetrics(container) } let services: k8s.V1Container[] = [] + let serviceNames: string[] = [] if (args.services?.length) { + const occurrences = new Map() + for (const s of args.services) { + const base = generateContainerName(s.image) + occurrences.set(base, (occurrences.get(base) || 0) + 1) + } + + const indices = new Map() services = args.services.map(service => { - core.debug(`Adding service '${service.image}' to pod definition`) - return createContainerSpec( - service, - generateContainerName(service.image), - false, - extension - ) + const base = generateContainerName(service.image) + const total = occurrences.get(base) || 0 + const idx = indices.get(base) || 0 + + let name: string + if (total > 1) { + name = `${base}-${idx}` + } else { + name = base + } + + indices.set(base, idx + 1) + serviceNames.push(name) + return createContainerSpec(service, name, false, extension) }) } @@ -71,7 +94,8 @@ export async function prepareJob( let createdPod: k8s.V1Pod | undefined = undefined try { - createdPod = await createPod( + createdPod = await createJobPod( + getJobPodName(), container, services, args.container.registry, @@ -80,8 +104,59 @@ export async function prepareJob( } catch (err) { await prunePods() core.debug(`createPod failed: ${JSON.stringify(err)}`) - const message = (err as any)?.response?.body?.message || err - throw new Error(`failed to create job pod: ${message}`) + // The k8s client throws HttpException whose message is a multi-line string + // containing the raw HTTP dump. Extract the human-readable "message" field + // from the embedded JSON body so the log shows something like: + // failed to create job pod: + // spec.volumes[5].name: Duplicate value: "bad-hostpath" + // instead of the full HTTP dump. + const raw = err instanceof Error ? err.message : String(err) + let detail = raw + // The k8s HttpException message is a multi-line dump: + // HTTP-Code: 422 + // Message: Unknown API Status Code! + // Body: "{\"kind\":\"Status\",\"message\":\"...\\n\"}" + // Headers: {...} + // Extract the Body JSON string, unescape it, and pull out "message". + try { + const bodyStart = raw.indexOf('Body: "') + // The boundary may be '"\nHeaders:' (real newline) or the literal + // string ends before Headers — use the last '"' before 'Headers:' as fallback + const headersIdx = raw.indexOf('Headers:') + const bodyEnd = + headersIdx !== -1 + ? raw.lastIndexOf('"', headersIdx) // last " before Headers: + : raw.indexOf('"\nHeaders:') + if (bodyStart !== -1 && bodyEnd !== -1 && bodyEnd > bodyStart) { + // Body content is a JSON string literal (without surrounding quotes). + // Wrap it in quotes and JSON.parse to properly unescape \" \\ \n \t etc. + const escaped = raw.substring(bodyStart + 7, bodyEnd) + const bodyStr = JSON.parse('"' + escaped + '"') + // bodyStr may be plain text (e.g. 502 Bad Gateway) instead of JSON. + // Parse separately so a non-JSON body still yields a friendly message. + try { + const parsed = JSON.parse(bodyStr) + if (typeof parsed?.message === 'string') { + detail = parsed.message + } + } catch { + detail = bodyStr + } + } + } catch { + // Parsing failed — fall through and show the raw string + } + const errorMessage = [ + 'failed to create job pod:', + ` ✗ ${detail}`, + '-'.repeat(60), + ' → Pod spec was rejected by the k8s API. Check:', + ' - resources.requests does not exceed resources.limits', + ' - volumeMounts reference a volume defined in spec.volumes', + ' - envFrom / valueFrom reference existing Secrets / ConfigMaps', + ' - Field types match the k8s schema (kubectl explain pod.spec.containers)' + ].join('\n') + throw new Error(errorMessage) } if (!createdPod?.metadata?.name) { @@ -91,6 +166,17 @@ export async function prepareJob( `Job pod created, waiting for it to come online ${createdPod?.metadata?.name}` ) + const runnerWorkspaceEnv = process.env.RUNNER_WORKSPACE + if (!runnerWorkspaceEnv) { + throw new Error('RUNNER_WORKSPACE environment variable is not set') + } + const runnerWorkspace = dirname(runnerWorkspaceEnv) + + let prepareScript: { containerPath: string; runnerPath: string } | undefined + if (args.container?.userMountVolumes?.length) { + prepareScript = prepareJobScript(args.container.userMountVolumes || []) + } + try { await waitForPodPhases( createdPod.metadata.name, @@ -100,7 +186,33 @@ export async function prepareJob( ) } catch (err) { await prunePods() - throw new Error(`pod failed to come online with error: ${err}`) + // Unwrap nested "Error: " prefix so the message renders as: + // pod failed to come online: + // + const detail = err instanceof Error ? err.message : String(err) + throw new Error(`pod failed to come online:\n${detail}`) + } + + await execCpToPod(createdPod.metadata.name, runnerWorkspace, '/__w') + + if (prepareScript) { + await execPodStep( + ['sh', '-e', prepareScript.containerPath], + createdPod.metadata.name, + JOB_CONTAINER_NAME + ) + + const promises: Promise[] = [] + for (const vol of args?.container?.userMountVolumes || []) { + promises.push( + execCpToPod( + createdPod.metadata.name, + vol.sourceVolumePath, + vol.targetVolumePath + ) + ) + } + await Promise.all(promises) } core.debug('Job pod is ready for traffic') @@ -112,21 +224,20 @@ export async function prepareJob( JOB_CONTAINER_NAME ) } catch (err) { - core.debug( - `Failed to determine if the pod is alpine: ${JSON.stringify(err)}` - ) - const message = (err as any)?.response?.body?.message || err + const message = formatError(err) + core.debug(`Failed to determine if the pod is alpine: ${message}`) throw new Error(`failed to determine if the pod is alpine: ${message}`) } core.debug(`Setting isAlpine to ${isAlpine}`) - generateResponseFile(responseFile, args, createdPod, isAlpine) + generateResponseFile(responseFile, args, createdPod, isAlpine, serviceNames) } function generateResponseFile( responseFile: string, args: PrepareJobArgs, appPod: k8s.V1Pod, - isAlpine + isAlpine: boolean, + serviceNames?: string[] ): void { if (!appPod.metadata?.name) { throw new Error('app pod must have metadata.name specified') @@ -159,7 +270,9 @@ function generateResponseFile( if (args.services?.length) { const serviceContainerNames = - args.services?.map(s => generateContainerName(s.image)) || [] + serviceNames && serviceNames.length + ? serviceNames + : args.services?.map(s => generateContainerName(s.image)) || [] response.context['services'] = appPod?.spec?.containers ?.filter(c => serviceContainerNames.includes(c.name)) @@ -167,7 +280,9 @@ function generateResponseFile( const ctxPorts: ContextPorts = {} if (c.ports?.length) { for (const port of c.ports) { - ctxPorts[port.containerPort] = port.hostPort + if (port.containerPort && port.hostPort) { + ctxPorts[port.containerPort.toString()] = port.hostPort.toString() + } } } @@ -181,19 +296,8 @@ function generateResponseFile( writeToResponseFile(responseFile, JSON.stringify(response)) } -async function copyExternalsToRoot(): Promise { - const workspace = process.env['RUNNER_WORKSPACE'] - if (workspace) { - await io.cp( - path.join(workspace, '../../externals'), - path.join(workspace, '../externals'), - { force: true, recursive: true, copySourceDirectory: false } - ) - } -} - export function createContainerSpec( - container: JobContainerInfo, + container: JobContainerInfo | ServiceContainerInfo, name: string, jobContainer = false, extension?: k8s.V1PodTemplateSpec @@ -208,24 +312,24 @@ export function createContainerSpec( image: container.image, ports: containerPorts(container) } as k8s.V1Container - if (container.workingDirectory) { - podContainer.workingDir = container.workingDirectory + if (container['workingDirectory']) { + podContainer.workingDir = container['workingDirectory'] } if (container.entryPoint) { podContainer.command = [container.entryPoint] } - if (container.entryPointArgs?.length > 0) { + if (container.entryPointArgs && container.entryPointArgs.length > 0) { podContainer.args = fixArgs(container.entryPointArgs) } podContainer.env = [] for (const [key, value] of Object.entries( - container['environmentVariables'] + container['environmentVariables'] || {} )) { if (value && key !== 'HOME') { - podContainer.env.push({ name: key, value: value as string }) + podContainer.env.push({ name: key, value }) } } @@ -234,17 +338,14 @@ export function createContainerSpec( value: 'true' }) - if (!('CI' in container['environmentVariables'])) { + if (!('CI' in (container['environmentVariables'] || {}))) { podContainer.env.push({ name: 'CI', value: 'true' }) } - podContainer.volumeMounts = containerVolumes( - container.userMountVolumes, - jobContainer - ) + podContainer.volumeMounts = CONTAINER_VOLUMES if (!extension) { return podContainer diff --git a/packages/k8s/src/hooks/run-container-step.ts b/packages/k8s/src/hooks/run-container-step.ts index e5261537..d36e8f7d 100644 --- a/packages/k8s/src/hooks/run-container-step.ts +++ b/packages/k8s/src/hooks/run-container-step.ts @@ -1,23 +1,37 @@ import * as core from '@actions/core' +import * as fs from 'fs' import * as k8s from '@kubernetes/client-node' import { RunContainerStepArgs } from 'hooklib' +import { dirname } from 'path' import { - createJob, - createSecretForEnvs, - getContainerJobPodName, - getPodLogs, - getPodStatus, - waitForJobToComplete, + createContainerStepPod, + deletePod, + describePodFailure, + execCpFromPod, + execCpToPod, + execPodStepWithOutput, + getContainerTerminatedErrors, + getPodByName, + getPrepareJobTimeoutSeconds, + getTerminatedReasonHint, waitForPodPhases } from '../k8s' import { - containerVolumes, - fixArgs, + CONTAINER_VOLUMES, + formatError, mergeContainerWithOptions, PodPhase, - readExtensionFromFile + readExtensionFromFile, + DEFAULT_CONTAINER_ENTRY_POINT_ARGS, + writeContainerStepScript } from '../k8s/utils' -import { JOB_CONTAINER_EXTENSION_NAME, JOB_CONTAINER_NAME } from './constants' +import { + getJobPodName, + getStepPodName, + JOB_CONTAINER_EXTENSION_NAME, + JOB_CONTAINER_NAME +} from './constants' +import { maybeInjectNpuMetrics } from '../k8s/utils/npu-metrics' export async function runContainerStep( stepContainer: RunContainerStepArgs @@ -26,119 +40,221 @@ export async function runContainerStep( throw new Error('Building container actions is not currently supported') } - let secretName: string | undefined = undefined - if (stepContainer.environmentVariables) { - try { - const envs = JSON.parse( - JSON.stringify(stepContainer.environmentVariables) - ) - envs['GITHUB_ACTIONS'] = 'true' - if (!('CI' in envs)) { - envs.CI = 'true' - } - secretName = await createSecretForEnvs(envs) - } catch (err) { - core.debug(`createSecretForEnvs failed: ${JSON.stringify(err)}`) - const message = (err as any)?.response?.body?.message || err - throw new Error(`failed to create script environment: ${message}`) - } + if (!stepContainer.entryPoint) { + throw new Error( + 'failed to start the container since the entrypoint is overwritten' + ) + } + + const envs = stepContainer.environmentVariables || {} + envs['GITHUB_ACTIONS'] = 'true' + if (!('CI' in envs)) { + envs.CI = 'true' } const extension = readExtensionFromFile() - core.debug(`Created secret ${secretName} for container job envs`) - const container = createContainerSpec(stepContainer, secretName, extension) + const container = createContainerSpec(stepContainer, extension) + maybeInjectNpuMetrics(container) - let job: k8s.V1Job + let pod: k8s.V1Pod try { - job = await createJob(container, extension) + pod = await createContainerStepPod(getStepPodName(), container, extension) } catch (err) { - core.debug(`createJob failed: ${JSON.stringify(err)}`) - const message = (err as any)?.response?.body?.message || err - throw new Error(`failed to run script step: ${message}`) + const message = formatError(err) + core.debug(`createContainerStepPod failed: ${message}`) + throw new Error(`failed to run container step: ${message}`) } - if (!job.metadata?.name) { + if (!pod.metadata?.name) { throw new Error( `Expected job ${JSON.stringify( - job + pod )} to have correctly set the metadata.name` ) } - core.debug(`Job created, waiting for pod to start: ${job.metadata?.name}`) + const podName = pod.metadata.name - let podName: string try { - podName = await getContainerJobPodName(job.metadata.name) - } catch (err) { - core.debug(`getContainerJobPodName failed: ${JSON.stringify(err)}`) - const message = (err as any)?.response?.body?.message || err - throw new Error(`failed to get container job pod name: ${message}`) - } + await waitForPodPhases( + podName, + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING, PodPhase.UNKNOWN]), + getPrepareJobTimeoutSeconds() + ) - await waitForPodPhases( - podName, - new Set([ - PodPhase.COMPLETED, - PodPhase.RUNNING, - PodPhase.SUCCEEDED, - PodPhase.FAILED - ]), - new Set([PodPhase.PENDING, PodPhase.UNKNOWN]) - ) - core.debug('Container step is running or complete, pulling logs') + const runnerWorkspaceEnv = process.env.RUNNER_WORKSPACE + const githubWorkspaceEnv = process.env.GITHUB_WORKSPACE + if (!runnerWorkspaceEnv || !githubWorkspaceEnv) { + throw new Error( + 'RUNNER_WORKSPACE or GITHUB_WORKSPACE environment variable is not set' + ) + } + const runnerWorkspace = dirname(runnerWorkspaceEnv) + const githubWorkspace = githubWorkspaceEnv + const parts = githubWorkspace.split('/').slice(-2) + if (parts.length !== 2) { + throw new Error(`Invalid github workspace directory: ${githubWorkspace}`) + } + const relativeWorkspace = parts.join('/') - await getPodLogs(podName, JOB_CONTAINER_NAME) + core.debug( + `Copying files from pod ${getJobPodName()} to ${runnerWorkspace}/${relativeWorkspace}` + ) + await execCpFromPod(getJobPodName(), `/__w`, `${runnerWorkspace}`) - core.debug('Waiting for container job to complete') - await waitForJobToComplete(job.metadata.name) + const { containerPath, runnerPath } = writeContainerStepScript( + `${runnerWorkspace}/__w/_temp`, + githubWorkspace, + stepContainer.entryPoint, + stepContainer.entryPointArgs, + envs + ) + + await execCpToPod(podName, `${runnerWorkspace}/__w`, '/__w') + + fs.rmSync(`${runnerWorkspace}/__w`, { recursive: true, force: true }) - // pod has failed so pull the status code from the container - const status = await getPodStatus(podName) - if (status?.phase === 'Succeeded') { - return 0 + try { + core.debug(`Executing container step script in pod ${podName}`) + const { code, output } = await execPodStepWithOutput( + ['sh', '-e', containerPath], + pod.metadata.name, + JOB_CONTAINER_NAME + ) + if (code === 0) { + return 0 + } + // Non-zero exit: surface a structured error so the user can tell whether + // it was their script or the container that failed. Read container + // status BEFORE deletePod runs (in the outer finally) to inspect the + // terminated reason, if it is already available. + const classification = await classifyScriptError( + pod.metadata.name, + code, + output + ) + throw new Error(classification) + } catch (err) { + core.debug(`execPodStep failed: ${formatError(err)}`) + // Re-throw our classified errors verbatim; wrap anything else. + if ( + err instanceof Error && + (err.message.startsWith('Step failed:') || + err.message.startsWith('failed to run script step')) + ) { + throw err + } + const message = formatError(err) + throw new Error(`failed to run container step: ${message}`) + } finally { + fs.rmSync(runnerPath, { force: true }) + } + } catch (error) { + try { + const errorPod = await getPodByName(podName) + const terminatedErrors = getContainerTerminatedErrors(errorPod) + if (terminatedErrors.length > 0) { + const details = await describePodFailure(podName) + core.error( + `Pod ${podName} has unrecoverable container errors:\n${terminatedErrors.join('\n')}\n${details}` + ) + } + } catch { + // Best-effort: pod may already be deleted or unreachable + } + core.error(`Failed to run container step: ${error}`) + throw error + } finally { + await deletePod(podName).catch(err => { + core.error(`Failed to delete step pod ${podName}: ${err}`) + }) } - if (!status?.containerStatuses?.length) { - core.error( - `Can't determine container status from response: ${JSON.stringify( - status - )}` +} + +// Inspect the pod's container status to determine whether a non-zero exit +// code came from the user's script (container terminated cleanly with +// reason=Completed) or from a container-level failure (OOMKilled, etc.). +// The container state may not yet be 'terminated' when called (k8s updates +// it asynchronously), so we default to treating unknown state as a script +// issue and let the user check their script first. +async function classifyScriptError( + podName: string, + exitCode: number, + tailOutput: string +): Promise { + const sep = '-'.repeat(60) + const errors: string[] = [` ✗ exit code: ${exitCode}`] + const sections: string[] = [] + + try { + const pod = await getPodByName(podName) + const cs = pod.status?.containerStatuses?.find( + s => s.name === JOB_CONTAINER_NAME ) - return 1 + const term = cs?.state?.terminated + if (term) { + const reason = term.reason ?? 'Completed' + const isContainerFault = + reason === 'OOMKilled' || + reason === 'Error' || + reason === 'FailedPostStartHookError' || + (term.exitCode === 137 && reason !== 'Completed') + if (isContainerFault) { + const detail = term.message ? `\n ${term.message}` : '' + const hint = `\n${getTerminatedReasonHint(reason, term.exitCode)}` + errors.push( + ` ✗ container "${JOB_CONTAINER_NAME}": ${reason} (exit code ${term.exitCode})${detail}${hint}` + ) + } else { + errors.push( + ` → your script exited with a non-zero code; please check your script for errors` + ) + sections.push( + `Container status: ${reason} (exit code ${term.exitCode})` + ) + } + } else { + // Container state unavailable — treat as script issue by default + errors.push(` → please check your script for errors`) + } + if (cs?.state?.waiting) { + errors.push( + ` ✗ container "${JOB_CONTAINER_NAME}" waiting: ${cs.state.waiting.reason ?? 'unknown'}` + ) + } + } catch { + // pod already gone or API error — default hint + errors.push(` → please check your script for errors`) + } + + if (tailOutput) { + const outputLines = tailOutput + .split('\n') + .map(l => ` ${l}`) + .join('\n') + sections.push(`Last output:\n${outputLines}`) } - const exitCode = - status.containerStatuses[status.containerStatuses.length - 1].state - ?.terminated?.exitCode - return Number(exitCode) || 1 + + let result = `failed to run script step:\n${errors.join('\n')}` + if (sections.length) { + result += `\n${sep}\n${sections.join('\n')}` + } + return result } function createContainerSpec( container: RunContainerStepArgs, - secretName?: string, extension?: k8s.V1PodTemplateSpec ): k8s.V1Container { const podContainer = new k8s.V1Container() podContainer.name = JOB_CONTAINER_NAME podContainer.image = container.image - podContainer.workingDir = container.workingDirectory - podContainer.command = container.entryPoint - ? [container.entryPoint] - : undefined - podContainer.args = container.entryPointArgs?.length - ? fixArgs(container.entryPointArgs) - : undefined - - if (secretName) { - podContainer.envFrom = [ - { - secretRef: { - name: secretName, - optional: false - } - } - ] - } - podContainer.volumeMounts = containerVolumes(undefined, false, true) + podContainer.workingDir = '/__w' + podContainer.command = ['tail'] + podContainer.args = DEFAULT_CONTAINER_ENTRY_POINT_ARGS + + podContainer.volumeMounts = CONTAINER_VOLUMES if (!extension) { return podContainer diff --git a/packages/k8s/src/hooks/run-script-step.ts b/packages/k8s/src/hooks/run-script-step.ts index 631946d3..5fe07a7f 100644 --- a/packages/k8s/src/hooks/run-script-step.ts +++ b/packages/k8s/src/hooks/run-script-step.ts @@ -2,17 +2,50 @@ import * as fs from 'fs' import * as core from '@actions/core' import { RunScriptStepArgs } from 'hooklib' -import { execPodStep } from '../k8s' -import { writeEntryPointScript } from '../k8s/utils' +import { + execCpFromPod, + execCpToPod, + execPodStep, + execPodStepWithOutput +} from '../k8s' +import { formatError, writeRunScript } from '../k8s/utils' import { JOB_CONTAINER_NAME } from './constants' +import { dirname } from 'path' +import * as shlex from 'shlex' + +function formatScriptError(exitCode: number, tailOutput: string): string { + const sep = '-'.repeat(60) + const errors = [ + ` ✗ exit code: ${exitCode}`, + ` → your script exited with a non-zero code; please check your script for errors` + ] + const sections: string[] = [] + if (tailOutput) { + const outputLines = tailOutput + .split('\n') + .map(l => ` ${l}`) + .join('\n') + sections.push(`Last output:\n${outputLines}`) + } + let result = `failed to run script step:\n${errors.join('\n')}` + if (sections.length) result += `\n${sep}\n${sections.join('\n')}` + return result +} export async function runScriptStep( args: RunScriptStepArgs, - state, - responseFile + state ): Promise { + // Validate that pod was created successfully (prepareJob succeeded) + if (!state?.jobPod) { + throw new Error( + 'jobPod must be set - ensure prepareJob completed successfully before running script steps' + ) + } + + // Write the entrypoint first. This will be later coppied to the workflow pod const { entryPoint, entryPointArgs, environmentVariables } = args - const { containerPath, runnerPath } = writeEntryPointScript( + const { containerPath, runnerPath } = writeRunScript( args.workingDirectory, entryPoint, entryPointArgs, @@ -20,19 +53,95 @@ export async function runScriptStep( environmentVariables ) + const workdir = dirname(process.env.RUNNER_WORKSPACE as string) + const runnerTemp = `${workdir}/_temp` + const containerTemp = '/__w/_temp' + const containerTempSrc = '/__w/_temp_pre' + // Ensure base and staging dirs exist before copying + await execPodStep( + [ + 'sh', + '-c', + 'mkdir -p /__w && mkdir -p /__w/_temp && mkdir -p /__w/_temp_pre' + ], + state.jobPod, + JOB_CONTAINER_NAME + ) + await execCpToPod(state.jobPod, runnerTemp, containerTempSrc) + + // Copy GitHub directories from temp to /github + // Merge strategy: + // - Overwrite files in _runner_file_commands + // - Append files not already present elsewhere + const mergeCommands = [ + 'set -e', + 'mkdir -p /__w/_temp /__w/_temp_pre', + 'SRC=/__w/_temp_pre', + 'DST=/__w/_temp', + // Overwrite _runner_file_commands + 'cp -a "$SRC/_runner_file_commands/." "$DST/_runner_file_commands"', + `find "$SRC" -type f ! -path "*/_runner_file_commands/*" -exec sh -c ' + rel="\${1#$2/}" + target="$3/$rel" + mkdir -p "$(dirname "$target")" + cp -a "$1" "$target" + ' _ {} "$SRC" "$DST" \\;`, + // Remove _temp_pre after merging + 'rm -rf /__w/_temp_pre' + ] + + try { + await execPodStep( + ['sh', '-c', mergeCommands.join(' && ')], + state.jobPod, + JOB_CONTAINER_NAME + ) + } catch (err) { + const message = formatError(err) + core.debug(`Failed to merge temp directories: ${message}`) + throw new Error(`failed to merge temp dirs: ${message}`) + } + + // Execute the entrypoint script args.entryPoint = 'sh' args.entryPointArgs = ['-e', containerPath] try { - await execPodStep( + const { code, output } = await execPodStepWithOutput( [args.entryPoint, ...args.entryPointArgs], state.jobPod, JOB_CONTAINER_NAME ) + if (code !== 0) { + throw new Error(formatScriptError(code, output)) + } } catch (err) { - core.debug(`execPodStep failed: ${JSON.stringify(err)}`) - const message = (err as any)?.response?.body?.message || err + core.debug(`execPodStep failed: ${formatError(err)}`) + if ( + err instanceof Error && + err.message.startsWith('failed to run script step') + ) { + throw err + } + const message = formatError(err) throw new Error(`failed to run script step: ${message}`) } finally { - fs.rmSync(runnerPath) + try { + fs.rmSync(runnerPath, { force: true }) + } catch (removeErr) { + core.debug(`Failed to remove file ${runnerPath}: ${removeErr}`) + } + } + + try { + core.debug( + `Copying from job pod '${state.jobPod}' ${containerTemp} to ${runnerTemp}` + ) + await execCpFromPod( + state.jobPod, + `${containerTemp}/_runner_file_commands`, + `${workdir}/_temp` + ) + } catch (error) { + core.warning('Failed to copy _temp from pod') } } diff --git a/packages/k8s/src/index.ts b/packages/k8s/src/index.ts index 80dc902b..291e20d7 100644 --- a/packages/k8s/src/index.ts +++ b/packages/k8s/src/index.ts @@ -1,5 +1,11 @@ import * as core from '@actions/core' -import { Command, getInputFromStdin, prepareJobArgs } from 'hooklib' +import { + Command, + getInputFromStdin, + PrepareJobArgs, + RunContainerStepArgs, + RunScriptStepArgs +} from 'hooklib' import { cleanupJob, prepareJob, @@ -27,16 +33,16 @@ async function run(): Promise { let exitCode = 0 switch (command) { case Command.PrepareJob: - await prepareJob(args as prepareJobArgs, responseFile) + await prepareJob(args as PrepareJobArgs, responseFile) return process.exit(0) case Command.CleanupJob: await cleanupJob() return process.exit(0) case Command.RunScriptStep: - await runScriptStep(args, state, null) + await runScriptStep(args as RunScriptStepArgs, state) return process.exit(0) case Command.RunContainerStep: - exitCode = await runContainerStep(args) + exitCode = await runContainerStep(args as RunContainerStepArgs) return process.exit(exitCode) default: throw new Error(`Command not recognized: ${command}`) diff --git a/packages/k8s/src/k8s/heartbeat.ts b/packages/k8s/src/k8s/heartbeat.ts new file mode 100644 index 00000000..b83f1654 --- /dev/null +++ b/packages/k8s/src/k8s/heartbeat.ts @@ -0,0 +1,136 @@ +import * as core from '@actions/core' + +export interface HeartbeatWebSocket { + readyState: number + ping(): void + close(): void + on(event: string, listener: (...args: any[]) => void): this + once(event: string, listener: (...args: any[]) => void): this +} + +export function parsePositiveMsEnv( + value: string | undefined, + fallback: number +): number { + const parsed = Number.parseInt(value ?? '', 10) + return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback +} + +export class WebSocketHeartbeat { + private pingInterval: ReturnType | null = null + private pongTimeout: ReturnType | null = null + private lastHeartbeatLog = 0 + private static readonly LOG_INTERVAL_MS = 2 * 60 * 1000 + + constructor( + private readonly pingPeriodMs: number, + private readonly pongDeadlineMs: number + ) {} + + private shouldLog(): boolean { + const now = Date.now() + if (now - this.lastHeartbeatLog >= WebSocketHeartbeat.LOG_INTERVAL_MS) { + this.lastHeartbeatLog = now + return true + } + return false + } + + stop(): void { + if (this.shouldLog()) { + core.debug('[Heartbeat] stopping heartbeat') + } + if (this.pingInterval) { + clearInterval(this.pingInterval) + this.pingInterval = null + } + if (this.pongTimeout) { + clearTimeout(this.pongTimeout) + this.pongTimeout = null + } + } + + start(ws: HeartbeatWebSocket, reject: (err: Error) => void): void { + core.debug( + `[Heartbeat] Starting with period=${this.pingPeriodMs}ms, deadline=${this.pongDeadlineMs}ms` + ) + this.lastHeartbeatLog = Date.now() + + const resetPongTimeout = (): void => { + if (this.pongTimeout) { + clearTimeout(this.pongTimeout) + this.pongTimeout = null + } + this.pongTimeout = setTimeout(() => { + core.warning( + `[Heartbeat] No pong received in ${this.pongDeadlineMs}ms, closing stale connection` + ) + this.stop() + try { + ws.close() + } catch { + // ignore errors closing an already-closing socket + } + reject( + new Error( + `WebSocket heartbeat timeout: no pong within ${this.pongDeadlineMs}ms` + ) + ) + }, this.pongDeadlineMs) + } + + // Arm the deadline only after the first ping is sent, not immediately on + // start, so a slow CONNECTING socket cannot time out before any exchange. + let deadlineArmed = false + + ws.on('pong', () => { + if (this.shouldLog()) { + core.debug('[Heartbeat] Pong received') + } + if (deadlineArmed) { + resetPongTimeout() + } + }) + + ws.on('error', (err: Error) => { + core.error(`[Heartbeat] WebSocket error: ${err.message}`) + this.stop() + }) + + ws.on('close', () => { + core.debug('[Heartbeat] WebSocket closed, stopping heartbeat') + this.stop() + }) + + // WebSocket readyState: 0 = CONNECTING, 1 = OPEN, 2 = CLOSING, 3 = CLOSED + this.pingInterval = setInterval(() => { + if (ws.readyState === 0) { + // Still connecting — skip this tick but keep the interval alive + return + } + if (ws.readyState === 1) { + try { + ws.ping() + if (!deadlineArmed) { + deadlineArmed = true + resetPongTimeout() + } + if (this.shouldLog()) { + core.debug('[Heartbeat] Ping sent') + } + } catch (err) { + core.error(`[Heartbeat] Ping failed: ${err}`) + this.stop() + } + } else { + // CLOSING (2) or CLOSED (3) + if (this.shouldLog()) { + core.debug( + `[Heartbeat] WebSocket closing/closed (readyState=${ws.readyState}), stopping heartbeat` + ) + } + this.stop() + } + }, this.pingPeriodMs) + } +} diff --git a/packages/k8s/src/k8s/index.ts b/packages/k8s/src/k8s/index.ts index 021b3839..d90ae3c0 100644 --- a/packages/k8s/src/k8s/index.ts +++ b/packages/k8s/src/k8s/index.ts @@ -1,22 +1,33 @@ import * as core from '@actions/core' +import * as fs from 'fs' +import * as path from 'path' +import { spawn } from 'child_process' import * as k8s from '@kubernetes/client-node' -import { ContainerInfo, Registry } from 'hooklib' +import tar from 'tar-fs' import * as stream from 'stream' +import { WritableStreamBuffer } from 'stream-buffers' +import { createHash } from 'crypto' +import type { ContainerInfo, Registry } from 'hooklib' import { - getJobPodName, - getRunnerPodName, getSecretName, - getStepPodName, - getVolumeClaimName, + JOB_CONTAINER_NAME, RunnerInstanceLabel } from '../hooks/constants' import { PodPhase, + formatError, mergePodSpecWithOptions, mergeObjectMeta, - useKubeScheduler, - fixArgs + fixArgs, + listDirAllCommand, + sleep, + EXTERNALS_VOLUME_NAME, + GITHUB_VOLUME_NAME, + WORK_VOLUME } from './utils' +import * as shlex from 'shlex' +import { parsePositiveMsEnv, WebSocketHeartbeat } from './heartbeat' +import type { HeartbeatWebSocket } from './heartbeat' const kc = new k8s.KubeConfig() @@ -28,8 +39,6 @@ const k8sAuthorizationV1Api = kc.makeApiClient(k8s.AuthorizationV1Api) const DEFAULT_WAIT_FOR_POD_TIME_SECONDS = 10 * 60 // 10 min -export const POD_VOLUME_NAME = 'work' - export const requiredPermissions = [ { group: '', @@ -49,12 +58,6 @@ export const requiredPermissions = [ resource: 'pods', subresource: 'log' }, - { - group: 'batch', - verbs: ['get', 'list', 'create', 'delete'], - resource: 'jobs', - subresource: '' - }, { group: '', verbs: ['create', 'delete', 'get', 'list'], @@ -63,7 +66,8 @@ export const requiredPermissions = [ } ] -export async function createPod( +export async function createJobPod( + name: string, jobContainer?: k8s.V1Container, services?: k8s.V1Container[], registry?: Registry, @@ -83,7 +87,7 @@ export async function createPod( appPod.kind = 'Pod' appPod.metadata = new k8s.V1ObjectMeta() - appPod.metadata.name = getJobPodName() + appPod.metadata.name = name const instanceLabel = new RunnerInstanceLabel() appPod.metadata.labels = { @@ -93,19 +97,68 @@ export async function createPod( appPod.spec = new k8s.V1PodSpec() appPod.spec.containers = containers - appPod.spec.restartPolicy = 'Never' + appPod.spec.securityContext = { + fsGroup: 1001 + } + + // Extract working directory from GITHUB_WORKSPACE + // GITHUB_WORKSPACE is like /__w/repo-name/repo-name + const githubWorkspace = process.env.GITHUB_WORKSPACE + const workingDirPath = githubWorkspace?.split('/').slice(-2).join('/') ?? '' + + const initCommands = [ + 'mkdir -p /mnt/externals', + 'mkdir -p /mnt/work', + 'mkdir -p /mnt/github', + 'mv /home/runner/externals/* /mnt/externals/' + ] - const nodeName = await getCurrentNodeName() - if (useKubeScheduler()) { - appPod.spec.affinity = await getPodAffinity(nodeName) - } else { - appPod.spec.nodeName = nodeName + if (workingDirPath) { + initCommands.push(`mkdir -p /mnt/work/${workingDirPath}`) } - const claimName = getVolumeClaimName() + + appPod.spec.initContainers = [ + { + name: 'fs-init', + image: + process.env.ACTIONS_RUNNER_IMAGE || + 'ghcr.io/actions/actions-runner:latest', + command: ['sh', '-c', initCommands.join(' && ')], + securityContext: { + runAsGroup: 1001, + runAsUser: 1001 + }, + volumeMounts: [ + { + name: EXTERNALS_VOLUME_NAME, + mountPath: '/mnt/externals' + }, + { + name: WORK_VOLUME, + mountPath: '/mnt/work' + }, + { + name: GITHUB_VOLUME_NAME, + mountPath: '/mnt/github' + } + ] + } + ] + + appPod.spec.restartPolicy = 'Never' + appPod.spec.volumes = [ { - name: 'work', - persistentVolumeClaim: { claimName } + name: EXTERNALS_VOLUME_NAME, + emptyDir: {} + }, + { + name: GITHUB_VOLUME_NAME, + emptyDir: {} + }, + { + name: WORK_VOLUME, + emptyDir: {} } ] @@ -127,102 +180,71 @@ export async function createPod( mergePodSpecWithOptions(appPod.spec, extension.spec) } - const { body } = await k8sApi.createNamespacedPod(namespace(), appPod) - return body + return await k8sApi.createNamespacedPod({ + namespace: namespace(), + body: appPod + }) } -export async function createJob( +export async function createContainerStepPod( + name: string, container: k8s.V1Container, extension?: k8s.V1PodTemplateSpec -): Promise { - const runnerInstanceLabel = new RunnerInstanceLabel() +): Promise { + const appPod = new k8s.V1Pod() - const job = new k8s.V1Job() - job.apiVersion = 'batch/v1' - job.kind = 'Job' - job.metadata = new k8s.V1ObjectMeta() - job.metadata.name = getStepPodName() - job.metadata.labels = { [runnerInstanceLabel.key]: runnerInstanceLabel.value } - job.metadata.annotations = {} - - job.spec = new k8s.V1JobSpec() - job.spec.ttlSecondsAfterFinished = 300 - job.spec.backoffLimit = 0 - job.spec.template = new k8s.V1PodTemplateSpec() - - job.spec.template.spec = new k8s.V1PodSpec() - job.spec.template.metadata = new k8s.V1ObjectMeta() - job.spec.template.metadata.labels = {} - job.spec.template.metadata.annotations = {} - job.spec.template.spec.containers = [container] - job.spec.template.spec.restartPolicy = 'Never' - - const nodeName = await getCurrentNodeName() - if (useKubeScheduler()) { - job.spec.template.spec.affinity = await getPodAffinity(nodeName) - } else { - job.spec.template.spec.nodeName = nodeName - } - - const claimName = getVolumeClaimName() - job.spec.template.spec.volumes = [ - { - name: 'work', - persistentVolumeClaim: { claimName } - } - ] + appPod.apiVersion = 'v1' + appPod.kind = 'Pod' - if (extension) { - if (extension.metadata) { - // apply metadata both to the job and the pod created by the job - mergeObjectMeta(job, extension.metadata) - mergeObjectMeta(job.spec.template, extension.metadata) - } - if (extension.spec) { - mergePodSpecWithOptions(job.spec.template.spec, extension.spec) - } + appPod.metadata = new k8s.V1ObjectMeta() + appPod.metadata.name = name + + const instanceLabel = new RunnerInstanceLabel() + appPod.metadata.labels = { + [instanceLabel.key]: instanceLabel.value } + appPod.metadata.annotations = {} - const { body } = await k8sBatchV1Api.createNamespacedJob(namespace(), job) - return body -} + appPod.spec = new k8s.V1PodSpec() + appPod.spec.containers = [container] -export async function getContainerJobPodName(jobName: string): Promise { - const selector = `job-name=${jobName}` - const backOffManager = new BackOffManager(60) - while (true) { - const podList = await k8sApi.listNamespacedPod( - namespace(), - undefined, - undefined, - undefined, - undefined, - selector, - 1 - ) + appPod.spec.restartPolicy = 'Never' - if (!podList.body.items?.length) { - await backOffManager.backOff() - continue + appPod.spec.volumes = [ + { + name: EXTERNALS_VOLUME_NAME, + emptyDir: {} + }, + { + name: GITHUB_VOLUME_NAME, + emptyDir: {} + }, + { + name: WORK_VOLUME, + emptyDir: {} } + ] - if (!podList.body.items[0].metadata?.name) { - throw new Error( - `Failed to determine the name of the pod for job ${jobName}` - ) - } - return podList.body.items[0].metadata.name + if (extension?.metadata) { + mergeObjectMeta(appPod, extension.metadata) } + + if (extension?.spec) { + mergePodSpecWithOptions(appPod.spec, extension.spec) + } + + return await k8sApi.createNamespacedPod({ + namespace: namespace(), + body: appPod + }) } -export async function deletePod(podName: string): Promise { - await k8sApi.deleteNamespacedPod( - podName, - namespace(), - undefined, - undefined, - 0 - ) +export async function deletePod(name: string): Promise { + await k8sApi.deleteNamespacedPod({ + name, + namespace: namespace(), + gracePeriodSeconds: 0 + }) } export async function execPodStep( @@ -230,11 +252,33 @@ export async function execPodStep( podName: string, containerName: string, stdin?: stream.Readable -): Promise { +): Promise { const exec = new k8s.Exec(kc) + core.debug( + `[execPodStep] Starting: cmd="${command[0]}" (${command.length} args), pod=${podName}, container=${containerName}` + ) + command = fixArgs(command) - // Exec returns a websocket. If websocket fails, we should reject the promise. Otherwise, websocket will call a callback. Since at that point, websocket is not failing, we can safely resolve or reject the promise. - await new Promise(function (resolve, reject) { + + const DEFAULT_PING_PERIOD_MS = 5000 + const pingPeriodMs = parsePositiveMsEnv( + process.env.ACTIONS_RUNNER_HEARTBEAT_PERIOD_MS, + DEFAULT_PING_PERIOD_MS + ) + const pongDeadlineMs = parsePositiveMsEnv( + process.env.ACTIONS_RUNNER_HEARTBEAT_DEADLINE_MS, + pingPeriodMs * 12 + 1000 + ) + core.debug( + `[execPodStep] Heartbeat config: pingPeriodMs=${pingPeriodMs}, pongDeadlineMs=${pongDeadlineMs}` + ) + + const heartbeat = new WebSocketHeartbeat(pingPeriodMs, pongDeadlineMs) + + return new Promise((resolve, reject) => { + core.debug('[execPodStep] About to call exec.exec') + let ws: HeartbeatWebSocket | null = null + exec .exec( namespace(), @@ -245,10 +289,251 @@ export async function execPodStep( process.stderr, stdin ?? null, false /* tty */, + async resp => { + core.debug( + `[execPodStep] execPodStep response: ${JSON.stringify(resp)}` + ) + + heartbeat.stop() + + // Close WebSocket and wait for it before resolving/rejecting + const closeWebSocket = async (): Promise => { + const socket = ws + if ( + socket && + (socket.readyState === 1 || socket.readyState === 0) + ) { + return new Promise(closeResolve => { + const closeTimeout = setTimeout(() => { + core.warning( + '[execPodStep] WebSocket close timeout, forcing cleanup' + ) + closeResolve() + }, 5000) + + socket.once('close', () => { + clearTimeout(closeTimeout) + core.debug('[execPodStep] WebSocket closed cleanly') + closeResolve() + }) + socket.close() + }) + } + } + + if (resp.status === 'Success') { + core.debug(`[execPodStep] Success, code: ${resp.code}`) + await closeWebSocket() + resolve(resp.code || 0) + } else { + core.debug( + `[execPodStep] Failure: ${JSON.stringify({ message: resp?.message, details: resp?.details })}` + ) + await closeWebSocket() + reject(new Error(resp?.message || 'execPodStep failed')) + } + } + ) + .then(websocket => { + core.debug('[execPodStep] exec.exec resolved, ws object received') + ws = websocket + if (ws) { + heartbeat.start(ws, reject) + } else { + core.warning('[Heartbeat] WebSocket is null, heartbeat not started') + } + }) + .catch(async e => { + heartbeat.stop() + core.error(`[execPodStep] exec.exec threw error: ${e}`) + + // Close WebSocket before rejecting with timeout protection + const socket = ws + if (socket && (socket.readyState === 1 || socket.readyState === 0)) { + await new Promise(closeResolve => { + const closeTimeout = setTimeout(() => { + core.warning( + '[execPodStep] WebSocket close timeout in error handler' + ) + closeResolve() + }, 5000) + + socket.once('close', () => { + clearTimeout(closeTimeout) + closeResolve() + }) + socket.close() + }) + } + + reject(e) + }) + }) +} + +// Variant of execPodStep that also captures the last `tailLines` lines of +// combined stdout/stderr so callers can surface the script's own output on +// failure. Returns the exit code plus the tail (empty string on success or if +// nothing was emitted). The original streams are still tee'd to +// process.stdout/process.stderr so GitHub Actions logs are unchanged. +export async function execPodStepWithOutput( + command: string[], + podName: string, + containerName: string, + tailLines = 20, + stdin?: stream.Readable +): Promise<{ code: number; output: string }> { + const exec = new k8s.Exec(kc) + command = fixArgs(command) + + // Ring buffer of the last N non-empty lines (cap to keep memory bounded). + const buffer: string[] = [] + const push = (line: string): void => { + if (line.length === 0) return + buffer.push(line) + if (buffer.length > tailLines) buffer.shift() + } + + // Separate pending buffers per stream to prevent stdout/stderr interleaving. + let pendingOut = '' + const ingestOut = (chunk: Buffer | string): void => { + pendingOut += chunk.toString('utf8') + const lines = pendingOut.split(/\r?\n/) + pendingOut = lines.pop() ?? '' + for (const line of lines) push(line) + } + + let pendingErr = '' + const ingestErr = (chunk: Buffer | string): void => { + pendingErr += chunk.toString('utf8') + const lines = pendingErr.split(/\r?\n/) + pendingErr = lines.pop() ?? '' + for (const line of lines) push(line) + } + + const flushPending = (): void => { + if (pendingOut) { + push(pendingOut) + pendingOut = '' + } + if (pendingErr) { + push(pendingErr) + pendingErr = '' + } + } + + const capture = new stream.Writable({ + write(chunk: Buffer | string, _enc, cb) { + try { + ingestOut(chunk) + process.stdout.write(chunk) + cb() + } catch (e) { + cb(e as Error) + } + } + }) + const captureErr = new stream.Writable({ + write(chunk: Buffer | string, _enc, cb) { + try { + ingestErr(chunk) + process.stderr.write(chunk) + cb() + } catch (e) { + cb(e as Error) + } + } + }) + + // Parse an exit code from a k8s exec error/status message. + // Handles both "command terminated with exit code N" and + // "command terminated with non-zero exit code: command terminated with exit code N". + const parseExitCode = (msg: string | undefined): number | null => { + const m = msg?.match(/exit code[:\s]+(\d+)/i) + return m ? parseInt(m[1], 10) : null + } + + return await new Promise(function (resolve, reject) { + exec + .exec( + namespace(), + podName, + containerName, + command, + capture, + captureErr, + stdin ?? null, + false /* tty */, resp => { - // kube.exec returns an error if exit code is not 0, but we can't actually get the exit code + core.debug(`execPodStepWithOutput response: ${JSON.stringify(resp)}`) + flushPending() if (resp.status === 'Success') { - resolve(resp.code) + resolve({ code: resp.code || 0, output: buffer.join('\n') }) + } else { + // k8s exec returns status='Failure' for non-zero script exit. + // resp.code may be undefined depending on k8s version; fall back + // to parsing the exit code from the message string. + const code = parseExitCode(resp?.message) + if (code !== null) { + resolve({ code, output: buffer.join('\n') }) + } else { + reject(new Error(resp?.message || 'execPodStepWithOutput failed')) + } + } + } + ) + .catch(e => { + // In @kubernetes/client-node v1.x the promise returned by exec() + // itself rejects for non-zero exits (the status callback may or may + // not fire first). Detect this case via the error message so the + // caller can classify the error instead of treating it as a hook + // failure. Genuine failures (connection drop, etc.) still reject. + flushPending() + const errMsg = e instanceof Error ? e.message : String(e) + const code = parseExitCode(errMsg) + if (code !== null) { + resolve({ code, output: buffer.join('\n') }) + } else { + reject(e) + } + }) + }) +} + +export async function execCalculateOutputHashSorted( + podName: string, + containerName: string, + command: string[] +): Promise<{ hash: string; lines: string[] }> { + const exec = new k8s.Exec(kc) + + let output = '' + const outputWriter = new stream.Writable({ + write(chunk, _enc, cb) { + try { + output += chunk.toString('utf8') + cb() + } catch (e) { + cb(e as Error) + } + } + }) + + await new Promise((resolve, reject) => { + exec + .exec( + namespace(), + podName, + containerName, + command, + outputWriter, // capture stdout + process.stderr, + null, + false /* tty */, + resp => { + core.debug(`internalExecOutput response: ${JSON.stringify(resp)}`) + if (resp.status === 'Success') { + resolve() } else { core.debug( JSON.stringify({ @@ -256,14 +541,319 @@ export async function execPodStep( details: resp?.details }) ) - reject(resp?.message) + reject(new Error(resp?.message || 'internalExecOutput failed')) } } ) - // If exec.exec fails, explicitly reject the outer promise - // eslint-disable-next-line github/no-then .catch(e => reject(e)) }) + + outputWriter.end() + + // Sort lines for consistent ordering across platforms + const lines = output + .split('\n') + .filter(line => line.length > 0) + .sort() + const sortedOutput = lines.join('\n') + '\n' + + const hash = createHash('sha256') + hash.update(sortedOutput) + return { hash: hash.digest('hex'), lines } +} + +export async function localCalculateOutputHashSorted( + commands: string[] +): Promise<{ hash: string; lines: string[] }> { + return await new Promise<{ hash: string; lines: string[] }>( + (resolve, reject) => { + const child = spawn(commands[0], commands.slice(1), { + stdio: ['ignore', 'pipe', 'ignore'] + }) + + let output = '' + child.stdout.on('data', chunk => { + output += chunk.toString('utf8') + }) + child.on('error', reject) + child.on('close', (code: number) => { + if (code === 0) { + // Sort lines for consistent ordering across distributions/platforms + const lines = output + .split('\n') + .filter(line => line.length > 0) + .sort() + const sortedOutput = lines.join('\n') + '\n' + + const hash = createHash('sha256') + hash.update(sortedOutput) + resolve({ hash: hash.digest('hex'), lines }) + } else { + reject(new Error(`child process exited with code ${code}`)) + } + }) + } + ) +} + +export async function execCpToPod( + podName: string, + runnerPath: string, + containerPath: string +): Promise { + core.debug(`Copying ${runnerPath} to pod ${podName} at ${containerPath}`) + + let attempt = 0 + while (true) { + try { + const exec = new k8s.Exec(kc) + // Use tar to extract with --no-same-owner to avoid ownership issues. + // Then use find to fix permissions. The -m flag helps but we also need to fix permissions after. + const command = [ + 'sh', + '-c', + `tar xf - --no-same-owner -C ${shlex.quote(containerPath)} 2>/dev/null; ` + + `find ${shlex.quote(containerPath)} -type f -exec chmod u+rw {} \\; 2>/dev/null; ` + + `find ${shlex.quote(containerPath)} -type d -exec chmod u+rwx {} \\; 2>/dev/null; ` + + `sync 2>/dev/null || true` + ] + const readStream = tar.pack(runnerPath) + const errStream = new WritableStreamBuffer() + await new Promise((resolve, reject) => { + exec + .exec( + namespace(), + podName, + JOB_CONTAINER_NAME, + command, + null, + errStream, + readStream, + false, + async status => { + if (errStream.size()) { + return reject( + new Error( + `Error from execCpToPod - status: ${status.status}, details: \n ${errStream.getContentsAsString()}` + ) + ) + } + resolve(status) + } + ) + .catch(e => reject(e)) + }) + break + } catch (error) { + core.debug(`cpToPod: Attempt ${attempt + 1} failed: ${error}`) + attempt++ + if (attempt >= 30) { + throw new Error( + `cpToPod failed after ${attempt} attempts: ${formatError(error)}` + ) + } + await sleep(1000) + } + } + + let attempts = 15 + const delay = 1000 + for (let i = 0; i < attempts; i++) { + try { + const { hash: want, lines: wantLines } = + await localCalculateOutputHashSorted([ + 'sh', + '-c', + listDirAllCommand(runnerPath) + ]) + + const { hash: got, lines: gotLines } = + await execCalculateOutputHashSorted(podName, JOB_CONTAINER_NAME, [ + 'sh', + '-c', + listDirAllCommand(containerPath) + ]) + + if (got !== want) { + core.debug( + `[cpToPod hash mismatch attempt ${i + 1}/${attempts}] want='${want}' got='${got}'` + ) + core.debug( + `[cpToPod] runner file count=${wantLines.length} pod file count=${gotLines.length}` + ) + const wantMap = new Map( + wantLines.map(l => [l.replace(/^\d+ /, ''), l.split(' ')[0]]) + ) + const gotMap = new Map( + gotLines.map(l => [l.replace(/^\d+ /, ''), l.split(' ')[0]]) + ) + const onlyInWant = wantLines.filter( + l => !gotMap.has(l.replace(/^\d+ /, '')) + ) + const onlyInGot = gotLines.filter( + l => !wantMap.has(l.replace(/^\d+ /, '')) + ) + const sizeDiff = wantLines + .filter(l => { + const name = l.replace(/^\d+ /, '') + return gotMap.has(name) && gotMap.get(name) !== wantMap.get(name) + }) + .map(l => { + const name = l.replace(/^\d+ /, '') + return `${name}: runner=${wantMap.get(name)} pod=${gotMap.get(name)}` + }) + core.debug(`[cpToPod] only in runner: ${JSON.stringify(onlyInWant)}`) + core.debug(`[cpToPod] only in pod: ${JSON.stringify(onlyInGot)}`) + core.debug(`[cpToPod] size mismatch: ${JSON.stringify(sizeDiff)}`) + await sleep(delay) + continue + } + + break + } catch (error) { + core.debug(`Attempt ${i + 1} failed: ${error}`) + await sleep(delay) + } + } +} + +export async function execCpFromPod( + podName: string, + containerPath: string, + parentRunnerPath: string +): Promise { + const targetRunnerPath = `${parentRunnerPath}/${path.basename(containerPath)}` + core.debug( + `Copying from pod ${podName} ${containerPath} to ${targetRunnerPath}` + ) + + // Clear target before extracting so deleted-on-pod files don't linger locally. + // tar.extract() appends into the destination; without this, stale files (e.g. + // git-credentials removed by checkout cleanup inside the pod) cause a permanent + // hash mismatch that no amount of retrying can resolve. + if (fs.existsSync(targetRunnerPath)) { + fs.rmSync(targetRunnerPath, { recursive: true, force: true }) + } + + let attempt = 0 + while (true) { + try { + // make temporary directory + const exec = new k8s.Exec(kc) + const containerPaths = containerPath.split('/') + const dirname = containerPaths.pop() as string + const command = [ + 'tar', + 'cf', + '-', + '-C', + containerPaths.join('/') || '/', + dirname + ] + const writerStream = tar.extract(parentRunnerPath) + const errStream = new WritableStreamBuffer() + + await new Promise((resolve, reject) => { + // Resolve only after writerStream finishes flushing to disk. + // The k8s status callback fires when the pod-side tar process exits, + // but tar-fs may still be writing buffered data to the local filesystem. + // Waiting for 'finish' ensures all files are on disk before hash check. + writerStream.on('finish', resolve) + writerStream.on('error', reject) + exec + .exec( + namespace(), + podName, + JOB_CONTAINER_NAME, + command, + writerStream, + errStream, + null, + false, + async (_s: k8s.V1Status) => { + if (errStream.size()) { + return reject( + new Error( + `Error from cpFromPod - details: \n ${errStream.getContentsAsString()}` + ) + ) + } + } + ) + .catch(e => reject(e)) + }) + break + } catch (error) { + core.debug(`Attempt ${attempt + 1} failed: ${error}`) + attempt++ + if (attempt >= 30) { + throw new Error( + `execCpFromPod failed after ${attempt} attempts: ${formatError(error)}` + ) + } + await sleep(1000) + } + } + + let attempts = 15 + const delay = 1000 + for (let i = 0; i < attempts; i++) { + try { + const { hash: want, lines: wantLines } = + await execCalculateOutputHashSorted(podName, JOB_CONTAINER_NAME, [ + 'sh', + '-c', + listDirAllCommand(containerPath) + ]) + + const { hash: got, lines: gotLines } = + await localCalculateOutputHashSorted([ + 'sh', + '-c', + listDirAllCommand(targetRunnerPath) + ]) + + if (got !== want) { + core.debug( + `[cpFromPod hash mismatch attempt ${i + 1}/${attempts}] want='${want}' got='${got}'` + ) + core.debug( + `[cpFromPod] pod file count=${wantLines.length} runner file count=${gotLines.length}` + ) + const wantMap = new Map( + wantLines.map(l => [l.replace(/^\d+ /, ''), l.split(' ')[0]]) + ) + const gotMap = new Map( + gotLines.map(l => [l.replace(/^\d+ /, ''), l.split(' ')[0]]) + ) + const onlyInWant = wantLines.filter( + l => !gotMap.has(l.replace(/^\d+ /, '')) + ) + const onlyInGot = gotLines.filter( + l => !wantMap.has(l.replace(/^\d+ /, '')) + ) + const sizeDiff = wantLines + .filter(l => { + const name = l.replace(/^\d+ /, '') + return gotMap.has(name) && gotMap.get(name) !== wantMap.get(name) + }) + .map(l => { + const name = l.replace(/^\d+ /, '') + return `${name}: pod=${wantMap.get(name)} runner=${gotMap.get(name)}` + }) + core.debug(`[cpFromPod] only in pod: ${JSON.stringify(onlyInWant)}`) + core.debug(`[cpFromPod] only in runner: ${JSON.stringify(onlyInGot)}`) + core.debug(`[cpFromPod] size mismatch: ${JSON.stringify(sizeDiff)}`) + await sleep(delay) + continue + } + + break + } catch (error) { + core.debug(`Attempt ${i + 1} failed: ${error}`) + await sleep(delay) + } + } } export async function waitForJobToComplete(jobName: string): Promise { @@ -274,7 +864,7 @@ export async function waitForJobToComplete(jobName: string): Promise { return } } catch (error) { - throw new Error(`job ${jobName} has failed`) + throw new Error(`job ${jobName} has failed: ${formatError(error)}`) } await backOffManager.backOff() } @@ -315,8 +905,10 @@ export async function createDockerSecret( ) } - const { body } = await k8sApi.createNamespacedSecret(namespace(), secret) - return body + return await k8sApi.createNamespacedSecret({ + namespace: namespace(), + body: secret + }) } export async function createSecretForEnvs(envs: { @@ -340,34 +932,567 @@ export async function createSecretForEnvs(envs: { secret.data[key] = Buffer.from(value).toString('base64') } - await k8sApi.createNamespacedSecret(namespace(), secret) + await k8sApi.createNamespacedSecret({ + namespace: namespace(), + body: secret + }) return secretName } -export async function deleteSecret(secretName: string): Promise { - await k8sApi.deleteNamespacedSecret(secretName, namespace()) +export async function deleteSecret(name: string): Promise { + await k8sApi.deleteNamespacedSecret({ + name, + namespace: namespace() + }) } export async function pruneSecrets(): Promise { - const secretList = await k8sApi.listNamespacedSecret( - namespace(), - undefined, - undefined, - undefined, - undefined, - new RunnerInstanceLabel().toString() - ) - if (!secretList.body.items.length) { + const secretList = await k8sApi.listNamespacedSecret({ + namespace: namespace(), + labelSelector: new RunnerInstanceLabel().toString() + }) + if (!secretList.items.length) { return } await Promise.all( - secretList.body.items.map( - secret => secret.metadata?.name && deleteSecret(secret.metadata.name) + secretList.items.map( + async secret => + secret.metadata?.name && (await deleteSecret(secret.metadata.name)) ) ) } +export const UNRECOVERABLE_WAITING_REASONS = new Set([ + // k8s has already retried image pull multiple times with exponential backoff. + // ErrImagePull is excluded: it fires on the first failure (could be a transient + // TLS timeout or network blip) and k8s will naturally promote it to + // ImagePullBackOff after a moment. Fast-failing on ErrImagePull would kill + // jobs that would have succeeded on the next pull attempt. + 'ImagePullBackOff', + // Image name is syntactically invalid — cannot self-heal without a config fix. + 'InvalidImageName', + // Container spec is invalid (bad env vars, resource limits, securityContext) — + // cannot self-heal without a config fix. + 'CreateContainerConfigError' + // CreateContainerError is excluded: it is sometimes emitted transiently by the + // container runtime (e.g. during a node-level runtime restart). It can + // self-resolve on the next kubelet retry cycle. +]) + +// Pod *event* reasons (from the event stream, not container status) that +// indicate a permanent failure the pod will never recover from on its own. +// These surface as Warning events on the pod (visible via `kubectl describe`) +// rather than in container.status.state.waiting.reason, so they need a separate +// list + a separate (async) detection path. +// +// - FailedMount: a volume cannot be mounted (e.g. hostPath `type: Directory` +// pointing at a path that does not exist on the node, missing PVC, missing +// Secret/ConfigMap volume). The container stays in `ContainerCreating` +// waiting state, which is NOT in UNRECOVERABLE_WAITING_REASONS, so without +// this check the hook polls until the 3600s timeout. +// - FailedBinding: a PVC could not be bound (no matching PV, storage class +// misconfiguration). Usually paired with FailedMount once the pod retries. +// +// FailedScheduling is included but gated by PERMANENT_SCHEDULING_PATTERNS: +// only messages that positively identify a permanent configuration error +// trigger fast-fail. Resource shortages ("Insufficient cpu/memory/gpu") +// are silently skipped so the pod keeps queuing until the timeout. +export const UNRECOVERABLE_EVENT_REASONS = new Set([ + 'FailedMount', + 'FailedBinding', + 'FailedScheduling' +]) + +// Patterns that POSITIVELY IDENTIFY a permanent, unrecoverable scheduling +// failure in a FailedScheduling event message. Fast-fail fires ONLY when +// one of these matches. Anything else (resource shortages, unknown format, +// absent message) is treated as transient — the pod keeps queuing. +// +// Permanent examples (WILL fast-fail): +// "0/3 nodes: 3 node(s) didn't match Pod's node affinity/selector." +// "0/3 nodes: 3 node(s) had untolerated taint {gpu: true}." +// "0/3 nodes: persistentvolumeclaim "my-pvc" not found." +// +// Transient examples (will NOT fast-fail, keep queuing): +// "0/3 nodes: 3 Insufficient nvidia.com/gpu." +// "0/3 nodes: 3 Insufficient memory." +// "0/1 nodes are available" ← ambiguous, unknown +// +// Extend at runtime via env var ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS +// (comma-separated regex strings; cannot remove built-in entries). +export const PERMANENT_SCHEDULING_PATTERNS: readonly RegExp[] = [ + // Node selector / affinity label mismatch — no node carries the required + // labels. Will not self-resolve without a pod-spec or node-label change. + /node\(s\) didn't match Pod's node affinity\/selector/i, + /node\(s\) didn't match node affinity/i, + // Untolerated taint — every node carries a taint the pod does not tolerate. + // Will not self-resolve without adding a toleration or removing the taint. + /node\(s\) had untolerated taint/i, + // PVC referenced in the pod spec does not exist in the namespace. The + // scheduler refuses to place the pod until the PVC is created. The workflow + // job spec is wrong — it won't self-resolve. + /persistentvolumeclaim "[^"]+" not found/i +] + +export const UNRECOVERABLE_TERMINATED_REASONS = new Set([ + 'OOMKilled', + 'Error', + 'FailedPostStartHookError' +]) + +// Maximum number of Warning events to include in a pod's failure description so +// that the GitHub Actions log is not flooded. +const MAX_DIAGNOSTIC_EVENTS = 10 + +// The fast-fail whitelist can be extended (not narrowed) from the environment so +// operators can add deterministic terminal reasons without a code change. This +// reuses the same env-var configuration pattern as the prepare-job timeout. When +// the variable is unset, behaviour is identical to the built-in defaults. +export function getUnrecoverableWaitingReasons(): Set { + const extra = process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_WAITING_REASONS'] + if (!extra) { + return UNRECOVERABLE_WAITING_REASONS + } + const reasons = new Set(UNRECOVERABLE_WAITING_REASONS) + for (const reason of extra.split(',')) { + const trimmed = reason.trim() + if (trimmed) { + reasons.add(trimmed) + } + } + return reasons +} + +// Mirrors getUnrecoverableWaitingReasons() but for pod *event* reasons. The +// env var ACTIONS_RUNNER_K8S_UNRECOVERABLE_EVENT_REASONS adds to (never removes +// from) the built-in UNRECOVERABLE_EVENT_REASONS set. +export function getUnrecoverableEventReasons(): Set { + const extra = process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_EVENT_REASONS'] + if (!extra) { + return UNRECOVERABLE_EVENT_REASONS + } + const reasons = new Set(UNRECOVERABLE_EVENT_REASONS) + for (const reason of extra.split(',')) { + const trimmed = reason.trim() + if (trimmed) { + reasons.add(trimmed) + } + } + return reasons +} + +export function getUnrecoverableTerminatedReasons(): Set { + const extra = + process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_TERMINATED_REASONS'] + if (!extra) { + return UNRECOVERABLE_TERMINATED_REASONS + } + const reasons = new Set(UNRECOVERABLE_TERMINATED_REASONS) + for (const reason of extra.split(',')) { + const trimmed = reason.trim() + if (trimmed) { + reasons.add(trimmed) + } + } + return reasons +} + +// Returns true when a FailedScheduling event message positively identifies a +// permanent configuration error that will not self-resolve. Returns false +// (treat as transient, keep queuing) for: +// - absent/empty messages → unknown, assume transient +// - resource shortages → Insufficient cpu/memory/gpu/etc. +// - any unrecognised format → unknown, assume transient +export function isPermanentSchedulingFailure( + message: string | undefined +): boolean { + if (!message) return false + return getPermanentSchedulingPatterns().some(p => p.test(message)) +} + +// Returns PERMANENT_SCHEDULING_PATTERNS extended by any extra patterns from +// ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS (comma-separated regexes). +// Invalid regex strings are skipped with a warning. +// The compiled result is cached: env var changes during a single process are +// rare (effectively never in a runner job), but this avoids repeated split + +// RegExp construction on every FailedScheduling poll iteration. +let _cachedSchedulingPatterns: readonly RegExp[] | undefined +let _lastSchedulingPatternsEnv: string | undefined + +export function getPermanentSchedulingPatterns(): readonly RegExp[] { + const extra = process.env['ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS'] + if (!extra) return PERMANENT_SCHEDULING_PATTERNS + if (_cachedSchedulingPatterns && _lastSchedulingPatternsEnv === extra) { + return _cachedSchedulingPatterns + } + const patterns: RegExp[] = [...PERMANENT_SCHEDULING_PATTERNS] + for (const raw of extra.split(',')) { + const trimmed = raw.trim() + if (!trimmed) continue + try { + patterns.push(new RegExp(trimmed, 'i')) + } catch { + core.warning( + `ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS: invalid regex "${trimmed}", skipped` + ) + } + } + _lastSchedulingPatternsEnv = extra + _cachedSchedulingPatterns = patterns + return patterns +} + +function getWaitingReasonHint(reason: string): string { + switch (reason) { + case 'ImagePullBackOff': + return [ + ` → Image pull has failed repeatedly (k8s retried with exponential backoff). Check:`, + ` - Image name and tag are correct and exist in the registry`, + ` - If private registry: imagePullSecret is configured and credentials are valid`, + ` - Network connectivity from the node to the registry (DNS, firewall, proxy, TLS)`, + ` Run: kubectl describe pod | grep -A10 "Events"` + ].join('\n') + case 'InvalidImageName': + return ` → Image name is malformed. Check the workflow/job container image configuration.` + case 'CreateContainerConfigError': + return ` → Container config is invalid. Check env vars, resource limits, and securityContext in the job spec.` + default: + return ` → Check pod events with: kubectl describe pod ` + } +} + +export function getContainerErrors(pod: k8s.V1Pod): string[] { + const errors: string[] = [] + const unrecoverableReasons = getUnrecoverableWaitingReasons() + const allStatuses = [ + ...(pod.status?.initContainerStatuses ?? []), + ...(pod.status?.containerStatuses ?? []) + ] + for (const cs of allStatuses) { + const waiting = cs.state?.waiting + if (waiting?.reason && unrecoverableReasons.has(waiting.reason)) { + const reason = ` ✗ container "${cs.name}": ${waiting.reason}` + const detail = waiting.message ? `\n ${waiting.message}` : '' + const hint = `\n${getWaitingReasonHint(waiting.reason)}` + errors.push(`${reason}${detail}${hint}`) + } + } + return errors +} + +export function getTerminatedReasonHint( + reason: string, + exitCode: number | undefined +): string { + if (reason === 'OOMKilled') { + return ` → Container exceeded its memory limit and was killed by the OOM killer.\n Increase the memory limit in the job spec or reduce memory usage in the script.` + } + if (reason === 'FailedPostStartHookError') { + return ` → The postStart lifecycle hook failed. Check the hook command and its exit code.` + } + if (reason === 'Error') { + switch (exitCode) { + case 137: + return ` → Exit code 137: process was killed (SIGKILL). Likely OOM or forceful termination.\n Check memory usage and resource limits.` + case 139: + return ` → Exit code 139: segmentation fault (SIGSEGV). The process crashed due to a memory access error.` + case 126: + return ` → Exit code 126: permission denied. The script or binary is not executable.\n Check file permissions inside the container image.` + case 127: + return ` → Exit code 127: command not found. The script or binary does not exist in the container.\n Check the image contents and the command/entrypoint configuration.` + default: + return ` → Script or process exited with a non-zero code (${exitCode ?? 'unknown'}).\n Check the step output above for error messages.\n Common causes: script logic errors, missing dependencies, unhandled exceptions.` + } + } + return ` → Check pod logs with: kubectl logs -c ${reason}` +} + +export function getContainerTerminatedErrors(pod: k8s.V1Pod): string[] { + const errors: string[] = [] + const unrecoverableReasons = getUnrecoverableTerminatedReasons() + const allStatuses = [ + ...(pod.status?.initContainerStatuses ?? []), + ...(pod.status?.containerStatuses ?? []) + ] + for (const cs of allStatuses) { + const terminated = cs.state?.terminated + if (terminated?.reason && unrecoverableReasons.has(terminated.reason)) { + const reason = ` ✗ container "${cs.name}": ${terminated.reason} (exit code ${terminated.exitCode})` + const detail = terminated.message ? `\n ${terminated.message}` : '' + const hint = `\n${getTerminatedReasonHint(terminated.reason, terminated.exitCode)}` + errors.push(`${reason}${detail}${hint}`) + } + } + return errors +} + +function getEventReasonHint(reason: string): string { + switch (reason) { + case 'FailedMount': + return [ + ` → A volume could not be mounted. Check:`, + ` - PVC is bound (kubectl get pvc)`, + ` - Secret/ConfigMap referenced in the volume exists`, + ` - hostPath directories exist on the scheduled node` + ].join('\n') + case 'FailedBinding': + return [ + ` → A PVC could not be bound to a PV. Check:`, + ` - StorageClass exists and has a provisioner`, + ` - Sufficient capacity is available`, + ` - Access mode (ReadWriteOnce/ReadWriteMany) matches available PVs` + ].join('\n') + case 'FailedScheduling': + return [ + ` → Pod cannot be scheduled due to a permanent configuration error. Check:`, + ` - nodeSelector / nodeAffinity labels match at least one node`, + ` - All tolerations are present for node taints`, + ` - PVCs referenced in the pod spec exist in the namespace` + ].join('\n') + default: + return ` → Check pod events with: kubectl describe pod ` + } +} + +// Inspects the pod's Warning events for reasons in UNRECOVERABLE_EVENT_REASONS. +// For FailedScheduling, only fast-fails when the message positively matches +// a known-permanent configuration error (see PERMANENT_SCHEDULING_PATTERNS). +// Resource shortages ("Insufficient cpu/memory/gpu") are silently skipped so +// the pod keeps queuing until the timeout. Best-effort: if events cannot be +// listed (e.g. the optional 'events' RBAC permission is missing) it returns [] +// instead of blocking container-level fast-fail detection. Deduplicates by +// reason so a repeatedly-retried event is reported once. +export async function getPodEventErrors(podName: string): Promise { + const unrecoverableReasons = getUnrecoverableEventReasons() + if (unrecoverableReasons.size === 0) { + return [] + } + + let items: k8s.CoreV1Event[] + try { + const result = await k8sApi.listNamespacedEvent({ + namespace: namespace(), + fieldSelector: `involvedObject.name=${podName}` + }) + items = result.items ?? [] + } catch (err) { + core.debug( + `Could not list events for pod ${podName} during fast-fail check: ${ + err instanceof Error ? err.message : String(err) + }` + ) + return [] + } + + const errors: string[] = [] + const seenReasons = new Set() + for (const e of items) { + if ( + e.type !== 'Warning' || + !e.reason || + !unrecoverableReasons.has(e.reason) + ) { + continue + } + // FailedScheduling: only fast-fail when the message positively matches a + // known-permanent config error. Resource shortages and unknown messages + // are treated as transient — let the pod keep queuing. + if ( + e.reason === 'FailedScheduling' && + !isPermanentSchedulingFailure(e.message) + ) { + core.debug( + `[fast-fail] Skipping FailedScheduling (not a recognised permanent error): ${ + e.message ?? '(no message)' + }` + ) + continue + } + if (seenReasons.has(e.reason)) { + continue + } + seenReasons.add(e.reason) + const count = e.count && e.count > 1 ? ` (x${e.count})` : '' + const reason = ` ✗ event: ${e.reason}${count}` + const detail = e.message ? `\n ${e.message}` : '' + const hint = getEventReasonHint(e.reason) + errors.push(`${reason}${detail}\n${hint}`) + } + return errors +} + +// describePodFailure aggregates everything that might explain why a pod is not +// healthy into a single human-readable string. It makes NO success/failure +// judgement of its own (a terminated exitCode=0 container is just reported as +// such) -- callers decide what is "bad". It never throws: if it cannot read the +// pod or list events it returns/embeds a best-effort note instead, so it is safe +// to call from any error path. +export async function describePodFailure(podName: string): Promise { + let pod: k8s.V1Pod + try { + pod = await readPod(podName) + } catch (err) { + return `Could not read pod ${podName} for diagnostics: ${ + err instanceof Error ? err.message : String(err) + }` + } + + const sections: string[] = [] + const status = pod.status + + // --- Pod-level status --- + const podLines: string[] = [] + const phaseLabel = status?.phase + ? `${status.phase}${status.reason ? ` (${status.reason})` : ''}` + : 'Unknown' + podLines.push(`Pod status: ${phaseLabel}`) + if (status?.message) { + podLines.push(` ${status.message}`) + } + + // Surface conditions that are False (e.g. PodScheduled=False from FailedScheduling) + for (const cond of status?.conditions ?? []) { + if (cond.status === 'False') { + const reason = cond.reason ? ` (${cond.reason})` : '' + const msg = cond.message ? `: ${cond.message}` : '' + podLines.push(` ✗ ${cond.type}=False${reason}${msg}`) + } + } + sections.push(podLines.join('\n')) + + // --- Container-level status (non-zero exits and non-unrecoverable waits) --- + const unrecoverableReasons = getUnrecoverableWaitingReasons() + const allStatuses = [ + ...(status?.initContainerStatuses ?? []), + ...(status?.containerStatuses ?? []) + ] + const containerLines: string[] = [] + for (const cs of allStatuses) { + const waiting = cs.state?.waiting + if (waiting?.reason) { + // Skip reasons already surfaced by getContainerErrors() in the caller's + // first line to avoid printing the same error twice. + if (!unrecoverableReasons.has(waiting.reason)) { + const msg = waiting.message ? `\n ${waiting.message}` : '' + containerLines.push( + ` ✗ container "${cs.name}" waiting: ${waiting.reason}${msg}` + ) + } + } + const terminated = cs.state?.terminated + // Only surface non-zero exits; exit 0 (e.g. fs-init Completed) is noise. + if (terminated && terminated.exitCode !== 0) { + const reason = terminated.reason ?? 'Unknown' + const msg = terminated.message ? `\n ${terminated.message}` : '' + containerLines.push( + ` ✗ container "${cs.name}" terminated: ${reason} (exit code ${terminated.exitCode})${msg}` + ) + } + } + if (containerLines.length) { + sections.push(`Container details:\n${containerLines.join('\n')}`) + } + + // --- Warning events --- + const eventLines = await describePodWarningEvents(podName) + if (eventLines.length) { + sections.push(`Recent warning events:\n${eventLines.join('\n')}`) + } + + if (!sections.length) { + return `No additional diagnostic information available for pod ${podName}` + } + return sections.join('\n\n') +} + +// Reads the most recent Warning events for a pod. Best-effort: listing events +// requires the optional "events" get/list permission, so any error (including +// RBAC Forbidden) is swallowed and an empty list is returned. +async function describePodWarningEvents(podName: string): Promise { + let items: k8s.CoreV1Event[] + try { + const result = await k8sApi.listNamespacedEvent({ + namespace: namespace(), + fieldSelector: `involvedObject.name=${podName}` + }) + items = result.items ?? [] + } catch (err) { + core.debug( + `Could not list events for pod ${podName} (the 'events' permission may be missing): ${ + err instanceof Error ? err.message : String(err) + }` + ) + return [] + } + + const warnings = items.filter(e => e.type === 'Warning') + if (!warnings.length) { + return [] + } + + const eventTime = (e: k8s.CoreV1Event): number => { + const t = e.lastTimestamp ?? e.eventTime ?? e.firstTimestamp + return t ? new Date(t).getTime() : 0 + } + warnings.sort((a, b) => eventTime(a) - eventTime(b)) + + const recent = warnings.slice(-MAX_DIAGNOSTIC_EVENTS) + const lines = recent.map(e => { + const count = e.count && e.count > 1 ? ` (x${e.count})` : '' + return ` [${e.reason ?? 'Warning'}]${count} ${e.message ?? ''}`.trimEnd() + }) + if (warnings.length > recent.length) { + lines.unshift( + ` (showing ${recent.length} of ${warnings.length} warning events)` + ) + } + return lines +} + +// Inspects the pod's status.conditions for scheduling failures. FailedScheduling +// is intentionally excluded from fast-fail detection (see UNRECOVERABLE_EVENT_REASONS +// comment) — scheduling failures are transient resource waits that should queue +// until the timeout, not terminate early. This function always returns [] as a +// result, but is kept so checkUnrecoverableErrors compiles and the dedup logic +// remains intact for future use. +export function getPodConditionErrors(_p: k8s.V1Pod): string[] { + return [] +} + +// Aggregates the three independent error-detection sources (container waiting +// reasons, pod Warning events, and pod conditions) into a single list, applying +// the cross-source deduplication rule (FailedScheduling event + Unschedulable +// condition = same failure, report once). Returns [] when no unrecoverable +// error is detected. The caller decides what to do with the list -- typically +// attach describePodFailure diagnostics and throw. +export async function checkUnrecoverableErrors( + pod: k8s.V1Pod, + podName: string +): Promise { + // Deterministic terminal errors on a container (e.g. ImagePullBackOff). + const containerErrors = getContainerErrors(pod) + // Terminated container errors (e.g. OOMKilled, non-zero exit) with hints. + const terminatedErrors = getContainerTerminatedErrors(pod) + // Best-effort: returns [] when the optional events RBAC permission is absent. + const eventErrors = await getPodEventErrors(podName) + // Conditions are set near-instantly by the scheduler while events may take + // a few extra seconds to propagate, so always run the check. Deduplicate + // against events so the same FailedScheduling isn't printed twice. + const conditionErrors = getPodConditionErrors(pod).filter( + c => + !eventErrors.some( + e => e.includes('FailedScheduling') && c.includes('Unschedulable') + ) + ) + return [ + ...containerErrors, + ...terminatedErrors, + ...eventErrors, + ...conditionErrors + ] +} + export async function waitForPodPhases( podName: string, awaitingPhases: Set, @@ -376,22 +1501,75 @@ export async function waitForPodPhases( ): Promise { const backOffManager = new BackOffManager(maxTimeSeconds) let phase: PodPhase = PodPhase.UNKNOWN - try { - while (true) { - phase = await getPodPhase(podName) - if (awaitingPhases.has(phase)) { - return + while (true) { + let pod: k8s.V1Pod + try { + pod = await readPod(podName) + } catch (err) { + // Transient API error (network blip, API server busy): log and back off + // rather than crashing the loop. The timeout will eventually fire if the + // pod stays permanently unreadable (e.g. RBAC issue). + core.warning( + `[waitForPodPhases] Could not read pod ${podName}, will retry after backoff: ${ + err instanceof Error ? err.message : String(err) + }` + ) + try { + await backOffManager.backOff() + } catch { + throw new Error( + `Pod ${podName} timed out after ${maxTimeSeconds}s (pod read failed: ${ + err instanceof Error ? err.message : String(err) + })\n${'-'.repeat(60)}\n(pod was unreadable; no further diagnostics available)` + ) } + continue + } + phase = parsePodPhase(pod) + if (awaitingPhases.has(phase)) { + return + } - if (!backOffPhases.has(phase)) { + // The pod reached a phase we are not willing to keep waiting on + // (a terminal/unhealthy phase). First check for unrecoverable + // container-level errors (e.g. OOMKilled, non-zero exit) so they are + // reported with actionable hints. Fall back to the generic "is unhealthy" + // message when no specific error is found. + if (!backOffPhases.has(phase)) { + const errors = await checkUnrecoverableErrors(pod, podName) + const details = await describePodFailure(podName) + if (errors.length > 0) { throw new Error( - `Pod ${podName} is unhealthy with phase status ${phase}` + `Pod ${podName} has unrecoverable errors:\n${errors.join('\n')}\n${'-'.repeat(60)}\n${details}` ) } + throw new Error( + `Pod ${podName} is unhealthy (phase: ${phase})\n${'-'.repeat(60)}\n${details}` + ) + } + + // Still in a back-off phase, but a deterministic unrecoverable error + // was detected (container / event / condition). Fail fast with + // diagnostics instead of waiting out the full timeout. + const errors = await checkUnrecoverableErrors(pod, podName) + if (errors.length > 0) { + const details = await describePodFailure(podName) + throw new Error( + `Pod ${podName} has unrecoverable errors:\n${errors.join('\n')}\n${'-'.repeat(60)}\n${details}` + ) + } + + try { await backOffManager.backOff() + } catch (_err) { + // BackOffManager throws "backoff timeout" when maxTimeSeconds is exceeded. + // Don't surface that bare message: collect diagnostics first so the user + // can see WHY the pod never became ready. + const details = await describePodFailure(podName) + throw new Error( + `Pod ${podName} timed out after ${maxTimeSeconds}s (phase: ${phase})\n${'-'.repeat(60)}\n${details}` + ) } - } catch (error) { - throw new Error(`Pod ${podName} is unhealthy with phase status ${phase}`) } } @@ -414,28 +1592,35 @@ export function getPrepareJobTimeoutSeconds(): number { return timeoutSeconds } -async function getPodPhase(podName: string): Promise { - const podPhaseLookup = new Set([ - PodPhase.PENDING, - PodPhase.RUNNING, - PodPhase.SUCCEEDED, - PodPhase.FAILED, - PodPhase.UNKNOWN - ]) - const { body } = await k8sApi.readNamespacedPod(podName, namespace()) - const pod = body +async function readPod(podName: string): Promise { + return await k8sApi.readNamespacedPod({ + name: podName, + namespace: namespace() + }) +} + +const podPhaseLookup = new Set([ + PodPhase.PENDING, + PodPhase.RUNNING, + PodPhase.SUCCEEDED, + PodPhase.FAILED, + PodPhase.UNKNOWN +]) +export function parsePodPhase(pod: k8s.V1Pod): PodPhase { if (!pod.status?.phase || !podPhaseLookup.has(pod.status.phase)) { return PodPhase.UNKNOWN } - return pod.status?.phase as PodPhase + return pod.status.phase as PodPhase } -async function isJobSucceeded(jobName: string): Promise { - const { body } = await k8sBatchV1Api.readNamespacedJob(jobName, namespace()) - const job = body +async function isJobSucceeded(name: string): Promise { + const job = await k8sBatchV1Api.readNamespacedJob({ + name, + namespace: namespace() + }) if (job.status?.failed) { - throw new Error(`job ${jobName} has failed`) + throw new Error(`job ${name} has failed`) } return !!job.status?.succeeded } @@ -451,34 +1636,32 @@ export async function getPodLogs( process.stdout.write(chunk) }) - logStream.on('error', err => { - process.stderr.write(err.message) - }) - - const r = await log.log(namespace(), podName, containerName, logStream, { + await log.log(namespace(), podName, containerName, logStream, { follow: true, pretty: false, timestamps: false }) - await new Promise(resolve => r.on('close', () => resolve(null))) + await new Promise((resolve, reject) => { + logStream.on('end', () => resolve(null)) + logStream.on('error', err => { + process.stderr.write(err.message) + reject(err) + }) + }) } export async function prunePods(): Promise { - const podList = await k8sApi.listNamespacedPod( - namespace(), - undefined, - undefined, - undefined, - undefined, - new RunnerInstanceLabel().toString() - ) - if (!podList.body.items.length) { + const podList = await k8sApi.listNamespacedPod({ + namespace: namespace(), + labelSelector: new RunnerInstanceLabel().toString() + }) + if (!podList.items.length) { return } await Promise.all( - podList.body.items.map( - pod => pod.metadata?.name && deletePod(pod.metadata.name) + podList.items.map( + async pod => pod.metadata?.name && (await deletePod(pod.metadata.name)) ) ) } @@ -486,16 +1669,16 @@ export async function prunePods(): Promise { export async function getPodStatus( name: string ): Promise { - const { body } = await k8sApi.readNamespacedPod(name, namespace()) - return body.status + const pod = await k8sApi.readNamespacedPod({ + name, + namespace: namespace() + }) + return pod.status } export async function isAuthPermissionsOK(): Promise { const sar = new k8s.V1SelfSubjectAccessReview() - const asyncs: Promise<{ - response: unknown - body: k8s.V1SelfSubjectAccessReview - }>[] = [] + const asyncs: Promise[] = [] for (const resource of requiredPermissions) { for (const verb of resource.verbs) { sar.spec = new k8s.V1SelfSubjectAccessReviewSpec() @@ -505,11 +1688,13 @@ export async function isAuthPermissionsOK(): Promise { sar.spec.resourceAttributes.group = resource.group sar.spec.resourceAttributes.resource = resource.resource sar.spec.resourceAttributes.subresource = resource.subresource - asyncs.push(k8sAuthorizationV1Api.createSelfSubjectAccessReview(sar)) + asyncs.push( + k8sAuthorizationV1Api.createSelfSubjectAccessReview({ body: sar }) + ) } } const responses = await Promise.all(asyncs) - return responses.every(resp => resp.body.status?.allowed) + return responses.every(resp => resp.status?.allowed) } export async function isPodContainerAlpine( @@ -522,60 +1707,44 @@ export async function isPodContainerAlpine( [ 'sh', '-c', - `'[ $(cat /etc/*release* | grep -i -e "^ID=*alpine*" -c) != 0 ] || exit 1'` + `[ $(cat /etc/*release* | grep -i -e "^ID=*alpine*" -c) != 0 ] || exit 1` ], podName, containerName ) - } catch (err) { + } catch { isAlpine = false } return isAlpine } -async function getCurrentNodeName(): Promise { - const resp = await k8sApi.readNamespacedPod(getRunnerPodName(), namespace()) - - const nodeName = resp.body.spec?.nodeName - if (!nodeName) { - throw new Error('Failed to determine node name') - } - return nodeName -} - -async function getPodAffinity(nodeName: string): Promise { - const affinity = new k8s.V1Affinity() - affinity.nodeAffinity = new k8s.V1NodeAffinity() - affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution = - new k8s.V1NodeSelector() - affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms = - [ - { - matchExpressions: [ - { - key: 'kubernetes.io/hostname', - operator: 'In', - values: [nodeName] - } - ] - } - ] - return affinity -} - export function namespace(): string { if (process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE']) { return process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] } const context = kc.getContexts().find(ctx => ctx.namespace) - if (!context?.namespace) { - throw new Error( - 'Failed to determine namespace, falling back to `default`. Namespace should be set in context, or in env variable "ACTIONS_RUNNER_KUBERNETES_NAMESPACE"' - ) + if (context?.namespace) { + return context.namespace } - return context.namespace + + // When running in-cluster the kubeconfig context has no namespace field; + // read it from the mounted ServiceAccount file instead. + const saNamespaceFile = + '/var/run/secrets/kubernetes.io/serviceaccount/namespace' + try { + const ns = fs.readFileSync(saNamespaceFile, 'utf8').trim() + if (ns) { + return ns + } + } catch { + // not running in-cluster, fall through to error + } + + throw new Error( + 'Failed to determine namespace. Set the ACTIONS_RUNNER_KUBERNETES_NAMESPACE environment variable or ensure the kubeconfig context includes a namespace.' + ) } class BackOffManager { @@ -647,6 +1816,23 @@ export function containerPorts( } export async function getPodByName(name): Promise { - const { body } = await k8sApi.readNamespacedPod(name, namespace()) - return body + return await k8sApi.readNamespacedPod({ + name, + namespace: namespace() + }) +} + +export async function getSecretByName(name: string): Promise { + return await k8sApi.readNamespacedSecret({ + name, + namespace: namespace() + }) +} + +export async function listPodsByRunnerInstance(): Promise { + const podList = await k8sApi.listNamespacedPod({ + namespace: namespace(), + labelSelector: new RunnerInstanceLabel().toString() + }) + return podList.items ?? [] } diff --git a/packages/k8s/src/k8s/utils.ts b/packages/k8s/src/k8s/utils.ts deleted file mode 100644 index 2d55279b..00000000 --- a/packages/k8s/src/k8s/utils.ts +++ /dev/null @@ -1,301 +0,0 @@ -import * as k8s from '@kubernetes/client-node' -import * as fs from 'fs' -import * as yaml from 'js-yaml' -import * as core from '@actions/core' -import { Mount } from 'hooklib' -import * as path from 'path' -import { v1 as uuidv4 } from 'uuid' -import { POD_VOLUME_NAME } from './index' -import { CONTAINER_EXTENSION_PREFIX } from '../hooks/constants' -import * as shlex from 'shlex' - -export const DEFAULT_CONTAINER_ENTRY_POINT_ARGS = [`-f`, `/dev/null`] -export const DEFAULT_CONTAINER_ENTRY_POINT = 'tail' - -export const ENV_HOOK_TEMPLATE_PATH = 'ACTIONS_RUNNER_CONTAINER_HOOK_TEMPLATE' -export const ENV_USE_KUBE_SCHEDULER = 'ACTIONS_RUNNER_USE_KUBE_SCHEDULER' - -export function containerVolumes( - userMountVolumes: Mount[] = [], - jobContainer = true, - containerAction = false -): k8s.V1VolumeMount[] { - const mounts: k8s.V1VolumeMount[] = [ - { - name: POD_VOLUME_NAME, - mountPath: '/__w' - } - ] - - const workspacePath = process.env.GITHUB_WORKSPACE as string - if (containerAction) { - const i = workspacePath.lastIndexOf('_work/') - const workspaceRelativePath = workspacePath.slice(i + '_work/'.length) - mounts.push( - { - name: POD_VOLUME_NAME, - mountPath: '/github/workspace', - subPath: workspaceRelativePath - }, - { - name: POD_VOLUME_NAME, - mountPath: '/github/file_commands', - subPath: '_temp/_runner_file_commands' - }, - { - name: POD_VOLUME_NAME, - mountPath: '/github/home', - subPath: '_temp/_github_home' - }, - { - name: POD_VOLUME_NAME, - mountPath: '/github/workflow', - subPath: '_temp/_github_workflow' - } - ) - return mounts - } - - if (!jobContainer) { - return mounts - } - - mounts.push( - { - name: POD_VOLUME_NAME, - mountPath: '/__e', - subPath: 'externals' - }, - { - name: POD_VOLUME_NAME, - mountPath: '/github/home', - subPath: '_temp/_github_home' - }, - { - name: POD_VOLUME_NAME, - mountPath: '/github/workflow', - subPath: '_temp/_github_workflow' - } - ) - - if (!userMountVolumes?.length) { - return mounts - } - - for (const userVolume of userMountVolumes) { - let sourceVolumePath = '' - if (path.isAbsolute(userVolume.sourceVolumePath)) { - if (!userVolume.sourceVolumePath.startsWith(workspacePath)) { - throw new Error( - 'Volume mounts outside of the work folder are not supported' - ) - } - // source volume path should be relative path - sourceVolumePath = userVolume.sourceVolumePath.slice( - workspacePath.length + 1 - ) - } else { - sourceVolumePath = userVolume.sourceVolumePath - } - - mounts.push({ - name: POD_VOLUME_NAME, - mountPath: userVolume.targetVolumePath, - subPath: sourceVolumePath, - readOnly: userVolume.readOnly - }) - } - - return mounts -} - -export function writeEntryPointScript( - workingDirectory: string, - entryPoint: string, - entryPointArgs?: string[], - prependPath?: string[], - environmentVariables?: { [key: string]: string } -): { containerPath: string; runnerPath: string } { - let exportPath = '' - if (prependPath?.length) { - // TODO: remove compatibility with typeof prependPath === 'string' as we bump to next major version, the hooks will lose PrependPath compat with runners 2.293.0 and older - const prepend = - typeof prependPath === 'string' ? prependPath : prependPath.join(':') - exportPath = `export PATH=${prepend}:$PATH` - } - let environmentPrefix = '' - - if (environmentVariables && Object.entries(environmentVariables).length) { - const envBuffer: string[] = [] - for (const [key, value] of Object.entries(environmentVariables)) { - if ( - key.includes(`=`) || - key.includes(`'`) || - key.includes(`"`) || - key.includes(`$`) - ) { - throw new Error( - `environment key ${key} is invalid - the key must not contain =, $, ', or "` - ) - } - envBuffer.push( - `"${key}=${value - .replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\$/g, '\\$') - .replace(/`/g, '\\`')}"` - ) - } - environmentPrefix = `env ${envBuffer.join(' ')} ` - } - - const content = `#!/bin/sh -l -${exportPath} -cd ${workingDirectory} && \ -exec ${environmentPrefix} ${entryPoint} ${ - entryPointArgs?.length ? entryPointArgs.join(' ') : '' - } -` - const filename = `${uuidv4()}.sh` - const entryPointPath = `${process.env.RUNNER_TEMP}/${filename}` - fs.writeFileSync(entryPointPath, content) - return { - containerPath: `/__w/_temp/${filename}`, - runnerPath: entryPointPath - } -} - -export function generateContainerName(image: string): string { - const nameWithTag = image.split('/').pop() - const name = nameWithTag?.split(':').at(0) - - if (!name) { - throw new Error(`Image definition '${image}' is invalid`) - } - - return name -} - -// Overwrite or append based on container options -// -// Keep in mind, envs and volumes could be passed as fields in container definition -// so default volume mounts and envs are appended first, and then create options are used -// to append more values -// -// Rest of the fields are just applied -// For example, container.createOptions.container.image is going to overwrite container.image field -export function mergeContainerWithOptions( - base: k8s.V1Container, - from: k8s.V1Container -): void { - for (const [key, value] of Object.entries(from)) { - if (key === 'name') { - if (value !== CONTAINER_EXTENSION_PREFIX + base.name) { - core.warning("Skipping name override: name can't be overwritten") - } - continue - } else if (key === 'image') { - core.warning("Skipping image override: image can't be overwritten") - continue - } else if (key === 'env') { - const envs = value as k8s.V1EnvVar[] - base.env = mergeLists(base.env, envs) - } else if (key === 'volumeMounts' && value) { - const volumeMounts = value as k8s.V1VolumeMount[] - base.volumeMounts = mergeLists(base.volumeMounts, volumeMounts) - } else if (key === 'ports' && value) { - const ports = value as k8s.V1ContainerPort[] - base.ports = mergeLists(base.ports, ports) - } else { - base[key] = value - } - } -} - -export function mergePodSpecWithOptions( - base: k8s.V1PodSpec, - from: k8s.V1PodSpec -): void { - for (const [key, value] of Object.entries(from)) { - if (key === 'containers') { - base.containers.push( - ...from.containers.filter( - e => !e.name?.startsWith(CONTAINER_EXTENSION_PREFIX) - ) - ) - } else if (key === 'volumes' && value) { - const volumes = value as k8s.V1Volume[] - base.volumes = mergeLists(base.volumes, volumes) - } else { - base[key] = value - } - } -} - -export function mergeObjectMeta( - base: { metadata?: k8s.V1ObjectMeta }, - from: k8s.V1ObjectMeta -): void { - if (!base.metadata?.labels || !base.metadata?.annotations) { - throw new Error( - "Can't merge metadata: base.metadata or base.annotations field is undefined" - ) - } - if (from?.labels) { - for (const [key, value] of Object.entries(from.labels)) { - if (base.metadata?.labels?.[key]) { - core.warning(`Label ${key} is already defined and will be overwritten`) - } - base.metadata.labels[key] = value - } - } - - if (from?.annotations) { - for (const [key, value] of Object.entries(from.annotations)) { - if (base.metadata?.annotations?.[key]) { - core.warning( - `Annotation ${key} is already defined and will be overwritten` - ) - } - base.metadata.annotations[key] = value - } - } -} - -export function readExtensionFromFile(): k8s.V1PodTemplateSpec | undefined { - const filePath = process.env[ENV_HOOK_TEMPLATE_PATH] - if (!filePath) { - return undefined - } - const doc = yaml.load(fs.readFileSync(filePath, 'utf8')) - if (!doc || typeof doc !== 'object') { - throw new Error(`Failed to parse ${filePath}`) - } - return doc as k8s.V1PodTemplateSpec -} - -export function useKubeScheduler(): boolean { - return process.env[ENV_USE_KUBE_SCHEDULER] === 'true' -} - -export enum PodPhase { - PENDING = 'Pending', - RUNNING = 'Running', - SUCCEEDED = 'Succeeded', - FAILED = 'Failed', - UNKNOWN = 'Unknown', - COMPLETED = 'Completed' -} - -function mergeLists(base?: T[], from?: T[]): T[] { - const b: T[] = base || [] - if (!from?.length) { - return b - } - b.push(...from) - return b -} - -export function fixArgs(args: string[]): string[] { - return shlex.split(args.join(' ')) -} diff --git a/packages/k8s/src/k8s/utils/heartbeat.spec.ts b/packages/k8s/src/k8s/utils/heartbeat.spec.ts new file mode 100644 index 00000000..e264c24c --- /dev/null +++ b/packages/k8s/src/k8s/utils/heartbeat.spec.ts @@ -0,0 +1,213 @@ +import { parsePositiveMsEnv, WebSocketHeartbeat } from '../heartbeat' + +vi.mock('@actions/core', () => ({ + debug: vi.fn(), + error: vi.fn(), + warning: vi.fn(), + info: vi.fn() +})) + +// ── parsePositiveMsEnv ──────────────────────────────────────────────────────── + +describe('parsePositiveMsEnv', () => { + it('returns fallback when value is undefined', () => { + expect(parsePositiveMsEnv(undefined, 500)).toBe(500) + }) + + it('returns fallback when value is empty string', () => { + expect(parsePositiveMsEnv('', 500)).toBe(500) + }) + + it('returns fallback when value is non-numeric', () => { + expect(parsePositiveMsEnv('bad', 500)).toBe(500) + }) + + it('returns fallback when value is zero', () => { + expect(parsePositiveMsEnv('0', 500)).toBe(500) + }) + + it('returns fallback when value is negative', () => { + expect(parsePositiveMsEnv('-100', 500)).toBe(500) + }) + + it('returns parsed value when positive integer', () => { + expect(parsePositiveMsEnv('3000', 500)).toBe(3000) + }) + + it('returns parsed value for large numbers', () => { + expect(parsePositiveMsEnv('60000', 500)).toBe(60000) + }) + + it('truncates float to integer', () => { + expect(parsePositiveMsEnv('1500.9', 500)).toBe(1500) + }) +}) + +// ── WebSocketHeartbeat ──────────────────────────────────────────────────────── + +function makeMockWs() { + const listeners: Record void)[]> = {} + return { + readyState: 1, + ping: vi.fn(), + close: vi.fn(), + on(event: string, listener: (...args: any[]) => void) { + listeners[event] = listeners[event] || [] + listeners[event].push(listener) + return this + }, + once(event: string, listener: (...args: any[]) => void) { + listeners[event] = listeners[event] || [] + listeners[event].push(listener) + return this + }, + emit(event: string, ...args: any[]) { + ;(listeners[event] || []).forEach(fn => fn(...args)) + } + } +} + +describe('WebSocketHeartbeat', () => { + beforeEach(() => { + vi.useFakeTimers() + }) + + afterEach(() => { + vi.useRealTimers() + }) + + it('start attaches and sends pings on interval', () => { + const ws = makeMockWs() + const hb = new WebSocketHeartbeat(1000, 2000) + hb.start(ws as any) + vi.advanceTimersByTime(1100) + expect(ws.ping).toHaveBeenCalled() + }) + + it('stop clears intervals without throwing', () => { + const ws = makeMockWs() + const hb = new WebSocketHeartbeat(1000, 2000) + hb.start(ws as any) + expect(() => hb.stop()).not.toThrow() + }) + + it('stop is safe to call before start', () => { + const hb = new WebSocketHeartbeat(1000, 2000) + expect(() => hb.stop()).not.toThrow() + }) + + it('stop called after ping does not throw', () => { + const ws = makeMockWs() + const hb = new WebSocketHeartbeat(500, 5000) + hb.start(ws as any) + vi.advanceTimersByTime(600) + expect(ws.ping).toHaveBeenCalled() + hb.stop() + }) + + it('emits pong and arms deadline after first ping', () => { + const ws = makeMockWs() + const hb = new WebSocketHeartbeat(500, 5000) + hb.start(ws as any) + // First ping arms the deadline + vi.advanceTimersByTime(600) + expect(ws.ping).toHaveBeenCalledTimes(1) + // Emit pong — should reset pong timeout + ws.emit('pong') + // Advance past the next ping interval + vi.advanceTimersByTime(500) + expect(ws.ping).toHaveBeenCalledTimes(2) + }) + + it('rejects when pong deadline elapses with no pong', () => { + const ws = makeMockWs() + const hb = new WebSocketHeartbeat(500, 1000) + const reject = vi.fn() + hb.start(ws as any, reject) + // First ping arms the deadline (1000ms) + vi.advanceTimersByTime(600) + expect(ws.ping).toHaveBeenCalledTimes(1) + // Advance past the pong deadline without emitting pong + vi.advanceTimersByTime(1100) + expect(reject).toHaveBeenCalled() + expect(reject.mock.calls[0][0]).toBeInstanceOf(Error) + expect(reject.mock.calls[0][0].message).toMatch(/heartbeat timeout/) + }) + + it('closes websocket when pong deadline elapses', () => { + const ws = makeMockWs() + const hb = new WebSocketHeartbeat(500, 1000) + hb.start(ws as any, () => {}) + vi.advanceTimersByTime(600) // first ping, arms deadline + vi.advanceTimersByTime(1100) // deadline elapses + expect(ws.close).toHaveBeenCalled() + }) + + it('stops heartbeat on websocket error event', () => { + const ws = makeMockWs() + const hb = new WebSocketHeartbeat(500, 5000) + hb.start(ws as any) + ws.emit('error', new Error('socket died')) + // Advance timers; interval should have been cleared so no more pings + vi.advanceTimersByTime(2000) + expect(ws.ping).toHaveBeenCalledTimes(0) + }) + + it('stops heartbeat on websocket close event', () => { + const ws = makeMockWs() + const hb = new WebSocketHeartbeat(500, 5000) + hb.start(ws as any) + vi.advanceTimersByTime(600) // first ping + ws.emit('close') + const pingCountAfterClose = ws.ping.mock.calls.length + vi.advanceTimersByTime(2000) + expect(ws.ping.mock.calls.length).toBe(pingCountAfterClose) + }) + + it('skips ping while websocket is in CONNECTING state', () => { + const ws = makeMockWs() + ws.readyState = 0 // CONNECTING + const hb = new WebSocketHeartbeat(500, 5000) + hb.start(ws as any) + vi.advanceTimersByTime(2000) + expect(ws.ping).not.toHaveBeenCalled() + }) + + it('stops heartbeat when websocket transitions to CLOSING', () => { + const ws = makeMockWs() + const hb = new WebSocketHeartbeat(500, 5000) + hb.start(ws as any) + vi.advanceTimersByTime(600) // OPEN → first ping fires + ws.readyState = 2 // CLOSING + vi.advanceTimersByTime(600) // next tick sees CLOSING → stop + const pingsAfterTransition = ws.ping.mock.calls.length + vi.advanceTimersByTime(2000) + expect(ws.ping.mock.calls.length).toBe(pingsAfterTransition) + }) + + it('catches errors thrown by ws.ping without crashing', () => { + const ws = makeMockWs() + ws.ping = vi.fn(() => { + throw new Error('ping failed') + }) + const hb = new WebSocketHeartbeat(500, 5000) + hb.start(ws as any) + vi.advanceTimersByTime(600) + // ping threw → heartbeat should stop, no further pings + vi.advanceTimersByTime(2000) + expect(ws.ping).toHaveBeenCalledTimes(1) + }) + + it('catches errors thrown by ws.close during pong deadline', () => { + const ws = makeMockWs() + ws.close = vi.fn(() => { + throw new Error('already closing') + }) + const hb = new WebSocketHeartbeat(500, 1000) + hb.start(ws as any, () => {}) + vi.advanceTimersByTime(600) // first ping arms deadline + vi.advanceTimersByTime(1100) // deadline elapses → close() throws, swallowed + // Test passes if no uncaught exception was thrown + expect(ws.close).toHaveBeenCalled() + }) +}) diff --git a/packages/k8s/src/k8s/utils/hooks-prepare-job.spec.ts b/packages/k8s/src/k8s/utils/hooks-prepare-job.spec.ts new file mode 100644 index 00000000..1043ad22 --- /dev/null +++ b/packages/k8s/src/k8s/utils/hooks-prepare-job.spec.ts @@ -0,0 +1,507 @@ +import * as fs from 'fs' +import * as os from 'os' +import * as path from 'path' +import * as k8s from '@kubernetes/client-node' + +vi.mock('@actions/core', () => ({ + debug: vi.fn(), + error: vi.fn(), + warning: vi.fn(), + info: vi.fn() +})) + +vi.mock('../index', () => ({ + containerPorts: vi.fn().mockReturnValue([]), + createJobPod: vi.fn(), + execCpToPod: vi.fn().mockResolvedValue(undefined), + execPodStep: vi.fn().mockResolvedValue(0), + isPodContainerAlpine: vi.fn().mockResolvedValue(false), + prunePods: vi.fn().mockResolvedValue(undefined), + waitForPodPhases: vi.fn().mockResolvedValue(undefined), + getPrepareJobTimeoutSeconds: vi.fn().mockReturnValue(60) +})) + +import { createContainerSpec, prepareJob } from '../../hooks/prepare-job' +import * as k8sMod from '../index' +import { JOB_CONTAINER_NAME } from '../../hooks/constants' +import { CONTAINER_VOLUMES } from './index' + +function makeTmpDir(): string { + const d = path.join(os.tmpdir(), `pj-spec-${Date.now()}`) + fs.mkdirSync(d, { recursive: true }) + return d +} + +function makeArgs(overrides: Record = {}) { + return { + container: { + image: 'ubuntu:latest', + entryPoint: 'sh', + entryPointArgs: ['-c', 'sleep 1'], + environmentVariables: {}, + portMappings: [], + userMountVolumes: [] + }, + services: [], + ...overrides + } +} + +function makePod(name = 'job-pod'): k8s.V1Pod { + return { + metadata: { name }, + spec: { + containers: [ + { name: JOB_CONTAINER_NAME, image: 'ubuntu:latest', ports: [] } + ] + }, + status: {} + } as k8s.V1Pod +} + +// ── createContainerSpec ──────────────────────────────────────────────────────── + +describe('createContainerSpec', () => { + it('sets image and name', () => { + const c = createContainerSpec( + { image: 'node:22', entryPoint: 'node' } as any, + 'c' + ) + expect(c.image).toBe('node:22') + expect(c.name).toBe('c') + }) + + it('sets default entryPoint for job container when none given', () => { + const c = createContainerSpec( + { image: 'ubuntu:latest' } as any, + JOB_CONTAINER_NAME, + true + ) + expect(c.command).toEqual(['tail']) + expect(c.args).toEqual(['-f', '/dev/null']) + }) + + it('does not set default entryPoint for service container', () => { + const c = createContainerSpec( + { image: 'redis:latest' } as any, + 'redis', + false + ) + expect(c.command).toBeUndefined() + expect(c.args).toBeUndefined() + }) + + it('sets command and args when entryPoint given', () => { + const c = createContainerSpec( + { + image: 'ubuntu:latest', + entryPoint: 'sh', + entryPointArgs: ['--'] + } as any, + 'c' + ) + expect(c.command).toEqual(['sh']) + expect(c.args).toBeDefined() + }) + + it('sets workingDir', () => { + const c = createContainerSpec( + { + image: 'ubuntu:latest', + workingDirectory: '/app', + entryPoint: 'sh' + } as any, + 'c' + ) + expect(c.workingDir).toBe('/app') + }) + + it('injects GITHUB_ACTIONS=true', () => { + const c = createContainerSpec( + { image: 'ubuntu:latest', entryPoint: 'sh' } as any, + 'c' + ) + expect(c.env).toEqual( + expect.arrayContaining([{ name: 'GITHUB_ACTIONS', value: 'true' }]) + ) + }) + + it('injects CI=true when not set', () => { + const c = createContainerSpec( + { image: 'ubuntu:latest', entryPoint: 'sh' } as any, + 'c' + ) + expect(c.env).toEqual( + expect.arrayContaining([{ name: 'CI', value: 'true' }]) + ) + }) + + it('preserves existing CI env', () => { + const c = createContainerSpec( + { + image: 'ubuntu:latest', + entryPoint: 'sh', + environmentVariables: { CI: 'false' } + } as any, + 'c' + ) + const ci = (c.env || []).filter(e => e.name === 'CI') + expect(ci).toHaveLength(1) + expect(ci[0].value).toBe('false') + }) + + it('skips HOME env var', () => { + const c = createContainerSpec( + { + image: 'ubuntu:latest', + entryPoint: 'sh', + environmentVariables: { HOME: '/root' } + } as any, + 'c' + ) + expect((c.env || []).some(e => e.name === 'HOME')).toBe(false) + }) + + it('attaches CONTAINER_VOLUMES as volumeMounts', () => { + const c = createContainerSpec( + { image: 'ubuntu:latest', entryPoint: 'sh' } as any, + 'c' + ) + expect(c.volumeMounts).toEqual(CONTAINER_VOLUMES) + }) + + it('applies extension overrides', () => { + const ext: k8s.V1PodTemplateSpec = { + spec: { + containers: [ + { + name: '$c', + resources: { requests: { cpu: '500m' } } + } as k8s.V1Container + ] + } + } + const c = createContainerSpec( + { image: 'ubuntu:latest', entryPoint: 'sh' } as any, + 'c', + false, + ext + ) + expect(c.resources?.requests?.cpu).toBe('500m') + }) +}) + +// ── prepareJob ──────────────────────────────────────────────────────────────── + +describe('prepareJob', () => { + let tmpDir: string + let responseFile: string + + beforeEach(() => { + tmpDir = makeTmpDir() + responseFile = path.join(tmpDir, 'response.json') + fs.writeFileSync(responseFile, '') + process.env.RUNNER_WORKSPACE = '/__w/repo' + process.env.RUNNER_TEMP = tmpDir + process.env.GITHUB_WORKSPACE = '/__w/repo/repo' + process.env.ACTIONS_RUNNER_POD_NAME = 'runner-pod' + process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE = 'default' + vi.mocked(k8sMod.createJobPod).mockResolvedValue(makePod()) + vi.mocked(k8sMod.waitForPodPhases).mockResolvedValue(undefined) + vi.mocked(k8sMod.isPodContainerAlpine).mockResolvedValue(false) + vi.mocked(k8sMod.execCpToPod).mockResolvedValue(undefined) + vi.mocked(k8sMod.prunePods).mockResolvedValue(undefined) + }) + + afterEach(() => { + vi.clearAllMocks() + fs.rmSync(tmpDir, { recursive: true, force: true }) + delete process.env.RUNNER_WORKSPACE + delete process.env.RUNNER_TEMP + delete process.env.GITHUB_WORKSPACE + delete process.env.ACTIONS_RUNNER_POD_NAME + delete process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE + }) + + it('throws when container is missing', async () => { + const args = makeArgs() + ;(args as any).container = undefined + await expect(prepareJob(args as any, responseFile)).rejects.toThrow( + 'Job Container is required' + ) + }) + + it('throws when no container image and no services', async () => { + const args = makeArgs() + ;(args as any).container = { image: '' } + args.services = [] + await expect(prepareJob(args as any, responseFile)).rejects.toThrow() + }) + + it('throws with structured message when createJobPod fails', async () => { + vi.mocked(k8sMod.createJobPod).mockRejectedValue( + new Error( + 'HTTP-Code: 422\nMessage: Unprocessable\nBody: "{\\"kind\\":\\"Status\\",\\"message\\":\\"Duplicate value\\"}"' + + '\nHeaders: {}' + ) + ) + await expect(prepareJob(makeArgs() as any, responseFile)).rejects.toThrow( + 'failed to create job pod' + ) + expect(k8sMod.prunePods).toHaveBeenCalledTimes(2) + }) + + it('throws when createJobPod fails with generic error', async () => { + vi.mocked(k8sMod.createJobPod).mockRejectedValue(new Error('timeout')) + await expect(prepareJob(makeArgs() as any, responseFile)).rejects.toThrow( + 'failed to create job pod' + ) + }) + + it('throws pod failed message when waitForPodPhases rejects', async () => { + vi.mocked(k8sMod.waitForPodPhases).mockRejectedValue(new Error('pod stuck')) + await expect(prepareJob(makeArgs() as any, responseFile)).rejects.toThrow( + 'pod failed to come online' + ) + expect(k8sMod.prunePods).toHaveBeenCalledTimes(2) + }) + + it('throws when RUNNER_WORKSPACE is not set', async () => { + delete process.env.RUNNER_WORKSPACE + await expect(prepareJob(makeArgs() as any, responseFile)).rejects.toThrow( + 'RUNNER_WORKSPACE' + ) + }) + + it('throws when isPodContainerAlpine rejects', async () => { + vi.mocked(k8sMod.isPodContainerAlpine).mockRejectedValue( + new Error('exec failed') + ) + await expect(prepareJob(makeArgs() as any, responseFile)).rejects.toThrow( + 'failed to determine if the pod is alpine' + ) + }) + + it('writes response file with jobPod and isAlpine=false on success', async () => { + await prepareJob(makeArgs() as any, responseFile) + const content = JSON.parse(fs.readFileSync(responseFile, 'utf8')) + expect(content.state.jobPod).toBe('job-pod') + expect(content.isAlpine).toBe(false) + }) + + it('sets isAlpine=true when alpine detected', async () => { + vi.mocked(k8sMod.isPodContainerAlpine).mockResolvedValue(true) + await prepareJob(makeArgs() as any, responseFile) + const content = JSON.parse(fs.readFileSync(responseFile, 'utf8')) + expect(content.isAlpine).toBe(true) + }) + + it('deduplicates colliding service names', async () => { + const args = makeArgs() as any + args.services = [ + { image: 'redis:latest', portMappings: [], environmentVariables: {} }, + { image: 'redis:latest', portMappings: [], environmentVariables: {} } + ] + vi.mocked(k8sMod.createJobPod).mockImplementation( + async (_name, _container, services) => + Promise.resolve({ + metadata: { name: 'job-pod' }, + spec: { + containers: [ + { name: JOB_CONTAINER_NAME, image: 'ubuntu:latest', ports: [] }, + ...((services || []) as k8s.V1Container[]).map(s => ({ + name: s.name, + image: s.image, + ports: [] + })) + ] + }, + status: {} + } as k8s.V1Pod) + ) + await prepareJob(args, responseFile) + const content = JSON.parse(fs.readFileSync(responseFile, 'utf8')) + expect(content.context.services).toHaveLength(2) + }) + + it('writes service container ports to response file', async () => { + const args = makeArgs() as any + args.services = [ + { + image: 'redis:latest', + portMappings: ['6379:6379'], + environmentVariables: {} + } + ] + vi.mocked(k8sMod.createJobPod).mockResolvedValue({ + metadata: { name: 'job-pod' }, + spec: { + containers: [ + { name: JOB_CONTAINER_NAME, image: 'ubuntu:latest', ports: [] }, + { + name: 'redis', + image: 'redis:latest', + ports: [{ containerPort: 6379, hostPort: 6379 }] + } + ] + }, + status: {} + } as k8s.V1Pod) + await prepareJob(args, responseFile) + const content = JSON.parse(fs.readFileSync(responseFile, 'utf8')) + expect(content.context.services).toHaveLength(1) + expect(content.context.services[0].ports['6379']).toBe('6379') + }) + + it('extracts k8s body message with headers section', async () => { + // Multi-line message with Headers section present — covers the + // raw.lastIndexOf('"', headersIdx) path + vi.mocked(k8sMod.createJobPod).mockRejectedValue( + new Error( + 'HTTP-Code: 422\nMessage: Unprocessable\nBody: "{\\"kind\\":\\"Status\\",\\"message\\":\\"spec is invalid\\"}"\nHeaders: {"content-type":"application/json"}' + ) + ) + await expect(prepareJob(makeArgs() as any, responseFile)).rejects.toThrow( + 'spec is invalid' + ) + }) + + it('falls back to bodyStr when body is non-JSON', async () => { + vi.mocked(k8sMod.createJobPod).mockRejectedValue( + new Error('HTTP-Code: 502\nBody: "Bad Gateway"\nHeaders: {}') + ) + await expect(prepareJob(makeArgs() as any, responseFile)).rejects.toThrow( + 'Bad Gateway' + ) + }) + + it('runs prepareScript when userMountVolumes are present', async () => { + const args = makeArgs() as any + args.container.userMountVolumes = [ + { + sourceVolumePath: '/src/vol1', + targetVolumePath: '/mnt/vol1', + readOnly: false + } + ] + await prepareJob(args, responseFile) + // execPodStep and execCpToPod are both called for the prepare script flow + expect(k8sMod.execPodStep).toHaveBeenCalled() + expect(k8sMod.execCpToPod).toHaveBeenCalledWith( + 'job-pod', + '/src/vol1', + '/mnt/vol1' + ) + }) + + it('throws when created pod has no metadata.name', async () => { + vi.mocked(k8sMod.createJobPod).mockResolvedValue({} as k8s.V1Pod) + await expect(prepareJob(makeArgs() as any, responseFile)).rejects.toThrow( + 'created pod should have metadata.name' + ) + }) + + it('uses services fallback when serviceNames is empty', async () => { + // When serviceNames is empty but services are present, the response + // generator falls back to args.services.map(generateContainerName). + const args = makeArgs() as any + args.services = [ + { + image: 'redis:latest', + portMappings: [], + environmentVariables: {} + } + ] + vi.mocked(k8sMod.createJobPod).mockResolvedValue({ + metadata: { name: 'job-pod' }, + spec: { + containers: [ + { name: JOB_CONTAINER_NAME, image: 'ubuntu:latest', ports: [] }, + { name: 'redis', image: 'redis:latest', ports: [] } + ] + }, + status: {} + } as k8s.V1Pod) + await prepareJob(args, responseFile) + const content = JSON.parse(fs.readFileSync(responseFile, 'utf8')) + expect(content.context.services).toHaveLength(1) + }) + + it('executes prepareScript and copies userMountVolumes when present', async () => { + // Covers prepare-job.ts lines 197-215 (prepareScript branch) + const args = makeArgs() as any + args.container.userMountVolumes = [ + { + sourceVolumePath: '/src/data', + targetVolumePath: '/mnt/data', + readOnly: false + } + ] + await prepareJob(args, responseFile) + // execPodStep called for prepareScript sh command + expect(k8sMod.execPodStep).toHaveBeenCalledWith( + expect.arrayContaining(['sh', '-e']), + 'job-pod', + expect.any(String) + ) + // execCpToPod called for the volume copy + expect(k8sMod.execCpToPod).toHaveBeenCalledWith( + 'job-pod', + '/src/data', + '/mnt/data' + ) + }) + + it('deduplicates colliding service image names with -0/-1 suffix', async () => { + // Covers prepare-job.ts lines 80-81 (total > 1 branch) + const args = makeArgs() as any + args.services = [ + { image: 'redis:latest', portMappings: [], environmentVariables: {} }, + { image: 'redis:latest', portMappings: [], environmentVariables: {} } + ] + vi.mocked(k8sMod.createJobPod).mockImplementation( + async (_name, _container, services) => + ({ + metadata: { name: 'job-pod' }, + spec: { + containers: [ + { name: JOB_CONTAINER_NAME, image: 'ubuntu:latest', ports: [] }, + ...((services || []) as k8s.V1Container[]).map(s => ({ + name: s.name, + image: s.image, + ports: [] + })) + ] + }, + status: {} + }) as k8s.V1Pod + ) + await prepareJob(args, responseFile) + const content = JSON.parse(fs.readFileSync(responseFile, 'utf8')) + expect(content.context.services).toHaveLength(2) + }) + + it('extracts message from plain-text k8s error body', async () => { + // Covers prepare-job.ts lines 141-142: bodyStr is plain text (not JSON) + vi.mocked(k8sMod.createJobPod).mockRejectedValue( + new Error( + 'HTTP-Code: 502\nMessage: Bad Gateway\nBody: "upstream timeout"\nHeaders: {}' + ) + ) + await expect(prepareJob(makeArgs() as any, responseFile)).rejects.toThrow( + 'failed to create job pod' + ) + }) + + it('falls through to raw detail when body JSON has no message field', async () => { + // Covers prepare-job.ts line 146: parsed is JSON but has no message field + vi.mocked(k8sMod.createJobPod).mockRejectedValue( + new Error( + 'HTTP-Code: 422\nMessage: err\nBody: "{\\"kind\\":\\"Status\\",\\"reason\\":\\"Invalid\\"}"\nHeaders: {}' + ) + ) + await expect(prepareJob(makeArgs() as any, responseFile)).rejects.toThrow( + 'failed to create job pod' + ) + }) +}) diff --git a/packages/k8s/src/k8s/utils/hooks-run-container-step.spec.ts b/packages/k8s/src/k8s/utils/hooks-run-container-step.spec.ts new file mode 100644 index 00000000..ef8a2ffb --- /dev/null +++ b/packages/k8s/src/k8s/utils/hooks-run-container-step.spec.ts @@ -0,0 +1,343 @@ +import * as fs from 'fs' +import * as os from 'os' +import * as path from 'path' +import * as k8s from '@kubernetes/client-node' +import { RunContainerStepArgs } from 'hooklib' + +vi.mock('@actions/core', () => ({ + debug: vi.fn(), + error: vi.fn(), + warning: vi.fn(), + info: vi.fn() +})) + +vi.mock('../index', () => ({ + createContainerStepPod: vi.fn(), + deletePod: vi.fn().mockResolvedValue(undefined), + describePodFailure: vi.fn().mockResolvedValue(''), + execCpFromPod: vi.fn().mockResolvedValue(undefined), + execCpToPod: vi.fn().mockResolvedValue(undefined), + execPodStepWithOutput: vi.fn().mockResolvedValue({ code: 0, output: '' }), + getContainerTerminatedErrors: vi.fn().mockReturnValue([]), + getPodByName: vi.fn(), + getPrepareJobTimeoutSeconds: vi.fn().mockReturnValue(60), + getTerminatedReasonHint: vi.fn().mockReturnValue(' → hint'), + waitForPodPhases: vi.fn().mockResolvedValue(undefined) +})) + +vi.mock('./index', async importOriginal => { + const real = await importOriginal() + return { + ...real, + writeContainerStepScript: vi.fn().mockReturnValue({ + containerPath: '/__w/_temp/script.sh', + runnerPath: '/tmp/script.sh' + }) + } +}) + +import { runContainerStep } from '../../hooks/run-container-step' +import * as k8sMod from '../index' + +function makeTmpDir(): string { + const d = path.join(os.tmpdir(), `rcs-spec-${Date.now()}`) + fs.mkdirSync(d, { recursive: true }) + return d +} + +function makeArgs( + overrides: Partial = {} +): RunContainerStepArgs { + return { + image: 'ubuntu:latest', + entryPoint: 'sh', + entryPointArgs: ['-c', 'echo hi'], + environmentVariables: {}, + ...overrides + } as RunContainerStepArgs +} + +function makePod( + name = 'step-pod', + containerStatuses?: k8s.V1ContainerStatus[] +): k8s.V1Pod { + return { + metadata: { name }, + status: { containerStatuses } + } as k8s.V1Pod +} + +describe('runContainerStep — argument validation', () => { + it('throws when dockerfile is set', async () => { + await expect( + runContainerStep(makeArgs({ dockerfile: 'Dockerfile' } as any)) + ).rejects.toThrow('Building container actions is not currently supported') + }) + + it('throws when entryPoint is missing', async () => { + await expect( + runContainerStep(makeArgs({ entryPoint: '' })) + ).rejects.toThrow( + 'failed to start the container since the entrypoint is overwritten' + ) + }) +}) + +describe('runContainerStep — createContainerStepPod failure', () => { + beforeEach(() => { + process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE = 'default' + process.env.ACTIONS_RUNNER_POD_NAME = 'runner-pod' + }) + afterEach(() => { + vi.clearAllMocks() + delete process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE + delete process.env.ACTIONS_RUNNER_POD_NAME + }) + + it('wraps error with failed to run container step', async () => { + vi.mocked(k8sMod.createContainerStepPod).mockRejectedValue( + new Error('quota exceeded') + ) + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'failed to run container step: quota exceeded' + ) + }) + + it('extracts k8s body message when available', async () => { + vi.mocked(k8sMod.createContainerStepPod).mockRejectedValue({ + response: { body: { message: 'limit reached' } } + }) + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'failed to run container step: limit reached' + ) + }) +}) + +describe('runContainerStep — pod missing metadata.name', () => { + beforeEach(() => { + process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE = 'default' + process.env.ACTIONS_RUNNER_POD_NAME = 'runner-pod' + vi.mocked(k8sMod.createContainerStepPod).mockResolvedValue({} as k8s.V1Pod) + }) + afterEach(() => { + vi.clearAllMocks() + delete process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE + delete process.env.ACTIONS_RUNNER_POD_NAME + }) + + it('throws when pod has no metadata.name', async () => { + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'to have correctly set the metadata.name' + ) + }) +}) + +describe('runContainerStep — execution paths', () => { + let tmpDir: string + + beforeEach(() => { + tmpDir = makeTmpDir() + process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE = 'default' + process.env.ACTIONS_RUNNER_POD_NAME = 'runner-pod' + process.env.RUNNER_WORKSPACE = '/__w/repo' + process.env.GITHUB_WORKSPACE = '/__w/repo/repo' + process.env.RUNNER_TEMP = tmpDir + vi.mocked(k8sMod.createContainerStepPod).mockResolvedValue(makePod()) + vi.mocked(k8sMod.waitForPodPhases).mockResolvedValue(undefined) + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 0, + output: '' + }) + vi.mocked(k8sMod.getPodByName).mockResolvedValue(makePod()) + vi.mocked(k8sMod.getContainerTerminatedErrors).mockReturnValue([]) + vi.mocked(k8sMod.describePodFailure).mockResolvedValue('') + }) + + afterEach(() => { + vi.clearAllMocks() + fs.rmSync(tmpDir, { recursive: true, force: true }) + delete process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE + delete process.env.ACTIONS_RUNNER_POD_NAME + delete process.env.RUNNER_WORKSPACE + delete process.env.GITHUB_WORKSPACE + delete process.env.RUNNER_TEMP + }) + + it('returns 0 on success', async () => { + expect(await runContainerStep(makeArgs())).toBe(0) + expect(k8sMod.deletePod).toHaveBeenCalledWith('step-pod') + }) + + it('deletes pod even on failure', async () => { + vi.mocked(k8sMod.execPodStepWithOutput).mockRejectedValue( + new Error('crash') + ) + await expect(runContainerStep(makeArgs())).rejects.toThrow() + expect(k8sMod.deletePod).toHaveBeenCalledWith('step-pod') + }) + + it('re-throws classified error verbatim (failed to run script step prefix)', async () => { + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 1, + output: '' + }) + vi.mocked(k8sMod.getPodByName).mockResolvedValue( + makePod('step-pod', [ + { + name: 'job', + state: { terminated: { reason: 'Completed', exitCode: 1 } } + } as k8s.V1ContainerStatus + ]) + ) + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'failed to run script step' + ) + }) + + it('wraps k8s exec errors with failed to run container step', async () => { + vi.mocked(k8sMod.execPodStepWithOutput).mockRejectedValue( + new Error('websocket error') + ) + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'failed to run container step' + ) + }) + + it('classifies OOMKilled as container fault', async () => { + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 137, + output: '' + }) + vi.mocked(k8sMod.getPodByName).mockResolvedValue( + makePod('step-pod', [ + { + name: 'job', + state: { terminated: { reason: 'OOMKilled', exitCode: 137 } } + } as k8s.V1ContainerStatus + ]) + ) + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'failed to run script step' + ) + }) + + it('injects GITHUB_ACTIONS and CI into envs', async () => { + const args = makeArgs({ environmentVariables: {} }) + await runContainerStep(args) + expect(args.environmentVariables?.['GITHUB_ACTIONS']).toBe('true') + expect(args.environmentVariables?.['CI']).toBe('true') + }) + + it('does not overwrite existing CI env', async () => { + const args = makeArgs({ environmentVariables: { CI: 'false' } }) + await runContainerStep(args) + expect(args.environmentVariables?.['CI']).toBe('false') + }) + + it('throws when RUNNER_WORKSPACE is not set', async () => { + delete process.env.RUNNER_WORKSPACE + await expect(runContainerStep(makeArgs())).rejects.toThrow() + expect(k8sMod.deletePod).toHaveBeenCalled() + }) + + it('logs terminated errors via describePodFailure', async () => { + vi.mocked(k8sMod.waitForPodPhases).mockRejectedValue( + new Error('pod failed') + ) + vi.mocked(k8sMod.getContainerTerminatedErrors).mockReturnValue([ + ' ✗ OOMKilled' + ]) + vi.mocked(k8sMod.describePodFailure).mockResolvedValue('pod details') + await expect(runContainerStep(makeArgs())).rejects.toThrow() + expect(k8sMod.describePodFailure).toHaveBeenCalledWith('step-pod') + }) + + it('throws when GITHUB_WORKSPACE has fewer than 2 path segments', async () => { + // Covers run-container-step.ts lines 95-96 (invalid github workspace) + // split('/').slice(-2) needs exactly 2 parts; 'noSlash' → ['noSlash'] → length 1 + process.env.GITHUB_WORKSPACE = 'noSlash' + await expect(runContainerStep(makeArgs())).rejects.toThrow( + /Invalid github workspace directory/ + ) + delete process.env.GITHUB_WORKSPACE + }) + + it('classifies script error with terminated state and completed reason', async () => { + // Covers run-container-step.ts line 163 (reason === 'Completed' branch) + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 1, + output: '' + }) + vi.mocked(k8sMod.getPodByName).mockResolvedValue( + makePod('step-pod', [ + { + name: 'job', + state: { terminated: { reason: 'Completed', exitCode: 1 } } + } as k8s.V1ContainerStatus + ]) + ) + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'failed to run script step' + ) + }) + + it('classifies script error when containerStatuses is missing', async () => { + // Covers run-container-step.ts line 168 (state unavailable branch) + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 1, + output: '' + }) + vi.mocked(k8sMod.getPodByName).mockResolvedValue(makePod('step-pod', [])) + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'failed to run script step' + ) + }) + + it('classifies script error when pod fetch throws', async () => { + // Covers run-container-step.ts lines 217-218, 220-223 (catch fallback) + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 1, + output: '' + }) + vi.mocked(k8sMod.getPodByName).mockRejectedValue(new Error('pod gone')) + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'failed to run script step' + ) + }) + + it('classifies script error when container is in waiting state', async () => { + // Covers run-container-step.ts lines 226-227 (waiting state branch) + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 1, + output: '' + }) + vi.mocked(k8sMod.getPodByName).mockResolvedValue( + makePod('step-pod', [ + { + name: 'job', + state: { waiting: { reason: 'ImagePullBackOff' } } + } as k8s.V1ContainerStatus + ]) + ) + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'failed to run script step' + ) + }) + + it('includes tail output in classify error when output is present', async () => { + // Covers run-container-step.ts lines 230-234 (tailOutput branch) + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 1, + output: 'Error: something went wrong\n at line 42' + }) + vi.mocked(k8sMod.getPodByName).mockResolvedValue( + makePod('step-pod', [ + { + name: 'job', + state: { terminated: { reason: 'Completed', exitCode: 1 } } + } as k8s.V1ContainerStatus + ]) + ) + await expect(runContainerStep(makeArgs())).rejects.toThrow(/Last output:/) + }) +}) diff --git a/packages/k8s/src/k8s/utils/hooks-run-script-step.spec.ts b/packages/k8s/src/k8s/utils/hooks-run-script-step.spec.ts new file mode 100644 index 00000000..ae073fac --- /dev/null +++ b/packages/k8s/src/k8s/utils/hooks-run-script-step.spec.ts @@ -0,0 +1,161 @@ +import * as fs from 'fs' +import * as os from 'os' +import * as path from 'path' + +vi.mock('@actions/core', () => ({ + debug: vi.fn(), + error: vi.fn(), + warning: vi.fn(), + info: vi.fn() +})) + +vi.mock('../index', () => ({ + execPodStep: vi.fn().mockResolvedValue(0), + execCpToPod: vi.fn().mockResolvedValue(undefined), + execCpFromPod: vi.fn().mockResolvedValue(undefined), + execPodStepWithOutput: vi.fn().mockResolvedValue({ code: 0, output: '' }) +})) + +import { runScriptStep } from '../../hooks/run-script-step' +import * as k8sMod from '../index' + +function makeTmpDir(): string { + const d = path.join(os.tmpdir(), `rss-spec-${Date.now()}`) + fs.mkdirSync(d, { recursive: true }) + return d +} + +function makeArgs(overrides: Record = {}) { + return { + entryPoint: 'sh', + entryPointArgs: ['-c', 'echo hi'], + environmentVariables: { VAR: 'val' }, + workingDirectory: '/__w', + prependPath: [], + ...overrides + } +} + +describe('runScriptStep', () => { + let tmpDir: string + + beforeEach(() => { + tmpDir = makeTmpDir() + process.env.RUNNER_TEMP = tmpDir + process.env.RUNNER_WORKSPACE = '/__w/repo' + process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE = 'default' + process.env.ACTIONS_RUNNER_POD_NAME = 'runner-pod' + vi.mocked(k8sMod.execPodStep).mockResolvedValue(0) + vi.mocked(k8sMod.execCpToPod).mockResolvedValue(undefined) + vi.mocked(k8sMod.execCpFromPod).mockResolvedValue(undefined) + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 0, + output: '' + }) + }) + + afterEach(() => { + fs.rmSync(tmpDir, { recursive: true, force: true }) + delete process.env.RUNNER_TEMP + delete process.env.RUNNER_WORKSPACE + delete process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE + delete process.env.ACTIONS_RUNNER_POD_NAME + vi.clearAllMocks() + }) + + it('throws when jobPod is null', async () => { + await expect( + runScriptStep(makeArgs() as any, { jobPod: null }) + ).rejects.toThrow('jobPod must be set') + }) + + it('throws when jobPod is undefined', async () => { + await expect(runScriptStep(makeArgs() as any, {})).rejects.toThrow( + 'jobPod must be set' + ) + }) + + it('completes without throwing when script exits 0', async () => { + await expect( + runScriptStep(makeArgs() as any, { jobPod: 'job-pod' }) + ).resolves.toBeUndefined() + expect(k8sMod.execPodStepWithOutput).toHaveBeenCalled() + }) + + it('throws structured error on non-zero exit', async () => { + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 1, + output: 'script output line' + }) + await expect( + runScriptStep(makeArgs() as any, { jobPod: 'job-pod' }) + ).rejects.toThrow('failed to run script step') + }) + + it('includes last output and separator in error message', async () => { + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 1, + output: 'my error output' + }) + let err: Error | undefined + try { + await runScriptStep(makeArgs() as any, { jobPod: 'job-pod' }) + } catch (e) { + err = e as Error + } + expect(err?.message).toContain('my error output') + expect(err?.message).toContain('Last output:') + expect(err?.message).toContain('---') + }) + + it('throws generic error when execPodStepWithOutput rejects', async () => { + vi.mocked(k8sMod.execPodStepWithOutput).mockRejectedValue( + new Error('websocket dropped') + ) + await expect( + runScriptStep(makeArgs() as any, { jobPod: 'job-pod' }) + ).rejects.toThrow('failed to run script step') + }) + + it('re-throws already-classified errors verbatim', async () => { + vi.mocked(k8sMod.execPodStepWithOutput).mockRejectedValue( + new Error('failed to run script step: OOMKilled') + ) + let err: Error | undefined + try { + await runScriptStep(makeArgs() as any, { jobPod: 'job-pod' }) + } catch (e) { + err = e as Error + } + expect(err?.message).toBe('failed to run script step: OOMKilled') + }) + + it('throws when merge dirs step (execPodStep) fails', async () => { + // First call = mkdir -p (succeeds), second call = merge script (fails) + vi.mocked(k8sMod.execPodStep) + .mockResolvedValueOnce(0) + .mockRejectedValueOnce(new Error('merge failed')) + await expect( + runScriptStep(makeArgs() as any, { jobPod: 'job-pod' }) + ).rejects.toThrow('failed to merge temp dirs') + }) + + it('copies files from pod after success', async () => { + await runScriptStep(makeArgs() as any, { jobPod: 'job-pod' }) + expect(k8sMod.execCpFromPod).toHaveBeenCalled() + }) + + // Covers run-script-step.ts line 145: catch block when copying temp dir fails + it('warns when copying _runner_file_commands fails', async () => { + const core = await import('@actions/core') + const warnSpy = vi.spyOn(core, 'warning') + vi.mocked(k8sMod.execCpFromPod).mockRejectedValueOnce( + new Error('cp failed') + ) + // Should NOT throw — the error is swallowed with a warning + await expect( + runScriptStep(makeArgs() as any, { jobPod: 'job-pod' }) + ).resolves.toBeUndefined() + expect(warnSpy).toHaveBeenCalledWith('Failed to copy _temp from pod') + }) +}) diff --git a/packages/k8s/src/k8s/utils/index.spec.ts b/packages/k8s/src/k8s/utils/index.spec.ts new file mode 100644 index 00000000..7196c144 --- /dev/null +++ b/packages/k8s/src/k8s/utils/index.spec.ts @@ -0,0 +1,577 @@ +import * as fs from 'fs' +import * as os from 'os' +import * as path from 'path' +import { + generateContainerName, + writeRunScript, + writeContainerStepScript, + prepareJobScript, + mergePodSpecWithOptions, + mergeContainerWithOptions, + mergeObjectMeta, + readExtensionFromFile, + fixArgs, + sleep, + listDirAllCommand, + useKubeScheduler, + ENV_HOOK_TEMPLATE_PATH, + ENV_USE_KUBE_SCHEDULER +} from './index' + +// Minimal temp dir helper for tests that write files +function makeTempDir(): string { + const dir = path.join(os.tmpdir(), `k8s-utils-test-${Date.now()}`) + fs.mkdirSync(dir, { recursive: true }) + return dir +} + +describe('generateContainerName', () => { + it('extracts name from image with registry and tag', () => { + expect(generateContainerName('public.ecr.aws/localstack/localstack')).toBe( + 'localstack' + ) + expect(generateContainerName('postgres:latest')).toBe('postgres') + expect(generateContainerName('postgres')).toBe('postgres') + expect( + generateContainerName( + 'public.ecr.aws/url/with/multiple/slashes/postgres:latest' + ) + ).toBe('postgres') + }) + + it('throws on invalid image string', () => { + expect(() => generateContainerName(':latest')).toThrow() + expect(() => + generateContainerName('localstack/localstack/:latest') + ).toThrow() + }) +}) + +describe('fixArgs', () => { + it('splits quoted arguments', () => { + expect(fixArgs(['"Hello', 'World"'])).toStrictEqual(['Hello World']) + }) + + it('handles single-quoted shell args', () => { + const result = fixArgs(['sh', '-c', "'echo hello'"]) + expect(result[0]).toBe('sh') + expect(result[1]).toBe('-c') + // shlex may or may not strip outer single-quotes depending on the environment + expect(result[2]).toMatch(/echo hello/) + }) + + it('returns plain args unchanged', () => { + expect(fixArgs(['ls', '-la', '/tmp'])).toStrictEqual(['ls', '-la', '/tmp']) + }) +}) + +describe('sleep', () => { + it('resolves after given ms', async () => { + const start = Date.now() + await sleep(50) + expect(Date.now() - start).toBeGreaterThanOrEqual(40) + }) +}) + +describe('listDirAllCommand', () => { + it('returns find command containing the dir', () => { + const cmd = listDirAllCommand('/some/path') + expect(cmd).toContain('/some/path') + expect(cmd).toContain('find') + expect(cmd).toContain('-type f') + }) + + it('shell-quotes paths with spaces', () => { + const cmd = listDirAllCommand('/path with spaces') + expect(cmd).toContain("'") + }) +}) + +describe('useKubeScheduler', () => { + afterEach(() => { + delete process.env[ENV_USE_KUBE_SCHEDULER] + }) + + it('returns true when env is "true"', () => { + process.env[ENV_USE_KUBE_SCHEDULER] = 'true' + expect(useKubeScheduler()).toBe(true) + }) + + it('returns false when env is unset', () => { + expect(useKubeScheduler()).toBe(false) + }) + + it('returns false when env is "false"', () => { + process.env[ENV_USE_KUBE_SCHEDULER] = 'false' + expect(useKubeScheduler()).toBe(false) + }) +}) + +describe('mergeObjectMeta', () => { + it('merges labels and annotations', () => { + const base = { + metadata: { labels: { existing: 'val' }, annotations: { ann: 'orig' } } + } + mergeObjectMeta(base, { + labels: { newLabel: 'newVal' }, + annotations: { newAnn: 'newAnnotation' } + }) + expect(base.metadata.labels['newLabel']).toBe('newVal') + expect(base.metadata.labels['existing']).toBe('val') + expect(base.metadata.annotations['newAnn']).toBe('newAnnotation') + }) + + it('throws if metadata is undefined', () => { + expect(() => + mergeObjectMeta({ metadata: undefined }, { labels: {} }) + ).toThrow() + }) + + it('throws if annotations are undefined', () => { + expect(() => + mergeObjectMeta({ metadata: { labels: { a: 'b' } } }, { labels: {} }) + ).toThrow() + }) +}) + +describe('writeRunScript', () => { + let tmpDir: string + + beforeEach(() => { + tmpDir = makeTempDir() + process.env.RUNNER_TEMP = tmpDir + }) + + afterEach(() => { + fs.rmSync(tmpDir, { recursive: true, force: true }) + delete process.env.RUNNER_TEMP + }) + + it('returns containerPath and runnerPath', () => { + const { containerPath, runnerPath } = writeRunScript('/work', 'sh', [ + '-e', + 'script.sh' + ]) + expect(containerPath).toMatch(/\/__w\/_temp\/.*\.sh/) + expect(runnerPath).toContain(tmpDir) + expect(fs.existsSync(runnerPath)).toBe(true) + }) + + it('escapes double-quote, dollar, backslash in env values', () => { + const { runnerPath } = writeRunScript('/work', 'sh', [], [], { + DQUOTE: '"', + DOLLAR: '$', + BACK_SLASH: '\\' + }) + const content = fs.readFileSync(runnerPath, 'utf8') + expect(content).toContain('\\"') + expect(content).toContain('\\$') + expect(content).toContain('\\\\') + }) + + it('throws if RUNNER_TEMP is not set', () => { + delete process.env.RUNNER_TEMP + expect(() => writeRunScript('/work', 'sh')).toThrow() + }) + + it('throws if env key contains "="', () => { + expect(() => + writeRunScript('/work', 'sh', [], [], { 'BAD=KEY': 'val' }) + ).toThrow() + }) + + it('throws if env key contains "$"', () => { + expect(() => + writeRunScript('/work', 'sh', [], [], { BAD$KEY: 'val' }) + ).toThrow() + }) +}) + +describe('writeContainerStepScript', () => { + let tmpDir: string + + beforeEach(() => { + tmpDir = makeTempDir() + process.env.RUNNER_TEMP = tmpDir + }) + + afterEach(() => { + fs.rmSync(tmpDir, { recursive: true, force: true }) + delete process.env.RUNNER_TEMP + }) + + it('returns containerPath and runnerPath', () => { + const { containerPath, runnerPath } = writeContainerStepScript( + tmpDir, + '/__w/repo/repo', + 'sh', + ['-e', 'script.sh'] + ) + expect(containerPath).toMatch(/\/__w\/_temp\/.*\.sh/) + expect(fs.existsSync(runnerPath)).toBe(true) + }) + + it('throws on invalid working directory', () => { + expect(() => writeContainerStepScript(tmpDir, 'tooshort', 'sh')).toThrow( + 'Invalid working directory' + ) + }) + + it('throws if env key contains invalid chars', () => { + expect(() => + writeContainerStepScript(tmpDir, '/__w/repo/repo', 'sh', [], { + 'BAD=KEY': 'val' + }) + ).toThrow() + }) +}) + +describe('prepareJobScript', () => { + let tmpDir: string + + beforeEach(() => { + tmpDir = makeTempDir() + process.env.RUNNER_TEMP = tmpDir + }) + + afterEach(() => { + fs.rmSync(tmpDir, { recursive: true, force: true }) + delete process.env.RUNNER_TEMP + }) + + it('returns paths and file exists', () => { + const { containerPath, runnerPath } = prepareJobScript([ + { + sourceVolumePath: '/src', + targetVolumePath: '/mnt/data', + readOnly: false + } + ]) + expect(containerPath).toMatch(/\/__w\/_temp\/.*\.sh/) + expect(fs.existsSync(runnerPath)).toBe(true) + }) + + it('includes mkdir for each mount target', () => { + const { runnerPath } = prepareJobScript([ + { + sourceVolumePath: '/s1', + targetVolumePath: '/mnt/vol1', + readOnly: false + }, + { + sourceVolumePath: '/s2', + targetVolumePath: '/mnt/vol2', + readOnly: false + } + ]) + const content = fs.readFileSync(runnerPath, 'utf8') + expect(content).toContain('/mnt/vol1') + expect(content).toContain('/mnt/vol2') + expect(content).toContain('mkdir -p') + }) + + it('works with empty mounts', () => { + const { runnerPath } = prepareJobScript([]) + expect(fs.existsSync(runnerPath)).toBe(true) + }) +}) + +describe('readExtensionFromFile', () => { + let tmpDir: string + + beforeEach(() => { + tmpDir = makeTempDir() + }) + + afterEach(() => { + fs.rmSync(tmpDir, { recursive: true, force: true }) + delete process.env[ENV_HOOK_TEMPLATE_PATH] + }) + + it('returns undefined when env var not set', () => { + expect(readExtensionFromFile()).toBeUndefined() + }) + + it('throws if file does not exist', () => { + process.env[ENV_HOOK_TEMPLATE_PATH] = '/nonexistent/path/data.yaml' + expect(() => readExtensionFromFile()).toThrow() + }) + + it('throws if file is empty', () => { + const f = path.join(tmpDir, 'empty.yaml') + fs.writeFileSync(f, '') + process.env[ENV_HOOK_TEMPLATE_PATH] = f + expect(() => readExtensionFromFile()).toThrow() + }) + + it('returns object for valid yaml', () => { + const f = path.join(tmpDir, 'valid.yaml') + fs.writeFileSync( + f, + `metadata:\n labels:\n label-name: label-value\nspec:\n containers:\n - name: test\n image: node:22\n` + ) + process.env[ENV_HOOK_TEMPLATE_PATH] = f + expect(readExtensionFromFile()).toBeDefined() + }) +}) + +describe('mergeContainerWithOptions', () => { + it('merges env and ports, keeps base name and image', () => { + const base = { + image: 'node:22', + name: 'test', + env: [{ name: 'A', value: '1' }], + ports: [{ containerPort: 8080, protocol: 'TCP' }] + } + const from = { + image: 'ubuntu:latest', + name: '$test', + env: [{ name: 'B', value: '2' }], + ports: [{ containerPort: 9090, protocol: 'TCP' }] + } + mergeContainerWithOptions(base as any, from as any) + expect(base.name).toBe('test') + expect(base.image).toBe('node:22') + expect(base.env).toHaveLength(2) + expect(base.ports).toHaveLength(2) + }) +}) + +describe('mergePodSpecWithOptions', () => { + it('merges volumes and non-extension containers, overwrites scalar fields', () => { + const base = { + containers: [{ image: 'node:22', name: 'test' }], + restartPolicy: 'Never' + } + const from = { + restartPolicy: 'Always', + volumes: [{ name: 'work', emptyDir: {} }], + containers: [{ image: 'ubuntu:latest', name: 'side-car' }] + } + mergePodSpecWithOptions(base as any, from as any) + expect(base.restartPolicy).toBe('Always') + expect((base as any).volumes).toHaveLength(1) + expect(base.containers).toHaveLength(2) + }) +}) + +import { formatError } from './index' + +describe('formatError', () => { + it('returns "null" for null', () => { + expect(formatError(null)).toBe('null') + }) + + it('returns "undefined" for undefined', () => { + expect(formatError(undefined)).toBe('undefined') + }) + + it('returns Error.message for Error instances', () => { + expect(formatError(new Error('boom'))).toBe('boom') + }) + + it('returns body.message when response.body.message is present', () => { + const err = { + response: { body: { message: 'quota exceeded', reason: 'Forbidden' } } + } + expect(formatError(err)).toBe('quota exceeded (reason: Forbidden)') + }) + + it('returns body.message without reason suffix when reason is empty', () => { + const err = { response: { body: { message: 'not found', reason: '' } } } + expect(formatError(err)).toBe('not found') + }) + + it('prefers response.body.message over top-level body', () => { + const err = { + response: { body: { message: 'from-response' } }, + body: { message: 'from-body' } + } + expect(formatError(err)).toBe('from-response') + }) + + it('falls back to top-level body.message when response absent', () => { + const err = { body: { message: 'top-level-body' } } + expect(formatError(err)).toBe('top-level-body') + }) + + it('returns top-level message for non-Error objects with message field', () => { + expect(formatError({ message: 'plain object error' })).toBe( + 'plain object error' + ) + }) + + it('JSON-stringifies unknown objects without message', () => { + expect(formatError({ code: 42 })).toBe('{"code":42}') + }) + + it('falls back to String() for circular objects', () => { + const circ: any = {} + circ.self = circ + const result = formatError(circ) + // Should not throw; result is a string + expect(typeof result).toBe('string') + }) + + it('returns string representation of number primitives', () => { + expect(formatError(42)).toBe('42') + }) + + it('returns string representation of string primitives', () => { + expect(formatError('oops')).toBe('oops') + }) +}) + +// ── writeRunScript: prependPath variants (lines 69-72) ─────────────────────── + +describe('writeRunScript prependPath', () => { + const originalRunnerTemp = process.env.RUNNER_TEMP + beforeEach(() => { + process.env.RUNNER_TEMP = makeTempDir() + }) + afterEach(() => { + if (originalRunnerTemp) process.env.RUNNER_TEMP = originalRunnerTemp + else delete process.env.RUNNER_TEMP + vi.restoreAllMocks() + }) + + it('accepts prependPath as array and joins with ":"', () => { + const { runnerPath } = writeRunScript( + '/work', + 'sh', + ['script.sh'], + ['/usr/local/bin', '/opt/bin'], + {} + ) + const content = fs.readFileSync(runnerPath, 'utf8') + expect(content).toContain('export PATH=/usr/local/bin:/opt/bin:$PATH') + fs.rmSync(runnerPath, { force: true }) + }) + + it('accepts prependPath as string (legacy compat)', () => { + const { runnerPath } = writeRunScript( + '/work', + 'sh', + ['script.sh'], + '/legacy/bin' as any, + {} + ) + const content = fs.readFileSync(runnerPath, 'utf8') + expect(content).toContain('export PATH=/legacy/bin:$PATH') + fs.rmSync(runnerPath, { force: true }) + }) +}) + +// ── scriptEnv: empty envs short-circuit (lines 155-156) ───────────────────── + +describe('scriptEnv via writeRunScript empty envs', () => { + const originalRunnerTemp = process.env.RUNNER_TEMP + beforeEach(() => { + process.env.RUNNER_TEMP = makeTempDir() + }) + afterEach(() => { + if (originalRunnerTemp) process.env.RUNNER_TEMP = originalRunnerTemp + else delete process.env.RUNNER_TEMP + }) + + it('omits env prefix when environmentVariables is empty', () => { + const { runnerPath } = writeRunScript({ + entryPointArgs: ['hello'], + environmentVariables: {} + } as any) + const content = fs.readFileSync(runnerPath, 'utf8') + // No "env " prefix when there are no envs + expect(content).not.toMatch(/^env\s/m) + fs.rmSync(runnerPath, { force: true }) + }) +}) + +// ── mergeContainerWithOptions: volumeMounts + ports branches (lines 187-188, 197-198) ── + +describe('mergeContainerWithOptions volumeMounts and ports', () => { + it('merges volumeMounts when from has volumeMounts', () => { + const base = { + name: 'job', + image: 'ubuntu:latest', + volumeMounts: [{ name: 'a', mountPath: '/a' }] + } + const from = { + volumeMounts: [{ name: 'b', mountPath: '/b' }] + } as any + mergeContainerWithOptions(base, from) + expect(base.volumeMounts).toHaveLength(2) + expect(base.volumeMounts?.[1].name).toBe('b') + }) + + it('merges ports when from has ports', () => { + const base = { + name: 'job', + image: 'ubuntu:latest', + ports: [{ containerPort: 80 }] + } + const from = { + ports: [{ containerPort: 443 }] + } as any + mergeContainerWithOptions(base, from) + expect(base.ports).toHaveLength(2) + expect(base.ports?.[1].containerPort).toBe(443) + }) +}) + +// ── mergeObjectMeta: overwrite warnings (lines 240-241, 249-252) ───────────── + +describe('mergeObjectMeta overwrite warnings', () => { + it('warns when label already exists and overwrites', () => { + const base = { + metadata: { + labels: { app: 'base' }, + annotations: {} + } + } as any + const from = { labels: { app: 'overwritten' } } as any + mergeObjectMeta(base, from) + expect(base.metadata.labels.app).toBe('overwritten') + }) + + it('warns when annotation already exists and overwrites', () => { + const base = { + metadata: { + labels: {}, + annotations: { note: 'base' } + } + } as any + const from = { annotations: { note: 'overwritten' } } as any + mergeObjectMeta(base, from) + expect(base.metadata.annotations.note).toBe('overwritten') + }) +}) + +// ── readExtensionFromFile: invalid YAML (lines 265-266) ───────────────────── + +describe('readExtensionFromFile invalid YAML', () => { + it('throws when file content is not an object (scalar)', () => { + process.env[ENV_HOOK_TEMPLATE_PATH] = '/tmp/nonexistent-scalar.yaml' + const tmpDir = makeTempDir() + const filePath = path.join(tmpDir, 'scalar.yaml') + // A YAML scalar (just a string) — not an object + fs.writeFileSync(filePath, 'just a string') + process.env[ENV_HOOK_TEMPLATE_PATH] = filePath + expect(() => readExtensionFromFile()).toThrow(/Failed to parse/) + fs.rmSync(filePath, { force: true }) + }) +}) + +// ── mergeLists: undefined from (lines 286-287) ────────────────────────────── + +describe('mergeLists via mergeContainerWithOptions empty from', () => { + it('returns base list unchanged when from is undefined', () => { + const base = { + name: 'job', + image: 'ubuntu:latest', + env: [{ name: 'A', value: '1' }] + } + const from = { env: undefined } as any + mergeContainerWithOptions(base, from) + expect(base.env).toEqual([{ name: 'A', value: '1' }]) + }) +}) diff --git a/packages/k8s/src/k8s/utils/index.ts b/packages/k8s/src/k8s/utils/index.ts new file mode 100644 index 00000000..5e62238e --- /dev/null +++ b/packages/k8s/src/k8s/utils/index.ts @@ -0,0 +1,358 @@ +import * as k8s from '@kubernetes/client-node' +import * as fs from 'fs' +import * as yaml from 'js-yaml' +import * as core from '@actions/core' +import { v1 as uuidv4 } from 'uuid' +import { CONTAINER_EXTENSION_PREFIX } from '../../hooks/constants' +import * as shlex from 'shlex' +import { Mount } from 'hooklib' + +export const DEFAULT_CONTAINER_ENTRY_POINT_ARGS = [`-f`, `/dev/null`] +export const DEFAULT_CONTAINER_ENTRY_POINT = 'tail' + +export const ENV_HOOK_TEMPLATE_PATH = 'ACTIONS_RUNNER_CONTAINER_HOOK_TEMPLATE' +export const ENV_USE_KUBE_SCHEDULER = 'ACTIONS_RUNNER_USE_KUBE_SCHEDULER' + +export const EXTERNALS_VOLUME_NAME = 'externals' +export const GITHUB_VOLUME_NAME = 'github' +export const WORK_VOLUME = 'work' + +export const CONTAINER_VOLUMES: k8s.V1VolumeMount[] = [ + { + name: EXTERNALS_VOLUME_NAME, + mountPath: '/__e' + }, + { + name: WORK_VOLUME, + mountPath: '/__w' + }, + { + name: GITHUB_VOLUME_NAME, + mountPath: '/github' + } +] + +export function prepareJobScript(userVolumeMounts: Mount[]): { + containerPath: string + runnerPath: string +} { + let mountDirs = userVolumeMounts + .map(m => shlex.quote(m.targetVolumePath)) + .join(' ') + + const content = `#!/bin/sh -l +set -e +cp -R /__w/_temp/_github_home /github/home +cp -R /__w/_temp/_github_workflow /github/workflow +mkdir -p ${mountDirs} +` + + const filename = `${uuidv4()}.sh` + const entryPointPath = `${process.env.RUNNER_TEMP}/${filename}` + fs.writeFileSync(entryPointPath, content) + return { + containerPath: `/__w/_temp/${filename}`, + runnerPath: entryPointPath + } +} + +export function writeRunScript( + workingDirectory: string, + entryPoint: string, + entryPointArgs?: string[], + prependPath?: string[], + environmentVariables?: { [key: string]: string } +): { containerPath: string; runnerPath: string } { + let exportPath = '' + if (prependPath?.length) { + // TODO: remove compatibility with typeof prependPath === 'string' as we bump to next major version, the hooks will lose PrependPath compat with runners 2.293.0 and older + const prepend = + typeof prependPath === 'string' ? prependPath : prependPath.join(':') + exportPath = `export PATH=${prepend}:$PATH` + } + + let environmentPrefix = scriptEnv(environmentVariables) + + const content = `#!/bin/sh -l +set -e +rm "$0" # remove script after running +${exportPath} +cd ${workingDirectory} && \ +exec ${environmentPrefix} ${entryPoint} ${ + entryPointArgs?.length ? entryPointArgs.join(' ') : '' + } +` + const filename = `${uuidv4()}.sh` + const entryPointPath = `${process.env.RUNNER_TEMP}/${filename}` + fs.writeFileSync(entryPointPath, content) + return { + containerPath: `/__w/_temp/${filename}`, + runnerPath: entryPointPath + } +} + +export function writeContainerStepScript( + dst: string, + workingDirectory: string, + entryPoint: string, + entryPointArgs?: string[], + environmentVariables?: { [key: string]: string } +): { containerPath: string; runnerPath: string } { + let environmentPrefix = scriptEnv(environmentVariables) + + const parts = workingDirectory.split('/').slice(-2) + if (parts.length !== 2) { + throw new Error(`Invalid working directory: ${workingDirectory}`) + } + + const content = `#!/bin/sh -l +rm "$0" # remove script after running +mv /__w/_temp/_github_home /github/home && \ +mv /__w/_temp/_github_workflow /github/workflow && \ +mv /__w/_temp/_runner_file_commands /github/file_commands || true && \ +mv ${shlex.quote('/__w/' + parts.join('/') + '/')} /github/workspace && \ +cd /github/workspace && \ +exec ${environmentPrefix} ${shlex.quote(entryPoint)} ${ + entryPointArgs?.length ? entryPointArgs.map(shlex.quote).join(' ') : '' + } +` + const filename = `${uuidv4()}.sh` + const entryPointPath = `${dst}/${filename}` + core.debug(`Writing container step script to ${entryPointPath}`) + fs.writeFileSync(entryPointPath, content) + return { + containerPath: `/__w/_temp/${filename}`, + runnerPath: entryPointPath + } +} + +function scriptEnv(envs?: { [key: string]: string }): string { + if (!envs || !Object.entries(envs).length) { + return '' + } + const envBuffer: string[] = [] + for (const [key, value] of Object.entries(envs)) { + if ( + key.includes(`=`) || + key.includes(`'`) || + key.includes(`"`) || + key.includes(`$`) + ) { + throw new Error( + `environment key ${key} is invalid - the key must not contain =, $, ', or "` + ) + } + envBuffer.push( + `"${key}=${value + .replace(/\\/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\$/g, '\\$') + .replace(/`/g, '\\`')}"` + ) + } + + if (!envBuffer?.length) { + return '' + } + + return `env ${envBuffer.join(' ')} ` +} + +export function generateContainerName(image: string): string { + const nameWithTag = image.split('/').pop() + const name = nameWithTag?.split(':')[0] + + if (!name) { + throw new Error(`Image definition '${image}' is invalid`) + } + + return name +} + +// Overwrite or append based on container options +// +// Keep in mind, envs and volumes could be passed as fields in container definition +// so default volume mounts and envs are appended first, and then create options are used +// to append more values +// +// Rest of the fields are just applied +// For example, container.createOptions.container.image is going to overwrite container.image field +export function mergeContainerWithOptions( + base: k8s.V1Container, + from: k8s.V1Container +): void { + for (const [key, value] of Object.entries(from)) { + if (key === 'name') { + if (value !== CONTAINER_EXTENSION_PREFIX + base.name) { + core.warning("Skipping name override: name can't be overwritten") + } + continue + } else if (key === 'image') { + core.warning("Skipping image override: image can't be overwritten") + continue + } else if (key === 'env') { + const envs = value as k8s.V1EnvVar[] + base.env = mergeLists(base.env, envs) + } else if (key === 'volumeMounts' && value) { + const volumeMounts = value as k8s.V1VolumeMount[] + base.volumeMounts = mergeLists(base.volumeMounts, volumeMounts) + } else if (key === 'ports' && value) { + const ports = value as k8s.V1ContainerPort[] + base.ports = mergeLists(base.ports, ports) + } else { + base[key] = value + } + } +} + +export function mergePodSpecWithOptions( + base: k8s.V1PodSpec, + from: k8s.V1PodSpec +): void { + for (const [key, value] of Object.entries(from)) { + if (key === 'containers') { + base.containers.push( + ...from.containers.filter( + e => !e.name?.startsWith(CONTAINER_EXTENSION_PREFIX) + ) + ) + } else if (key === 'volumes' && value) { + const volumes = value as k8s.V1Volume[] + base.volumes = mergeLists(base.volumes, volumes) + } else { + base[key] = value + } + } +} + +export function mergeObjectMeta( + base: { metadata?: k8s.V1ObjectMeta }, + from: k8s.V1ObjectMeta +): void { + if (!base.metadata?.labels || !base.metadata?.annotations) { + throw new Error( + "Can't merge metadata: base.metadata or base.annotations field is undefined" + ) + } + if (from?.labels) { + for (const [key, value] of Object.entries(from.labels)) { + if (base.metadata?.labels?.[key]) { + core.warning(`Label ${key} is already defined and will be overwritten`) + } + base.metadata.labels[key] = value + } + } + + if (from?.annotations) { + for (const [key, value] of Object.entries(from.annotations)) { + if (base.metadata?.annotations?.[key]) { + core.warning( + `Annotation ${key} is already defined and will be overwritten` + ) + } + base.metadata.annotations[key] = value + } + } +} + +export function readExtensionFromFile(): k8s.V1PodTemplateSpec | undefined { + const filePath = process.env[ENV_HOOK_TEMPLATE_PATH] + if (!filePath) { + return undefined + } + const doc = yaml.load(fs.readFileSync(filePath, 'utf8')) + if (!doc || typeof doc !== 'object') { + throw new Error(`Failed to parse ${filePath}`) + } + return doc as k8s.V1PodTemplateSpec +} + +export function useKubeScheduler(): boolean { + return process.env[ENV_USE_KUBE_SCHEDULER] === 'true' +} + +export enum PodPhase { + PENDING = 'Pending', + RUNNING = 'Running', + SUCCEEDED = 'Succeeded', + FAILED = 'Failed', + UNKNOWN = 'Unknown', + COMPLETED = 'Completed' +} + +function mergeLists(base?: T[], from?: T[]): T[] { + const b: T[] = base || [] + if (!from?.length) { + return b + } + b.push(...from) + return b +} + +export function fixArgs(args: string[]): string[] { + // Preserve shell command strings passed via `sh -c` without re-tokenizing. + // Retokenizing would split the script into multiple args, breaking `sh -c`. + if (args.length >= 2 && args[0] === 'sh' && args[1] === '-c') { + return args + } + return shlex.split(args.join(' ')) +} + +export async function sleep(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)) +} + +export function listDirAllCommand(dir: string): string { + return `cd ${shlex.quote(dir)} && find . -type f -not -path '*/_runner_hook_responses*' -exec stat -c '%s %n' {} \\;` +} + +// Safely turn an unknown thrown value into a diagnostic string without +// throwing. The previous `JSON.stringify(err)` pattern crashed with +// `TypeError: Converting circular structure to JSON` when err was a +// @kubernetes/client-node HTTP error (its response embeds a +// TLSSocket <-> HTTPParser cycle). The thrown TypeError shadowed the +// original failure in every catch block that used it (issue #329). +export function formatError(err: unknown): string { + if (err === null || err === undefined) { + return String(err) + } + + // @kubernetes/client-node API errors expose the actual server message + // under response.body — prefer that when available. + const body = + (err as { response?: { body?: unknown } })?.response?.body ?? + (err as { body?: unknown })?.body + if (body && typeof body === 'object') { + const msg = (body as { message?: unknown }).message + const reason = (body as { reason?: unknown }).reason + if (typeof msg === 'string') { + return typeof reason === 'string' && reason.length > 0 + ? `${msg} (reason: ${reason})` + : msg + } + } + + if (err instanceof Error) { + return err.message + } + + if (typeof err === 'object') { + // Non-Error objects sometimes carry a top-level message (axios-style + // errors, hand-rolled error-likes). Extract before the JSON.stringify + // branch so a circular ref doesn't reduce the diagnostic to + // "[object Object]". + const msg = (err as { message?: unknown }).message + if (typeof msg === 'string') { + return msg + } + try { + return JSON.stringify(err) + } catch { + return String(err) + } + } + + // Primitives serialise more readably via String() than JSON.stringify + // (which would quote strings and refuse to handle symbols). + return String(err) +} diff --git a/packages/k8s/src/k8s/utils/k8s-index.spec.ts b/packages/k8s/src/k8s/utils/k8s-index.spec.ts new file mode 100644 index 00000000..10b51d98 --- /dev/null +++ b/packages/k8s/src/k8s/utils/k8s-index.spec.ts @@ -0,0 +1,1971 @@ +import * as k8s from '@kubernetes/client-node' +import { + namespace, + getPrepareJobTimeoutSeconds, + parsePodPhase, + getContainerErrors, + getContainerTerminatedErrors, + getTerminatedReasonHint, + getPodEventErrors, + describePodFailure, + checkUnrecoverableErrors, + waitForPodPhases, + isPermanentSchedulingFailure, + getPermanentSchedulingPatterns, + getUnrecoverableWaitingReasons, + getUnrecoverableEventReasons, + getUnrecoverableTerminatedReasons, + getPodConditionErrors, + UNRECOVERABLE_WAITING_REASONS, + UNRECOVERABLE_TERMINATED_REASONS, + PERMANENT_SCHEDULING_PATTERNS, + deletePod, + createJobPod, + createContainerStepPod, + createDockerSecret, + createSecretForEnvs, + deleteSecret, + pruneSecrets, + prunePods, + getPodStatus, + waitForJobToComplete, + isAuthPermissionsOK, + execCalculateOutputHashSorted, + localCalculateOutputHashSorted, + isPodContainerAlpine, + containerPorts, + getPodLogs, + getPodByName, + getSecretByName, + listPodsByRunnerInstance, + execPodStepWithOutput, + execPodStep +} from '../index' +import { PodPhase } from './index' + +vi.mock('@actions/core', () => ({ + debug: vi.fn(), + error: vi.fn(), + warning: vi.fn(), + info: vi.fn() +})) + +// ── helpers ─────────────────────────────────────────────────────────────────── + +function buildPod( + phase?: string, + opts: { + containerStatuses?: k8s.V1ContainerStatus[] + initContainerStatuses?: k8s.V1ContainerStatus[] + conditions?: k8s.V1PodCondition[] + } = {} +): k8s.V1Pod { + return { + metadata: { name: 'test-pod' }, + status: { + phase, + containerStatuses: opts.containerStatuses, + initContainerStatuses: opts.initContainerStatuses, + conditions: opts.conditions + } + } as k8s.V1Pod +} + +function waitingContainer( + name: string, + reason?: string, + message?: string +): k8s.V1ContainerStatus { + return { + name, + state: { waiting: { reason, message } } + } as k8s.V1ContainerStatus +} + +function terminatedContainer( + name: string, + reason?: string, + exitCode?: number, + message?: string +): k8s.V1ContainerStatus { + return { + name, + state: { terminated: { reason, exitCode, message } } + } as k8s.V1ContainerStatus +} + +function buildEvent( + reason: string, + message: string, + opts: { type?: string; count?: number } = {} +): k8s.CoreV1Event { + return { + type: opts.type ?? 'Warning', + reason, + message, + count: opts.count + } as k8s.CoreV1Event +} + +function podResult(pod: k8s.V1Pod): never { + return pod as never +} + +function eventResult(items: k8s.CoreV1Event[]): never { + return { items } as never +} + +// ── namespace ───────────────────────────────────────────────────────────────── + +describe('namespace', () => { + afterEach(() => { + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('returns env var when set', () => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'my-ns' + expect(namespace()).toBe('my-ns') + }) +}) + +// ── getPrepareJobTimeoutSeconds ─────────────────────────────────────────────── + +describe('getPrepareJobTimeoutSeconds', () => { + afterEach(() => { + delete process.env['ACTIONS_RUNNER_PREPARE_JOB_TIMEOUT_SECONDS'] + }) + + it('returns default when env is unset', () => { + expect(getPrepareJobTimeoutSeconds()).toBe(600) + }) + + it('returns parsed value when env is valid', () => { + process.env['ACTIONS_RUNNER_PREPARE_JOB_TIMEOUT_SECONDS'] = '120' + expect(getPrepareJobTimeoutSeconds()).toBe(120) + }) + + it('returns default when env is invalid', () => { + process.env['ACTIONS_RUNNER_PREPARE_JOB_TIMEOUT_SECONDS'] = 'bad' + expect(getPrepareJobTimeoutSeconds()).toBe(600) + }) + + it('returns default when env is zero', () => { + process.env['ACTIONS_RUNNER_PREPARE_JOB_TIMEOUT_SECONDS'] = '0' + expect(getPrepareJobTimeoutSeconds()).toBe(600) + }) +}) + +// ── parsePodPhase ───────────────────────────────────────────────────────────── + +describe('parsePodPhase', () => { + it('returns known phases', () => { + expect(parsePodPhase(buildPod(PodPhase.RUNNING))).toBe(PodPhase.RUNNING) + expect(parsePodPhase(buildPod(PodPhase.PENDING))).toBe(PodPhase.PENDING) + expect(parsePodPhase(buildPod(PodPhase.SUCCEEDED))).toBe(PodPhase.SUCCEEDED) + expect(parsePodPhase(buildPod(PodPhase.FAILED))).toBe(PodPhase.FAILED) + }) + + it('returns UNKNOWN for unrecognized or missing phase', () => { + expect(parsePodPhase(buildPod(undefined))).toBe(PodPhase.UNKNOWN) + expect(parsePodPhase({} as k8s.V1Pod)).toBe(PodPhase.UNKNOWN) + expect(parsePodPhase(buildPod('Weird'))).toBe(PodPhase.UNKNOWN) + }) +}) + +// ── getUnrecoverableWaitingReasons ──────────────────────────────────────────── + +describe('getUnrecoverableWaitingReasons', () => { + afterEach(() => { + delete process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_WAITING_REASONS'] + }) + + it('returns built-in defaults when env not set', () => { + const reasons = getUnrecoverableWaitingReasons() + expect(reasons.has('ImagePullBackOff')).toBe(true) + expect(reasons.has('InvalidImageName')).toBe(true) + }) + + it('adds extra reasons from env var', () => { + process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_WAITING_REASONS'] = + 'CustomReason' + const reasons = getUnrecoverableWaitingReasons() + expect(reasons.has('CustomReason')).toBe(true) + expect(reasons.has('ImagePullBackOff')).toBe(true) + }) +}) + +// ── getUnrecoverableEventReasons ────────────────────────────────────────────── + +describe('getUnrecoverableEventReasons', () => { + afterEach(() => { + delete process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_EVENT_REASONS'] + }) + + it('returns built-in defaults when env not set', () => { + const reasons = getUnrecoverableEventReasons() + expect(reasons.has('FailedScheduling')).toBe(true) + expect(reasons.has('FailedMount')).toBe(true) + }) + + it('adds extra reasons from env var', () => { + process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_EVENT_REASONS'] = 'MyEvent' + expect(getUnrecoverableEventReasons().has('MyEvent')).toBe(true) + }) +}) + +// ── getUnrecoverableTerminatedReasons ───────────────────────────────────────── + +describe('getUnrecoverableTerminatedReasons', () => { + afterEach(() => { + delete process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_TERMINATED_REASONS'] + }) + + it('returns built-in defaults', () => { + const reasons = getUnrecoverableTerminatedReasons() + expect(reasons.has('OOMKilled')).toBe(true) + expect(reasons.has('FailedPostStartHookError')).toBe(true) + }) + + it('adds extra reasons from env var, filters empty strings', () => { + process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_TERMINATED_REASONS'] = + 'MyReason,, ' + const reasons = getUnrecoverableTerminatedReasons() + expect(reasons.has('MyReason')).toBe(true) + expect(reasons.has('OOMKilled')).toBe(true) + }) +}) + +// ── isPermanentSchedulingFailure ────────────────────────────────────────────── + +describe('isPermanentSchedulingFailure', () => { + it('returns false for undefined', () => { + expect(isPermanentSchedulingFailure(undefined)).toBe(false) + }) + + it('returns false for empty string', () => { + expect(isPermanentSchedulingFailure('')).toBe(false) + }) + + it('returns true for node affinity mismatch', () => { + expect( + isPermanentSchedulingFailure( + "0/3 nodes are available: 3 node(s) didn't match Pod's node affinity/selector." + ) + ).toBe(true) + }) + + it('returns true for untolerated taint', () => { + expect( + isPermanentSchedulingFailure( + '0/2 nodes are available: 2 node(s) had untolerated taint {key: value}.' + ) + ).toBe(true) + }) + + it('returns true for PVC not found', () => { + expect( + isPermanentSchedulingFailure( + '0/1 nodes are available: persistentvolumeclaim "my-pvc" not found.' + ) + ).toBe(true) + }) + + it('returns false for resource shortages (transient)', () => { + expect( + isPermanentSchedulingFailure( + '0/3 nodes are available: 3 Insufficient cpu.' + ) + ).toBe(false) + }) + + it('returns false for unknown message', () => { + expect(isPermanentSchedulingFailure('something unexpected')).toBe(false) + }) +}) + +// ── getPermanentSchedulingPatterns ──────────────────────────────────────────── + +describe('getPermanentSchedulingPatterns', () => { + afterEach(() => { + delete process.env['ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS'] + }) + + it('returns built-in patterns', () => { + const patterns = getPermanentSchedulingPatterns() + expect(patterns.length).toBeGreaterThan(0) + expect(patterns).toEqual(PERMANENT_SCHEDULING_PATTERNS) + }) + + it('extends with env var patterns', () => { + process.env['ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS'] = + 'mypattern' + const patterns = getPermanentSchedulingPatterns() + expect(patterns.length).toBeGreaterThan( + PERMANENT_SCHEDULING_PATTERNS.length + ) + }) +}) + +// ── getContainerErrors ──────────────────────────────────────────────────────── + +describe('getContainerErrors', () => { + it('returns empty for pod with no container statuses', () => { + expect(getContainerErrors(buildPod(PodPhase.PENDING))).toEqual([]) + expect(getContainerErrors({} as k8s.V1Pod)).toEqual([]) + }) + + it('returns empty for recoverable waiting reason', () => { + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [waitingContainer('job', 'ContainerCreating')] + }) + expect(getContainerErrors(pod)).toEqual([]) + }) + + it('detects every unrecoverable waiting reason', () => { + for (const reason of Array.from(UNRECOVERABLE_WAITING_REASONS)) { + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [waitingContainer('job', reason)] + }) + const errors = getContainerErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain(`"job": ${reason}`) + expect(errors[0]).toContain('→') + } + }) + + it('includes message detail when waiting container has a message', () => { + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [ + waitingContainer('job', 'ImagePullBackOff', 'Back-off pulling image') + ] + }) + const errors = getContainerErrors(pod) + expect(errors[0]).toContain('Back-off pulling image') + }) + + it('inspects init containers as well', () => { + const pod = buildPod(PodPhase.PENDING, { + initContainerStatuses: [waitingContainer('init', 'ImagePullBackOff')] + }) + const errors = getContainerErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain('"init"') + }) + + it('does not fast-fail on ErrImagePull (transient)', () => { + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [waitingContainer('job', 'ErrImagePull')] + }) + expect(getContainerErrors(pod)).toEqual([]) + }) +}) + +// ── getTerminatedReasonHint ─────────────────────────────────────────────────── + +describe('getTerminatedReasonHint', () => { + it('returns OOMKilled hint', () => { + expect(getTerminatedReasonHint('OOMKilled', 137)).toContain('memory limit') + }) + + it('returns FailedPostStartHookError hint', () => { + expect(getTerminatedReasonHint('FailedPostStartHookError', 1)).toContain( + 'postStart' + ) + }) + + it('returns exit code 137 SIGKILL hint', () => { + expect(getTerminatedReasonHint('Error', 137)).toContain('SIGKILL') + }) + + it('returns exit code 127 command-not-found hint', () => { + expect(getTerminatedReasonHint('Error', 127)).toContain('not found') + }) + + it('returns exit code 126 permission denied hint', () => { + expect(getTerminatedReasonHint('Error', 126)).toContain('permission') + }) + + it('returns generic exit code hint for Error with other code', () => { + const hint = getTerminatedReasonHint('Error', 1) + expect(hint).toContain('non-zero code') + }) + + it('returns kubectl fallback for unknown reason', () => { + expect(getTerminatedReasonHint('Unknown', 1)).toContain('kubectl') + }) +}) + +// ── getContainerTerminatedErrors ────────────────────────────────────────────── + +describe('getContainerTerminatedErrors', () => { + it('returns empty when no container statuses', () => { + expect(getContainerTerminatedErrors(buildPod())).toEqual([]) + expect(getContainerTerminatedErrors({} as k8s.V1Pod)).toEqual([]) + }) + + it('returns empty for running containers', () => { + const pod = buildPod(PodPhase.RUNNING, { + containerStatuses: [ + { name: 'job', state: { running: {} } } as k8s.V1ContainerStatus + ] + }) + expect(getContainerTerminatedErrors(pod)).toEqual([]) + }) + + it('detects OOMKilled and includes hint', () => { + const pod = buildPod(PodPhase.FAILED, { + containerStatuses: [terminatedContainer('job', 'OOMKilled', 137)] + }) + const errors = getContainerTerminatedErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain('OOMKilled') + expect(errors[0]).toContain('memory limit') + }) + + it('detects Error exit code 1', () => { + const pod = buildPod(PodPhase.FAILED, { + containerStatuses: [terminatedContainer('job', 'Error', 1)] + }) + const errors = getContainerTerminatedErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain('Error') + }) + + it('detects every unrecoverable terminated reason', () => { + for (const reason of Array.from(UNRECOVERABLE_TERMINATED_REASONS)) { + const pod = buildPod(PodPhase.FAILED, { + containerStatuses: [terminatedContainer('job', reason, 1)] + }) + expect(getContainerTerminatedErrors(pod)).toHaveLength(1) + } + }) + + it('ignores terminated with non-unrecoverable reason', () => { + const pod = buildPod(PodPhase.SUCCEEDED, { + containerStatuses: [terminatedContainer('job', 'Completed', 0)] + }) + expect(getContainerTerminatedErrors(pod)).toEqual([]) + }) + + it('detects terminated errors in init containers', () => { + const pod = buildPod(PodPhase.FAILED, { + initContainerStatuses: [terminatedContainer('init', 'OOMKilled', 137)] + }) + const errors = getContainerTerminatedErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain('"init"') + }) +}) + +// ── getPodConditionErrors ───────────────────────────────────────────────────── + +describe('getPodConditionErrors', () => { + it('returns empty array (current implementation)', () => { + expect(getPodConditionErrors(buildPod())).toEqual([]) + }) +}) + +// ── getPodEventErrors (with CoreV1Api prototype spy) ────────────────────────── + +describe('getPodEventErrors', () => { + let eventSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + eventSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'listNamespacedEvent' as any) + eventSpy.mockResolvedValue(eventResult([])) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('returns empty when no warning events', async () => { + eventSpy.mockResolvedValue(eventResult([])) + expect(await getPodEventErrors('my-pod')).toEqual([]) + }) + + it('returns empty for normal-type events matching a reason', async () => { + eventSpy.mockResolvedValue( + eventResult([ + buildEvent('FailedScheduling', 'no nodes', { type: 'Normal' }) + ]) + ) + expect(await getPodEventErrors('my-pod')).toEqual([]) + }) + + it('detects FailedMount and includes hint', async () => { + eventSpy.mockResolvedValue( + eventResult([buildEvent('FailedMount', 'Unable to mount volumes')]) + ) + const errors = await getPodEventErrors('my-pod') + expect(errors).toHaveLength(1) + expect(errors[0]).toContain('FailedMount') + }) + + it('detects FailedScheduling with permanent config error', async () => { + eventSpy.mockResolvedValue( + eventResult([ + buildEvent( + 'FailedScheduling', + "0/3 nodes are available: 3 node(s) didn't match Pod's node affinity/selector." + ) + ]) + ) + const errors = await getPodEventErrors('my-pod') + expect(errors).toHaveLength(1) + expect(errors[0]).toContain('FailedScheduling') + }) + + it('does NOT fast-fail on FailedScheduling with resource shortage', async () => { + eventSpy.mockResolvedValue( + eventResult([ + buildEvent('FailedScheduling', '0/3 nodes: 3 Insufficient cpu.') + ]) + ) + expect(await getPodEventErrors('my-pod')).toEqual([]) + }) + + it('deduplicates events with same reason', async () => { + eventSpy.mockResolvedValue( + eventResult([ + buildEvent('FailedMount', 'err1'), + buildEvent('FailedMount', 'err2') + ]) + ) + const errors = await getPodEventErrors('my-pod') + expect(errors).toHaveLength(1) + }) + + it('degrades gracefully when listing events is forbidden', async () => { + eventSpy.mockRejectedValue(new Error('events is forbidden') as never) + expect(await getPodEventErrors('my-pod')).toEqual([]) + }) +}) + +// ── describePodFailure (with prototype spies) ───────────────────────────────── + +describe('describePodFailure', () => { + let readSpy: ReturnType + let eventSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + readSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'readNamespacedPod' as any) + eventSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'listNamespacedEvent' as any) + eventSpy.mockResolvedValue(eventResult([])) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('reports phase and terminated containers', async () => { + readSpy.mockResolvedValue( + podResult( + buildPod(PodPhase.FAILED, { + containerStatuses: [terminatedContainer('job', 'OOMKilled', 137)] + }) + ) + ) + const result = await describePodFailure('my-pod') + expect(result).toContain('Failed') + }) + + it('includes recent Warning events', async () => { + readSpy.mockResolvedValue(podResult(buildPod(PodPhase.PENDING))) + eventSpy.mockResolvedValue( + eventResult([buildEvent('FailedScheduling', 'no nodes available')]) + ) + const result = await describePodFailure('my-pod') + expect(result).toContain('FailedScheduling') + }) + + it('degrades gracefully when pod cannot be read', async () => { + readSpy.mockRejectedValue(new Error('pod not found') as never) + const result = await describePodFailure('my-pod') + expect(result).toContain('Could not read pod') + }) +}) + +// ── checkUnrecoverableErrors ────────────────────────────────────────────────── + +describe('checkUnrecoverableErrors', () => { + let eventSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + eventSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'listNamespacedEvent' as any) + eventSpy.mockResolvedValue(eventResult([])) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('returns empty for healthy pod', async () => { + const pod = buildPod(PodPhase.RUNNING) + expect(await checkUnrecoverableErrors(pod, 'my-pod')).toEqual([]) + }) + + it('returns container waiting errors', async () => { + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [waitingContainer('job', 'ImagePullBackOff')] + }) + const errors = await checkUnrecoverableErrors(pod, 'my-pod') + expect(errors.length).toBeGreaterThan(0) + expect(errors[0]).toContain('ImagePullBackOff') + }) + + it('returns terminated errors', async () => { + const pod = buildPod(PodPhase.FAILED, { + containerStatuses: [terminatedContainer('job', 'OOMKilled', 137)] + }) + const errors = await checkUnrecoverableErrors(pod, 'my-pod') + expect(errors.length).toBeGreaterThan(0) + expect(errors[0]).toContain('OOMKilled') + }) + + it('returns event errors', async () => { + eventSpy.mockResolvedValue( + eventResult([buildEvent('FailedMount', 'mount failed')]) + ) + const pod = buildPod(PodPhase.PENDING) + const errors = await checkUnrecoverableErrors(pod, 'my-pod') + expect(errors.some(e => e.includes('FailedMount'))).toBe(true) + }) +}) + +// ── waitForPodPhases (with prototype spies) ─────────────────────────────────── + +describe('waitForPodPhases', () => { + let readSpy: ReturnType + let eventSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + readSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'readNamespacedPod' as any) + eventSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'listNamespacedEvent' as any) + eventSpy.mockResolvedValue(eventResult([])) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('resolves when pod reaches awaited phase', async () => { + readSpy.mockResolvedValue(podResult(buildPod(PodPhase.RUNNING))) + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]) + ) + ).resolves.toBeUndefined() + }) + + it('surfaces unrecoverable container errors in thrown message', async () => { + readSpy.mockResolvedValue( + podResult( + buildPod(PodPhase.PENDING, { + containerStatuses: [ + waitingContainer('job', 'ImagePullBackOff', 'can not pull') + ] + }) + ) + ) + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]), + 30 + ) + ).rejects.toThrow('ImagePullBackOff') + }, 15000) + + it('fast-fails on FailedMount event', async () => { + readSpy.mockResolvedValue(podResult(buildPod(PodPhase.PENDING))) + eventSpy.mockResolvedValue( + eventResult([buildEvent('FailedMount', 'Unable to mount volumes')]) + ) + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]), + 30 + ) + ).rejects.toThrow('FailedMount') + }, 15000) + + it('fast-fails on permanent FailedScheduling', async () => { + readSpy.mockResolvedValue(podResult(buildPod(PodPhase.PENDING))) + eventSpy.mockResolvedValue( + eventResult([ + buildEvent( + 'FailedScheduling', + "0/3 nodes are available: 3 node(s) didn't match Pod's node affinity/selector." + ) + ]) + ) + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]), + 30 + ) + ).rejects.toThrow('FailedScheduling') + }, 15000) + + it('throws with phase when pod reaches non-backoff phase', async () => { + readSpy.mockResolvedValue(podResult(buildPod(PodPhase.FAILED))) + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]), + 30 + ) + ).rejects.toThrow() + }, 15000) + + it('retries on transient readPod failure', async () => { + readSpy + .mockRejectedValueOnce(new Error('connection refused') as never) + .mockRejectedValueOnce(new Error('connection refused') as never) + .mockResolvedValue(podResult(buildPod(PodPhase.RUNNING))) + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]), + 30 + ) + ).resolves.toBeUndefined() + }, 15000) +}) + +// ── deletePod ───────────────────────────────────────────────────────────────── + +describe('deletePod', () => { + let deleteSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + deleteSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'deleteNamespacedPod' as any) + deleteSpy.mockResolvedValue({} as never) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('calls deleteNamespacedPod with correct args', async () => { + await deletePod('my-pod') + expect(deleteSpy).toHaveBeenCalledWith( + expect.objectContaining({ name: 'my-pod', namespace: 'default' }) + ) + }) +}) + +// ── createJobPod ────────────────────────────────────────────────────────────── + +describe('createJobPod', () => { + let createSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + process.env['ACTIONS_RUNNER_POD_NAME'] = 'runner-pod' + createSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'createNamespacedPod' as any) + createSpy.mockResolvedValue({ + metadata: { name: 'job-pod' }, + spec: { containers: [] } + } as never) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + delete process.env['ACTIONS_RUNNER_POD_NAME'] + }) + + it('calls createNamespacedPod and returns the pod', async () => { + const container = new k8s.V1Container() + container.name = 'job' + container.image = 'ubuntu:latest' + const pod = await createJobPod('job-pod', container) + expect(createSpy).toHaveBeenCalled() + expect(pod).toBeDefined() + }) + + it('creates pod with services', async () => { + const jobContainer = new k8s.V1Container() + jobContainer.name = 'job' + jobContainer.image = 'ubuntu:latest' + const service = new k8s.V1Container() + service.name = 'redis' + service.image = 'redis:latest' + await createJobPod('job-pod', jobContainer, [service]) + expect(createSpy).toHaveBeenCalled() + }) + + it('handles createNamespacedPod failure', async () => { + createSpy.mockRejectedValue(new Error('quota exceeded') as never) + await expect(createJobPod('job-pod')).rejects.toThrow() + }) +}) + +// ── createContainerStepPod ──────────────────────────────────────────────────── + +describe('createContainerStepPod', () => { + let createSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + process.env['ACTIONS_RUNNER_POD_NAME'] = 'runner-pod' + createSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'createNamespacedPod' as any) + createSpy.mockResolvedValue({ + metadata: { name: 'step-pod' }, + spec: { containers: [] } + } as never) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + delete process.env['ACTIONS_RUNNER_POD_NAME'] + }) + + it('calls createNamespacedPod and returns pod', async () => { + const container = new k8s.V1Container() + container.name = 'job' + container.image = 'ubuntu:latest' + const pod = await createContainerStepPod('step-pod', container) + expect(createSpy).toHaveBeenCalled() + expect(pod).toBeDefined() + }) +}) + +// ── namespace (fallbacks) ───────────────────────────────────────────────────── +// +// We cannot spy on `fs.readFileSync` directly in ESM (module namespace is not +// configurable). Instead, use a real temp file path that doesn't exist for +// the "missing" path, and a real temp file with content for the SA-file path. + +describe('namespace fallbacks', () => { + afterEach(() => { + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('resolves a fallback or throws when no namespace source is available', () => { + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + // Outside a pod: no kubeconfig namespace and no ServiceAccount file → + // throws ENOENT. Inside a pod (e.g. CI runners): the SA file (or a + // kubeconfig context) legitimately resolves the namespace. + let resolved: string | undefined + try { + resolved = namespace() + } catch (err) { + expect(String(err)).toMatch(/Failed to determine namespace/) + return + } + expect(typeof resolved).toBe('string') + expect(resolved?.length).toBeGreaterThan(0) + }) +}) + +// ── getPermanentSchedulingPatterns (env extension + cache) ─────────────────── + +describe('getPermanentSchedulingPatterns env extension', () => { + afterEach(() => { + delete process.env['ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS'] + vi.restoreAllMocks() + }) + + it('skips invalid regex with a warning', () => { + process.env['ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS'] = + '[invalid, (goodpattern)' + const result = getPermanentSchedulingPatterns() + expect(result.length).toBeGreaterThan(PERMANENT_SCHEDULING_PATTERNS.length) + // Valid pattern was added, invalid one was skipped + expect(result.some(p => p.source.includes('goodpattern'))).toBe(true) + }) + + it('caches compiled patterns across calls with same env', () => { + process.env['ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS'] = + 'pattern-a' + const first = getPermanentSchedulingPatterns() + const second = getPermanentSchedulingPatterns() + // Same env → cached result, identity preserved + expect(second).toBe(first) + }) + + it('filters out empty entries from comma-separated list', () => { + process.env['ACTIONS_RUNNER_K8S_PERMANENT_SCHEDULING_PATTERNS'] = + ' ,, alpha, ' + const result = getPermanentSchedulingPatterns() + // Only "alpha" should be added + expect(result.some(p => p.source === 'alpha')).toBe(true) + expect(result.some(p => p.source === '')).toBe(false) + }) +}) + +// ── createDockerSecret ─────────────────────────────────────────────────────── + +describe('createDockerSecret', () => { + let createSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + process.env['ACTIONS_RUNNER_POD_NAME'] = 'runner-pod' + createSpy = vi.spyOn( + k8s.CoreV1Api.prototype, + 'createNamespacedSecret' as any + ) + createSpy.mockResolvedValue({ + metadata: { name: 'docker-secret' } + } as never) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + delete process.env['ACTIONS_RUNNER_POD_NAME'] + }) + + it('creates secret with base64-encoded docker config', async () => { + const secret = await createDockerSecret({ + serverUrl: 'https://ghcr.io', + username: 'user', + password: 'pass' + }) + expect(createSpy).toHaveBeenCalledWith( + expect.objectContaining({ namespace: 'default' }) + ) + expect(secret.metadata?.name).toBe('docker-secret') + // Verify the auth payload decodes correctly + const call = createSpy.mock.calls[0][0] as any + const decoded = JSON.parse( + Buffer.from(call.body.data['.dockerconfigjson'], 'base64').toString( + 'utf8' + ) + ) + expect(decoded.auths['https://ghcr.io'].username).toBe('user') + expect(decoded.auths['https://ghcr.io'].password).toBe('pass') + }) + + it('falls back to docker.io when serverUrl is missing', async () => { + await createDockerSecret({ + username: 'u', + password: 'p' + } as any) + const call = createSpy.mock.calls[0][0] as any + const decoded = JSON.parse( + Buffer.from(call.body.data['.dockerconfigjson'], 'base64').toString( + 'utf8' + ) + ) + expect(decoded.auths['https://index.docker.io/v1/']).toBeDefined() + }) +}) + +// ── createSecretForEnvs ────────────────────────────────────────────────────── + +describe('createSecretForEnvs', () => { + let createSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + process.env['ACTIONS_RUNNER_POD_NAME'] = 'runner-pod' + createSpy = vi.spyOn( + k8s.CoreV1Api.prototype, + 'createNamespacedSecret' as any + ) + createSpy.mockResolvedValue({ metadata: { name: 'env-secret' } } as never) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + delete process.env['ACTIONS_RUNNER_POD_NAME'] + }) + + it('base64-encodes each env value', async () => { + const name = await createSecretForEnvs({ FOO: 'bar', BAZ: 'qux' }) + // createSecretForEnvs returns the locally-generated secret name (not the API response) + expect(typeof name).toBe('string') + expect(name.length).toBeGreaterThan(0) + const call = createSpy.mock.calls[0][0] as any + expect(call.body.data['FOO']).toBe(Buffer.from('bar').toString('base64')) + expect(call.body.data['BAZ']).toBe(Buffer.from('qux').toString('base64')) + }) + + it('handles empty envs object', async () => { + const name = await createSecretForEnvs({}) + expect(typeof name).toBe('string') + expect(name.length).toBeGreaterThan(0) + const call = createSpy.mock.calls[0][0] as any + expect(call.body.data).toEqual({}) + }) +}) + +// ── deleteSecret ───────────────────────────────────────────────────────────── + +describe('deleteSecret', () => { + let deleteSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + deleteSpy = vi.spyOn( + k8s.CoreV1Api.prototype, + 'deleteNamespacedSecret' as any + ) + deleteSpy.mockResolvedValue({} as never) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('calls deleteNamespacedSecret with name and namespace', async () => { + await deleteSecret('my-secret') + expect(deleteSpy).toHaveBeenCalledWith( + expect.objectContaining({ name: 'my-secret', namespace: 'default' }) + ) + }) +}) + +// ── pruneSecrets ───────────────────────────────────────────────────────────── + +describe('pruneSecrets', () => { + let listSpy: ReturnType + let deleteSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + process.env['ACTIONS_RUNNER_POD_NAME'] = 'runner-pod' + listSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'listNamespacedSecret' as any) + deleteSpy = vi.spyOn( + k8s.CoreV1Api.prototype, + 'deleteNamespacedSecret' as any + ) + deleteSpy.mockResolvedValue({} as never) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + delete process.env['ACTIONS_RUNNER_POD_NAME'] + }) + + it('returns immediately when no secrets found', async () => { + listSpy.mockResolvedValue({ items: [] } as never) + await pruneSecrets() + expect(deleteSpy).not.toHaveBeenCalled() + }) + + it('deletes all secrets returned by list', async () => { + listSpy.mockResolvedValue({ + items: [ + { metadata: { name: 'a' } }, + { metadata: { name: 'b' } }, + { metadata: { name: undefined } } // skipped + ] + } as never) + await pruneSecrets() + expect(deleteSpy).toHaveBeenCalledTimes(2) + expect(deleteSpy).toHaveBeenCalledWith( + expect.objectContaining({ name: 'a' }) + ) + expect(deleteSpy).toHaveBeenCalledWith( + expect.objectContaining({ name: 'b' }) + ) + }) +}) + +// ── prunePods ──────────────────────────────────────────────────────────────── + +describe('prunePods', () => { + let listSpy: ReturnType + let deleteSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + process.env['ACTIONS_RUNNER_POD_NAME'] = 'runner-pod' + listSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'listNamespacedPod' as any) + deleteSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'deleteNamespacedPod' as any) + deleteSpy.mockResolvedValue({} as never) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + delete process.env['ACTIONS_RUNNER_POD_NAME'] + }) + + it('returns immediately when no pods found', async () => { + listSpy.mockResolvedValue({ items: [] } as never) + await prunePods() + expect(deleteSpy).not.toHaveBeenCalled() + }) + + it('deletes all named pods', async () => { + listSpy.mockResolvedValue({ + items: [{ metadata: { name: 'p1' } }, { metadata: { name: 'p2' } }] + } as never) + await prunePods() + expect(deleteSpy).toHaveBeenCalledTimes(2) + }) +}) + +// ── getPodStatus ───────────────────────────────────────────────────────────── + +describe('getPodStatus', () => { + let readSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + readSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'readNamespacedPod' as any) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('returns pod.status from the API', async () => { + readSpy.mockResolvedValue({ + status: { phase: PodPhase.RUNNING } + } as never) + const status = await getPodStatus('my-pod') + expect(status?.phase).toBe(PodPhase.RUNNING) + }) +}) + +// ── waitForJobToComplete ───────────────────────────────────────────────────── + +describe('waitForJobToComplete', () => { + let readSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + readSpy = vi.spyOn(k8s.BatchV1Api.prototype, 'readNamespacedJob' as any) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('resolves when job has succeeded status', async () => { + readSpy.mockResolvedValue({ status: { succeeded: 1 } } as never) + await expect(waitForJobToComplete('my-job')).resolves.toBeUndefined() + }) + + it('throws wrapped error when job has failed status', async () => { + readSpy.mockResolvedValue({ status: { failed: 1 } } as never) + await expect(waitForJobToComplete('my-job')).rejects.toThrow( + /job my-job has failed/ + ) + }) +}) + +// ── isAuthPermissionsOK ────────────────────────────────────────────────────── + +describe('isAuthPermissionsOK', () => { + let sarSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + sarSpy = vi.spyOn( + k8s.AuthorizationV1Api.prototype, + 'createSelfSubjectAccessReview' as any + ) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('returns true when all permissions are allowed', async () => { + sarSpy.mockResolvedValue({ status: { allowed: true } } as never) + await expect(isAuthPermissionsOK()).resolves.toBe(true) + }) + + it('returns false when any permission is denied', async () => { + sarSpy.mockResolvedValue({ status: { allowed: false } } as never) + await expect(isAuthPermissionsOK()).resolves.toBe(false) + }) +}) + +// ── localCalculateOutputHashSorted ─────────────────────────────────────────── + +describe('localCalculateOutputHashSorted', () => { + it('sorts lines and produces a sha256 hash', async () => { + // Use `node` so the test is cross-platform (Windows has no /bin/echo) + const { hash, lines } = await localCalculateOutputHashSorted([ + process.execPath, + '-e', + "console.log('hello')" + ]) + expect(lines).toEqual(['hello']) + expect(hash).toMatch(/^[a-f0-9]{64}$/) + }) + + it('rejects when child process exits non-zero', async () => { + // `node -e process.exit(1)` always exits 1 on every platform + await expect( + localCalculateOutputHashSorted([ + process.execPath, + '-e', + 'process.exit(1)' + ]) + ).rejects.toThrow(/exited with code/) + }) +}) + +// ── execCalculateOutputHashSorted ──────────────────────────────────────────── + +describe('execCalculateOutputHashSorted', () => { + let execSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + execSpy = vi.spyOn(k8s.Exec.prototype, 'exec' as any) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('sorts captured stdout and returns hash + lines', async () => { + // Simulate the exec callback path: capture stream receives bytes, + // status callback fires with Success. + execSpy.mockImplementation(async function ( + this: any, + _ns, + _pod, + _c, + _cmd, + stdout, + _stderr, + _stdin, + _tty, + statusCb + ) { + // Write some lines out of order to verify sorting + stdout.write('banana\napple\ncherry\n') + void Promise.resolve().then(() => + statusCb({ status: 'Success', code: 0 }) + ) + return Promise.resolve({}) + }) + const { hash, lines } = await execCalculateOutputHashSorted( + 'my-pod', + 'job', + ['sh', '-c', 'echo test'] + ) + expect(lines).toEqual(['apple', 'banana', 'cherry']) + expect(hash).toMatch(/^[a-f0-9]{64}$/) + }) + + it('rejects when exec returns Failure status', async () => { + execSpy.mockImplementation(async function ( + this: any, + _ns, + _pod, + _c, + _cmd, + stdout, + _stderr, + _stdin, + _tty, + statusCb + ) { + stdout.write('') + void Promise.resolve().then(() => + statusCb({ status: 'Failure', message: 'exec failed' }) + ) + return Promise.resolve({}) + }) + await expect( + execCalculateOutputHashSorted('my-pod', 'job', ['ls']) + ).rejects.toThrow('exec failed') + }) + + it('rejects when exec promise rejects', async () => { + execSpy.mockRejectedValue(new Error('connection refused') as never) + await expect( + execCalculateOutputHashSorted('my-pod', 'job', ['ls']) + ).rejects.toThrow('connection refused') + }) +}) + +// ── isPodContainerAlpine ───────────────────────────────────────────────────── + +describe('isPodContainerAlpine', () => { + let execSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + execSpy = vi.spyOn(k8s.Exec.prototype, 'exec' as any) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('returns true when the alpine check exits 0', async () => { + execSpy.mockImplementation(async function ( + this: any, + _ns, + _pod, + _c, + _cmd, + _stdout, + _stderr, + _stdin, + _tty, + statusCb + ) { + void Promise.resolve().then(() => + statusCb({ status: 'Success', code: 0 }) + ) + return Promise.resolve({}) + }) + await expect(isPodContainerAlpine('my-pod', 'job')).resolves.toBe(true) + }) + + it('returns false when the alpine check fails (non-zero exit)', async () => { + execSpy.mockImplementation(async function ( + this: any, + _ns, + _pod, + _c, + _cmd, + _stdout, + _stderr, + _stdin, + _tty, + statusCb + ) { + void Promise.resolve().then(() => + statusCb({ + status: 'Failure', + message: 'command terminated with exit code 1' + }) + ) + return Promise.resolve({}) + }) + await expect(isPodContainerAlpine('my-pod', 'job')).resolves.toBe(false) + }) +}) + +// ── getPodEventErrors (extended: count + multiple reasons) ─────────────────── + +describe('getPodEventErrors extended', () => { + let eventSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + eventSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'listNamespacedEvent' as any) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('appends (xN) when event count > 1', async () => { + eventSpy.mockResolvedValue( + eventResult([buildEvent('FailedMount', 'mount err', { count: 5 })]) + ) + const errors = await getPodEventErrors('my-pod') + expect(errors[0]).toContain('(x5)') + }) + + it('returns errors for distinct unrecoverable reasons', async () => { + eventSpy.mockResolvedValue( + eventResult([ + buildEvent('FailedMount', 'm1'), + buildEvent('FailedBinding', 'pvc not found') + ]) + ) + const errors = await getPodEventErrors('my-pod') + expect(errors).toHaveLength(2) + expect(errors.some(e => e.includes('FailedMount'))).toBe(true) + expect(errors.some(e => e.includes('FailedBinding'))).toBe(true) + }) + + it('skips FailedScheduling when message has no permanent pattern', async () => { + eventSpy.mockResolvedValue( + eventResult([ + buildEvent('FailedScheduling', 'some random transient issue') + ]) + ) + const errors = await getPodEventErrors('my-pod') + expect(errors).toEqual([]) + }) + + it('includes message detail in error', async () => { + eventSpy.mockResolvedValue( + eventResult([ + buildEvent('FailedMount', 'a specific mount failure detail') + ]) + ) + const errors = await getPodEventErrors('my-pod') + expect(errors[0]).toContain('a specific mount failure detail') + }) +}) + +// ── createJobPod with extension ─────────────────────────────────────────────── + +describe('createJobPod with extension and workingDir', () => { + let createSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + process.env['ACTIONS_RUNNER_POD_NAME'] = 'runner-pod' + process.env['GITHUB_WORKSPACE'] = '/__w/repo/repo' + createSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'createNamespacedPod' as any) + createSpy.mockResolvedValue({ + metadata: { name: 'job-pod' }, + spec: { containers: [] } + } as never) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + delete process.env['ACTIONS_RUNNER_POD_NAME'] + delete process.env['GITHUB_WORKSPACE'] + }) + + it('applies extension metadata and spec when provided', async () => { + // Covers k8s/index.ts lines 229-230, 233 (extension branches in createJobPod) + const extension: k8s.V1PodTemplateSpec = { + metadata: { + labels: { 'custom-label': 'val' }, + annotations: { 'custom-ann': 'val2' } + }, + spec: { + containers: [], + restartPolicy: 'Never' + } + } + const container = new k8s.V1Container() + container.name = 'job' + container.image = 'ubuntu:latest' + await createJobPod('job-pod', container, [], undefined, extension) + expect(createSpy).toHaveBeenCalled() + }) + + it('sets workingDirPath mkdir when GITHUB_WORKSPACE has sub-path', async () => { + // Covers k8s/index.ts line 117 (workingDirPath conditional) + process.env['GITHUB_WORKSPACE'] = '/__w/repo/myrepo' + const container = new k8s.V1Container() + container.name = 'job' + container.image = 'ubuntu:latest' + await createJobPod('job-pod', container) + expect(createSpy).toHaveBeenCalled() + }) +}) + +// ── getContainerErrors — getWaitingReasonHint branches ──────────────────────── + +describe('getContainerErrors — getWaitingReasonHint additional branches', () => { + it('returns CreateContainerConfigError hint', () => { + // Covers k8s/index.ts lines 1127-1128 (CreateContainerConfigError case) + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [waitingContainer('job', 'CreateContainerConfigError')] + }) + const errors = getContainerErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain('Container config is invalid') + }) + + it('returns default hint for unknown waiting reason via env extension', () => { + // Covers k8s/index.ts lines 1136-1139 (default case in getWaitingReasonHint) + // Add a custom reason via env var + process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_WAITING_REASONS'] = + 'WeirdCustomReason' + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [waitingContainer('job', 'WeirdCustomReason')] + }) + const errors = getContainerErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain('kubectl describe pod') + delete process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_WAITING_REASONS'] + }) + + it('returns InvalidImageName hint', () => { + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [waitingContainer('job', 'InvalidImageName')] + }) + const errors = getContainerErrors(pod) + expect(errors[0]).toContain('malformed') + }) +}) + +// ── containerPorts ──────────────────────────────────────────────────────────── + +describe('containerPorts', () => { + it('returns empty array when portMappings is absent', () => { + expect(containerPorts({} as any)).toEqual([]) + expect(containerPorts({ portMappings: [] } as any)).toEqual([]) + }) + + it('parses a simple containerPort', () => { + const ports = containerPorts({ portMappings: ['8080'] } as any) + expect(ports).toHaveLength(1) + expect(ports[0].containerPort).toBe(8080) + expect(ports[0].protocol).toBe('TCP') + }) + + it('parses hostPort:containerPort format', () => { + const ports = containerPorts({ portMappings: ['80:8080'] } as any) + expect(ports[0].hostPort).toBe(80) + expect(ports[0].containerPort).toBe(8080) + }) + + it('parses protocol suffix', () => { + const ports = containerPorts({ portMappings: ['8080/UDP'] } as any) + expect(ports[0].protocol).toBe('UDP') + expect(ports[0].containerPort).toBe(8080) + }) + + it('parses hostPort:containerPort/protocol', () => { + const ports = containerPorts({ portMappings: ['80:8080/TCP'] } as any) + expect(ports[0].hostPort).toBe(80) + expect(ports[0].containerPort).toBe(8080) + expect(ports[0].protocol).toBe('TCP') + }) + + it('throws on too many slashes', () => { + expect(() => + containerPorts({ portMappings: ['80/TCP/extra'] } as any) + ).toThrow('Unexpected port format') + }) + + it('throws on too many colons', () => { + expect(() => + containerPorts({ portMappings: ['80:8080:9090'] } as any) + ).toThrow('":" separator') + }) + + it('throws on invalid port number', () => { + expect(() => containerPorts({ portMappings: ['0'] } as any)).toThrow( + 'invalid container port' + ) + expect(() => containerPorts({ portMappings: ['65536'] } as any)).toThrow( + 'invalid container port' + ) + expect(() => containerPorts({ portMappings: ['abc'] } as any)).toThrow( + 'invalid container port' + ) + }) + + it('parses multiple port mappings', () => { + const ports = containerPorts({ + portMappings: ['80:8080', '443:8443/TCP'] + } as any) + expect(ports).toHaveLength(2) + expect(ports[0].containerPort).toBe(8080) + expect(ports[1].containerPort).toBe(8443) + }) +}) + +// ── execPodStepWithOutput ───────────────────────────────────────────────────── + +describe('execPodStepWithOutput', () => { + let execSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + execSpy = vi.spyOn(k8s.Exec.prototype, 'exec' as any) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('resolves with code 0 and captured output on success', async () => { + execSpy.mockImplementation(async function ( + this: any, + _ns, + _pod, + _c, + _cmd, + stdout, + _stderr, + _stdin, + _tty, + statusCb + ) { + stdout.write('hello\nworld\n') + void Promise.resolve().then(() => + statusCb({ status: 'Success', code: 0 }) + ) + return Promise.resolve({}) + }) + const result = await execPodStepWithOutput( + ['sh', '-c', 'echo hi'], + 'my-pod', + 'job' + ) + expect(result.code).toBe(0) + expect(result.output).toContain('hello') + }) + + it('resolves with parsed exit code from Failure message', async () => { + execSpy.mockImplementation(async function ( + this: any, + _ns, + _pod, + _c, + _cmd, + _stdout, + _stderr, + _stdin, + _tty, + statusCb + ) { + void Promise.resolve().then(() => + statusCb({ + status: 'Failure', + message: 'command terminated with exit code 1' + }) + ) + return Promise.resolve({}) + }) + const result = await execPodStepWithOutput( + ['sh', '-c', 'exit 1'], + 'my-pod', + 'job' + ) + expect(result.code).toBe(1) + }) + + it('rejects when Failure has no parseable exit code', async () => { + execSpy.mockImplementation(async function ( + this: any, + _ns, + _pod, + _c, + _cmd, + _stdout, + _stderr, + _stdin, + _tty, + statusCb + ) { + void Promise.resolve().then(() => + statusCb({ status: 'Failure', message: 'unexpected error' }) + ) + return Promise.resolve({}) + }) + await expect( + execPodStepWithOutput(['sh', '-c', 'fail'], 'my-pod', 'job') + ).rejects.toThrow('unexpected error') + }) + + it('resolves with parsed code when exec promise rejects with exit code message', async () => { + execSpy.mockRejectedValue( + new Error('command terminated with exit code 2') as never + ) + const result = await execPodStepWithOutput( + ['sh', '-c', 'exit 2'], + 'my-pod', + 'job' + ) + expect(result.code).toBe(2) + }) + + it('rejects when exec promise rejects without exit code', async () => { + execSpy.mockRejectedValue(new Error('connection refused') as never) + await expect( + execPodStepWithOutput(['ls'], 'my-pod', 'job') + ).rejects.toThrow('connection refused') + }) +}) + +// ── getPodLogs ──────────────────────────────────────────────────────────────── + +describe('getPodLogs', () => { + let logSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + logSpy = vi.spyOn(k8s.Log.prototype, 'log' as any) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('resolves when log stream ends normally', async () => { + logSpy.mockImplementation(async (_ns, _pod, _c, logStream, _opts) => { + void Promise.resolve().then(() => logStream.end()) + return undefined + }) + await expect(getPodLogs('my-pod', 'job')).resolves.toBeUndefined() + }) + + it('rejects when log stream emits an error', async () => { + logSpy.mockImplementation(async (_ns, _pod, _c, logStream, _opts) => { + void Promise.resolve().then(() => + logStream.destroy(new Error('stream error')) + ) + return undefined + }) + await expect(getPodLogs('my-pod', 'job')).rejects.toThrow('stream error') + }) +}) + +// ── getPodByName ────────────────────────────────────────────────────────────── + +describe('getPodByName', () => { + let readSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + readSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'readNamespacedPod' as any) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('returns the pod from the API', async () => { + const fakePod = buildPod('Running') + readSpy.mockResolvedValue(fakePod as never) + const pod = await getPodByName('my-pod') + expect(readSpy).toHaveBeenCalledWith( + expect.objectContaining({ name: 'my-pod', namespace: 'default' }) + ) + expect(pod).toBe(fakePod) + }) + + it('propagates API errors', async () => { + readSpy.mockRejectedValue(new Error('not found') as never) + await expect(getPodByName('missing-pod')).rejects.toThrow('not found') + }) +}) + +// ── getSecretByName ─────────────────────────────────────────────────────────── + +describe('getSecretByName', () => { + let readSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + readSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'readNamespacedSecret' as any) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('returns the secret from the API', async () => { + const fakeSecret = { + data: { PUSHGATEWAY_URL: 'aHR0cDovL3Bndzo5MDkx' } + } as k8s.V1Secret + readSpy.mockResolvedValue(fakeSecret as never) + const secret = await getSecretByName('npu-metrics-pushgw') + expect(readSpy).toHaveBeenCalledWith( + expect.objectContaining({ + name: 'npu-metrics-pushgw', + namespace: 'default' + }) + ) + expect(secret).toBe(fakeSecret) + }) + + it('propagates API errors', async () => { + readSpy.mockRejectedValue(new Error('forbidden') as never) + await expect(getSecretByName('nope')).rejects.toThrow('forbidden') + }) +}) + +// ── listPodsByRunnerInstance ────────────────────────────────────────────────── + +describe('listPodsByRunnerInstance', () => { + let listSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_POD_NAME'] = 'my-runner-pod' + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + listSpy = vi.spyOn(k8s.CoreV1Api.prototype, 'listNamespacedPod' as any) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + delete process.env['ACTIONS_RUNNER_POD_NAME'] + }) + + it('lists pods with the runner-pod label selector', async () => { + const fakeList = { + items: [buildPod('Running'), buildPod('Succeeded')] + } as never + listSpy.mockResolvedValue(fakeList) + const pods = await listPodsByRunnerInstance() + expect(listSpy).toHaveBeenCalledWith( + expect.objectContaining({ + namespace: 'default', + labelSelector: 'runner-pod=my-runner-pod' + }) + ) + expect(pods).toHaveLength(2) + }) + + it('returns an empty list when no pods match', async () => { + listSpy.mockResolvedValue({ items: [] } as never) + const pods = await listPodsByRunnerInstance() + expect(pods).toEqual([]) + }) + + it('propagates API errors', async () => { + listSpy.mockRejectedValue(new Error('forbidden') as never) + await expect(listPodsByRunnerInstance()).rejects.toThrow('forbidden') + }) +}) + +// ── execPodStep ─────────────────────────────────────────────────────────────── + +describe('execPodStep', () => { + let execSpy: ReturnType + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + execSpy = vi.spyOn(k8s.Exec.prototype, 'exec' as any) + }) + + afterEach(() => { + vi.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('resolves with exit code 0 on Success', async () => { + execSpy.mockImplementation(async function ( + this: any, + _ns, + _pod, + _c, + _cmd, + _stdout, + _stderr, + _stdin, + _tty, + statusCb + ) { + void Promise.resolve().then(() => + statusCb({ status: 'Success', code: 0 }) + ) + return Promise.resolve(null) + }) + const code = await execPodStep(['echo', 'hi'], 'my-pod', 'job') + expect(code).toBe(0) + }) + + it('rejects with message on Failure', async () => { + execSpy.mockImplementation(async function ( + this: any, + _ns, + _pod, + _c, + _cmd, + _stdout, + _stderr, + _stdin, + _tty, + statusCb + ) { + void Promise.resolve().then(() => + statusCb({ status: 'Failure', message: 'command failed' }) + ) + return Promise.resolve(null) + }) + await expect( + execPodStep(['sh', '-c', 'exit 1'], 'my-pod', 'job') + ).rejects.toThrow('command failed') + }) + + it('rejects when exec promise rejects', async () => { + execSpy.mockRejectedValue(new Error('connection refused') as never) + await expect(execPodStep(['ls'], 'my-pod', 'job')).rejects.toThrow( + 'connection refused' + ) + }) + + it('resolves with Success code when ws is non-null (heartbeat branch)', async () => { + const fakeWs = { + readyState: 1, + once: vi.fn((_event, cb) => { + setTimeout(cb, 0) + return fakeWs + }), + close: vi.fn() + } + execSpy.mockImplementation(async function ( + this: any, + _ns, + _pod, + _c, + _cmd, + _stdout, + _stderr, + _stdin, + _tty, + statusCb + ) { + void Promise.resolve().then(() => + statusCb({ status: 'Success', code: 42 }) + ) + return Promise.resolve(fakeWs) + }) + const code = await execPodStep(['echo'], 'my-pod', 'job') + expect(code).toBe(42) + }) + + it('handles ws close timeout on Failure (readyState=1)', async () => { + const fakeWs = { + readyState: 1, + once: vi.fn(), + close: vi.fn() + } + execSpy.mockImplementation(async function ( + this: any, + _ns, + _pod, + _c, + _cmd, + _stdout, + _stderr, + _stdin, + _tty, + statusCb + ) { + void Promise.resolve().then(() => + statusCb({ status: 'Failure', message: 'oops' }) + ) + return Promise.resolve(fakeWs) + }) + await expect(execPodStep(['fail'], 'my-pod', 'job')).rejects.toThrow('oops') + }, 10000) +}) diff --git a/packages/k8s/src/k8s/utils/npu-metrics.spec.ts b/packages/k8s/src/k8s/utils/npu-metrics.spec.ts new file mode 100644 index 00000000..d4c6a992 --- /dev/null +++ b/packages/k8s/src/k8s/utils/npu-metrics.spec.ts @@ -0,0 +1,1002 @@ +import * as k8s from '@kubernetes/client-node' +import * as http from 'http' +import * as net from 'net' +import type { AddressInfo } from 'net' + +vi.mock('@actions/core', () => ({ + debug: vi.fn(), + error: vi.fn(), + warning: vi.fn(), + info: vi.fn() +})) + +vi.mock('../index', () => ({ + execPodStepWithOutput: vi.fn(), + getPodByName: vi.fn(), + getSecretByName: vi.fn(), + listPodsByRunnerInstance: vi.fn(), + namespace: vi.fn().mockReturnValue('test-ns') +})) + +import { + NPU_METRICS_MARKER, + buildNpuAggregateScript, + buildNpuJobMetricsBody, + buildNpuPushFailedBody, + buildNpuSamplerScript, + buildPushgatewayPath, + collectAndPushNpuMetrics, + collectNpuAggregateFromPod, + containerHasNpuRequest, + decodePushSecret, + escapePromLabelValue, + extractClusterFromRunnerPod, + getIdleThresholdPercent, + getNpuSampleIntervalSeconds, + hasNpuRequest, + injectNpuMetrics, + isIdleRecord, + maybeInjectNpuMetrics, + nodeRequest, + npuMetricsEnabled, + parseNpuAggregate, + pushToPushgateway, + repoFromEnv, + resolveNpuLabelsFromPod, + withTimeout +} from './npu-metrics' +import * as k8sMod from '../index' + +function makeContainer( + overrides: Partial = {} +): k8s.V1Container { + return { + name: 'job', + image: 'ubuntu:latest', + ...overrides + } as k8s.V1Container +} + +function b64(value: string): string { + return Buffer.from(value, 'utf8').toString('base64') +} + +// ── toggles and thresholds ───────────────────────────────────────────────────── + +describe('npuMetricsEnabled', () => { + it('defaults to enabled', () => { + expect(npuMetricsEnabled({})).toBe(true) + }) + it('disables on disabled', () => { + expect( + npuMetricsEnabled({ + ACTIONS_RUNNER_NPU_METRICS: 'disabled' + }) + ).toBe(false) + }) + it('is case-insensitive and trims', () => { + expect( + npuMetricsEnabled({ + ACTIONS_RUNNER_NPU_METRICS: ' DISABLED ' + }) + ).toBe(false) + }) + it('keeps enabled for other values', () => { + expect( + npuMetricsEnabled({ + ACTIONS_RUNNER_NPU_METRICS: 'enabled' + }) + ).toBe(true) + }) +}) + +describe('getNpuSampleIntervalSeconds', () => { + it('defaults to 1s', () => { + expect(getNpuSampleIntervalSeconds({})).toBe(1) + }) + it('parses a valid value', () => { + expect( + getNpuSampleIntervalSeconds({ + NPU_SAMPLE_INTERVAL: '0.5' + }) + ).toBe(0.5) + }) + it('clamps to the 0.2s minimum', () => { + expect( + getNpuSampleIntervalSeconds({ + NPU_SAMPLE_INTERVAL: '0.01' + }) + ).toBe(0.2) + }) + it('falls back to default on invalid input', () => { + expect( + getNpuSampleIntervalSeconds({ + NPU_SAMPLE_INTERVAL: 'abc' + }) + ).toBe(1) + expect( + getNpuSampleIntervalSeconds({ + NPU_SAMPLE_INTERVAL: '-2' + }) + ).toBe(1) + }) +}) + +describe('getIdleThresholdPercent', () => { + it('defaults to 5', () => { + expect(getIdleThresholdPercent({})).toBe(5) + }) + it('parses a custom threshold', () => { + expect(getIdleThresholdPercent({ NPU_IDLE_THRESHOLD: '10' })).toBe(10) + }) + it('falls back to default on invalid input', () => { + expect( + getIdleThresholdPercent({ + NPU_IDLE_THRESHOLD: 'oops' + }) + ).toBe(5) + }) +}) + +// ── detection ────────────────────────────────────────────────────────────────── + +describe('containerHasNpuRequest / hasNpuRequest', () => { + it('detects ascend resource requests', () => { + const c = makeContainer({ + resources: { requests: { 'huawei.com/ascend-1980': '8' } } + }) + expect(containerHasNpuRequest(c)).toBe(true) + }) + it('detects ascend resource limits only', () => { + const c = makeContainer({ + resources: { limits: { 'huawei.com/ascend-310': '1' } } + }) + expect(containerHasNpuRequest(c)).toBe(true) + }) + it('rejects non-ascend resources', () => { + const c = makeContainer({ + resources: { requests: { cpu: '2', 'nvidia.com/gpu': '1' } } + }) + expect(containerHasNpuRequest(c)).toBe(false) + }) + it('handles empty resources', () => { + expect(containerHasNpuRequest(makeContainer())).toBe(false) + expect(hasNpuRequest(undefined)).toBe(false) + }) + it('hasNpuRequest scans all containers', () => { + const spec = { + containers: [ + makeContainer({ name: 'a' }), + makeContainer({ + name: 'b', + resources: { requests: { 'huawei.com/ascend-910b': '2' } } + }) + ] + } as k8s.V1PodSpec + expect(hasNpuRequest(spec)).toBe(true) + }) +}) + +// ── shell scripts ────────────────────────────────────────────────────────────── + +describe('buildNpuSamplerScript', () => { + it('embeds the marker, card enumeration and interval', () => { + const script = buildNpuSamplerScript(1) + expect(script).toContain(NPU_METRICS_MARKER) + expect(script).toContain('/dev/davinci[0-9]*') + expect(script).toContain('npu-smi info -t usages') + expect(script).toContain('sleep 1') + expect(script).toContain('/tmp/npu-samples.jsonl') + }) + it('rotates the samples file above the size cap', () => { + expect(buildNpuSamplerScript()).toContain('-gt 4194304') + }) + it('substitutes the requested interval', () => { + expect(buildNpuSamplerScript(0.25)).toContain('sleep 0.25') + }) +}) + +describe('buildNpuAggregateScript', () => { + it('aggregates samples and prints the marker payload', () => { + const script = buildNpuAggregateScript() + expect(script).toContain(NPU_METRICS_MARKER) + expect(script).toContain('awk -v now=') + expect(script).toContain('touch "$F"') + }) +}) + +// ── injection ────────────────────────────────────────────────────────────────── + +describe('injectNpuMetrics / maybeInjectNpuMetrics', () => { + afterEach(() => { + delete process.env.ACTIONS_RUNNER_NPU_METRICS + }) + + it('injects lifecycle hooks on a bare container', () => { + const c = makeContainer() + expect(injectNpuMetrics(c)).toBe(true) + expect(c.lifecycle?.postStart?.exec?.command?.[0]).toBe('sh') + expect(c.lifecycle?.postStart?.exec?.command?.[1]).toBe('-c') + expect(c.lifecycle?.postStart?.exec?.command?.[2]).toContain( + NPU_METRICS_MARKER + ) + expect(c.lifecycle?.postStart?.exec?.command?.[2]).toContain( + '/tmp/npu-samples.jsonl' + ) + expect(c.lifecycle?.preStop?.exec?.command?.[2]).toContain( + `head -c 4096 > /dev/termination-log` + ) + }) + + it('appends to an existing sh -c postStart without touching it', () => { + const c = makeContainer({ + lifecycle: { + postStart: { + exec: { command: ['/bin/sh', '-c', 'echo npu-precheck'] } + } + } + }) + expect(injectNpuMetrics(c)).toBe(true) + const command = c.lifecycle?.postStart?.exec?.command + expect(command?.[0]).toBe('/bin/sh') + const script = command?.[2] ?? '' + expect(script).toContain('echo npu-precheck') + expect(script).toContain(NPU_METRICS_MARKER) + const lines = script.split('\n') + expect(lines[0]).toBe('echo npu-precheck') + }) + + it('wraps an arbitrary existing command', () => { + const c = makeContainer({ + lifecycle: { + postStart: { exec: { command: ['/usr/bin/check', '--flag'] } } + } + }) + expect(injectNpuMetrics(c)).toBe(true) + const command = c.lifecycle?.postStart?.exec?.command + expect(command?.[0]).toBe('sh') + expect(command?.[1]).toBe('-c') + expect(command?.[2]).toContain(`'/usr/bin/check' '--flag'`) + expect(command?.[2]).toContain(NPU_METRICS_MARKER) + }) + + it('is idempotent via the marker', () => { + const c = makeContainer() + injectNpuMetrics(c) + const frozen = JSON.stringify(c.lifecycle) + expect(injectNpuMetrics(c)).toBe(false) + expect(JSON.stringify(c.lifecycle)).toBe(frozen) + }) + + it('skips when a non-exec handler already exists', () => { + const c = makeContainer({ + lifecycle: { + postStart: { httpGet: { path: '/x', port: 80 } } + } + }) + expect(injectNpuMetrics(c)).toBe(false) + expect(c.lifecycle?.postStart?.httpGet?.path).toBe('/x') + }) + + it('maybeInject skips when disabled', () => { + process.env.ACTIONS_RUNNER_NPU_METRICS = 'disabled' + const c = makeContainer({ + resources: { requests: { 'huawei.com/ascend-1980': '8' } } + }) + expect(maybeInjectNpuMetrics(c)).toBe(false) + expect(c.lifecycle).toBeUndefined() + }) + + it('maybeInject skips without an npu request', () => { + const c = makeContainer() + expect(maybeInjectNpuMetrics(c)).toBe(false) + expect(c.lifecycle).toBeUndefined() + }) + + it('maybeInject injects with an npu request', () => { + const c = makeContainer({ + resources: { requests: { 'huawei.com/ascend-1980': '8' } } + }) + expect(maybeInjectNpuMetrics(c)).toBe(true) + expect(c.lifecycle?.postStart).toBeDefined() + }) +}) + +// ── parsing and idle ─────────────────────────────────────────────────────────── + +describe('parseNpuAggregate', () => { + it('parses a valid payload', () => { + const payload = parseNpuAggregate( + `{"v":"NPU_METRICS_V1","ts":1690000100,"cards":[{"c":"0","n":3,"pu":88.5,"au":51.2,"ph":77,"fs":1690000000,"ls":1690000002}]}\n` + ) + expect(payload?.version).toBe(NPU_METRICS_MARKER) + expect(payload?.cards).toHaveLength(1) + expect(payload?.cards[0]).toEqual({ + card: '0', + samples: 3, + peakUtil: 88.5, + avgUtil: 51.2, + peakHbm: 77, + firstTs: 1690000000, + lastTs: 1690000002 + }) + }) + it('parses payload embedded in junk (termination message)', () => { + const payload = parseNpuAggregate(`pre {"v":"NPU_METRICS_V1"`) + expect(payload).toBeUndefined() + }) + it('extracts payload with prefix and suffix junk', () => { + const payload = parseNpuAggregate( + `some-prefix {"v":"NPU_METRICS_V1","ts":1,"cards":[]} trailing` + ) + expect(payload?.version).toBe(NPU_METRICS_MARKER) + expect(payload?.cards).toHaveLength(0) + }) + it('returns undefined for missing or invalid input', () => { + expect(parseNpuAggregate(undefined)).toBeUndefined() + expect(parseNpuAggregate('')).toBeUndefined() + expect(parseNpuAggregate('no json here')).toBeUndefined() + expect(parseNpuAggregate('{"v":"OTHER","ts":1,"cards":[]}')).toBeUndefined() + }) + it('drops malformed card entries', () => { + const payload = parseNpuAggregate( + `{"v":"NPU_METRICS_V1","ts":1,"cards":[{"c":"0","n":1},null,{"x":1}]}` + ) + expect(payload?.cards).toHaveLength(1) + expect(payload?.cards[0].samples).toBe(1) + }) +}) + +describe('isIdleRecord', () => { + const card = (pu: number, au: number) => ({ + card: '0', + samples: 5, + peakUtil: pu, + avgUtil: au, + peakHbm: 10, + firstTs: 1, + lastTs: 2 + }) + it('marks all-low records idle', () => { + expect(isIdleRecord([card(4.9, 1.2), card(0, 0)])).toBe(true) + }) + it('marks records with any busy card as not idle', () => { + expect(isIdleRecord([card(4.9, 1.2), card(12, 3)])).toBe(false) + }) + it('treats the 5% threshold as exclusive', () => { + expect(isIdleRecord([card(5, 1)])).toBe(false) + expect(isIdleRecord([card(4.99, 4.99)])).toBe(true) + }) + it('honours a custom threshold', () => { + expect(isIdleRecord([card(8, 8)], 10)).toBe(true) + }) + it('empty records are not idle', () => { + expect(isIdleRecord([])).toBe(false) + }) +}) + +// ── prometheus text ──────────────────────────────────────────────────────────── + +describe('prometheus formatting', () => { + const labels = { + cluster: 'gy005', + namespace: 'test-ns', + pod: 'runner-x-workflow', + podType: 'workflow', + repo: 'org/repo', + runId: '123', + npuType: 'ascend-1980', + cardsRequested: '8', + result: '0' + } + const card = { + card: '1', + samples: 4, + peakUtil: 88, + avgUtil: 40, + peakHbm: 66, + firstTs: 100, + lastTs: 145 + } + + it('escapes label values', () => { + expect(escapePromLabelValue('a"b\\c\nd')).toBe('a\\"b\\\\c\\nd') + }) + + it('emits one series per metric per card with the idle label', () => { + const body = buildNpuJobMetricsBody(labels, [card]) + const expectedLabels = + `cluster="gy005",namespace="test-ns",repo="org/repo",run_id="123",` + + `pod="runner-x-workflow",pod_type="workflow",card="1",` + + `npu_type="ascend-1980",cards_requested="8",result="0",idle="false"` + expect(body).toContain( + `custom_npu_job_peak_util_percent{${expectedLabels}} 88` + ) + expect(body).toContain( + `custom_npu_job_avg_util_percent{${expectedLabels}} 40` + ) + expect(body).toContain( + `custom_npu_job_duration_seconds{${expectedLabels}} 45` + ) + expect(body).toContain(`custom_npu_job_sample_count{${expectedLabels}} 4`) + expect(body).toContain( + `custom_npu_job_push_total{cluster="gy005",namespace="test-ns",status="success"} 1` + ) + }) + + it('marks idle records', () => { + const idleCard = { ...card, peakUtil: 0, avgUtil: 0 } + expect(buildNpuJobMetricsBody(labels, [idleCard])).toContain('idle="true"') + }) + + it('emits a failed counter body', () => { + expect(buildNpuPushFailedBody(labels)).toContain('status="failed"') + }) + + it('builds the pushgateway grouping path with encoding', () => { + expect(buildPushgatewayPath('gy005', 'ns-a', 'pod/b')).toBe( + '/metrics/job/npu-job-record/cluster/gy005/ns/ns-a/pod/pod%2Fb' + ) + }) +}) + +// ── timeout / http ───────────────────────────────────────────────────────────── + +describe('withTimeout', () => { + it('passes the value through when fast', async () => { + await expect(withTimeout(Promise.resolve(7), 1000)).resolves.toBe(7) + }) + it('rejects when the promise exceeds the budget', async () => { + const slow = new Promise(resolve => setTimeout(resolve, 500, 'late')) + await expect(withTimeout(slow, 20)).rejects.toThrow('timeout') + }) + it('propagates promise rejections', async () => { + await expect( + withTimeout(Promise.reject(new Error('boom')), 1000) + ).rejects.toThrow('boom') + }) +}) + +describe('nodeRequest', () => { + let server: http.Server + let port: number + let seen: { auth?: string; body?: string; path?: string } + + beforeAll(async () => { + seen = {} + server = http.createServer((req, res) => { + let body = '' + req.on('data', chunk => (body += chunk)) + req.on('end', () => { + seen = { auth: req.headers.authorization, body, path: req.url } + res.statusCode = 204 + res.end() + }) + }) + await new Promise(resolve => { + server.listen(0, '127.0.0.1', () => resolve()) + }) + port = (server.address() as AddressInfo).port + }) + + afterAll(async () => { + await new Promise(resolve => server.close(resolve)) + }) + + it('posts the body with basic auth over http', async () => { + const response = await nodeRequest({ + url: `http://127.0.0.1:${port}/metrics/job/npu-job-record`, + method: 'POST', + body: 'custom_npu_job_peak_util_percent 1', + username: 'user', + password: 'pass' + }) + expect(response.statusCode).toBe(204) + expect(seen.path).toBe('/metrics/job/npu-job-record') + expect(seen.auth).toBe( + `Basic ${Buffer.from('user:pass').toString('base64')}` + ) + expect(seen.body).toContain('custom_npu_job_peak_util_percent') + }) + + it('rejects on connection errors', async () => { + const socket = new net.Socket() + const freePort = (socket.address() as AddressInfo)?.port + socket.destroy() + await expect( + nodeRequest({ + url: `http://127.0.0.1:${freePort + 1}/metrics`, + method: 'POST', + body: 'x', + timeoutMs: 1000 + }) + ).rejects.toThrow() + }) +}) + +describe('pushToPushgateway', () => { + const config = { url: 'http://pgw.example', username: 'u', password: 'p' } + + it('succeeds on 2xx without retries', async () => { + const requestFn = vi.fn().mockResolvedValue({ statusCode: 200 }) + await pushToPushgateway(config, '/metrics/job/x', 'body', { requestFn }) + expect(requestFn).toHaveBeenCalledTimes(1) + expect(requestFn).toHaveBeenCalledWith( + expect.objectContaining({ + url: 'http://pgw.example/metrics/job/x', + method: 'POST', + body: 'body', + username: 'u', + password: 'p' + }) + ) + }) + + it('retries failures and succeeds eventually', async () => { + const requestFn = vi + .fn() + .mockRejectedValueOnce(new Error('conn reset')) + .mockResolvedValueOnce({ statusCode: 202 }) + await pushToPushgateway(config, '/metrics/job/x', 'body', { + requestFn, + retryDelayMs: 0 + }) + expect(requestFn).toHaveBeenCalledTimes(2) + }) + + it('gives up after the configured retries', async () => { + const requestFn = vi.fn().mockRejectedValue(new Error('down')) + await expect( + pushToPushgateway(config, '/metrics/job/x', 'body', { + requestFn, + retryDelayMs: 0 + }) + ).rejects.toThrow('down') + expect(requestFn).toHaveBeenCalledTimes(3) + }) + + it('treats non-2xx as failure and retries', async () => { + const requestFn = vi + .fn() + .mockResolvedValueOnce({ statusCode: 500 }) + .mockResolvedValue({ statusCode: 200 }) + await pushToPushgateway(config, '/metrics/job/x', 'body', { + requestFn, + retryDelayMs: 0 + }) + expect(requestFn).toHaveBeenCalledTimes(2) + }) + + it('strips trailing slashes from the base url', async () => { + const requestFn = vi.fn().mockResolvedValue({ statusCode: 200 }) + await pushToPushgateway( + { url: 'http://pgw.example/' }, + '/metrics/job/x', + 'body', + { requestFn } + ) + expect(requestFn).toHaveBeenCalledWith( + expect.objectContaining({ url: 'http://pgw.example/metrics/job/x' }) + ) + }) +}) + +// ── secret / labels ──────────────────────────────────────────────────────────── + +describe('decodePushSecret', () => { + it('decodes url, user and password', () => { + const secret = { + data: { + PUSHGATEWAY_URL: b64('http://pgw:9091'), + PUSHGATEWAY_USER: b64('u'), + PUSHGATEWAY_PASSWORD: b64('p') + } + } as k8s.V1Secret + expect(decodePushSecret(secret)).toEqual({ + url: 'http://pgw:9091', + username: 'u', + password: 'p' + }) + }) + it('requires the url key', () => { + expect( + decodePushSecret({ data: { PUSHGATEWAY_USER: b64('u') } } as k8s.V1Secret) + ).toBeUndefined() + expect(decodePushSecret(undefined)).toBeUndefined() + expect(decodePushSecret({} as k8s.V1Secret)).toBeUndefined() + }) +}) + +describe('extractClusterFromRunnerPod', () => { + it('prefers scale-set-like label keys', () => { + const pod = { + metadata: { + name: 'ephemeral-abc', + labels: { + 'actions.github.com/scale-set-name': 'linux-aarch64-a3-2-gy005' + } + } + } as k8s.V1Pod + expect(extractClusterFromRunnerPod(pod)).toBe('gy005') + }) + it('falls back to any label value shaped like a scale set name', () => { + const pod = { + metadata: { + name: 'pod', + labels: { misc: 'linux-aarch64-910b-8-wlcb-001' } + } + } as k8s.V1Pod + expect(extractClusterFromRunnerPod(pod)).toBe('wlcb-001') + }) + it('falls back to the pod name', () => { + const pod = { + metadata: { name: 'linux-aarch64-a3-2-cn12-001', labels: {} } + } as k8s.V1Pod + expect(extractClusterFromRunnerPod(pod)).toBe('cn12-001') + }) + it('returns unknown when nothing matches', () => { + const pod = { + metadata: { name: 'linux-aarch64-a3-2', labels: { app: 'x' } } + } as k8s.V1Pod + expect(extractClusterFromRunnerPod(pod)).toBe('unknown') + }) + it('does not treat a numeric suffix as a cluster', () => { + const pod = { + metadata: { name: 'linux-aarch64-a3-2', labels: {} } + } as k8s.V1Pod + expect(extractClusterFromRunnerPod(pod)).toBe('unknown') + }) +}) + +describe('resolveNpuLabelsFromPod', () => { + it('derives step pod type and aggregates npu types', () => { + const pod = { + metadata: { name: 'runner-x-step-abc12345' }, + spec: { + containers: [ + { + name: 'job', + resources: { requests: { 'huawei.com/ascend-310': '2' } } + }, + { + name: 'side', + resources: { requests: { 'huawei.com/ascend-1980': '8' } } + } + ] + }, + status: { phase: 'Running' } + } as unknown as k8s.V1Pod + const labels = resolveNpuLabelsFromPod(pod, 'runner-x-step-abc12345') + expect(labels.podType).toBe('step') + expect(labels.npuType).toBe('ascend-1980,ascend-310') + expect(labels.cardsRequested).toBe('8') + expect(labels.result).toBe('Running') + }) + it('uses the terminated exit code as result', () => { + const pod = { + metadata: { name: 'runner-x-workflow' }, + spec: { containers: [{ name: 'job' }] }, + status: { + phase: 'Succeeded', + containerStatuses: [ + { name: 'job', state: { terminated: { exitCode: 0, message: '' } } } + ] + } + } as unknown as k8s.V1Pod + expect(resolveNpuLabelsFromPod(pod, 'runner-x-workflow').result).toBe('0') + }) + it('handles a pod without status', () => { + const pod = { + metadata: { name: 'p' }, + spec: { containers: [] } + } as unknown as k8s.V1Pod + const labels = resolveNpuLabelsFromPod(pod, 'p') + expect(labels.podType).toBe('workflow') + expect(labels.npuType).toBe('unknown') + expect(labels.cardsRequested).toBe('0') + expect(labels.result).toBe('unknown') + }) +}) + +describe('repoFromEnv', () => { + afterEach(() => { + delete process.env.GITHUB_REPOSITORY + delete process.env.GITHUB_WORKSPACE + }) + it('prefers GITHUB_REPOSITORY', () => { + process.env.GITHUB_REPOSITORY = 'org/repo' + expect(repoFromEnv()).toBe('org/repo') + }) + it('falls back to the last two GITHUB_WORKSPACE segments', () => { + process.env.GITHUB_WORKSPACE = '/__w/repo-name/repo-name' + expect(repoFromEnv()).toBe('repo-name/repo-name') + }) + it('returns unknown without envs', () => { + expect(repoFromEnv({})).toBe('unknown') + }) +}) + +// ── collection from pods ─────────────────────────────────────────────────────── + +describe('collectNpuAggregateFromPod', () => { + afterEach(() => { + vi.clearAllMocks() + }) + + it('parses the termination message when the container terminated', async () => { + const pod = { + metadata: { name: 'job-pod' }, + status: { + containerStatuses: [ + { + name: 'job', + state: { + terminated: { + exitCode: 0, + message: + '{"v":"NPU_METRICS_V1","ts":9,"cards":[{"c":"0","n":1,"pu":2,"au":1,"ph":1,"fs":1,"ls":2}]}' + } + } + } + ] + } + } as unknown as k8s.V1Pod + const payload = await collectNpuAggregateFromPod(pod) + expect(payload?.cards[0].peakUtil).toBe(2) + expect(k8sMod.execPodStepWithOutput).not.toHaveBeenCalled() + }) + + it('execs the aggregate script when the container is running', async () => { + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 0, + output: '{"v":"NPU_METRICS_V1","ts":9,"cards":[]}' + }) + const pod = { + metadata: { name: 'job-pod' }, + status: { + phase: 'Running', + containerStatuses: [ + { name: 'job', state: { running: { startedAt: new Date() } } } + ] + } + } as unknown as k8s.V1Pod + const payload = await collectNpuAggregateFromPod(pod) + expect(k8sMod.execPodStepWithOutput).toHaveBeenCalledWith( + expect.arrayContaining(['sh', '-c']), + 'job-pod', + 'job', + 5 + ) + expect(payload?.version).toBe(NPU_METRICS_MARKER) + }) + + it('returns undefined when the pod has no name', async () => { + expect(await collectNpuAggregateFromPod({} as k8s.V1Pod)).toBeUndefined() + }) + + it('returns undefined when the container is pending', async () => { + const pod = { + metadata: { name: 'job-pod' }, + status: { + containerStatuses: [{ name: 'job', state: { waiting: {} } }] + } + } as unknown as k8s.V1Pod + expect(await collectNpuAggregateFromPod(pod)).toBeUndefined() + }) +}) + +// ── end to end collection and push ───────────────────────────────────────────── + +describe('collectAndPushNpuMetrics', () => { + let server: http.Server + let port: number + let received: { path?: string; body?: string }[] + + beforeAll(async () => { + received = [] + server = http.createServer((req, res) => { + let body = '' + req.on('data', chunk => (body += chunk)) + req.on('end', () => { + received.push({ path: req.url, body }) + res.statusCode = 200 + res.end('ok') + }) + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + port = (server.address() as AddressInfo).port + }) + + afterAll(async () => { + await new Promise(resolve => server.close(resolve)) + }) + + beforeEach(() => { + received.length = 0 + process.env.ACTIONS_RUNNER_POD_NAME = 'runner-x' + process.env.GITHUB_REPOSITORY = 'org/repo' + process.env.GITHUB_RUN_ID = '42' + const jobPod = { + metadata: { + name: 'runner-x-workflow', + labels: { 'runner-pod': 'runner-x' } + }, + spec: { + containers: [ + { + name: 'job', + resources: { requests: { 'huawei.com/ascend-1980': '2' } } + } + ] + }, + status: { + phase: 'Running', + containerStatuses: [ + { name: 'job', state: { running: { startedAt: new Date() } } } + ] + } + } as unknown as k8s.V1Pod + const stepPod = { + metadata: { + name: 'runner-x-step-ab12cd34', + labels: { 'runner-pod': 'runner-x' } + }, + spec: { + containers: [ + { + name: 'job', + resources: { requests: { 'huawei.com/ascend-1980': '2' } } + } + ] + }, + status: { + phase: 'Succeeded', + containerStatuses: [ + { + name: 'job', + state: { + terminated: { + exitCode: 0, + message: + '{"v":"NPU_METRICS_V1","ts":9,"cards":[{"c":"1","n":1,"pu":1,"au":0.5,"ph":1,"fs":10,"ls":11}]}' + } + } + } + ] + } + } as unknown as k8s.V1Pod + const cpuPod = { + metadata: { + name: 'runner-x-cpu-extra', + labels: { 'runner-pod': 'runner-x' } + }, + spec: { containers: [{ name: 'job' }] }, + status: { phase: 'Running' } + } as unknown as k8s.V1Pod + const runnerPod = { + metadata: { + name: 'runner-x', + labels: { + 'actions.github.com/scale-set-name': 'linux-aarch64-a3-2-gy005' + } + } + } as k8s.V1Pod + vi.mocked(k8sMod.listPodsByRunnerInstance).mockResolvedValue([ + jobPod, + stepPod, + cpuPod + ]) + vi.mocked(k8sMod.getPodByName).mockImplementation(async (name: string) => { + if (name === 'runner-x') return runnerPod + throw new Error(`unexpected pod ${name}`) + }) + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 0, + output: + '{"v":"NPU_METRICS_V1","ts":9,"cards":[{"c":"0","n":2,"pu":88,"au":50,"ph":70,"fs":100,"last":0,"ls":160}]}' + }) + vi.mocked(k8sMod.getSecretByName).mockResolvedValue({ + data: { + PUSHGATEWAY_URL: b64(`http://127.0.0.1:${port}`), + PUSHGATEWAY_USER: b64('push-user'), + PUSHGATEWAY_PASSWORD: b64('push-pass') + } + } as k8s.V1Secret) + }) + + afterEach(() => { + vi.clearAllMocks() + delete process.env.ACTIONS_RUNNER_POD_NAME + delete process.env.GITHUB_REPOSITORY + delete process.env.GITHUB_RUN_ID + delete process.env.ACTIONS_RUNNER_NPU_METRICS + }) + + it('collects from job and step pods and pushes one record per pod', async () => { + await collectAndPushNpuMetrics() + const paths = received.map(r => r.path) + expect(paths).toContain( + '/metrics/job/npu-job-record/cluster/gy005/ns/test-ns/pod/runner-x-workflow' + ) + expect(paths).toContain( + '/metrics/job/npu-job-record/cluster/gy005/ns/test-ns/pod/runner-x-step-ab12cd34' + ) + expect(received).toHaveLength(2) + + const workflowBody = received.find(r => + r.path?.endsWith('runner-x-workflow') + )?.body + expect(workflowBody).toContain('custom_npu_job_peak_util_percent') + expect(workflowBody).toContain('idle="false"') + expect(workflowBody).toContain('pod_type="workflow"') + expect(workflowBody).toContain('repo="org/repo"') + expect(workflowBody).toContain('run_id="42"') + expect(workflowBody).toContain('npu_type="ascend-1980"') + expect(workflowBody).toContain('cards_requested="2"') + expect(workflowBody).toContain('custom_npu_job_push_total') + expect(workflowBody).toContain('custom_npu_job_duration_seconds{') + + const stepBody = received.find(r => r.path?.endsWith('ab12cd34'))?.body + expect(stepBody).toContain('pod_type="step"') + expect(stepBody).toContain('idle="true"') + expect(stepBody).toContain('card="1"') + }) + + it('skips everything when disabled', async () => { + process.env.ACTIONS_RUNNER_NPU_METRICS = 'disabled' + await collectAndPushNpuMetrics() + expect(k8sMod.listPodsByRunnerInstance).not.toHaveBeenCalled() + }) + + it('skips push when the secret is missing', async () => { + vi.mocked(k8sMod.getSecretByName).mockRejectedValue( + new Error('secrets "npu-metrics-pushgw" not found') + ) + await expect(collectAndPushNpuMetrics()).resolves.toBeUndefined() + expect(k8sMod.listPodsByRunnerInstance).toHaveBeenCalled() + }) + + it('skips when no aggregate payload can be read', async () => { + vi.mocked(k8sMod.execPodStepWithOutput).mockResolvedValue({ + code: 0, + output: 'no sampler output' + }) + await expect(collectAndPushNpuMetrics()).resolves.toBeUndefined() + expect(received).toHaveLength(1) // only the step pod termination message + }) + + it('survives an unreachable pushgateway', async () => { + vi.mocked(k8sMod.getSecretByName).mockResolvedValue({ + data: { PUSHGATEWAY_URL: b64('http://127.0.0.1:1') } + } as k8s.V1Secret) + await expect(collectAndPushNpuMetrics()).resolves.toBeUndefined() + }, 30000) + + it('returns silently when the pod list fails', async () => { + vi.mocked(k8sMod.listPodsByRunnerInstance).mockRejectedValue( + new Error('404') + ) + await expect(collectAndPushNpuMetrics()).resolves.toBeUndefined() + }) + + it('keeps going when one pod collection throws', async () => { + vi.mocked(k8sMod.execPodStepWithOutput).mockRejectedValue( + new Error('exec boom') + ) + await expect(collectAndPushNpuMetrics()).resolves.toBeUndefined() + expect(received).toHaveLength(1) // step pod record still pushed + }) + + it('does nothing for pods without npu requests', async () => { + vi.mocked(k8sMod.listPodsByRunnerInstance).mockResolvedValue([ + { + metadata: { name: 'cpu-only', labels: { 'runner-pod': 'runner-x' } }, + spec: { containers: [{ name: 'job' }] }, + status: { phase: 'Succeeded' } + } as unknown as k8s.V1Pod + ]) + await collectAndPushNpuMetrics() + expect(k8sMod.execPodStepWithOutput).not.toHaveBeenCalled() + expect(received).toHaveLength(0) + }) +}) diff --git a/packages/k8s/src/k8s/utils/npu-metrics.ts b/packages/k8s/src/k8s/utils/npu-metrics.ts new file mode 100644 index 00000000..20af4d12 --- /dev/null +++ b/packages/k8s/src/k8s/utils/npu-metrics.ts @@ -0,0 +1,758 @@ +import * as core from '@actions/core' +import * as k8s from '@kubernetes/client-node' +import * as https from 'https' +import * as http from 'http' +import { URL } from 'url' +import { getRunnerPodName, JOB_CONTAINER_NAME } from '../../hooks/constants' +import { formatError } from './index' +import { + execPodStepWithOutput, + getPodByName, + getSecretByName, + listPodsByRunnerInstance, + namespace +} from '../index' + +export const NPU_METRICS_MARKER = 'NPU_METRICS_V1' +export const ENV_NPU_METRICS_ENABLED = 'ACTIONS_RUNNER_NPU_METRICS' +export const ENV_NPU_SAMPLE_INTERVAL = 'NPU_SAMPLE_INTERVAL' +export const ENV_NPU_IDLE_THRESHOLD = 'NPU_IDLE_THRESHOLD' + +export const DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS = 1 +export const MIN_NPU_SAMPLE_INTERVAL_SECONDS = 0.2 +export const DEFAULT_NPU_IDLE_THRESHOLD_PERCENT = 5 + +export const NPU_SAMPLES_FILE = '/tmp/npu-samples.jsonl' +export const NPU_TERMINATION_LOG = '/dev/termination-log' +export const NPU_SAMPLES_MAX_BYTES = 4 * 1024 * 1024 +export const NPU_AGGREGATE_MAX_BYTES = 4096 + +export const NPU_METRICS_SECRET_NAME = 'npu-metrics-pushgw' +export const NPU_METRICS_PUSH_JOB = 'npu-job-record' +export const NPU_COLLECT_TIMEOUT_MS = 10_000 + +const NPU_RESOURCE_REGEX = /^huawei\.com\/(ascend\S*)$/i +const SCALE_SET_NAME_REGEX = /^linux-[a-z0-9]+-[a-z0-9]+-\d+-([a-z][a-z0-9-]*)$/ + +export interface NpuCardAggregate { + card: string + samples: number + peakUtil: number + avgUtil: number + peakHbm: number + firstTs: number + lastTs: number +} + +export interface NpuAggregatePayload { + version: string + ts: number + cards: NpuCardAggregate[] +} + +export interface NpuPushConfig { + url: string + username?: string + password?: string +} + +export interface NpuJobLabels { + cluster: string + namespace: string + pod: string + podType: string + repo: string + runId: string + npuType: string + cardsRequested: string + result: string +} + +export function npuMetricsEnabled( + env: Record = process.env +): boolean { + return ( + (env[ENV_NPU_METRICS_ENABLED] ?? '').trim().toLowerCase() !== 'disabled' + ) +} + +export function getNpuSampleIntervalSeconds( + env: Record = process.env +): number { + const raw = env[ENV_NPU_SAMPLE_INTERVAL] + if (!raw) { + return DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS + } + const parsed = Number(raw) + if (!Number.isFinite(parsed) || parsed <= 0) { + core.warning( + `NPU_SAMPLE_INTERVAL is invalid ("${raw}"): use ${DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS}` + ) + return DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS + } + return Math.max(parsed, MIN_NPU_SAMPLE_INTERVAL_SECONDS) +} + +export function getIdleThresholdPercent( + env: Record = process.env +): number { + const raw = env[ENV_NPU_IDLE_THRESHOLD] + if (!raw) { + return DEFAULT_NPU_IDLE_THRESHOLD_PERCENT + } + const parsed = Number(raw) + if (!Number.isFinite(parsed) || parsed < 0) { + core.warning( + `NPU_IDLE_THRESHOLD is invalid ("${raw}"): use ${DEFAULT_NPU_IDLE_THRESHOLD_PERCENT}` + ) + return DEFAULT_NPU_IDLE_THRESHOLD_PERCENT + } + return parsed +} + +export function containerHasNpuRequest(container: k8s.V1Container): boolean { + const resources = [container.resources?.requests, container.resources?.limits] + for (const entry of resources) { + for (const key of Object.keys(entry ?? {})) { + if (NPU_RESOURCE_REGEX.test(key)) { + return true + } + } + } + return false +} + +export function hasNpuRequest(spec: k8s.V1PodSpec | undefined): boolean { + return (spec?.containers ?? []).some(c => containerHasNpuRequest(c)) +} + +function listNpuCardsCommand(): string { + return `ls /dev/davinci[0-9]* 2>/dev/null | sed 's|.*/davinci||' | sort -n | uniq | tr '\\n' ' '` +} + +export function buildNpuSamplerScript( + intervalSeconds = DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS +): string { + return [ + `# ${NPU_METRICS_MARKER} sampler (detached, best-effort)`, + `F=${NPU_SAMPLES_FILE}`, + `CARDS=$(${listNpuCardsCommand()})`, + `[ -z "$CARDS" ] && exit 0`, + `while :; do`, + ` NOW=$(date +%s)`, + ` for C in $CARDS; do`, + ` OUT=$(npu-smi info -t usages -i "$C" 2>/dev/null) || continue`, + ` U=$(printf '%s\\n' "$OUT" | awk '{l=$0; gsub(/[ \\t\\r]/, "", l)} l ~ /AICore/ { if (match(l, /[0-9.]+%?$/)) { v = substr(l, RSTART, RLENGTH); sub(/%$/, "", v); print v; exit } }')`, + ` H=$(printf '%s\\n' "$OUT" | awk '{l=$0; gsub(/[ \\t\\r]/, "", l)} l ~ /HBM/ { if (match(l, /[0-9.]+%?$/)) { v = substr(l, RSTART, RLENGTH); sub(/%$/, "", v); print v; exit } }')`, + ` printf '{"ts":%s,"card":%s,"util":%s,"hbm":%s}\\n' "$NOW" "$C" "\${U:-0}" "\${H:-0}" >> "$F" 2>/dev/null || true`, + ` done`, + ` SZ=$(wc -c < "$F" 2>/dev/null || echo 0)`, + ` if [ "$SZ" -gt ${NPU_SAMPLES_MAX_BYTES} ]; then`, + ` tail -n 2000 "$F" > "$F.r" 2>/dev/null && mv "$F.r" "$F" || true`, + ` fi`, + ` sleep ${intervalSeconds}`, + `done` + ].join('\n') +} + +const AGGREGATE_AWK = [ + `BEGIN {`, + ` n = split(cards, a, " ")`, + ` for (i = 1; i <= n; i++) { cnt[a[i]] = 0; pu[a[i]] = 0; ph[a[i]] = 0; su[a[i]] = 0; fs[a[i]] = 0; ls[a[i]] = 0 }`, + `}`, + `{`, + ` ts = $0; sub(/.*"ts":/, "", ts); sub(/[^0-9].*/, "", ts)`, + ` c = $0; sub(/.*"card":/, "", c); sub(/[^0-9].*/, "", c)`, + ` u = $0; sub(/.*"util":/, "", u); sub(/[^0-9.].*/, "", u)`, + ` h = $0; sub(/.*"hbm":/, "", h); sub(/[^0-9.].*/, "", h)`, + ` if (c == "") next`, + ` cnt[c]++`, + ` if (ts != "") { t = ts + 0; if (fs[c] == 0 || t < fs[c]) fs[c] = t; if (t > ls[c]) ls[c] = t }`, + ` if (u + 0 > pu[c]) pu[c] = u + 0`, + ` if (h + 0 > ph[c]) ph[c] = h + 0`, + ` su[c] += u + 0`, + `}`, + `END {`, + ` printf "{\\"v\\":\\"${NPU_METRICS_MARKER}\\",\\"ts\\":%d,\\"cards\\":[", now`, + ` sep = ""`, + ` for (c in cnt) {`, + ` au = cnt[c] > 0 ? su[c] / cnt[c] : 0`, + ` printf "%s{\\"c\\":\\"%s\\",\\"n\\":%d,\\"pu\\":%.1f,\\"au\\":%.1f,\\"ph\\":%.1f,\\"fs\\":%d,\\"ls\\":%d}", sep, c, cnt[c], pu[c], au, ph[c], fs[c], ls[c]`, + ` sep = ","`, + ` }`, + ` printf "]}\\n"`, + `}` +].join('\n') + +export function buildNpuAggregateScript(): string { + return [ + `# ${NPU_METRICS_MARKER} aggregate`, + `F=${NPU_SAMPLES_FILE}`, + `CARDS=$(${listNpuCardsCommand()})`, + `NOW=$(date +%s)`, + `touch "$F" 2>/dev/null || true`, + `awk -v now="$NOW" -v cards="$CARDS" '${AGGREGATE_AWK}' "$F" 2>/dev/null` + ].join('\n') +} + +function commandHasMarker(command: string[] | undefined): boolean { + return (command ?? []).join(' ').includes(NPU_METRICS_MARKER) +} + +function appendExecCommand( + existing: string[] | undefined, + appendLines: string[] +): string[] { + if ( + existing && + existing.length >= 3 && + /(^|\/)sh$/.test(existing[0]) && + existing[1] === '-c' + ) { + return [ + existing[0], + existing[1], + [...existing.slice(2), ...appendLines].join('\n') + ] + } + const prefix = (existing ?? []).map( + part => `'${part.replace(/'/g, "'\\''")}'` + ) + return ['sh', '-c', [prefix.join(' '), ...appendLines].join('\n')] +} + +export function injectNpuMetrics( + container: k8s.V1Container, + intervalSeconds = DEFAULT_NPU_SAMPLE_INTERVAL_SECONDS +): boolean { + const lifecycle = container.lifecycle ?? {} + if ( + commandHasMarker(lifecycle.postStart?.exec?.command) || + commandHasMarker(lifecycle.preStop?.exec?.command) + ) { + return false + } + + if ( + (lifecycle.postStart && !lifecycle.postStart.exec) || + (lifecycle.preStop && !lifecycle.preStop.exec) + ) { + core.warning( + 'npu-metrics: container already has a non-exec lifecycle handler, skip injection' + ) + return false + } + + const samplerLine = `(${buildNpuSamplerScript(intervalSeconds)}) >/dev/null 2>&1 &` + const aggregateLine = `{ ( ${buildNpuAggregateScript()} ) | head -c ${NPU_AGGREGATE_MAX_BYTES} > ${NPU_TERMINATION_LOG}; } 2>/dev/null || true` + + lifecycle.postStart = { + exec: { + command: appendExecCommand(lifecycle.postStart?.exec?.command, [ + `# ${NPU_METRICS_MARKER} postStart: start detached npu sampler`, + samplerLine + ]) + } + } + lifecycle.preStop = { + exec: { + command: appendExecCommand(lifecycle.preStop?.exec?.command, [ + `# ${NPU_METRICS_MARKER} preStop: write npu aggregate to termination log`, + aggregateLine + ]) + } + } + container.lifecycle = lifecycle + return true +} + +export function maybeInjectNpuMetrics(container: k8s.V1Container): boolean { + if (!npuMetricsEnabled()) { + return false + } + if (!containerHasNpuRequest(container)) { + return false + } + return injectNpuMetrics(container) +} + +export function parseNpuAggregate( + raw: string | undefined +): NpuAggregatePayload | undefined { + if (!raw) { + return undefined + } + const start = raw.indexOf('{"v":') + if (start === -1) { + return undefined + } + const candidates = [raw.slice(start)] + const end = raw.lastIndexOf('}') + if (end > start) { + candidates.push(raw.slice(start, end + 1)) + } + for (const candidate of candidates) { + let parsed: any + try { + parsed = JSON.parse(candidate) + } catch { + continue + } + if (parsed?.v !== NPU_METRICS_MARKER || !Array.isArray(parsed.cards)) { + continue + } + const cards: NpuCardAggregate[] = [] + for (const c of parsed.cards) { + if (c === null || typeof c !== 'object' || c.c === undefined) { + continue + } + cards.push({ + card: String(c.c), + samples: Number(c.n) || 0, + peakUtil: Number(c.pu) || 0, + avgUtil: Number(c.au) || 0, + peakHbm: Number(c.ph) || 0, + firstTs: Number(c.fs) || 0, + lastTs: Number(c.ls) || 0 + }) + } + return { version: parsed.v, ts: Number(parsed.ts) || 0, cards } + } + return undefined +} + +export function isIdleRecord( + cards: NpuCardAggregate[], + threshold = DEFAULT_NPU_IDLE_THRESHOLD_PERCENT +): boolean { + if (!cards.length) { + return false + } + return cards.every(c => c.peakUtil < threshold && c.avgUtil < threshold) +} + +export function escapePromLabelValue(value: string): string { + return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n') +} + +export function formatPromLabels(labels: Record): string { + return Object.entries(labels) + .filter(([, v]) => v !== undefined) + .map(([k, v]) => `${k}="${escapePromLabelValue(v)}"`) + .join(',') +} + +const NPU_JOB_METRIC_LABEL_KEYS = [ + 'cluster', + 'namespace', + 'repo', + 'run_id', + 'pod', + 'pod_type', + 'card', + 'npu_type', + 'cards_requested', + 'result', + 'idle' +] + +export function buildNpuJobMetricsBody( + labels: NpuJobLabels, + cards: NpuCardAggregate[], + idleThreshold = DEFAULT_NPU_IDLE_THRESHOLD_PERCENT +): string { + const base: Record = { + cluster: labels.cluster, + namespace: labels.namespace, + repo: labels.repo, + run_id: labels.runId, + pod: labels.pod, + pod_type: labels.podType, + npu_type: labels.npuType, + cards_requested: labels.cardsRequested, + result: labels.result + } + const idle = isIdleRecord(cards, idleThreshold) ? 'true' : 'false' + const lines: string[] = [] + lines.push('# TYPE custom_npu_job_peak_util_percent gauge') + lines.push('# TYPE custom_npu_job_avg_util_percent gauge') + lines.push('# TYPE custom_npu_job_duration_seconds gauge') + lines.push('# TYPE custom_npu_job_sample_count gauge') + for (const card of cards) { + const cardLabels = { ...base, card: card.card, idle } + const l = formatPromLabels( + Object.fromEntries( + NPU_JOB_METRIC_LABEL_KEYS.map(k => [k, cardLabels[k]]) + ) as Record + ) + lines.push(`custom_npu_job_peak_util_percent{${l}} ${card.peakUtil}`) + lines.push(`custom_npu_job_avg_util_percent{${l}} ${card.avgUtil}`) + const duration = Math.max(card.lastTs - card.firstTs, 0) + lines.push(`custom_npu_job_duration_seconds{${l}} ${duration}`) + lines.push(`custom_npu_job_sample_count{${l}} ${card.samples}`) + } + lines.push('# TYPE custom_npu_job_push_total counter') + lines.push( + `custom_npu_job_push_total{cluster="${escapePromLabelValue(labels.cluster)}",namespace="${escapePromLabelValue(labels.namespace)}",status="success"} 1` + ) + return lines.join('\n') + '\n' +} + +export function buildNpuPushFailedBody(labels: NpuJobLabels): string { + return ( + `# TYPE custom_npu_job_push_total counter\n` + + `custom_npu_job_push_total{cluster="${escapePromLabelValue(labels.cluster)}",namespace="${escapePromLabelValue(labels.namespace)}",status="failed"} 1\n` + ) +} + +export function buildPushgatewayPath( + cluster: string, + ns: string, + pod: string +): string { + return `/metrics/job/${NPU_METRICS_PUSH_JOB}/cluster/${encodeURIComponent( + cluster + )}/ns/${encodeURIComponent(ns)}/pod/${encodeURIComponent(pod)}` +} + +export async function withTimeout( + promise: Promise, + timeoutMs: number +): Promise { + return await new Promise((resolve, reject) => { + const timer = setTimeout(() => reject(new Error('timeout')), timeoutMs) + promise.then( + value => { + clearTimeout(timer) + resolve(value) + }, + err => { + clearTimeout(timer) + reject(err) + } + ) + }) +} + +export interface PushRequest { + url: string + method: string + body: string + username?: string + password?: string + timeoutMs?: number +} + +export type RequestFn = (req: PushRequest) => Promise<{ statusCode: number }> + +export async function nodeRequest(req: PushRequest): Promise<{ + statusCode: number +}> { + const target = new URL(req.url) + const client = target.protocol === 'http:' ? http : https + const headers: Record = { + 'Content-Type': 'text/plain' + } + if (req.username !== undefined || req.password !== undefined) { + const basic = Buffer.from( + `${req.username ?? ''}:${req.password ?? ''}` + ).toString('base64') + headers['Authorization'] = `Basic ${basic}` + } + return await new Promise((resolve, reject) => { + const request = client.request( + target, + { + method: req.method, + headers, + timeout: req.timeoutMs ?? 5000, + rejectUnauthorized: false + }, + response => { + response.resume() + response.on('end', () => + resolve({ statusCode: response.statusCode ?? 0 }) + ) + } + ) + request.on('timeout', () => request.destroy(new Error('request timeout'))) + request.on('error', reject) + request.end(req.body) + }) +} + +export async function pushToPushgateway( + config: NpuPushConfig, + path: string, + body: string, + options?: { retries?: number; retryDelayMs?: number; requestFn?: RequestFn } +): Promise { + const retries = options?.retries ?? 2 + const retryDelayMs = options?.retryDelayMs ?? 1000 + const requestFn = options?.requestFn ?? nodeRequest + const url = `${config.url.replace(/\/+$/, '')}${path}` + let lastError: unknown + for (let attempt = 0; attempt <= retries; attempt++) { + if (attempt > 0) { + await new Promise(resolve => setTimeout(resolve, retryDelayMs)) + } + try { + const response = await requestFn({ + url, + method: 'POST', + body, + username: config.username, + password: config.password + }) + if (response.statusCode >= 200 && response.statusCode < 300) { + return + } + lastError = new Error(`pushgateway returned ${response.statusCode}`) + } catch (err) { + lastError = err + } + } + throw lastError instanceof Error ? lastError : new Error(String(lastError)) +} + +export function decodePushSecret( + secret: k8s.V1Secret | undefined +): NpuPushConfig | undefined { + const data = secret?.data ?? {} + const decode = (key: string): string | undefined => { + const encoded = data[key] + if (!encoded) { + return undefined + } + try { + const decoded = Buffer.from(encoded, 'base64').toString('utf8') + return decoded.length ? decoded : undefined + } catch { + return undefined + } + } + const url = decode('PUSHGATEWAY_URL') + if (!url) { + return undefined + } + return { + url, + username: decode('PUSHGATEWAY_USER'), + password: decode('PUSHGATEWAY_PASSWORD') + } +} + +export async function readNpuPushConfig(): Promise { + try { + const secret = await getSecretByName(NPU_METRICS_SECRET_NAME) + return decodePushSecret(secret) + } catch (err) { + core.debug( + `npu-metrics: secret ${NPU_METRICS_SECRET_NAME} unavailable, skip push: ${formatError(err)}` + ) + return undefined + } +} + +function parseScaleSetSuffix(value: string | undefined): string | undefined { + if (!value) { + return undefined + } + const match = value.match(SCALE_SET_NAME_REGEX) + return match ? match[1] : undefined +} + +export function extractClusterFromRunnerPod(pod: k8s.V1Pod): string { + const labels = pod.metadata?.labels ?? {} + const annotations = pod.metadata?.annotations ?? {} + const entries: [string, string][] = [ + ...Object.entries(labels), + ...Object.entries(annotations) + ] + for (const [key, value] of entries) { + if (/scale[-_]?set|runner[-_]?deployment/i.test(key)) { + const suffix = parseScaleSetSuffix(value) + if (suffix) { + return suffix + } + } + } + for (const [, value] of entries) { + const suffix = parseScaleSetSuffix(value) + if (suffix) { + return suffix + } + } + return parseScaleSetSuffix(pod.metadata?.name) ?? 'unknown' +} + +export function resolveNpuLabelsFromPod( + pod: k8s.V1Pod, + podName: string +): { + podType: string + npuType: string + cardsRequested: string + result: string +} { + const podType = podName.includes('-step-') ? 'step' : 'workflow' + const npuTypes = new Set() + let cards = 0 + for (const container of pod.spec?.containers ?? []) { + for (const resources of [ + container.resources?.requests, + container.resources?.limits + ]) { + for (const [key, quantity] of Object.entries(resources ?? {})) { + const match = key.match(NPU_RESOURCE_REGEX) + if (match) { + npuTypes.add(match[1]) + cards = Math.max(cards, parseInt(String(quantity), 10) || 0) + } + } + } + } + const mainStatus = (pod.status?.containerStatuses ?? []).find( + s => s.name === JOB_CONTAINER_NAME + ) + const terminated = mainStatus?.state?.terminated + const result = terminated + ? String(terminated.exitCode) + : (pod.status?.phase ?? 'unknown') + return { + podType, + npuType: Array.from(npuTypes).sort().join(',') || 'unknown', + cardsRequested: String(cards || 0), + result + } +} + +export function repoFromEnv( + env: Record = process.env +): string { + if (env.GITHUB_REPOSITORY) { + return env.GITHUB_REPOSITORY + } + const workspace = env.GITHUB_WORKSPACE ?? '' + const parts = workspace.split('/').filter(p => p.length > 0) + if (parts.length >= 2) { + return `${parts[parts.length - 2]}/${parts[parts.length - 1]}` + } + return 'unknown' +} + +export async function collectNpuAggregateFromPod( + pod: k8s.V1Pod +): Promise { + const podName = pod.metadata?.name + if (!podName) { + return undefined + } + const mainStatus = (pod.status?.containerStatuses ?? []).find( + s => s.name === JOB_CONTAINER_NAME + ) + const terminatedMessage = mainStatus?.state?.terminated?.message + if (terminatedMessage) { + return parseNpuAggregate(terminatedMessage) + } + if (!mainStatus?.state?.running) { + return undefined + } + const { output } = await execPodStepWithOutput( + ['sh', '-c', buildNpuAggregateScript()], + podName, + JOB_CONTAINER_NAME, + 5 + ) + return parseNpuAggregate(output) +} + +export async function collectAndPushNpuMetrics(): Promise { + if (!npuMetricsEnabled()) { + return + } + let pods: k8s.V1Pod[] = [] + try { + pods = await listPodsByRunnerInstance() + } catch (err) { + core.debug(`npu-metrics: pod list failed: ${formatError(err)}`) + return + } + const npuPods = pods.filter( + pod => pod.metadata?.name && hasNpuRequest(pod.spec) + ) + if (!npuPods.length) { + return + } + + let cluster = 'unknown' + try { + const runnerPod = await getPodByName(getRunnerPodName()) + cluster = extractClusterFromRunnerPod(runnerPod) + } catch (err) { + core.debug(`npu-metrics: cluster label unresolved: ${formatError(err)}`) + } + + const config = await readNpuPushConfig() + if (!config) { + core.debug( + `npu-metrics: push config missing (secret ${NPU_METRICS_SECRET_NAME}), skip push` + ) + return + } + + for (const pod of npuPods) { + const podName = pod.metadata?.name as string + try { + await collectAndPushForPod(pod, podName, cluster, config) + } catch (err) { + core.debug( + `npu-metrics: collection failed for ${podName}: ${formatError(err)}` + ) + } + } +} + +async function collectAndPushForPod( + pod: k8s.V1Pod, + podName: string, + cluster: string, + config: NpuPushConfig +): Promise { + const payload = await collectNpuAggregateFromPod(pod) + if (!payload || !payload.cards.length) { + core.debug(`npu-metrics: no aggregate payload for ${podName}, skip`) + return + } + + const npuInfo = resolveNpuLabelsFromPod(pod, podName) + const labels: NpuJobLabels = { + cluster, + namespace: namespace(), + pod: podName, + podType: npuInfo.podType, + repo: repoFromEnv(), + runId: process.env.GITHUB_RUN_ID ?? '', + npuType: npuInfo.npuType, + cardsRequested: npuInfo.cardsRequested, + result: npuInfo.result + } + + const body = buildNpuJobMetricsBody( + labels, + payload.cards, + getIdleThresholdPercent() + ) + const path = buildPushgatewayPath(labels.cluster, labels.namespace, podName) + try { + await pushToPushgateway(config, path, body) + core.debug(`npu-metrics: pushed job record for ${podName}`) + } catch (err) { + core.warning(`npu-metrics: push failed for ${podName}: ${formatError(err)}`) + try { + await pushToPushgateway(config, path, buildNpuPushFailedBody(labels)) + } catch { + // pushgateway unreachable, nothing else to record + } + } +} diff --git a/packages/k8s/tests/cleanup-job-test.ts b/packages/k8s/tests/cleanup-job-test.ts index 3981cce5..b0e983a7 100644 --- a/packages/k8s/tests/cleanup-job-test.ts +++ b/packages/k8s/tests/cleanup-job-test.ts @@ -3,6 +3,7 @@ import { cleanupJob, prepareJob } from '../src/hooks' import { RunnerInstanceLabel } from '../src/hooks/constants' import { namespace } from '../src/k8s' import { TestHelper } from './test-setup' +import { PrepareJobArgs } from 'hooklib' let testHelper: TestHelper @@ -14,7 +15,10 @@ describe('Cleanup Job', () => { const prepareJobOutputFilePath = testHelper.createFile( 'prepare-job-output.json' ) - await prepareJob(prepareJobData.args, prepareJobOutputFilePath) + await prepareJob( + prepareJobData.args as PrepareJobArgs, + prepareJobOutputFilePath + ) }) afterEach(async () => { @@ -32,16 +36,12 @@ describe('Cleanup Job', () => { kc.loadFromDefault() const k8sApi = kc.makeApiClient(k8s.CoreV1Api) - const podList = await k8sApi.listNamespacedPod( - namespace(), - undefined, - undefined, - undefined, - undefined, - new RunnerInstanceLabel().toString() - ) + const podList = await k8sApi.listNamespacedPod({ + namespace: namespace(), + labelSelector: new RunnerInstanceLabel().toString() + }) - expect(podList.body.items.length).toBe(0) + expect(podList.items.length).toBe(0) }) it('should have no runner linked secrets', async () => { @@ -51,15 +51,11 @@ describe('Cleanup Job', () => { kc.loadFromDefault() const k8sApi = kc.makeApiClient(k8s.CoreV1Api) - const secretList = await k8sApi.listNamespacedSecret( - namespace(), - undefined, - undefined, - undefined, - undefined, - new RunnerInstanceLabel().toString() - ) + const secretList = await k8sApi.listNamespacedSecret({ + namespace: namespace(), + labelSelector: new RunnerInstanceLabel().toString() + }) - expect(secretList.body.items.length).toBe(0) + expect(secretList.items.length).toBe(0) }) }) diff --git a/packages/k8s/tests/e2e-test.ts b/packages/k8s/tests/e2e-test.ts index 5b73bf81..80976955 100644 --- a/packages/k8s/tests/e2e-test.ts +++ b/packages/k8s/tests/e2e-test.ts @@ -6,6 +6,7 @@ import { runScriptStep } from '../src/hooks' import { TestHelper } from './test-setup' +import { RunContainerStepArgs, RunScriptStepArgs } from 'hooklib' jest.useRealTimers() @@ -25,6 +26,7 @@ describe('e2e', () => { afterEach(async () => { await testHelper.cleanup() }) + it('should prepare job, run script step, run container step then cleanup without errors', async () => { await expect( prepareJob(prepareJobData.args, prepareJobOutputFilePath) @@ -36,13 +38,16 @@ describe('e2e', () => { const prepareJobOutputData = JSON.parse(prepareJobOutputJson.toString()) await expect( - runScriptStep(scriptStepData.args, prepareJobOutputData.state, null) + runScriptStep( + scriptStepData.args as RunScriptStepArgs, + prepareJobOutputData.state + ) ).resolves.not.toThrow() const runContainerStepData = testHelper.getRunContainerStepDefinition() await expect( - runContainerStep(runContainerStepData.args) + runContainerStep(runContainerStepData.args as RunContainerStepArgs) ).resolves.not.toThrow() await expect(cleanupJob()).resolves.not.toThrow() diff --git a/packages/k8s/tests/error-serialization-test.ts b/packages/k8s/tests/error-serialization-test.ts new file mode 100644 index 00000000..decf2a25 --- /dev/null +++ b/packages/k8s/tests/error-serialization-test.ts @@ -0,0 +1,191 @@ +const mockExec = jest.fn() +const mockReadNamespacedPod = jest.fn() +const mockReadNamespacedJob = jest.fn() + +jest.mock('@kubernetes/client-node', () => { + return { + KubeConfig: jest.fn().mockImplementation(() => ({ + loadFromDefault: jest.fn(), + makeApiClient: jest.fn().mockImplementation(ApiClass => { + const name = ApiClass?.name || ApiClass?.toString() || '' + if (name.includes('Batch')) { + return { readNamespacedJob: mockReadNamespacedJob } + } + if (name.includes('Authorization')) { + return { createSelfSubjectAccessReview: jest.fn() } + } + return { readNamespacedPod: mockReadNamespacedPod } + }), + getContexts: jest.fn().mockReturnValue([{ namespace: 'test-namespace' }]) + })), + Exec: jest.fn().mockImplementation(() => ({ exec: mockExec })), + // eslint-disable-next-line @typescript-eslint/no-extraneous-class + CoreV1Api: class CoreV1Api {}, + // eslint-disable-next-line @typescript-eslint/no-extraneous-class + BatchV1Api: class BatchV1Api {}, + // eslint-disable-next-line @typescript-eslint/no-extraneous-class + AuthorizationV1Api: class AuthorizationV1Api {}, + Log: jest.fn() + } +}) + +jest.mock('tar-fs', () => ({ + default: { + pack: jest.fn().mockReturnValue({ pipe: jest.fn() }), + extract: jest.fn().mockReturnValue({ + on: jest.fn(), + pipe: jest.fn() + }) + }, + __esModule: true +})) + +jest.mock('../src/k8s/utils', () => { + const actual = jest.requireActual('../src/k8s/utils') + return { + ...actual, + sleep: jest.fn().mockResolvedValue(undefined) + } +}) + +import { + execCpToPod, + execCpFromPod, + waitForJobToComplete, + waitForPodPhases +} from '../src/k8s' +import { PodPhase } from '../src/k8s/utils' + +describe('error serialization', () => { + beforeEach(() => { + jest.clearAllMocks() + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'test-namespace' + }) + + afterEach(() => { + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + describe('execCpToPod', () => { + it('should include Error.message in thrown error after retries', async () => { + mockExec.mockRejectedValue(new Error('connection refused')) + + await expect( + execCpToPod('test-pod', '/tmp/src', '/workspace') + ).rejects.toThrow('cpToPod failed after 30 attempts: connection refused') + }) + + it('should use String() for non-Error throwables', async () => { + mockExec.mockRejectedValue('raw string error') + + await expect( + execCpToPod('test-pod', '/tmp/src', '/workspace') + ).rejects.toThrow('cpToPod failed after 30 attempts: raw string error') + }) + + it('should not produce empty braces in error message', async () => { + mockExec.mockRejectedValue(new Error('ETIMEOUT')) + + await expect( + execCpToPod('test-pod', '/tmp/src', '/workspace') + ).rejects.toMatchObject({ + message: expect.not.stringContaining('{}') + }) + }) + }) + + describe('execCpFromPod', () => { + it('should include Error.message in thrown error after retries', async () => { + mockExec.mockRejectedValue(new Error('container not found')) + + await expect( + execCpFromPod('test-pod', '/workspace/output', '/tmp/dst') + ).rejects.toThrow( + 'execCpFromPod failed after 30 attempts: container not found' + ) + }) + + it('should use String() for non-Error throwables', async () => { + mockExec.mockRejectedValue(42) + + await expect( + execCpFromPod('test-pod', '/workspace/output', '/tmp/dst') + ).rejects.toThrow('execCpFromPod failed after 30 attempts: 42') + }) + }) + + describe('waitForJobToComplete', () => { + it('should include Error.message when job fails', async () => { + mockReadNamespacedJob.mockResolvedValue({ + status: { failed: 1 } + }) + + await expect(waitForJobToComplete('my-job')).rejects.toThrow( + 'job my-job has failed: job my-job has failed' + ) + }) + + it('should include Error.message when API call throws', async () => { + mockReadNamespacedJob.mockRejectedValue(new Error('403 Forbidden')) + + await expect(waitForJobToComplete('my-job')).rejects.toThrow( + 'job my-job has failed: 403 Forbidden' + ) + }) + + it('should use String() for non-Error throwables from API', async () => { + mockReadNamespacedJob.mockRejectedValue('unexpected API failure') + + await expect(waitForJobToComplete('my-job')).rejects.toThrow( + 'job my-job has failed: unexpected API failure' + ) + }) + }) + + describe('waitForPodPhases', () => { + it('should include error message when pod enters unhealthy phase', async () => { + mockReadNamespacedPod.mockResolvedValue({ + status: { phase: 'Failed' } + }) + + await expect( + waitForPodPhases( + 'test-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]) + ) + ).rejects.toThrow(/Pod test-pod is unhealthy \(phase: Failed\)/) + }) + + it('should include Error.message when API call throws', async () => { + mockReadNamespacedPod.mockRejectedValue(new Error('network timeout')) + + await expect( + waitForPodPhases( + 'test-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]), + 1 + ) + ).rejects.toThrow('network timeout') + }) + + it('should not produce empty braces from Error objects', async () => { + mockReadNamespacedPod.mockRejectedValue(new Error('socket hang up')) + + try { + await waitForPodPhases( + 'test-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]), + 1 + ) + fail('Expected waitForPodPhases to throw') + } catch (error) { + const msg = (error as Error).message + expect(msg).not.toContain('{}') + expect(msg).toContain('socket hang up') + } + }) + }) +}) diff --git a/packages/k8s/tests/exec-pod-step-with-output-test.ts b/packages/k8s/tests/exec-pod-step-with-output-test.ts new file mode 100644 index 00000000..b947fcfd --- /dev/null +++ b/packages/k8s/tests/exec-pod-step-with-output-test.ts @@ -0,0 +1,197 @@ +import * as k8s from '@kubernetes/client-node' +import { execPodStepWithOutput } from '../src/k8s' + +jest.mock('@actions/core', () => ({ + debug: jest.fn(), + error: jest.fn(), + warning: jest.fn(), + info: jest.fn() +})) + +describe('execPodStepWithOutput', () => { + let execSpy: jest.SpyInstance + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + execSpy = jest.spyOn(k8s.Exec.prototype, 'exec') + }) + + afterEach(() => { + jest.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('resolves with code 0 and captured stdout on success', async () => { + execSpy.mockImplementation( + async ( + _ns, + _pod, + _container, + _cmd, + stdout, + _stderr, + _stdin, + _tty, + callback + ) => { + stdout.write('hello from script\n') + stdout.write('second line\n') + callback({ status: 'Success', code: 0 }) + return Promise.resolve() + } + ) + const { code, output } = await execPodStepWithOutput( + ['sh', '-c', 'echo hello'], + 'test-pod', + 'job' + ) + expect(code).toBe(0) + expect(output).toContain('hello from script') + expect(output).toContain('second line') + }) + + it('resolves with exit code when exec() promise rejects with non-zero exit message', async () => { + // This is the k8s client v1.x path: exec() rejects directly, callback never fires. + execSpy.mockImplementation(async (_ns, _pod, _container, _cmd, stdout) => { + stdout.write('some output before fail\n') + return Promise.reject( + new Error( + 'command terminated with non-zero exit code: command terminated with exit code 154' + ) + ) + }) + const { code, output } = await execPodStepWithOutput( + ['sh', '-c', 'exit 154'], + 'test-pod', + 'job' + ) + expect(code).toBe(154) + expect(output).toContain('some output before fail') + }) + + it('resolves with exit code from Failure status callback', async () => { + execSpy.mockImplementation( + async ( + _ns, + _pod, + _container, + _cmd, + _stdout, + stderr, + _stdin, + _tty, + callback + ) => { + stderr.write('error output\n') + callback({ + status: 'Failure', + message: 'command terminated with exit code 1' + }) + return Promise.resolve() + } + ) + const { code, output } = await execPodStepWithOutput( + ['sh', '-c', 'exit 1'], + 'test-pod', + 'job' + ) + expect(code).toBe(1) + expect(output).toContain('error output') + }) + + it('rejects on genuine exec failure (no exit code in error message)', async () => { + execSpy.mockReturnValue( + Promise.reject(new Error('websocket: connection refused')) + ) + await expect( + execPodStepWithOutput(['echo', 'hi'], 'test-pod', 'job') + ).rejects.toThrow('websocket: connection refused') + }) + + it('rejects on Failure callback with no exit code in message', async () => { + execSpy.mockImplementation( + async ( + _ns, + _pod, + _container, + _cmd, + _stdout, + _stderr, + _stdin, + _tty, + callback + ) => { + callback({ status: 'Failure', message: 'container not found' }) + return Promise.resolve() + } + ) + await expect( + execPodStepWithOutput(['echo'], 'test-pod', 'job') + ).rejects.toThrow('container not found') + }) + + it('retains only the last tailLines lines in the output buffer', async () => { + execSpy.mockImplementation( + async ( + _ns, + _pod, + _container, + _cmd, + stdout, + _stderr, + _stdin, + _tty, + callback + ) => { + for (let i = 0; i < 30; i++) { + stdout.write(`line ${i}\n`) + } + callback({ status: 'Success', code: 0 }) + return Promise.resolve() + } + ) + const { code, output } = await execPodStepWithOutput( + ['cmd'], + 'test-pod', + 'job', + 5 // tailLines = 5 + ) + expect(code).toBe(0) + const lines = output.split('\n').filter(Boolean) + expect(lines.length).toBeLessThanOrEqual(5) + expect(output).toContain('line 29') + expect(output).not.toContain('line 0') + }) + + it('keeps stdout and stderr pending buffers independent (no interleaving)', async () => { + execSpy.mockImplementation( + async ( + _ns, + _pod, + _container, + _cmd, + stdout, + stderr, + _stdin, + _tty, + callback + ) => { + // Write partial lines to both streams without a newline delimiter. + // If the pending buffers were shared, "out partial" and "err partial" + // would be concatenated into one corrupted line. + stdout.write('out partial') + stderr.write('err partial') + stdout.write(' continued\n') // completes the stdout line + stderr.write(' done\n') // completes the stderr line + callback({ status: 'Success', code: 0 }) + return Promise.resolve() + } + ) + const { output } = await execPodStepWithOutput(['cmd'], 'test-pod', 'job') + expect(output).toContain('out partial continued') + expect(output).toContain('err partial done') + // The two partial writes must NOT be merged into a single corrupted line + expect(output).not.toContain('out partialerr partial') + expect(output).not.toContain('err partialout partial') + }) +}) diff --git a/packages/k8s/tests/format-error-test.ts b/packages/k8s/tests/format-error-test.ts new file mode 100644 index 00000000..9fe78936 --- /dev/null +++ b/packages/k8s/tests/format-error-test.ts @@ -0,0 +1,94 @@ +import { formatError } from '../src/k8s/utils' + +describe('formatError', () => { + it('returns the message of a standard Error', () => { + const err = new Error('connection refused') + expect(formatError(err)).toBe('connection refused') + }) + + it('extracts response.body.message from @kubernetes/client-node errors', () => { + const k8sErr = { + message: 'HTTP request failed', + response: { + body: { + message: "pods 'foo' is forbidden: User cannot create pods", + reason: 'Forbidden', + code: 403 + } + } + } + expect(formatError(k8sErr)).toBe( + "pods 'foo' is forbidden: User cannot create pods (reason: Forbidden)" + ) + }) + + it('returns body.message without reason when reason is missing', () => { + const k8sErr = { + response: { body: { message: 'something broke' } } + } + expect(formatError(k8sErr)).toBe('something broke') + }) + + it('falls back to top-level body when response is absent', () => { + const k8sErr = { body: { message: 'top-level body message' } } + expect(formatError(k8sErr)).toBe('top-level body message') + }) + + it('does NOT throw on objects with circular references (the #329 regression)', () => { + // Reproduce the @kubernetes/client-node error shape that crashed + // JSON.stringify with: "Converting circular structure to JSON, + // starting at object with constructor 'TLSSocket'". + const socket: any = { constructor: { name: 'TLSSocket' } } + const parser: any = { constructor: { name: 'HTTPParser' }, socket } + socket.parser = parser + const circularErr: any = { + message: 'k8s exec failed', + response: { req: { socket } } + // no response.body — exercises the top-level-message branch. + } + + expect(() => formatError(circularErr)).not.toThrow() + expect(formatError(circularErr)).toBe('k8s exec failed') + }) + + it('returns the message field when present on a plain (non-Error) object', () => { + // Some throwables expose a top-level .message without being an Error + // (axios-style errors, hand-rolled error-likes from third parties). + expect(formatError({ message: 'top-level msg only' })).toBe( + 'top-level msg only' + ) + }) + + it('handles string throwables', () => { + expect(formatError('raw string error')).toBe('raw string error') + }) + + it('handles number throwables', () => { + expect(formatError(42)).toBe('42') + }) + + it('handles null', () => { + expect(formatError(null)).toBe('null') + }) + + it('handles undefined', () => { + expect(formatError(undefined)).toBe('undefined') + }) + + it('handles plain objects without message via JSON.stringify', () => { + expect(formatError({ code: 'ENOENT', path: '/tmp/x' })).toBe( + '{"code":"ENOENT","path":"/tmp/x"}' + ) + }) + + it('falls back to String() when even JSON.stringify throws', () => { + // Construct an object whose toJSON throws — exercises the inner try/catch. + const evil = { + toJSON() { + throw new Error('toJSON exploded') + } + } + expect(() => formatError(evil)).not.toThrow() + expect(formatError(evil)).toBe('[object Object]') + }) +}) diff --git a/packages/k8s/tests/heartbeat-test.ts b/packages/k8s/tests/heartbeat-test.ts new file mode 100644 index 00000000..56ea083a --- /dev/null +++ b/packages/k8s/tests/heartbeat-test.ts @@ -0,0 +1,207 @@ +import { EventEmitter } from 'events' +import { parsePositiveMsEnv, WebSocketHeartbeat } from '../src/k8s/heartbeat' +import type { HeartbeatWebSocket } from '../src/k8s/heartbeat' + +jest.mock('@actions/core', () => ({ + debug: jest.fn(), + warning: jest.fn(), + error: jest.fn(), + info: jest.fn() +})) + +// Minimal WebSocket test double backed by EventEmitter +class MockWebSocket extends EventEmitter implements HeartbeatWebSocket { + readyState: number + ping = jest.fn() + close = jest.fn() + + constructor(readyState = 1) { + super() + this.readyState = readyState + } +} + +describe('parsePositiveMsEnv', () => { + it('returns the fallback for undefined input', () => { + expect(parsePositiveMsEnv(undefined, 5000)).toBe(5000) + }) + + it('returns the fallback for an empty string', () => { + expect(parsePositiveMsEnv('', 5000)).toBe(5000) + }) + + it('returns the fallback for non-numeric input', () => { + expect(parsePositiveMsEnv('abc', 5000)).toBe(5000) + }) + + it('returns the fallback for zero', () => { + expect(parsePositiveMsEnv('0', 5000)).toBe(5000) + }) + + it('returns the fallback for negative values', () => { + expect(parsePositiveMsEnv('-100', 5000)).toBe(5000) + }) + + it('returns the fallback for NaN', () => { + expect(parsePositiveMsEnv('NaN', 5000)).toBe(5000) + }) + + it('parses a valid positive integer', () => { + expect(parsePositiveMsEnv('3000', 5000)).toBe(3000) + }) + + it('ignores fractional parts (parseInt semantics)', () => { + expect(parsePositiveMsEnv('1500.9', 5000)).toBe(1500) + }) +}) + +describe('WebSocketHeartbeat', () => { + beforeEach(() => { + jest.useFakeTimers() + }) + + afterEach(() => { + jest.useRealTimers() + }) + + describe('CONNECTING state (readyState === 0)', () => { + it('skips ping while connecting but keeps the interval running', () => { + const ws = new MockWebSocket(0) // CONNECTING + const reject = jest.fn() + const hb = new WebSocketHeartbeat(100, 10000) + + hb.start(ws, reject) + + jest.advanceTimersByTime(500) // fire interval several times + + expect(ws.ping).not.toHaveBeenCalled() + expect(reject).not.toHaveBeenCalled() + + hb.stop() + }) + + it('starts sending pings once the socket transitions to OPEN', () => { + const ws = new MockWebSocket(0) + const reject = jest.fn() + const hb = new WebSocketHeartbeat(100, 10000) + + hb.start(ws, reject) + + jest.advanceTimersByTime(100) // one interval tick while CONNECTING + expect(ws.ping).not.toHaveBeenCalled() + + ws.readyState = 1 // now OPEN + jest.advanceTimersByTime(100) // exactly one more tick + + expect(ws.ping).toHaveBeenCalledTimes(1) + + hb.stop() + }) + }) + + describe('pong timeout', () => { + it('closes the socket and rejects the promise when no pong is received after first ping', () => { + const ws = new MockWebSocket(1) + const reject = jest.fn() + // pingPeriodMs=100, pongDeadlineMs=200 + // t=100: first ping sent → deadline armed, fires at t=300 + const hb = new WebSocketHeartbeat(100, 200) + + hb.start(ws, reject) + + jest.advanceTimersByTime(350) // past first ping + deadline + + expect(ws.close).toHaveBeenCalledTimes(1) + expect(reject).toHaveBeenCalledTimes(1) + expect(reject.mock.calls[0][0]).toBeInstanceOf(Error) + expect(reject.mock.calls[0][0].message).toMatch(/heartbeat timeout/) + }) + + it('does not reject while the socket is still CONNECTING, even past pongDeadlineMs', () => { + const ws = new MockWebSocket(0) // CONNECTING — never transitions + const reject = jest.fn() + const hb = new WebSocketHeartbeat(100, 200) + + hb.start(ws, reject) + + // Advance well past what the deadline would have been if armed at start + jest.advanceTimersByTime(1000) + + expect(reject).not.toHaveBeenCalled() + + hb.stop() + }) + + it('resets the pong deadline when a pong is received', () => { + const ws = new MockWebSocket(1) + const reject = jest.fn() + // pingPeriodMs=100, pongDeadlineMs=500 + // t=100: first ping → deadline at t=600 + const hb = new WebSocketHeartbeat(100, 500) + + hb.start(ws, reject) + + jest.advanceTimersByTime(400) // t=400, deadline at t=600 + ws.emit('pong') // reset deadline → now fires at t=900 + + jest.advanceTimersByTime(400) // t=800, deadline not yet reached + + expect(reject).not.toHaveBeenCalled() + + hb.stop() + }) + }) + + describe('stop()', () => { + it('clears all timers so no pings or timeout callbacks fire after stop', () => { + const ws = new MockWebSocket(1) + const reject = jest.fn() + const hb = new WebSocketHeartbeat(100, 500) + + hb.start(ws, reject) + + jest.advanceTimersByTime(50) + hb.stop() + + const pingCountAtStop = ws.ping.mock.calls.length + + jest.advanceTimersByTime(1000) // well past both intervals + + expect(ws.ping).toHaveBeenCalledTimes(pingCountAtStop) + expect(reject).not.toHaveBeenCalled() + }) + + it('stops automatically when the WebSocket emits close', () => { + const ws = new MockWebSocket(1) + const reject = jest.fn() + const hb = new WebSocketHeartbeat(100, 500) + + hb.start(ws, reject) + + ws.emit('close') + + jest.advanceTimersByTime(1000) + + expect(reject).not.toHaveBeenCalled() + }) + }) + + describe('CLOSING/CLOSED state', () => { + it('stops the heartbeat when readyState is CLOSING (2)', () => { + const ws = new MockWebSocket(1) + const reject = jest.fn() + const hb = new WebSocketHeartbeat(100, 10000) + + hb.start(ws, reject) + + jest.advanceTimersByTime(150) // one successful ping + expect(ws.ping).toHaveBeenCalledTimes(1) + + ws.readyState = 2 // CLOSING + jest.advanceTimersByTime(200) + + // ping should not have been called again after transitioning to CLOSING + expect(ws.ping).toHaveBeenCalledTimes(1) + }) + }) +}) diff --git a/packages/k8s/tests/k8s-utils-test.ts b/packages/k8s/tests/k8s-utils-test.ts index fc84586c..bfb6c453 100644 --- a/packages/k8s/tests/k8s-utils-test.ts +++ b/packages/k8s/tests/k8s-utils-test.ts @@ -1,9 +1,8 @@ import * as fs from 'fs' -import { containerPorts, POD_VOLUME_NAME } from '../src/k8s' +import { containerPorts } from '../src/k8s' import { - containerVolumes, generateContainerName, - writeEntryPointScript, + writeRunScript, mergePodSpecWithOptions, mergeContainerWithOptions, readExtensionFromFile, @@ -27,91 +26,55 @@ describe('k8s utils', () => { it('should not throw', () => { expect(() => - writeEntryPointScript( - '/test', - 'sh', - ['-e', 'script.sh'], - ['/prepend/path'], - { - SOME_ENV: 'SOME_VALUE' - } - ) + writeRunScript('/test', 'sh', ['-e', 'script.sh'], ['/prepend/path'], { + SOME_ENV: 'SOME_VALUE' + }) ).not.toThrow() }) it('should throw if RUNNER_TEMP is not set', () => { delete process.env.RUNNER_TEMP expect(() => - writeEntryPointScript( - '/test', - 'sh', - ['-e', 'script.sh'], - ['/prepend/path'], - { - SOME_ENV: 'SOME_VALUE' - } - ) + writeRunScript('/test', 'sh', ['-e', 'script.sh'], ['/prepend/path'], { + SOME_ENV: 'SOME_VALUE' + }) ).toThrow() }) it('should throw if environment variable name contains double quote', () => { expect(() => - writeEntryPointScript( - '/test', - 'sh', - ['-e', 'script.sh'], - ['/prepend/path'], - { - 'SOME"_ENV': 'SOME_VALUE' - } - ) + writeRunScript('/test', 'sh', ['-e', 'script.sh'], ['/prepend/path'], { + 'SOME"_ENV': 'SOME_VALUE' + }) ).toThrow() }) it('should throw if environment variable name contains =', () => { expect(() => - writeEntryPointScript( - '/test', - 'sh', - ['-e', 'script.sh'], - ['/prepend/path'], - { - 'SOME=ENV': 'SOME_VALUE' - } - ) + writeRunScript('/test', 'sh', ['-e', 'script.sh'], ['/prepend/path'], { + 'SOME=ENV': 'SOME_VALUE' + }) ).toThrow() }) it('should throw if environment variable name contains single quote', () => { expect(() => - writeEntryPointScript( - '/test', - 'sh', - ['-e', 'script.sh'], - ['/prepend/path'], - { - "SOME'_ENV": 'SOME_VALUE' - } - ) + writeRunScript('/test', 'sh', ['-e', 'script.sh'], ['/prepend/path'], { + "SOME'_ENV": 'SOME_VALUE' + }) ).toThrow() }) it('should throw if environment variable name contains dollar', () => { expect(() => - writeEntryPointScript( - '/test', - 'sh', - ['-e', 'script.sh'], - ['/prepend/path'], - { - SOME_$_ENV: 'SOME_VALUE' - } - ) + writeRunScript('/test', 'sh', ['-e', 'script.sh'], ['/prepend/path'], { + SOME_$_ENV: 'SOME_VALUE' + }) ).toThrow() }) it('should escape double quote, dollar and backslash in environment variable values', () => { - const { runnerPath } = writeEntryPointScript( + const { runnerPath } = writeRunScript( '/test', 'sh', ['-e', 'script.sh'], @@ -130,7 +93,7 @@ describe('k8s utils', () => { }) it('should return object with containerPath and runnerPath', () => { - const { containerPath, runnerPath } = writeEntryPointScript( + const { containerPath, runnerPath } = writeRunScript( '/test', 'sh', ['-e', 'script.sh'], @@ -145,7 +108,7 @@ describe('k8s utils', () => { }) it('should write entrypoint path and the file should exist', () => { - const { runnerPath } = writeEntryPointScript( + const { runnerPath } = writeRunScript( '/test', 'sh', ['-e', 'script.sh'], @@ -168,88 +131,6 @@ describe('k8s utils', () => { await testHelper.cleanup() }) - it('should throw if container action and GITHUB_WORKSPACE env is not set', () => { - delete process.env.GITHUB_WORKSPACE - expect(() => containerVolumes([], true, true)).toThrow() - expect(() => containerVolumes([], false, true)).toThrow() - }) - - it('should always have work mount', () => { - let volumes = containerVolumes([], true, true) - expect(volumes.find(e => e.mountPath === '/__w')).toBeTruthy() - volumes = containerVolumes([], true, false) - expect(volumes.find(e => e.mountPath === '/__w')).toBeTruthy() - volumes = containerVolumes([], false, true) - expect(volumes.find(e => e.mountPath === '/__w')).toBeTruthy() - volumes = containerVolumes([], false, false) - expect(volumes.find(e => e.mountPath === '/__w')).toBeTruthy() - }) - - it('should always have /github/workflow mount if working on container job or container action', () => { - let volumes = containerVolumes([], true, true) - expect(volumes.find(e => e.mountPath === '/github/workflow')).toBeTruthy() - volumes = containerVolumes([], true, false) - expect(volumes.find(e => e.mountPath === '/github/workflow')).toBeTruthy() - volumes = containerVolumes([], false, true) - expect(volumes.find(e => e.mountPath === '/github/workflow')).toBeTruthy() - - volumes = containerVolumes([], false, false) - expect( - volumes.find(e => e.mountPath === '/github/workflow') - ).toBeUndefined() - }) - - it('should have container action volumes', () => { - let volumes = containerVolumes([], true, true) - let workspace = volumes.find(e => e.mountPath === '/github/workspace') - let fileCommands = volumes.find( - e => e.mountPath === '/github/file_commands' - ) - expect(workspace).toBeTruthy() - expect(workspace?.subPath).toBe('repo/repo') - expect(fileCommands).toBeTruthy() - expect(fileCommands?.subPath).toBe('_temp/_runner_file_commands') - - volumes = containerVolumes([], false, true) - workspace = volumes.find(e => e.mountPath === '/github/workspace') - fileCommands = volumes.find(e => e.mountPath === '/github/file_commands') - expect(workspace).toBeTruthy() - expect(workspace?.subPath).toBe('repo/repo') - expect(fileCommands).toBeTruthy() - expect(fileCommands?.subPath).toBe('_temp/_runner_file_commands') - }) - - it('should have externals, github home mounts if job container', () => { - const volumes = containerVolumes() - expect(volumes.find(e => e.mountPath === '/__e')).toBeTruthy() - expect(volumes.find(e => e.mountPath === '/github/home')).toBeTruthy() - }) - - it('should throw if user volume source volume path is not in workspace', () => { - expect(() => - containerVolumes( - [ - { - sourceVolumePath: '/outside/of/workdir' - } - ], - true, - false - ) - ).toThrow() - }) - - it(`all volumes should have name ${POD_VOLUME_NAME}`, () => { - let volumes = containerVolumes([], true, true) - expect(volumes.every(e => e.name === POD_VOLUME_NAME)).toBeTruthy() - volumes = containerVolumes([], true, false) - expect(volumes.every(e => e.name === POD_VOLUME_NAME)).toBeTruthy() - volumes = containerVolumes([], false, true) - expect(volumes.every(e => e.name === POD_VOLUME_NAME)).toBeTruthy() - volumes = containerVolumes([], false, false) - expect(volumes.every(e => e.name === POD_VOLUME_NAME)).toBeTruthy() - }) - it('should parse container ports', () => { const tt = [ { diff --git a/packages/k8s/tests/prepare-job-test.ts b/packages/k8s/tests/prepare-job-test.ts index ca94e6c5..99286ac9 100644 --- a/packages/k8s/tests/prepare-job-test.ts +++ b/packages/k8s/tests/prepare-job-test.ts @@ -3,15 +3,9 @@ import * as path from 'path' import { cleanupJob } from '../src/hooks' import { createContainerSpec, prepareJob } from '../src/hooks/prepare-job' import { TestHelper } from './test-setup' -import { - ENV_HOOK_TEMPLATE_PATH, - ENV_USE_KUBE_SCHEDULER, - generateContainerName, - readExtensionFromFile -} from '../src/k8s/utils' -import { getPodByName } from '../src/k8s' +import { ENV_HOOK_TEMPLATE_PATH, generateContainerName } from '../src/k8s/utils' +import { execPodStep, getPodByName } from '../src/k8s' import { V1Container } from '@kubernetes/client-node' -import * as yaml from 'js-yaml' import { JOB_CONTAINER_NAME } from '../src/hooks/constants' jest.useRealTimers() @@ -47,19 +41,34 @@ describe('Prepare job', () => { }) it('should prepare job with absolute path for userVolumeMount', async () => { + const userVolumeMount = path.join( + process.env.GITHUB_WORKSPACE as string, + 'myvolume' + ) + fs.mkdirSync(userVolumeMount, { recursive: true }) + fs.writeFileSync(path.join(userVolumeMount, 'file.txt'), 'hello') prepareJobData.args.container.userMountVolumes = [ { - sourceVolumePath: path.join( - process.env.GITHUB_WORKSPACE as string, - '/myvolume' - ), - targetVolumePath: '/volume_mount', + sourceVolumePath: userVolumeMount, + targetVolumePath: '/__w/myvolume', readOnly: false } ] await expect( prepareJob(prepareJobData.args, prepareJobOutputFilePath) ).resolves.not.toThrow() + + const content = JSON.parse( + fs.readFileSync(prepareJobOutputFilePath).toString() + ) + + await execPodStep( + ['sh', '-c', '[ "$(cat /__w/myvolume/file.txt)" = "hello" ] || exit 5'], + content!.state!.jobPod, + JOB_CONTAINER_NAME + ).then(output => { + expect(output).toBe(0) + }) }) it('should prepare job with envs CI and GITHUB_ACTIONS', async () => { @@ -110,19 +119,6 @@ describe('Prepare job', () => { ) }) - it('should throw an exception if the user volume mount is absolute path outside of GITHUB_WORKSPACE', async () => { - prepareJobData.args.container.userMountVolumes = [ - { - sourceVolumePath: '/somewhere/not/in/gh-workspace', - targetVolumePath: '/containermount', - readOnly: false - } - ] - await expect( - prepareJob(prepareJobData.args, prepareJobOutputFilePath) - ).rejects.toThrow() - }) - it('should not run prepare job without the job container', async () => { prepareJobData.args.container = undefined await expect( @@ -168,8 +164,7 @@ describe('Prepare job', () => { expect(got.metadata?.annotations?.['annotated-by']).toBe('extension') expect(got.metadata?.labels?.['labeled-by']).toBe('extension') - expect(got.spec?.securityContext?.runAsUser).toBe(1000) - expect(got.spec?.securityContext?.runAsGroup).toBe(3000) + expect(got.spec?.restartPolicy).toBe('Never') // job container expect(got.spec?.containers[0].name).toBe(JOB_CONTAINER_NAME) @@ -219,17 +214,6 @@ describe('Prepare job', () => { expect(content.context.services.length).toBe(1) }) - it('should not throw exception using kube scheduler', async () => { - // only for ReadWriteMany volumes or single node cluster - process.env[ENV_USE_KUBE_SCHEDULER] = 'true' - - await expect( - prepareJob(prepareJobData.args, prepareJobOutputFilePath) - ).resolves.not.toThrow() - - delete process.env[ENV_USE_KUBE_SCHEDULER] - }) - test.each([undefined, null, []])( 'should not throw exception when portMapping=%p', async pm => { @@ -243,4 +227,53 @@ describe('Prepare job', () => { expect(() => content.context.services[0].image).not.toThrow() } ) + + it('should prepare job with container with non-root user', async () => { + prepareJobData.args!.container!.image = + 'ghcr.io/actions/actions-runner:latest' // known to use user 1001 + await expect( + prepareJob(prepareJobData.args, prepareJobOutputFilePath) + ).resolves.not.toThrow() + + const content = JSON.parse( + fs.readFileSync(prepareJobOutputFilePath).toString() + ) + expect(content.state.jobPod).toBeTruthy() + expect(content.context.container.image).toBe( + 'ghcr.io/actions/actions-runner:latest' + ) + }) + + it('should create unique service container names when images collide', async () => { + // Use fixed, non-colliding high ports. (Kubernetes hostPort must be unique per node.) + prepareJobData.args.container.portMappings = ['31080:8080'] + + // make two services with the same image + const svc = JSON.parse(JSON.stringify(prepareJobData.args.services[0])) + const svc2 = JSON.parse(JSON.stringify(svc)) + // Ensure unique host ports so the pod spec is valid even with two services. + // (Kubernetes hostPort must be unique per node.) + svc.portMappings = ['31081:80', '31082:8080'] + svc2.portMappings = ['31083:80', '31084:8080'] + prepareJobData.args.services = [svc, svc2] + // ensure registries are null as TestHelper expects + prepareJobData.args.services.forEach((s: any) => (s.registry = null)) + + await expect( + prepareJob(prepareJobData.args, prepareJobOutputFilePath) + ).resolves.not.toThrow() + + const content = JSON.parse( + fs.readFileSync(prepareJobOutputFilePath).toString() + ) + + expect(content.context.services).toBeTruthy() + expect(content.context.services.length).toBe(2) + + const got = await getPodByName(content.state.jobPod) + const names = (got.spec?.containers || []).map(c => c.name) + + // when images collide, names should be suffixed with -0, -1 + expect(names).toEqual(expect.arrayContaining(['redis-0', 'redis-1'])) + }) }) diff --git a/packages/k8s/tests/prepare-job-unit-test.ts b/packages/k8s/tests/prepare-job-unit-test.ts new file mode 100644 index 00000000..a149b06e --- /dev/null +++ b/packages/k8s/tests/prepare-job-unit-test.ts @@ -0,0 +1,328 @@ +/** + * Pure unit tests for prepare-job.ts — no k8s cluster required. + * All k8s API calls are mocked. + */ +import * as fs from 'fs' +import * as os from 'os' +import * as path from 'path' +import * as k8s from '@kubernetes/client-node' + +jest.mock('@actions/core', () => ({ + debug: jest.fn(), + error: jest.fn(), + warning: jest.fn(), + info: jest.fn() +})) + +import * as k8sModule from '../src/k8s' +import { createContainerSpec, prepareJob } from '../src/hooks/prepare-job' +import { JOB_CONTAINER_NAME } from '../src/hooks/constants' +import { CONTAINER_VOLUMES } from '../src/k8s/utils' + +// ── helpers ────────────────────────────────────────────────────────────────── + +function makeTmpDir(): string { + const d = path.join(os.tmpdir(), `prepare-job-unit-${Date.now()}`) + fs.mkdirSync(d, { recursive: true }) + return d +} + +function makeMinimalArgs() { + return { + container: { + image: 'ubuntu:latest', + entryPoint: 'sh', + entryPointArgs: ['-c', 'sleep 1'], + environmentVariables: {}, + portMappings: [], + userMountVolumes: [] + }, + services: [] + } +} + +// ── createContainerSpec ─────────────────────────────────────────────────────── + +describe('createContainerSpec', () => { + it('sets image and name', () => { + const c = createContainerSpec( + { image: 'node:22', entryPoint: 'node' } as any, + 'my-container' + ) + expect(c.image).toBe('node:22') + expect(c.name).toBe('my-container') + }) + + it('sets default entryPoint for job containers when none given', () => { + const c = createContainerSpec( + { image: 'ubuntu:latest' } as any, + JOB_CONTAINER_NAME, + true + ) + expect(c.command).toEqual(['tail']) + expect(c.args).toEqual(['-f', '/dev/null']) + }) + + it('does NOT set default entryPoint for service containers', () => { + const c = createContainerSpec( + { image: 'redis:latest' } as any, + 'redis', + false + ) + expect(c.command).toBeUndefined() + expect(c.args).toBeUndefined() + }) + + it('sets command and args when entryPoint/entryPointArgs given', () => { + const c = createContainerSpec( + { + image: 'ubuntu:latest', + entryPoint: 'sh', + entryPointArgs: ['-c', 'echo hi'] + } as any, + 'my-container' + ) + expect(c.command).toEqual(['sh']) + // fixArgs splits 'sh -c echo hi' → shlex produces ['-c', 'echo', 'hi'] + expect(c.args).toEqual(expect.arrayContaining(['-c'])) + }) + + it('sets workingDir from workingDirectory', () => { + const c = createContainerSpec( + { + image: 'ubuntu:latest', + workingDirectory: '/app', + entryPoint: 'sh' + } as any, + 'my-container' + ) + expect(c.workingDir).toBe('/app') + }) + + it('injects GITHUB_ACTIONS=true env', () => { + const c = createContainerSpec( + { image: 'ubuntu:latest', entryPoint: 'sh' } as any, + 'c' + ) + expect(c.env).toEqual( + expect.arrayContaining([{ name: 'GITHUB_ACTIONS', value: 'true' }]) + ) + }) + + it('injects CI=true when not set', () => { + const c = createContainerSpec( + { image: 'ubuntu:latest', entryPoint: 'sh' } as any, + 'c' + ) + expect(c.env).toEqual( + expect.arrayContaining([{ name: 'CI', value: 'true' }]) + ) + }) + + it('does NOT inject CI when already set in environmentVariables', () => { + const c = createContainerSpec( + { + image: 'ubuntu:latest', + entryPoint: 'sh', + environmentVariables: { CI: 'false' } + } as any, + 'c' + ) + const ciEntries = (c.env || []).filter(e => e.name === 'CI') + expect(ciEntries).toHaveLength(1) + expect(ciEntries[0].value).toBe('false') + }) + + it('skips HOME from environmentVariables', () => { + const c = createContainerSpec( + { + image: 'ubuntu:latest', + entryPoint: 'sh', + environmentVariables: { HOME: '/root', FOO: 'bar' } + } as any, + 'c' + ) + expect((c.env || []).some(e => e.name === 'HOME')).toBe(false) + expect((c.env || []).some(e => e.name === 'FOO')).toBe(true) + }) + + it('attaches CONTAINER_VOLUMES as volumeMounts', () => { + const c = createContainerSpec( + { image: 'ubuntu:latest', entryPoint: 'sh' } as any, + 'c' + ) + expect(c.volumeMounts).toEqual(CONTAINER_VOLUMES) + }) + + it('applies extension overrides via mergeContainerWithOptions', () => { + const extension: k8s.V1PodTemplateSpec = { + spec: { + containers: [ + { + name: '$c', + resources: { requests: { cpu: '500m' } } + } as k8s.V1Container + ] + } + } + const c = createContainerSpec( + { image: 'ubuntu:latest', entryPoint: 'sh' } as any, + 'c', + false, + extension + ) + expect(c.resources?.requests?.cpu).toBe('500m') + }) +}) + +// ── prepareJob error paths ──────────────────────────────────────────────────── + +describe('prepareJob error paths', () => { + let tmpDir: string + let responseFile: string + let prunePodsSpy: jest.SpyInstance + let createJobPodSpy: jest.SpyInstance + let waitForPodPhasesSpy: jest.SpyInstance + let isPodContainerAlpineSpy: jest.SpyInstance + + beforeEach(() => { + tmpDir = makeTmpDir() + responseFile = path.join(tmpDir, 'response.json') + // writeToResponseFile requires the file to already exist + fs.writeFileSync(responseFile, '') + process.env.RUNNER_WORKSPACE = path.join(tmpDir, 'runner/_work/repo') + process.env.RUNNER_TEMP = path.join(tmpDir, 'tmp') + process.env.GITHUB_WORKSPACE = path.join(tmpDir, 'runner/_work/repo/repo') + process.env.ACTIONS_RUNNER_POD_NAME = 'runner-pod' + process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE = 'default' + fs.mkdirSync(process.env.RUNNER_TEMP, { recursive: true }) + fs.mkdirSync(path.dirname(process.env.RUNNER_WORKSPACE), { + recursive: true + }) + + prunePodsSpy = jest + .spyOn(k8sModule, 'prunePods') + .mockResolvedValue(undefined) + createJobPodSpy = jest.spyOn(k8sModule, 'createJobPod').mockResolvedValue({ + metadata: { name: 'job-pod-xyz' } + } as k8s.V1Pod) + waitForPodPhasesSpy = jest + .spyOn(k8sModule, 'waitForPodPhases') + .mockResolvedValue(undefined) + isPodContainerAlpineSpy = jest + .spyOn(k8sModule, 'isPodContainerAlpine') + .mockResolvedValue(false) + jest.spyOn(k8sModule, 'execCpToPod').mockResolvedValue(undefined) + }) + + afterEach(() => { + jest.restoreAllMocks() + fs.rmSync(tmpDir, { recursive: true, force: true }) + delete process.env.RUNNER_WORKSPACE + delete process.env.RUNNER_TEMP + delete process.env.GITHUB_WORKSPACE + delete process.env.ACTIONS_RUNNER_POD_NAME + delete process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE + }) + + it('throws when container is missing', async () => { + const args = makeMinimalArgs() + args.container = undefined as any + await expect(prepareJob(args as any, responseFile)).rejects.toThrow( + 'Job Container is required' + ) + }) + + it('throws when no container image and no services', async () => { + const args = makeMinimalArgs() + args.container = { image: '' } as any + args.services = [] + await expect(prepareJob(args as any, responseFile)).rejects.toThrow() + }) + + it('throws with structured message when createJobPod fails with k8s error', async () => { + const k8sError = new Error( + 'HTTP-Code: 422\nMessage: Unprocessable\nBody: "{\\"kind\\":\\"Status\\",\\"message\\":\\"spec.volumes[0].name: Duplicate value\\"}"' + + '\nHeaders: {}' + ) + createJobPodSpy.mockRejectedValue(k8sError) + + await expect( + prepareJob(makeMinimalArgs() as any, responseFile) + ).rejects.toThrow('failed to create job pod') + expect(prunePodsSpy).toHaveBeenCalledTimes(2) // initial prune + error prune + }) + + it('throws wrapped error when createJobPod fails with generic error', async () => { + createJobPodSpy.mockRejectedValue(new Error('network timeout')) + await expect( + prepareJob(makeMinimalArgs() as any, responseFile) + ).rejects.toThrow('failed to create job pod') + }) + + it('throws pod failed message when waitForPodPhases rejects', async () => { + waitForPodPhasesSpy.mockRejectedValue(new Error('pod stuck in Pending')) + await expect( + prepareJob(makeMinimalArgs() as any, responseFile) + ).rejects.toThrow('pod failed to come online') + expect(prunePodsSpy).toHaveBeenCalledTimes(2) // initial + cleanup + }) + + it('throws when isPodContainerAlpine rejects', async () => { + isPodContainerAlpineSpy.mockRejectedValue(new Error('exec failed')) + await expect( + prepareJob(makeMinimalArgs() as any, responseFile) + ).rejects.toThrow('failed to determine if the pod is alpine') + }) + + it('throws when RUNNER_WORKSPACE is not set', async () => { + delete process.env.RUNNER_WORKSPACE + await expect( + prepareJob(makeMinimalArgs() as any, responseFile) + ).rejects.toThrow('RUNNER_WORKSPACE') + }) + + it('writes response file on success', async () => { + await prepareJob(makeMinimalArgs() as any, responseFile) + expect(fs.existsSync(responseFile)).toBe(true) + const content = JSON.parse(fs.readFileSync(responseFile, 'utf8')) + expect(content.state.jobPod).toBe('job-pod-xyz') + expect(content.isAlpine).toBe(false) + }) + + it('sets isAlpine=true in response when alpine detected', async () => { + isPodContainerAlpineSpy.mockResolvedValue(true) + await prepareJob(makeMinimalArgs() as any, responseFile) + const content = JSON.parse(fs.readFileSync(responseFile, 'utf8')) + expect(content.isAlpine).toBe(true) + }) + + it('deduplicates service names when images collide', async () => { + const args = makeMinimalArgs() as any + args.services = [ + { image: 'redis:latest', portMappings: [], environmentVariables: {} }, + { image: 'redis:latest', portMappings: [], environmentVariables: {} } + ] + createJobPodSpy.mockImplementation(async (_name, _container, services) => { + // Return a pod with the service containers echoed back + return Promise.resolve({ + metadata: { name: 'job-pod-xyz' }, + spec: { + containers: [ + { name: JOB_CONTAINER_NAME, image: 'ubuntu:latest', ports: [] }, + ...(services || []).map((s: k8s.V1Container) => ({ + name: s.name, + image: s.image, + ports: [] + })) + ] + } + } as k8s.V1Pod) + }) + + await prepareJob(args, responseFile) + const content = JSON.parse(fs.readFileSync(responseFile, 'utf8')) + // Two services with colliding names → redis-0, redis-1 + expect(content.context.services).toHaveLength(2) + }) +}) diff --git a/packages/k8s/tests/run-container-step-terminated-test.ts b/packages/k8s/tests/run-container-step-terminated-test.ts new file mode 100644 index 00000000..be2c6c5b --- /dev/null +++ b/packages/k8s/tests/run-container-step-terminated-test.ts @@ -0,0 +1,190 @@ +import * as k8s from '@kubernetes/client-node' +import * as core from '@actions/core' +import { runContainerStep } from '../src/hooks' +import * as k8sModule from '../src/k8s' +import { RunContainerStepArgs } from 'hooklib' + +jest.mock('@actions/core', () => ({ + debug: jest.fn(), + error: jest.fn(), + warning: jest.fn(), + info: jest.fn() +})) + +function terminatedContainer( + name: string, + reason: string, + exitCode: number, + message?: string +): k8s.V1ContainerStatus { + return { + name, + state: { terminated: { reason, exitCode, message } } + } as k8s.V1ContainerStatus +} + +function buildPodWithTerminated( + containerStatuses: k8s.V1ContainerStatus[] +): k8s.V1Pod { + return { + metadata: { name: 'test-step-pod' }, + status: { + phase: 'Failed', + containerStatuses + } + } as k8s.V1Pod +} + +function makeMinimalArgs(): RunContainerStepArgs { + return { + image: 'ubuntu:latest', + entryPoint: 'sh', + entryPointArgs: ['-c', 'echo test'] + } as RunContainerStepArgs +} + +describe('runContainerStep terminated error detection', () => { + let _createStepPodSpy: jest.SpyInstance + let _waitForPodPhasesSpy: jest.SpyInstance + let getPodByNameSpy: jest.SpyInstance + let getContainerTerminatedErrorsSpy: jest.SpyInstance + let describePodFailureSpy: jest.SpyInstance + let _deletePodSpy: jest.SpyInstance + let coreErrorSpy: jest.SpyInstance + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + process.env['RUNNER_WORKSPACE'] = '/tmp/runner/_work/repo' + process.env['GITHUB_WORKSPACE'] = '/tmp/runner/_work/repo/repo' + process.env['ACTIONS_RUNNER_POD_NAME'] = 'test-runner-pod' + + _createStepPodSpy = jest + .spyOn(k8sModule, 'createContainerStepPod') + .mockResolvedValue({ + metadata: { name: 'test-step-pod' } + } as k8s.V1Pod) + + _waitForPodPhasesSpy = jest + .spyOn(k8sModule, 'waitForPodPhases') + .mockRejectedValue( + new Error('Pod test-step-pod has unrecoverable errors') + ) + + getPodByNameSpy = jest.spyOn(k8sModule, 'getPodByName') + + getContainerTerminatedErrorsSpy = jest.spyOn( + k8sModule, + 'getContainerTerminatedErrors' + ) + + describePodFailureSpy = jest + .spyOn(k8sModule, 'describePodFailure') + .mockResolvedValue( + 'Pod status: Failed\nContainer details:\n ✗ container "job" terminated: OOMKilled (exit code 137)' + ) + + _deletePodSpy = jest + .spyOn(k8sModule, 'deletePod') + .mockResolvedValue(undefined) + + coreErrorSpy = jest.spyOn(core, 'error') + }) + + afterEach(() => { + jest.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + delete process.env['RUNNER_WORKSPACE'] + delete process.env['GITHUB_WORKSPACE'] + delete process.env['ACTIONS_RUNNER_POD_NAME'] + }) + + it('detects OOMKilled and logs describePodFailure output', async () => { + getPodByNameSpy.mockResolvedValue( + buildPodWithTerminated([ + terminatedContainer( + 'job', + 'OOMKilled', + 137, + 'The node was low on resource: memory' + ) + ]) + ) + getContainerTerminatedErrorsSpy.mockReturnValue([ + ' ✗ container "job": OOMKilled (exit code 137)\n The node was low on resource: memory' + ]) + + await expect(runContainerStep(makeMinimalArgs())).rejects.toThrow() + + expect(getPodByNameSpy).toHaveBeenCalledWith('test-step-pod') + expect(getContainerTerminatedErrorsSpy).toHaveBeenCalled() + expect(describePodFailureSpy).toHaveBeenCalledWith('test-step-pod') + expect(coreErrorSpy).toHaveBeenCalledWith( + expect.stringContaining('OOMKilled') + ) + }) + + it('detects Error (exit non-zero) and logs describePodFailure output', async () => { + getPodByNameSpy.mockResolvedValue( + buildPodWithTerminated([terminatedContainer('job', 'Error', 1)]) + ) + getContainerTerminatedErrorsSpy.mockReturnValue([ + ' ✗ container "job": Error (exit code 1)' + ]) + + await expect(runContainerStep(makeMinimalArgs())).rejects.toThrow() + + expect(getPodByNameSpy).toHaveBeenCalledWith('test-step-pod') + expect(getContainerTerminatedErrorsSpy).toHaveBeenCalled() + expect(describePodFailureSpy).toHaveBeenCalledWith('test-step-pod') + expect(coreErrorSpy).toHaveBeenCalledWith( + expect.stringContaining('Error (exit code 1)') + ) + }) + + it('detects FailedPostStartHookError and logs describePodFailure output', async () => { + getPodByNameSpy.mockResolvedValue( + buildPodWithTerminated([ + terminatedContainer( + 'job', + 'FailedPostStartHookError', + 137, + 'postStart hook failed' + ) + ]) + ) + getContainerTerminatedErrorsSpy.mockReturnValue([ + ' ✗ container "job": FailedPostStartHookError (exit code 137)\n postStart hook failed' + ]) + + await expect(runContainerStep(makeMinimalArgs())).rejects.toThrow() + + expect(getPodByNameSpy).toHaveBeenCalledWith('test-step-pod') + expect(getContainerTerminatedErrorsSpy).toHaveBeenCalled() + expect(describePodFailureSpy).toHaveBeenCalledWith('test-step-pod') + expect(coreErrorSpy).toHaveBeenCalledWith( + expect.stringContaining('FailedPostStartHookError') + ) + }) + + it('does not log terminated errors when pod has none', async () => { + getPodByNameSpy.mockResolvedValue(buildPodWithTerminated([])) + getContainerTerminatedErrorsSpy.mockReturnValue([]) + + await expect(runContainerStep(makeMinimalArgs())).rejects.toThrow() + + expect(getPodByNameSpy).toHaveBeenCalledWith('test-step-pod') + expect(getContainerTerminatedErrorsSpy).toHaveBeenCalled() + expect(describePodFailureSpy).not.toHaveBeenCalled() + }) + + it('gracefully handles getPodByName failure', async () => { + getPodByNameSpy.mockRejectedValue(new Error('pod not found')) + + await expect(runContainerStep(makeMinimalArgs())).rejects.toThrow() + + expect(getPodByNameSpy).toHaveBeenCalledWith('test-step-pod') + expect(coreErrorSpy).toHaveBeenCalledWith( + expect.stringContaining('Failed to run container step') + ) + }) +}) diff --git a/packages/k8s/tests/run-container-step-test.ts b/packages/k8s/tests/run-container-step-test.ts index 51a33b76..caeb8600 100644 --- a/packages/k8s/tests/run-container-step-test.ts +++ b/packages/k8s/tests/run-container-step-test.ts @@ -1,4 +1,4 @@ -import { runContainerStep } from '../src/hooks' +import { prepareJob, runContainerStep } from '../src/hooks' import { TestHelper } from './test-setup' import { ENV_HOOK_TEMPLATE_PATH } from '../src/k8s/utils' import * as fs from 'fs' @@ -10,11 +10,16 @@ jest.useRealTimers() let testHelper: TestHelper let runContainerStepData: any +let prepareJobData: any +let prepareJobOutputFilePath: string describe('Run container step', () => { beforeEach(async () => { testHelper = new TestHelper() await testHelper.initialize() + prepareJobData = testHelper.getPrepareJobDefinition() + prepareJobOutputFilePath = testHelper.createFile('prepare-job-output.json') + await prepareJob(prepareJobData.args, prepareJobOutputFilePath) runContainerStepData = testHelper.getRunContainerStepDefinition() }) @@ -22,11 +27,6 @@ describe('Run container step', () => { await testHelper.cleanup() }) - it('should not throw', async () => { - const exitCode = await runContainerStep(runContainerStepData.args) - expect(exitCode).toBe(0) - }) - it('should run pod with extensions applied', async () => { const extension = { metadata: { @@ -42,7 +42,7 @@ describe('Run container step', () => { { name: JOB_CONTAINER_EXTENSION_NAME, command: ['sh'], - args: ['-c', 'echo test'] + args: ['-c', 'sleep 10000'] }, { name: 'side-container', @@ -51,11 +51,7 @@ describe('Run container step', () => { args: ['-c', 'echo test'] } ], - restartPolicy: 'Never', - securityContext: { - runAsUser: 1000, - runAsGroup: 3000 - } + restartPolicy: 'Never' } } @@ -72,7 +68,7 @@ describe('Run container step', () => { runContainerStepData.args.entryPoint = 'bash' runContainerStepData.args.entryPointArgs = [ '-c', - "'if [[ -z $NODE_ENV ]]; then exit 1; fi'" + 'if [[ -z $NODE_ENV ]]; then exit 1; fi' ] await expect( runContainerStep(runContainerStepData.args) @@ -83,7 +79,7 @@ describe('Run container step', () => { runContainerStepData.args.entryPoint = 'bash' runContainerStepData.args.entryPointArgs = [ '-c', - "'if [[ -z $GITHUB_ACTIONS ]] || [[ -z $CI ]]; then exit 1; fi'" + 'if [[ -z $GITHUB_ACTIONS ]] || [[ -z $CI ]]; then exit 1; fi' ] await expect( runContainerStep(runContainerStepData.args) diff --git a/packages/k8s/tests/run-container-step-unit-test.ts b/packages/k8s/tests/run-container-step-unit-test.ts new file mode 100644 index 00000000..468f0f8c --- /dev/null +++ b/packages/k8s/tests/run-container-step-unit-test.ts @@ -0,0 +1,264 @@ +/** + * Pure unit tests for run-container-step.ts — no k8s cluster required. + */ +import * as fs from 'fs' +import * as os from 'os' +import * as path from 'path' +import * as k8s from '@kubernetes/client-node' +import { RunContainerStepArgs } from 'hooklib' +import { runContainerStep } from '../src/hooks/run-container-step' +import * as k8sModule from '../src/k8s' +import * as utils from '../src/k8s/utils' + +jest.mock('@actions/core', () => ({ + debug: jest.fn(), + error: jest.fn(), + warning: jest.fn(), + info: jest.fn() +})) + +// ── helpers ────────────────────────────────────────────────────────────────── + +function makeTmpDir(): string { + const d = path.join(os.tmpdir(), `rcs-unit-${Date.now()}`) + fs.mkdirSync(d, { recursive: true }) + return d +} + +function makeArgs( + overrides: Partial = {} +): RunContainerStepArgs { + return { + image: 'ubuntu:latest', + entryPoint: 'sh', + entryPointArgs: ['-c', 'echo hi'], + environmentVariables: {}, + ...overrides + } as RunContainerStepArgs +} + +// ── tests ───────────────────────────────────────────────────────────────────── + +describe('runContainerStep — argument validation', () => { + it('throws when dockerfile is set (not supported)', async () => { + await expect( + runContainerStep(makeArgs({ dockerfile: 'Dockerfile' } as any)) + ).rejects.toThrow('Building container actions is not currently supported') + }) + + it('throws when entryPoint is missing', async () => { + await expect( + runContainerStep(makeArgs({ entryPoint: '' })) + ).rejects.toThrow( + 'failed to start the container since the entrypoint is overwritten' + ) + }) +}) + +describe('runContainerStep — createContainerStepPod failure', () => { + let tmpDir: string + let createStepPodSpy: jest.SpyInstance + + beforeEach(() => { + tmpDir = makeTmpDir() + process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE = 'default' + process.env.ACTIONS_RUNNER_POD_NAME = 'runner-pod' + process.env.RUNNER_WORKSPACE = path.join(tmpDir, 'runner/_work/repo') + process.env.GITHUB_WORKSPACE = path.join(tmpDir, 'runner/_work/repo/repo') + process.env.RUNNER_TEMP = path.join(tmpDir, 'tmp') + fs.mkdirSync(process.env.RUNNER_TEMP, { recursive: true }) + fs.mkdirSync(path.dirname(process.env.RUNNER_WORKSPACE), { + recursive: true + }) + + createStepPodSpy = jest + .spyOn(k8sModule, 'createContainerStepPod') + .mockRejectedValue(new Error('pod quota exceeded')) + }) + + afterEach(() => { + jest.restoreAllMocks() + fs.rmSync(tmpDir, { recursive: true, force: true }) + delete process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE + delete process.env.ACTIONS_RUNNER_POD_NAME + delete process.env.RUNNER_WORKSPACE + delete process.env.GITHUB_WORKSPACE + delete process.env.RUNNER_TEMP + }) + + it('wraps createContainerStepPod error', async () => { + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'failed to run container step: pod quota exceeded' + ) + }) + + it('wraps k8s body message when available', async () => { + createStepPodSpy.mockRejectedValue({ + response: { body: { message: 'namespace limit reached' } } + }) + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'failed to run container step: namespace limit reached' + ) + }) +}) + +describe('runContainerStep — pod missing metadata.name', () => { + let tmpDir: string + + beforeEach(() => { + tmpDir = makeTmpDir() + process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE = 'default' + process.env.ACTIONS_RUNNER_POD_NAME = 'runner-pod' + process.env.RUNNER_WORKSPACE = path.join(tmpDir, 'runner/_work/repo') + process.env.GITHUB_WORKSPACE = path.join(tmpDir, 'runner/_work/repo/repo') + process.env.RUNNER_TEMP = path.join(tmpDir, 'tmp') + fs.mkdirSync(process.env.RUNNER_TEMP, { recursive: true }) + fs.mkdirSync(path.dirname(process.env.RUNNER_WORKSPACE), { + recursive: true + }) + + jest + .spyOn(k8sModule, 'createContainerStepPod') + .mockResolvedValue({} as k8s.V1Pod) + jest.spyOn(k8sModule, 'deletePod').mockResolvedValue(undefined) + }) + + afterEach(() => { + jest.restoreAllMocks() + fs.rmSync(tmpDir, { recursive: true, force: true }) + delete process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE + delete process.env.ACTIONS_RUNNER_POD_NAME + delete process.env.RUNNER_WORKSPACE + delete process.env.GITHUB_WORKSPACE + delete process.env.RUNNER_TEMP + }) + + it('throws when pod has no metadata.name', async () => { + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'to have correctly set the metadata.name' + ) + }) +}) + +describe('runContainerStep — script execution paths', () => { + let tmpDir: string + let execPodStepWithOutputSpy: jest.SpyInstance + let getPodByNameSpy: jest.SpyInstance + let deletePodSpy: jest.SpyInstance + + beforeEach(() => { + tmpDir = makeTmpDir() + const runnerTemp = path.join(tmpDir, 'tmp') + fs.mkdirSync(runnerTemp, { recursive: true }) + // Use forward-slash paths so the '/__w/repo/repo'.split('/') logic works on Windows + const runnerWork = '/__w/repo' + const githubWork = '/__w/repo/repo' + + process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE = 'default' + process.env.ACTIONS_RUNNER_POD_NAME = 'runner-pod' + process.env.RUNNER_WORKSPACE = runnerWork + process.env.GITHUB_WORKSPACE = githubWork + process.env.RUNNER_TEMP = runnerTemp + + jest.spyOn(k8sModule, 'createContainerStepPod').mockResolvedValue({ + metadata: { name: 'step-pod-abc' } + } as k8s.V1Pod) + + jest.spyOn(k8sModule, 'waitForPodPhases').mockResolvedValue(undefined) + jest.spyOn(k8sModule, 'execCpFromPod').mockResolvedValue(undefined) + jest.spyOn(k8sModule, 'execCpToPod').mockResolvedValue(undefined) + // createTempDir for /__w/_temp + const wDir = path.join(tmpDir, 'runner/__w/_temp') + fs.mkdirSync(wDir, { recursive: true }) + + // Mock writeContainerStepScript so no real FS write to /__w/... + jest.spyOn(utils, 'writeContainerStepScript').mockReturnValue({ + containerPath: '/__w/_temp/script.sh', + runnerPath: path.join(tmpDir, 'script.sh') + }) + + execPodStepWithOutputSpy = jest + .spyOn(k8sModule, 'execPodStepWithOutput') + .mockResolvedValue({ code: 0, output: '' }) + + getPodByNameSpy = jest.spyOn(k8sModule, 'getPodByName').mockResolvedValue({ + metadata: { name: 'step-pod-abc' }, + status: {} + } as k8s.V1Pod) + + jest.spyOn(k8sModule, 'getContainerTerminatedErrors').mockReturnValue([]) + + jest.spyOn(k8sModule, 'describePodFailure').mockResolvedValue('pod details') + + deletePodSpy = jest + .spyOn(k8sModule, 'deletePod') + .mockResolvedValue(undefined) + }) + + afterEach(() => { + jest.restoreAllMocks() + fs.rmSync(tmpDir, { recursive: true, force: true }) + delete process.env.ACTIONS_RUNNER_KUBERNETES_NAMESPACE + delete process.env.ACTIONS_RUNNER_POD_NAME + delete process.env.RUNNER_WORKSPACE + delete process.env.GITHUB_WORKSPACE + delete process.env.RUNNER_TEMP + }) + + it('returns 0 on success', async () => { + const result = await runContainerStep(makeArgs()) + expect(result).toBe(0) + expect(deletePodSpy).toHaveBeenCalledWith('step-pod-abc') + }) + + it('re-throws classified errors verbatim (Step failed: prefix)', async () => { + execPodStepWithOutputSpy.mockResolvedValue({ + code: 1, + output: 'bad output' + }) + getPodByNameSpy.mockResolvedValue({ + metadata: { name: 'step-pod-abc' }, + status: { + containerStatuses: [ + { + name: 'job', + state: { terminated: { reason: 'Completed', exitCode: 1 } } + } + ] + } + } as any) + + await expect(runContainerStep(makeArgs())).rejects.toThrow( + 'failed to run script step' + ) + expect(deletePodSpy).toHaveBeenCalled() + }) + + it('deletes pod on failure', async () => { + execPodStepWithOutputSpy.mockRejectedValue(new Error('websocket dropped')) + await expect(runContainerStep(makeArgs())).rejects.toThrow() + expect(deletePodSpy).toHaveBeenCalledWith('step-pod-abc') + }) + + it('throws when RUNNER_WORKSPACE env not set', async () => { + delete process.env.RUNNER_WORKSPACE + // writeContainerStepScript is called before the workspace check in some paths — + // either way the pod should be deleted and an error thrown + await expect(runContainerStep(makeArgs())).rejects.toThrow() + expect(deletePodSpy).toHaveBeenCalled() + }) + + it('injects GITHUB_ACTIONS and CI into envs', async () => { + const args = makeArgs({ environmentVariables: {} }) + await runContainerStep(args) + // env injection happens before pod creation — check envs on the args object + expect(args.environmentVariables?.['GITHUB_ACTIONS']).toBe('true') + expect(args.environmentVariables?.['CI']).toBe('true') + }) + + it('does not overwrite existing CI env', async () => { + const args = makeArgs({ environmentVariables: { CI: 'false' } }) + await runContainerStep(args) + expect(args.environmentVariables?.['CI']).toBe('false') + }) +}) diff --git a/packages/k8s/tests/run-script-step-test.ts b/packages/k8s/tests/run-script-step-test.ts index 2d9d8fd9..da2b3f05 100644 --- a/packages/k8s/tests/run-script-step-test.ts +++ b/packages/k8s/tests/run-script-step-test.ts @@ -1,6 +1,7 @@ import * as fs from 'fs' import { cleanupJob, prepareJob, runScriptStep } from '../src/hooks' import { TestHelper } from './test-setup' +import { PrepareJobArgs, RunScriptStepArgs } from 'hooklib' jest.useRealTimers() @@ -8,7 +9,9 @@ let testHelper: TestHelper let prepareJobOutputData: any -let runScriptStepDefinition +let runScriptStepDefinition: { + args: RunScriptStepArgs +} describe('Run script step', () => { beforeEach(async () => { @@ -19,9 +22,14 @@ describe('Run script step', () => { ) const prepareJobData = testHelper.getPrepareJobDefinition() - runScriptStepDefinition = testHelper.getRunScriptStepDefinition() + runScriptStepDefinition = testHelper.getRunScriptStepDefinition() as { + args: RunScriptStepArgs + } - await prepareJob(prepareJobData.args, prepareJobOutputFilePath) + await prepareJob( + prepareJobData.args as PrepareJobArgs, + prepareJobOutputFilePath + ) const outputContent = fs.readFileSync(prepareJobOutputFilePath) prepareJobOutputData = JSON.parse(outputContent.toString()) }) @@ -37,22 +45,14 @@ describe('Run script step', () => { it('should not throw an exception', async () => { await expect( - runScriptStep( - runScriptStepDefinition.args, - prepareJobOutputData.state, - null - ) + runScriptStep(runScriptStepDefinition.args, prepareJobOutputData.state) ).resolves.not.toThrow() }) it('should fail if the working directory does not exist', async () => { runScriptStepDefinition.args.workingDirectory = '/foo/bar' await expect( - runScriptStep( - runScriptStepDefinition.args, - prepareJobOutputData.state, - null - ) + runScriptStep(runScriptStepDefinition.args, prepareJobOutputData.state) ).rejects.toThrow() }) @@ -64,16 +64,12 @@ describe('Run script step', () => { "'if [[ -z $NODE_ENV ]]; then exit 1; fi'" ] await expect( - runScriptStep( - runScriptStepDefinition.args, - prepareJobOutputData.state, - null - ) + runScriptStep(runScriptStepDefinition.args, prepareJobOutputData.state) ).resolves.not.toThrow() }) it('Should have path variable changed in container with prepend path string', async () => { - runScriptStepDefinition.args.prependPath = '/some/path' + runScriptStepDefinition.args.prependPath = ['/some/path'] runScriptStepDefinition.args.entryPoint = '/bin/bash' runScriptStepDefinition.args.entryPointArgs = [ '-c', @@ -81,11 +77,7 @@ describe('Run script step', () => { ] await expect( - runScriptStep( - runScriptStepDefinition.args, - prepareJobOutputData.state, - null - ) + runScriptStep(runScriptStepDefinition.args, prepareJobOutputData.state) ).resolves.not.toThrow() }) @@ -103,11 +95,7 @@ describe('Run script step', () => { ] await expect( - runScriptStep( - runScriptStepDefinition.args, - prepareJobOutputData.state, - null - ) + runScriptStep(runScriptStepDefinition.args, prepareJobOutputData.state) ).resolves.not.toThrow() }) @@ -122,11 +110,7 @@ describe('Run script step', () => { ] await expect( - runScriptStep( - runScriptStepDefinition.args, - prepareJobOutputData.state, - null - ) + runScriptStep(runScriptStepDefinition.args, prepareJobOutputData.state) ).resolves.not.toThrow() }) }) diff --git a/packages/k8s/tests/run-script-step-unit-test.ts b/packages/k8s/tests/run-script-step-unit-test.ts new file mode 100644 index 00000000..12ef1dbd --- /dev/null +++ b/packages/k8s/tests/run-script-step-unit-test.ts @@ -0,0 +1,109 @@ +import { runScriptStep } from '../src/hooks' +import * as k8sModule from '../src/k8s' +import * as utils from '../src/k8s/utils' +import { RunScriptStepArgs } from 'hooklib' + +jest.mock('@actions/core', () => ({ + debug: jest.fn(), + error: jest.fn(), + warning: jest.fn(), + info: jest.fn() +})) + +function makeArgs(): RunScriptStepArgs { + return { + entryPoint: 'sh', + entryPointArgs: ['-e', '/__w/_temp/script.sh'], + workingDirectory: '/__w/repo/repo', + environmentVariables: {} + } as RunScriptStepArgs +} + +const state = { jobPod: 'test-job-pod' } + +describe('runScriptStep error classification', () => { + let execPodStepWithOutputSpy: jest.SpyInstance + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + process.env['RUNNER_WORKSPACE'] = '/tmp/runner/_work/repo' + process.env['RUNNER_TEMP'] = '/tmp/runner/_work/_temp' + + // Mock writeRunScript so tests don't need a real filesystem + jest.spyOn(utils, 'writeRunScript').mockReturnValue({ + containerPath: '/__w/_temp/test-script.sh', + runnerPath: '/tmp/test-script.sh' + }) + + jest.spyOn(k8sModule, 'execPodStep').mockResolvedValue(0) + jest.spyOn(k8sModule, 'execCpToPod').mockResolvedValue(undefined) + jest.spyOn(k8sModule, 'execCpFromPod').mockResolvedValue(undefined) + + execPodStepWithOutputSpy = jest.spyOn(k8sModule, 'execPodStepWithOutput') + }) + + afterEach(() => { + jest.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + delete process.env['RUNNER_WORKSPACE'] + delete process.env['RUNNER_TEMP'] + }) + + it('completes without throwing when script exits 0', async () => { + execPodStepWithOutputSpy.mockResolvedValue({ code: 0, output: '' }) + await expect(runScriptStep(makeArgs(), state)).resolves.toBeUndefined() + }) + + it('throws structured error on non-zero exit with last output', async () => { + execPodStepWithOutputSpy.mockResolvedValue({ + code: 154, + output: 'line one\nline two\nexit line' + }) + await expect(runScriptStep(makeArgs(), state)).rejects.toThrow( + /failed to run script step/ + ) + await expect(runScriptStep(makeArgs(), state)).rejects.toThrow( + /exit code: 154/ + ) + }) + + it('includes last output in error message', async () => { + execPodStepWithOutputSpy.mockResolvedValue({ + code: 1, + output: 'script output line' + }) + let caughtErr: Error | undefined + try { + await runScriptStep(makeArgs(), state) + } catch (e) { + caughtErr = e as Error + } + expect(caughtErr).toBeDefined() + expect(caughtErr?.message).toContain('script output line') + expect(caughtErr?.message).toContain('Last output:') + expect(caughtErr?.message).toContain('---') + }) + + it('throws generic error when execPodStepWithOutput rejects with non-exit error', async () => { + execPodStepWithOutputSpy.mockRejectedValue( + new Error('websocket connection dropped') + ) + await expect(runScriptStep(makeArgs(), state)).rejects.toThrow( + /failed to run script step.*websocket connection dropped/ + ) + }) + + it('should throw error when state.jobPod is null (pod creation failed)', async () => { + const nullState = { jobPod: null } + await expect(runScriptStep(makeArgs(), nullState)).rejects.toThrow( + /jobPod must be set/ + ) + }) + + it('should throw error when state.jobPod is undefined (pod creation failed)', async () => { + const undefinedState = {} + await expect(runScriptStep(makeArgs(), undefinedState)).rejects.toThrow( + /jobPod must be set/ + ) + }) +}) diff --git a/packages/k8s/tests/test-setup.ts b/packages/k8s/tests/test-setup.ts index 25efcf5d..2c81ddb9 100644 --- a/packages/k8s/tests/test-setup.ts +++ b/packages/k8s/tests/test-setup.ts @@ -9,87 +9,97 @@ const kc = new k8s.KubeConfig() kc.loadFromDefault() const k8sApi = kc.makeApiClient(k8s.CoreV1Api) -const k8sStorageApi = kc.makeApiClient(k8s.StorageV1Api) export class TestHelper { private tempDirPath: string private podName: string + private runnerWorkdir: string + private runnerTemp: string + constructor() { this.tempDirPath = `${__dirname}/_temp/runner` + this.runnerWorkdir = `${this.tempDirPath}/_work` + this.runnerTemp = `${this.tempDirPath}/_work/_temp` this.podName = uuidv4().replace(/-/g, '') } - public async initialize(): Promise { + async initialize(): Promise { process.env['ACTIONS_RUNNER_POD_NAME'] = `${this.podName}` - process.env['RUNNER_WORKSPACE'] = `${this.tempDirPath}/_work/repo` - process.env['RUNNER_TEMP'] = `${this.tempDirPath}/_work/_temp` - process.env['GITHUB_WORKSPACE'] = `${this.tempDirPath}/_work/repo/repo` + process.env['RUNNER_WORKSPACE'] = `${this.runnerWorkdir}/repo` + process.env['RUNNER_TEMP'] = `${this.runnerTemp}` + process.env['GITHUB_WORKSPACE'] = `${this.runnerWorkdir}/repo/repo` process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' - fs.mkdirSync(`${this.tempDirPath}/_work/repo/repo`, { recursive: true }) + fs.mkdirSync(`${this.runnerWorkdir}/repo/repo`, { recursive: true }) fs.mkdirSync(`${this.tempDirPath}/externals`, { recursive: true }) - fs.mkdirSync(process.env.RUNNER_TEMP, { recursive: true }) + fs.mkdirSync(this.runnerTemp, { recursive: true }) + fs.mkdirSync(`${this.runnerTemp}/_github_workflow`, { recursive: true }) + fs.mkdirSync(`${this.runnerTemp}/_github_home`, { recursive: true }) + fs.mkdirSync(`${this.runnerTemp}/_runner_file_commands`, { + recursive: true + }) fs.copyFileSync( path.resolve(`${__dirname}/../../../examples/example-script.sh`), - `${process.env.RUNNER_TEMP}/example-script.sh` + `${this.runnerTemp}/example-script.sh` ) await this.cleanupK8sResources() try { - await this.createTestVolume() await this.createTestJobPod() } catch (e) { console.log(e) } } - public async cleanup(): Promise { + async cleanup(): Promise { try { await this.cleanupK8sResources() fs.rmSync(this.tempDirPath, { recursive: true }) - } catch {} + } catch { + // Ignore errors during cleanup + } } - public async cleanupK8sResources() { - await k8sApi - .deleteNamespacedPersistentVolumeClaim( - `${this.podName}-work`, - 'default', - undefined, - undefined, - 0 - ) - .catch(e => {}) - await k8sApi.deletePersistentVolume(`${this.podName}-pv`).catch(e => {}) - await k8sStorageApi.deleteStorageClass('local-storage').catch(e => {}) + + async cleanupK8sResources(): Promise { await k8sApi - .deleteNamespacedPod(this.podName, 'default', undefined, undefined, 0) - .catch(e => {}) + .deleteNamespacedPod({ + name: this.podName, + namespace: 'default', + gracePeriodSeconds: 0 + }) + .catch((e: k8s.ApiException) => { + if (e.code !== 404) { + console.error(JSON.stringify(e)) + } + }) await k8sApi - .deleteNamespacedPod( - `${this.podName}-workflow`, - 'default', - undefined, - undefined, - 0 - ) - .catch(e => {}) + .deleteNamespacedPod({ + name: `${this.podName}-workflow`, + namespace: 'default', + gracePeriodSeconds: 0 + }) + .catch((e: k8s.ApiException) => { + if (e.code !== 404) { + console.error(JSON.stringify(e)) + } + }) } - public createFile(fileName?: string): string { + createFile(fileName?: string): string { const filePath = `${this.tempDirPath}/${fileName || uuidv4()}` fs.writeFileSync(filePath, '') return filePath } - public removeFile(fileName: string): void { + removeFile(fileName: string): void { const filePath = `${this.tempDirPath}/${fileName}` fs.rmSync(filePath) } - public async createTestJobPod() { + async createTestJobPod(): Promise { const container = { - name: 'nginx', - image: 'nginx:latest', + name: 'runner', + image: 'ghcr.io/actions/actions-runner:latest', imagePullPolicy: 'IfNotPresent' } as k8s.V1Container @@ -99,59 +109,18 @@ export class TestHelper { }, spec: { restartPolicy: 'Never', - containers: [container] - } - } as k8s.V1Pod - await k8sApi.createNamespacedPod('default', pod) - } - - public async createTestVolume() { - var sc: k8s.V1StorageClass = { - metadata: { - name: 'local-storage' - }, - provisioner: 'kubernetes.io/no-provisioner', - volumeBindingMode: 'Immediate' - } - await k8sStorageApi.createStorageClass(sc) - - var volume: k8s.V1PersistentVolume = { - metadata: { - name: `${this.podName}-pv` - }, - spec: { - storageClassName: 'local-storage', - capacity: { - storage: '2Gi' - }, - volumeMode: 'Filesystem', - accessModes: ['ReadWriteOnce'], - hostPath: { - path: `${this.tempDirPath}/_work` - } - } - } - await k8sApi.createPersistentVolume(volume) - var volumeClaim: k8s.V1PersistentVolumeClaim = { - metadata: { - name: `${this.podName}-work` - }, - spec: { - accessModes: ['ReadWriteOnce'], - volumeMode: 'Filesystem', - storageClassName: 'local-storage', - volumeName: `${this.podName}-pv`, - resources: { - requests: { - storage: '1Gi' - } + containers: [container], + securityContext: { + runAsUser: 1001, + runAsGroup: 1001, + fsGroup: 1001 } } - } - await k8sApi.createNamespacedPersistentVolumeClaim('default', volumeClaim) + } as k8s.V1Pod + await k8sApi.createNamespacedPod({ namespace: 'default', body: pod }) } - public getPrepareJobDefinition(): HookData { + getPrepareJobDefinition(): HookData { const prepareJob = JSON.parse( fs.readFileSync( path.resolve(__dirname + '/../../../examples/prepare-job.json'), @@ -168,7 +137,7 @@ export class TestHelper { return prepareJob } - public getRunScriptStepDefinition(): HookData { + getRunScriptStepDefinition(): HookData { const runScriptStep = JSON.parse( fs.readFileSync( path.resolve(__dirname + '/../../../examples/run-script-step.json'), @@ -180,7 +149,7 @@ export class TestHelper { return runScriptStep } - public getRunContainerStepDefinition(): HookData { + getRunContainerStepDefinition(): HookData { const runContainerStep = JSON.parse( fs.readFileSync( path.resolve(__dirname + '/../../../examples/run-container-step.json'), diff --git a/packages/k8s/tests/wait-for-pod-phases-test.ts b/packages/k8s/tests/wait-for-pod-phases-test.ts new file mode 100644 index 00000000..eac0568d --- /dev/null +++ b/packages/k8s/tests/wait-for-pod-phases-test.ts @@ -0,0 +1,875 @@ +import * as k8s from '@kubernetes/client-node' +import { + describePodFailure, + getContainerErrors, + getContainerTerminatedErrors, + getPodEventErrors, + getUnrecoverableEventReasons, + getUnrecoverableTerminatedReasons, + getUnrecoverableWaitingReasons, + isPermanentSchedulingFailure, + parsePodPhase, + PERMANENT_SCHEDULING_PATTERNS, + UNRECOVERABLE_EVENT_REASONS, + UNRECOVERABLE_TERMINATED_REASONS, + UNRECOVERABLE_WAITING_REASONS, + waitForPodPhases +} from '../src/k8s' +import { PodPhase } from '../src/k8s/utils' + +// Build a minimal V1Pod with the given phase and container statuses so we can +// exercise the container-error detection logic in isolation. +function buildPod( + phase?: string, + opts: { + containerStatuses?: k8s.V1ContainerStatus[] + initContainerStatuses?: k8s.V1ContainerStatus[] + } = {} +): k8s.V1Pod { + return { + status: { + phase, + containerStatuses: opts.containerStatuses, + initContainerStatuses: opts.initContainerStatuses + } + } as k8s.V1Pod +} + +function waitingContainer( + name: string, + reason?: string, + message?: string +): k8s.V1ContainerStatus { + return { + name, + state: { waiting: { reason, message } } + } as k8s.V1ContainerStatus +} + +function terminatedContainer( + name: string, + reason?: string, + exitCode?: number, + message?: string +): k8s.V1ContainerStatus { + return { + name, + state: { terminated: { reason, exitCode, message } } + } as k8s.V1ContainerStatus +} + +// Build a Warning event with the fields getPodEventErrors() inspects. +function buildEvent( + reason: string, + message: string, + opts: { type?: string; count?: number } = {} +): k8s.CoreV1Event { + return { + type: opts.type ?? 'Warning', + reason, + message, + count: opts.count, + lastTimestamp: new Date('2026-01-01T00:00:00Z') + } as k8s.CoreV1Event +} + +// @kubernetes/client-node 1.x object-style API returns the object directly +// (not wrapped in { body }), so mocks must do the same. +function podResult(pod: k8s.V1Pod): never { + return pod as never +} +function eventResult(items: k8s.CoreV1Event[]): never { + return { items } as never +} + +describe('parsePodPhase', () => { + it('returns the phase when it is a known value', () => { + expect(parsePodPhase(buildPod(PodPhase.RUNNING))).toBe(PodPhase.RUNNING) + expect(parsePodPhase(buildPod(PodPhase.PENDING))).toBe(PodPhase.PENDING) + expect(parsePodPhase(buildPod(PodPhase.SUCCEEDED))).toBe(PodPhase.SUCCEEDED) + expect(parsePodPhase(buildPod(PodPhase.FAILED))).toBe(PodPhase.FAILED) + }) + + it('returns UNKNOWN when phase is missing', () => { + expect(parsePodPhase(buildPod(undefined))).toBe(PodPhase.UNKNOWN) + expect(parsePodPhase({} as k8s.V1Pod)).toBe(PodPhase.UNKNOWN) + }) + + it('returns UNKNOWN when phase is not a recognized value', () => { + expect(parsePodPhase(buildPod('SomethingElse'))).toBe(PodPhase.UNKNOWN) + }) +}) + +describe('getContainerErrors', () => { + it('returns no errors when there are no container statuses', () => { + expect(getContainerErrors(buildPod(PodPhase.PENDING))).toEqual([]) + expect(getContainerErrors({} as k8s.V1Pod)).toEqual([]) + }) + + it('returns no errors when containers are waiting for a recoverable reason', () => { + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [waitingContainer('job', 'ContainerCreating')] + }) + expect(getContainerErrors(pod)).toEqual([]) + }) + + it('detects every unrecoverable waiting reason and includes a hint', () => { + for (const reason of Array.from(UNRECOVERABLE_WAITING_REASONS)) { + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [waitingContainer('job', reason)] + }) + const errors = getContainerErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain(` ✗ container "job": ${reason}`) + expect(errors[0]).toContain('→') + } + }) + + it('includes retry-history and network hint for ImagePullBackOff', () => { + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [ + waitingContainer( + 'job', + 'ImagePullBackOff', + 'Back-off pulling image "does-not-exist:latest"' + ) + ] + }) + const errors = getContainerErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain(' ✗ container "job": ImagePullBackOff') + expect(errors[0]).toContain( + 'Back-off pulling image "does-not-exist:latest"' + ) + expect(errors[0]).toContain('registry') + expect(errors[0]).toContain('TLS') + }) + + it('does not fast-fail on ErrImagePull (treated as transient first-attempt)', () => { + // ErrImagePull fires on the first pull failure (could be a TLS timeout). + // k8s will retry and promote to ImagePullBackOff if it keeps failing. + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [ + waitingContainer('job', 'ErrImagePull', 'TLS handshake timeout') + ] + }) + expect(getContainerErrors(pod)).toEqual([]) + }) + + it('does not fast-fail on CreateContainerError (treated as transient runtime issue)', () => { + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [waitingContainer('job', 'CreateContainerError')] + }) + expect(getContainerErrors(pod)).toEqual([]) + }) + + it('inspects init containers as well as regular containers', () => { + const pod = buildPod(PodPhase.PENDING, { + initContainerStatuses: [waitingContainer('init', 'ImagePullBackOff')], + containerStatuses: [waitingContainer('job', 'InvalidImageName')] + }) + const errors = getContainerErrors(pod) + expect(errors).toHaveLength(2) + expect(errors[0]).toContain(' ✗ container "init": ImagePullBackOff') + expect(errors[1]).toContain(' ✗ container "job": InvalidImageName') + }) + + it('ignores running/terminated containers and only collects waiting errors', () => { + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [ + { name: 'running', state: { running: {} } } as k8s.V1ContainerStatus, + waitingContainer('bad', 'InvalidImageName') + ] + }) + const errors = getContainerErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain(' ✗ container "bad": InvalidImageName') + }) +}) + +describe('getPodEventErrors', () => { + let eventSpy: jest.SpyInstance + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + eventSpy = jest.spyOn(k8s.CoreV1Api.prototype, 'listNamespacedEvent') + }) + + afterEach(() => { + jest.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + delete process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_EVENT_REASONS'] + }) + + it('returns no errors when there are no warning events', async () => { + eventSpy.mockResolvedValue(eventResult([])) + expect(await getPodEventErrors('my-pod')).toEqual([]) + }) + + it('returns no errors for warning events whose reason is not unrecoverable', async () => { + eventSpy.mockResolvedValue( + eventResult([ + buildEvent('Unhealthy', 'Liveness probe failed'), + buildEvent('BackOff', 'container restart back-off') + ]) + ) + expect(await getPodEventErrors('my-pod')).toEqual([]) + }) + + it('detects FailedMount (the hostPath Directory missing case) and includes hint', async () => { + eventSpy.mockResolvedValue( + eventResult([ + buildEvent( + 'FailedMount', + 'Unable to attach or mount volume "bad-hostpath": mount path "/this/path/does/not/exist" does not exist', + { count: 3 } + ) + ]) + ) + const errors = await getPodEventErrors('my-pod') + expect(errors).toHaveLength(1) + expect(errors[0]).toContain(' ✗ event: FailedMount (x3)') + expect(errors[0]).toContain('does not exist') + expect(errors[0]).toContain('PVC') + }) + + it('fast-fails on FailedScheduling with permanent config errors', async () => { + for (const msg of [ + "0/3 nodes are available: 3 node(s) didn't match Pod's node affinity/selector.", + '0/3 nodes are available: 3 node(s) had untolerated taint {gpu: true}.', + '0/3 nodes are available: persistentvolumeclaim "my-pvc" not found. preemption: 0/3' + ]) { + eventSpy.mockResolvedValue( + eventResult([buildEvent('FailedScheduling', msg)]) + ) + const errors = await getPodEventErrors('my-pod') + expect(errors).toHaveLength(1) + expect(errors[0]).toContain(' ✗ event: FailedScheduling') + expect(errors[0]).toContain('→') + } + }) + + it('does NOT fast-fail on FailedScheduling with resource shortages (keeps queuing)', async () => { + for (const msg of [ + '0/3 nodes are available: 3 Insufficient nvidia.com/gpu.', + '0/5 nodes are available: 5 Insufficient memory.', + '0/1 nodes are available' + ]) { + eventSpy.mockResolvedValue( + eventResult([buildEvent('FailedScheduling', msg)]) + ) + expect(await getPodEventErrors('my-pod')).toEqual([]) + } + // No message at all — unknown cause, treat as transient + eventSpy.mockResolvedValue( + eventResult([ + { type: 'Warning', reason: 'FailedScheduling' } as k8s.CoreV1Event + ]) + ) + expect(await getPodEventErrors('my-pod')).toEqual([]) + }) + + it('detects FailedBinding and FailedMount (always unrecoverable) and includes hints', async () => { + eventSpy.mockResolvedValue( + eventResult([ + buildEvent('FailedBinding', 'no persistent volumes available'), + buildEvent('FailedMount', 'volume not found') + ]) + ) + const errors = await getPodEventErrors('my-pod') + expect(errors).toHaveLength(2) + expect(errors[0]).toContain(' ✗ event: FailedBinding') + expect(errors[0]).toContain('StorageClass') + expect(errors[1]).toContain(' ✗ event: FailedMount') + expect(errors[1]).toContain('PVC') + }) + + it('ignores Normal-type events even if the reason matches', async () => { + eventSpy.mockResolvedValue( + eventResult([ + buildEvent('FailedMount', 'volume not found', { type: 'Normal' }) + ]) + ) + expect(await getPodEventErrors('my-pod')).toEqual([]) + }) + + it('deduplicates events that share the same reason', async () => { + eventSpy.mockResolvedValue( + eventResult([ + buildEvent('FailedMount', 'first attempt', { count: 1 }), + buildEvent('FailedMount', 'second attempt', { count: 5 }) + ]) + ) + // Only the first occurrence is kept. + const errors = await getPodEventErrors('my-pod') + expect(errors).toHaveLength(1) + expect(errors[0]).toContain(' ✗ event: FailedMount') + expect(errors[0]).toContain('first attempt') + }) + + it('honors extra reasons from the env var and includes default hint', async () => { + process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_EVENT_REASONS'] = + 'FailedPreStopHook' + eventSpy.mockResolvedValue( + eventResult([buildEvent('FailedPreStopHook', 'hook failed')]) + ) + const errors = await getPodEventErrors('my-pod') + expect(errors).toHaveLength(1) + expect(errors[0]).toContain(' ✗ event: FailedPreStopHook') + expect(errors[0]).toContain('hook failed') + expect(errors[0]).toContain('kubectl describe pod') + }) + + it('degrades gracefully when listing events is forbidden', async () => { + eventSpy.mockRejectedValue(new Error('events is forbidden') as never) + expect(await getPodEventErrors('my-pod')).toEqual([]) + }) +}) + +describe('isPermanentSchedulingFailure', () => { + it('returns true for node affinity/selector mismatch', () => { + expect( + isPermanentSchedulingFailure( + "0/3 nodes are available: 3 node(s) didn't match Pod's node affinity/selector." + ) + ).toBe(true) + expect( + isPermanentSchedulingFailure( + "0/5 nodes are available: 5 node(s) didn't match node affinity." + ) + ).toBe(true) + }) + + it('returns true for untolerated taint', () => { + expect( + isPermanentSchedulingFailure( + '0/3 nodes are available: 3 node(s) had untolerated taint {gpu: true}.' + ) + ).toBe(true) + }) + + it('returns true for PVC not found', () => { + expect( + isPermanentSchedulingFailure( + '0/3 nodes are available: persistentvolumeclaim "my-pvc" not found. preemption: 0/3' + ) + ).toBe(true) + }) + + it('returns false for resource shortages (transient — keep queuing)', () => { + expect( + isPermanentSchedulingFailure( + '0/3 nodes are available: 3 Insufficient nvidia.com/gpu.' + ) + ).toBe(false) + expect( + isPermanentSchedulingFailure( + '0/5 nodes are available: 5 Insufficient memory.' + ) + ).toBe(false) + expect( + isPermanentSchedulingFailure( + '0/2 nodes are available: 2 Insufficient cpu.' + ) + ).toBe(false) + }) + + it('returns false for ambiguous / unknown messages (safe default: keep queuing)', () => { + expect(isPermanentSchedulingFailure('0/1 nodes are available')).toBe(false) + expect( + isPermanentSchedulingFailure('preemption: 0/3 nodes are available') + ).toBe(false) + expect(isPermanentSchedulingFailure(undefined)).toBe(false) + }) + + it('PERMANENT_SCHEDULING_PATTERNS is non-empty', () => { + expect(PERMANENT_SCHEDULING_PATTERNS.length).toBeGreaterThan(0) + }) +}) + +describe('getUnrecoverableWaitingReasons', () => { + afterEach(() => { + delete process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_WAITING_REASONS'] + }) + + it('returns the built-in defaults when the env var is unset', () => { + expect(getUnrecoverableWaitingReasons()).toEqual( + UNRECOVERABLE_WAITING_REASONS + ) + }) + + it('adds extra reasons from the env var without dropping the defaults', () => { + process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_WAITING_REASONS'] = + 'CrashLoopBackOff, RunContainerError' + const reasons = getUnrecoverableWaitingReasons() + for (const builtin of Array.from(UNRECOVERABLE_WAITING_REASONS)) { + expect(reasons.has(builtin)).toBe(true) + } + expect(reasons.has('CrashLoopBackOff')).toBe(true) + expect(reasons.has('RunContainerError')).toBe(true) + }) + + it('makes getContainerErrors honor the extended whitelist', () => { + process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_WAITING_REASONS'] = + 'CrashLoopBackOff' + const pod = buildPod(PodPhase.PENDING, { + containerStatuses: [waitingContainer('job', 'CrashLoopBackOff')] + }) + const errors = getContainerErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain(' ✗ container "job": CrashLoopBackOff') + }) +}) + +describe('getUnrecoverableEventReasons', () => { + afterEach(() => { + delete process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_EVENT_REASONS'] + }) + + it('returns the built-in defaults when the env var is unset', () => { + expect(getUnrecoverableEventReasons()).toEqual(UNRECOVERABLE_EVENT_REASONS) + }) + + it('adds extra reasons from the env var without dropping the defaults', () => { + process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_EVENT_REASONS'] = + 'FailedPreStopHook, FailedPostStartHook' + const reasons = getUnrecoverableEventReasons() + for (const builtin of Array.from(UNRECOVERABLE_EVENT_REASONS)) { + expect(reasons.has(builtin)).toBe(true) + } + expect(reasons.has('FailedPreStopHook')).toBe(true) + expect(reasons.has('FailedPostStartHook')).toBe(true) + }) +}) + +describe('getContainerTerminatedErrors', () => { + it('returns no errors when there are no container statuses', () => { + expect(getContainerTerminatedErrors(buildPod(PodPhase.FAILED))).toEqual([]) + expect(getContainerTerminatedErrors({} as k8s.V1Pod)).toEqual([]) + }) + + it('returns no errors when containers have no terminated state', () => { + const pod = buildPod(PodPhase.RUNNING, { + containerStatuses: [ + { name: 'job', state: { running: {} } } as k8s.V1ContainerStatus, + waitingContainer('sidecar', 'ContainerCreating') + ] + }) + expect(getContainerTerminatedErrors(pod)).toEqual([]) + }) + + it('returns no errors for terminated containers with recoverable reasons', () => { + const pod = buildPod(PodPhase.SUCCEEDED, { + containerStatuses: [terminatedContainer('fs-init', 'Completed', 0)] + }) + expect(getContainerTerminatedErrors(pod)).toEqual([]) + }) + + it('detects OOMKilled and includes hint', () => { + const pod = buildPod(PodPhase.FAILED, { + containerStatuses: [ + terminatedContainer( + 'job', + 'OOMKilled', + 137, + 'The node was low on resource: memory' + ) + ] + }) + const errors = getContainerTerminatedErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain( + ' ✗ container "job": OOMKilled (exit code 137)' + ) + expect(errors[0]).toContain('The node was low on resource: memory') + expect(errors[0]).toContain('memory limit') + }) + + it('detects Error exit code 1 and includes generic hint', () => { + const pod = buildPod(PodPhase.FAILED, { + containerStatuses: [terminatedContainer('job', 'Error', 1)] + }) + const errors = getContainerTerminatedErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain(' ✗ container "job": Error (exit code 1)') + expect(errors[0]).toContain('non-zero code (1)') + }) + + it('detects Error exit code 137 and includes SIGKILL hint', () => { + const pod = buildPod(PodPhase.FAILED, { + containerStatuses: [terminatedContainer('job', 'Error', 137)] + }) + const errors = getContainerTerminatedErrors(pod) + expect(errors[0]).toContain('exit code 137') + expect(errors[0]).toContain('SIGKILL') + }) + + it('detects Error exit code 127 and includes command-not-found hint', () => { + const pod = buildPod(PodPhase.FAILED, { + containerStatuses: [terminatedContainer('job', 'Error', 127)] + }) + const errors = getContainerTerminatedErrors(pod) + expect(errors[0]).toContain('command not found') + }) + + it('detects FailedPostStartHookError and includes hint', () => { + const pod = buildPod(PodPhase.FAILED, { + containerStatuses: [ + terminatedContainer( + 'job', + 'FailedPostStartHookError', + 137, + 'postStart hook failed' + ) + ] + }) + const errors = getContainerTerminatedErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain( + ' ✗ container "job": FailedPostStartHookError (exit code 137)' + ) + expect(errors[0]).toContain('postStart hook failed') + expect(errors[0]).toContain('postStart lifecycle hook') + }) + + it('detects every unrecoverable terminated reason', () => { + for (const reason of Array.from(UNRECOVERABLE_TERMINATED_REASONS)) { + const pod = buildPod(PodPhase.FAILED, { + containerStatuses: [terminatedContainer('job', reason, 1)] + }) + const errors = getContainerTerminatedErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain( + ` ✗ container "job": ${reason} (exit code 1)` + ) + } + }) + + it('detects terminated errors in init containers as well', () => { + const pod = buildPod(PodPhase.FAILED, { + initContainerStatuses: [terminatedContainer('init', 'Error', 2)], + containerStatuses: [terminatedContainer('job', 'OOMKilled', 137)] + }) + const errors = getContainerTerminatedErrors(pod) + expect(errors).toHaveLength(2) + expect(errors[0]).toContain(' ✗ container "init": Error (exit code 2)') + expect(errors[1]).toContain( + ' ✗ container "job": OOMKilled (exit code 137)' + ) + }) + + it('ignores terminated with reason not in the whitelist', () => { + const pod = buildPod(PodPhase.SUCCEEDED, { + containerStatuses: [terminatedContainer('job', 'Completed', 0)] + }) + expect(getContainerTerminatedErrors(pod)).toEqual([]) + }) +}) + +describe('getUnrecoverableTerminatedReasons', () => { + afterEach(() => { + delete process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_TERMINATED_REASONS'] + }) + + it('returns the built-in defaults when the env var is unset', () => { + expect(getUnrecoverableTerminatedReasons()).toEqual( + UNRECOVERABLE_TERMINATED_REASONS + ) + }) + + it('adds extra reasons from the env var without dropping the defaults', () => { + process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_TERMINATED_REASONS'] = + 'DeadlineExceeded, CustomReason' + const reasons = getUnrecoverableTerminatedReasons() + for (const builtin of Array.from(UNRECOVERABLE_TERMINATED_REASONS)) { + expect(reasons.has(builtin)).toBe(true) + } + expect(reasons.has('DeadlineExceeded')).toBe(true) + expect(reasons.has('CustomReason')).toBe(true) + }) + + it('makes getContainerTerminatedErrors honor the extended whitelist', () => { + process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_TERMINATED_REASONS'] = + 'DeadlineExceeded' + const pod = buildPod(PodPhase.FAILED, { + containerStatuses: [terminatedContainer('job', 'DeadlineExceeded', 1)] + }) + const errors = getContainerTerminatedErrors(pod) + expect(errors).toHaveLength(1) + expect(errors[0]).toContain( + ' ✗ container "job": DeadlineExceeded (exit code 1)' + ) + }) + + it('filters empty strings from the env var', () => { + process.env['ACTIONS_RUNNER_K8S_UNRECOVERABLE_TERMINATED_REASONS'] = + ', , CustomReason, ' + const reasons = getUnrecoverableTerminatedReasons() + expect(reasons.has('')).toBe(false) + expect(reasons.has('CustomReason')).toBe(true) + for (const builtin of Array.from(UNRECOVERABLE_TERMINATED_REASONS)) { + expect(reasons.has(builtin)).toBe(true) + } + }) +}) + +describe('waitForPodPhases', () => { + let readSpy: jest.SpyInstance + let eventSpy: jest.SpyInstance + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + readSpy = jest.spyOn(k8s.CoreV1Api.prototype, 'readNamespacedPod') + // waitForPodPhases now calls getPodEventErrors (lists events) on every poll + // for fast-fail detection, and describePodFailure on failure paths (also + // lists events). Stub it out so the tests never hit a real cluster. + eventSpy = jest.spyOn(k8s.CoreV1Api.prototype, 'listNamespacedEvent') + eventSpy.mockResolvedValue(eventResult([])) + }) + + afterEach(() => { + jest.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('returns once the pod reaches an awaited phase', async () => { + readSpy.mockResolvedValue(podResult(buildPod(PodPhase.RUNNING))) + + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]) + ) + ).resolves.toBeUndefined() + }) + + it('surfaces unrecoverable container errors in the thrown message', async () => { + readSpy.mockResolvedValue( + podResult( + buildPod(PodPhase.PENDING, { + containerStatuses: [ + waitingContainer( + 'job', + 'ImagePullBackOff', + 'Back-off pulling image "nope:latest"' + ) + ] + }) + ) + ) + + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]) + ) + ).rejects.toThrow('Pod my-pod has unrecoverable errors') + }) + + it('fast-fails on FailedMount events instead of polling to timeout', async () => { + // Container is in ContainerCreating (recoverable waiting reason), but the + // pod has a FailedMount Warning event -- this is the hostPath-missing case. + readSpy.mockResolvedValue( + podResult( + buildPod(PodPhase.PENDING, { + containerStatuses: [waitingContainer('job', 'ContainerCreating')] + }) + ) + ) + eventSpy.mockResolvedValue( + eventResult([ + buildEvent( + 'FailedMount', + 'mount path "/this/path/does/not/exist" does not exist', + { count: 4 } + ) + ]) + ) + + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]) + ) + ).rejects.toThrow( + /has unrecoverable errors:[\s\S]*event: FailedMount \(x4\)/ + ) + }) + + it('fast-fails on FailedScheduling with permanent message (PVC not found)', async () => { + readSpy.mockResolvedValue(podResult(buildPod(PodPhase.PENDING))) + eventSpy.mockResolvedValue( + eventResult([ + buildEvent( + 'FailedScheduling', + '0/3 nodes are available: persistentvolumeclaim "missing-pvc" not found. preemption: 0/3' + ) + ]) + ) + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]) + ) + ).rejects.toThrow(/has unrecoverable errors:[\s\S]*event: FailedScheduling/) + }) + + it('does NOT fast-fail on FailedScheduling with Insufficient resources (keeps polling)', async () => { + readSpy + .mockResolvedValueOnce(podResult(buildPod(PodPhase.PENDING))) + .mockResolvedValueOnce(podResult(buildPod(PodPhase.RUNNING))) + eventSpy.mockResolvedValue( + eventResult([ + buildEvent( + 'FailedScheduling', + '0/3 nodes are available: 3 Insufficient nvidia.com/gpu.' + ) + ]) + ) + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]) + ) + ).resolves.toBeUndefined() + }) + + it('retries on transient readPod failure and recovers when pod becomes ready', async () => { + // Risk A fix: a transient readPod error must NOT crash the loop immediately. + // Pod read fails twice, then returns Running — function must resolve. + readSpy + .mockRejectedValueOnce(new Error('connection refused') as never) + .mockRejectedValueOnce(new Error('connection refused') as never) + .mockResolvedValue(podResult(buildPod(PodPhase.RUNNING))) + // eventSpy already returns [] from beforeEach + + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]) + ) + ).resolves.toBeUndefined() + }) + + it('throws with the phase when the pod is in a non-backoff phase', async () => { + readSpy.mockResolvedValue(podResult(buildPod(PodPhase.FAILED))) + + await expect( + waitForPodPhases( + 'my-pod', + new Set([PodPhase.RUNNING]), + new Set([PodPhase.PENDING]) + ) + ).rejects.toThrow('Pod my-pod is unhealthy (phase: Failed)') + }) +}) + +describe('describePodFailure', () => { + let readSpy: jest.SpyInstance + let eventSpy: jest.SpyInstance + + beforeEach(() => { + process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' + readSpy = jest.spyOn(k8s.CoreV1Api.prototype, 'readNamespacedPod') + eventSpy = jest.spyOn(k8s.CoreV1Api.prototype, 'listNamespacedEvent') + // Default: no events. Individual tests override this. + eventSpy.mockResolvedValue(eventResult([])) + }) + + afterEach(() => { + jest.restoreAllMocks() + delete process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] + }) + + it('reports phase, failing conditions and terminated containers', async () => { + readSpy.mockResolvedValue( + podResult({ + status: { + phase: PodPhase.FAILED, + reason: 'Evicted', + message: 'The node was low on resource: memory', + conditions: [ + { + type: 'PodScheduled', + status: 'False', + reason: 'Unschedulable', + message: 'no nodes available' + } + ], + containerStatuses: [ + { + name: 'job', + state: { + terminated: { exitCode: 137, reason: 'OOMKilled' } + } + } + ] + } + } as k8s.V1Pod) + ) + + const description = await describePodFailure('my-pod') + expect(description).toContain('Pod status: Failed (Evicted)') + expect(description).toContain('The node was low on resource: memory') + expect(description).toContain( + '✗ PodScheduled=False (Unschedulable): no nodes available' + ) + expect(description).toContain( + '✗ container "job" terminated: OOMKilled (exit code 137)' + ) + }) + + it('includes recent Warning events and skips Normal ones', async () => { + readSpy.mockResolvedValue( + podResult({ status: { phase: PodPhase.PENDING } } as k8s.V1Pod) + ) + eventSpy.mockResolvedValue( + eventResult([ + { + type: 'Normal', + reason: 'Scheduled', + message: 'assigned', + lastTimestamp: new Date('2026-01-01T00:00:00Z') + } as k8s.CoreV1Event, + { + type: 'Warning', + reason: 'FailedScheduling', + message: '0/1 nodes are available', + count: 3, + lastTimestamp: new Date('2026-01-01T00:01:00Z') + } as k8s.CoreV1Event + ]) + ) + + const description = await describePodFailure('my-pod') + expect(description).toContain( + '[FailedScheduling] (x3) 0/1 nodes are available' + ) + expect(description).not.toContain('[Scheduled]') + }) + + it('degrades gracefully when listing events is forbidden', async () => { + readSpy.mockResolvedValue( + podResult({ status: { phase: PodPhase.PENDING } } as k8s.V1Pod) + ) + eventSpy.mockRejectedValue(new Error('events is forbidden') as never) + + const description = await describePodFailure('my-pod') + expect(description).toContain('Pod status: Pending') + // No throw, and no event lines. + expect(description).not.toContain('[Warning]') + }) + + it('never throws when the pod cannot be read', async () => { + readSpy.mockRejectedValue(new Error('pod not found') as never) + + const description = await describePodFailure('my-pod') + expect(description).toContain('Could not read pod my-pod for diagnostics') + }) +}) diff --git a/packages/k8s/tsconfig.json b/packages/k8s/tsconfig.json index 063081c7..d8742648 100644 --- a/packages/k8s/tsconfig.json +++ b/packages/k8s/tsconfig.json @@ -3,9 +3,15 @@ "compilerOptions": { "baseUrl": "./", "outDir": "./lib", - "rootDir": "./src" + "rootDir": "./src", + "skipLibCheck": true, + "types": [] }, + "esModuleInterop": true, "include": [ - "./src" + "src/**/*" + ], + "exclude": [ + "src/**/*.spec.ts" ] - } \ No newline at end of file +} diff --git a/packages/k8s/tsconfig.test.json b/packages/k8s/tsconfig.test.json new file mode 100644 index 00000000..9e9dc4a3 --- /dev/null +++ b/packages/k8s/tsconfig.test.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "allowJs": true, + "types": ["node", "jest"] + }, + "extends": "./tsconfig.json" +} diff --git a/releaseNotes.md b/releaseNotes.md index 55d411e1..68383954 100644 --- a/releaseNotes.md +++ b/releaseNotes.md @@ -1,24 +1,21 @@ -## Features - -- k8s: Use pod affinity when KubeScheduler is enabled [#212] -- docker: support alternative network modes [#209] + ## Bugs -- Expose CI=true and GITHUB_ACTIONS env variables [#215] -- k8s: add /github/home to containerAction mounts and surface createSecretForEnvs errors [#198] -- k8s: start logging from the beginning [#184] +- Change command to remove sudo to fix fs-init initial container [#263] +- Sort 'find' output before hashing for consistency [#267] +- feat: check if required binaries are present [#272] +- Allow non-root container [#264] +- Improve validation checks after copying [#285] +- Fix workingDir permissions issue by creating it within init container [#283] +- Fix event.json not being copied to /github/workflow in kubernetes-novolume mode [#287] +- Reduce the amount of data copied to the workflow pod [#293] +- Overwrite runner file commands [#298] ## Misc -- Bump node in tests to node 22 since node14 is quite old [#216] -- Bump jsonpath-plus from 10.1.0 to 10.3.0 in /packages/k8s [#213] -- Bump braces from 3.0.2 to 3.0.3 in /packages/hooklib [#194] -- Bump cross-spawn from 7.0.3 to 7.0.6 in /packages/k8s [#196] -- Bump ws from 7.5.8 to 7.5.10 in /packages/k8s [#192] -- Remove dependency on deprecated release actions [#193] -- Update to the latest available actions [#191] - +- Dependency updates [#276] [#277] [#278] [#279] [#304] +- Group dependabot updates [#289] ## SHA-256 Checksums diff --git a/vitest.config.js b/vitest.config.js new file mode 100644 index 00000000..382acaa6 --- /dev/null +++ b/vitest.config.js @@ -0,0 +1,29 @@ +import { defineConfig } from 'vitest/config' +import path from 'path' + +export default defineConfig({ + resolve: { + alias: { + hooklib: path.resolve(__dirname, './packages/hooklib/src/index.ts') + } + }, + test: { + environment: 'node', + globals: true, + include: [ + 'packages/k8s/src/**/*.spec.ts', + 'packages/docker/src/**/*.spec.ts', + 'packages/hooklib/src/**/*.spec.ts' + ], + coverage: { + provider: 'v8', + reporter: ['text', 'clover', 'lcov'], + reportsDirectory: './coverage', + include: [ + 'packages/k8s/src/**/*.ts', + 'packages/hooklib/src/**/*.ts' + ], + exclude: ['**/*.spec.ts', '**/*.d.ts'] + } + } +})