From f4a2ac0d7ec8e17bd2a8a80e3feaf0845ae64e31 Mon Sep 17 00:00:00 2001 From: thanhncc391 Date: Wed, 18 Mar 2026 10:48:35 +0700 Subject: [PATCH 1/4] feat: resolve problem 4 --- .gitignore | 6 + package-lock.json | 4689 +++++++++++++++++++++++++++++++++++ package.json | 20 + src/problem1/.keep | 0 src/problem2/index.html | 27 - src/problem2/script.js | 0 src/problem2/style.css | 8 - src/problem3/.keep | 0 src/problem4/.keep | 0 src/problem4/index.test.ts | 28 + src/problem4/index.ts | 65 + src/problem4/jest.config.js | 11 + tsconfig.json | 13 + 13 files changed, 4832 insertions(+), 35 deletions(-) create mode 100644 .gitignore create mode 100644 package-lock.json create mode 100644 package.json delete mode 100644 src/problem1/.keep delete mode 100644 src/problem2/index.html delete mode 100644 src/problem2/script.js delete mode 100644 src/problem2/style.css delete mode 100644 src/problem3/.keep delete mode 100644 src/problem4/.keep create mode 100644 src/problem4/index.test.ts create mode 100644 src/problem4/index.ts create mode 100644 src/problem4/jest.config.js create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..d8eda8755 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +node_modules/* +dist/* +coverage/* +logs/* +*.log +*.tsbuildinfo \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..47dd7df40 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4689 @@ +{ + "name": "99tech-problems", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "99tech-problems", + "version": "1.0.0", + "dependencies": { + "ts-node": "^10.9.2", + "typescript": "^5.9.3" + }, + "devDependencies": { + "@types/jest": "^30.0.0", + "@types/node": "^25.5.0", + "jest": "^30.3.0", + "jest-util": "^30.3.0", + "ts-jest": "^29.4.6" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@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": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@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-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.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": { + "@babel/core": "^7.0.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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": { + "@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-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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, + "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-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.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "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, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", + "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.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": ">=12" + } + }, + "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": { + "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": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.3.0.tgz", + "integrity": "sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.3.0.tgz", + "integrity": "sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.3.0", + "jest-config": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-resolve-dependencies": "30.3.0", + "jest-runner": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "jest-watcher": "30.3.0", + "pretty-format": "30.3.0", + "slash": "^3.0.0" + }, + "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/diff-sequences": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", + "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz", + "integrity": "sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-mock": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.3.0", + "jest-snapshot": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", + "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.3.0.tgz", + "integrity": "sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@sinonjs/fake-timers": "^15.0.0", + "@types/node": "*", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "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/@jest/globals": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.3.0.tgz", + "integrity": "sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/types": "30.3.0", + "jest-mock": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "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": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.3.0.tgz", + "integrity": "sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@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.3.0", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", + "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": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "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": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.3.0.tgz", + "integrity": "sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.3.0.tgz", + "integrity": "sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/types": "30.3.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.3.0.tgz", + "integrity": "sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.3.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.3.0.tgz", + "integrity": "sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.3.0", + "@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.3.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.3.0", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/types": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "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": ">=14" + } + }, + "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": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.48", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", + "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "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": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", + "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "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": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "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": { + "@babel/types": "^7.0.0" + } + }, + "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": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "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": { + "@babel/types": "^7.28.2" + } + }, + "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": { + "@types/istanbul-lib-coverage": "*" + } + }, + "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": { + "@types/istanbul-lib-report": "*" + } + }, + "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/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "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/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "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/@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, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/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/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT" + }, + "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/babel-jest": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz", + "integrity": "sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.3.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.3.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" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.3.0.tgz", + "integrity": "sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "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, + "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" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.3.0.tgz", + "integrity": "sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.3.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" + } + }, + "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.10.8", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", + "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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.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" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "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" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001780", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", + "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, + "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" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "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.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" + } + }, + "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, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "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" + }, + "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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.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==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "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" + }, + "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==", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "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.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": 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" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.313", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", + "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", + "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/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, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "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" + } + }, + "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/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, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "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" + } + }, + "node_modules/expect": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.3.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.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, + "license": "MIT" + }, + "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, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "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/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" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "license": "ISC" + }, + "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" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "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" + } + }, + "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.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "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" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "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, + "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" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "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": "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, + "license": "ISC", + "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, + "license": "ISC" + }, + "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, + "license": "MIT" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "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": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "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, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "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, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.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.3.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz", + "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.3.0", + "@jest/types": "30.3.0", + "import-local": "^3.2.0", + "jest-cli": "30.3.0" + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.3.0.tgz", + "integrity": "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.3.0", + "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.3.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.3.0.tgz", + "integrity": "sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "p-limit": "^3.1.0", + "pretty-format": "30.3.0", + "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.3.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.3.0.tgz", + "integrity": "sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "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.3.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz", + "integrity": "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.3.0", + "@jest/types": "30.3.0", + "babel-jest": "30.3.0", + "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.3.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-runner": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "parse-json": "^5.2.0", + "pretty-format": "30.3.0", + "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.3.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", + "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.3.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", + "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.3.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.3.0.tgz", + "integrity": "sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "jest-util": "30.3.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.3.0.tgz", + "integrity": "sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-mock": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.3.0.tgz", + "integrity": "sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", + "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-leak-detector": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.3.0.tgz", + "integrity": "sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", + "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.3.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", + "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.3.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3", + "pretty-format": "30.3.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-mock": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz", + "integrity": "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-util": "30.3.0" + }, + "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 + } + } + }, + "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, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.3.0.tgz", + "integrity": "sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.3.0.tgz", + "integrity": "sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.3.0.tgz", + "integrity": "sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/environment": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-leak-detector": "30.3.0", + "jest-message-util": "30.3.0", + "jest-resolve": "30.3.0", + "jest-runtime": "30.3.0", + "jest-util": "30.3.0", + "jest-watcher": "30.3.0", + "jest-worker": "30.3.0", + "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" + } + }, + "node_modules/jest-runtime": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.3.0.tgz", + "integrity": "sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/globals": "30.3.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@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.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.3.0.tgz", + "integrity": "sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==", + "dev": true, + "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.3.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.3.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "pretty-format": "30.3.0", + "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.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", + "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "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" + } + }, + "node_modules/jest-validate": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz", + "integrity": "sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.3.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.3.0.tgz", + "integrity": "sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.3.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.3.0", + "merge-stream": "^2.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": { + "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, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "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" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT" + }, + "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": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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/make-dir/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "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/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" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/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" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "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-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "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, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "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" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/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, + "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" + } + }, + "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" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "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.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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" + } + }, + "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" + } + }, + "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" + }, + "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/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/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" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "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": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "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" + } + }, + "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, + "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" + } + }, + "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, + "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" + } + }, + "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, + "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" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "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/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": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "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, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "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" + } + }, + "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": "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, + "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.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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" + }, + "node_modules/ts-jest": { + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "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 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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" + } + }, + "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==", + "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", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "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/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-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, + "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==", + "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-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "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/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==", + "license": "MIT" + }, + "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, + "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" + } + }, + "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, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "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" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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" + } + }, + "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" + } + }, + "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, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "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" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "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/package.json b/package.json new file mode 100644 index 000000000..4702ede13 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "99tech-problems", + "version": "1.0.0", + "npm": "10.9.0", + "scripts": { + "dev-4": "ts-node ./src/problem4/index.ts", + "test-4": "jest --config ./src/problem4/jest.config.js" + }, + "dependencies": { + "ts-node": "^10.9.2", + "typescript": "^5.9.3" + }, + "devDependencies": { + "@types/jest": "^30.0.0", + "@types/node": "^25.5.0", + "jest": "^30.3.0", + "jest-util": "^30.3.0", + "ts-jest": "^29.4.6" + } +} diff --git a/src/problem1/.keep b/src/problem1/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/problem2/index.html b/src/problem2/index.html deleted file mode 100644 index 4058a68bf..000000000 --- a/src/problem2/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Fancy Form - - - - - - - - -
-
Swap
- - - - - - - -
- - - - diff --git a/src/problem2/script.js b/src/problem2/script.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/problem2/style.css b/src/problem2/style.css deleted file mode 100644 index 915af91c7..000000000 --- a/src/problem2/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - display: flex; - flex-direction: row; - align-items: center; - justify-content: center; - min-width: 360px; - font-family: Arial, Helvetica, sans-serif; -} diff --git a/src/problem3/.keep b/src/problem3/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/problem4/.keep b/src/problem4/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/problem4/index.test.ts b/src/problem4/index.test.ts new file mode 100644 index 000000000..48be7a66e --- /dev/null +++ b/src/problem4/index.test.ts @@ -0,0 +1,28 @@ +import { sum_to_n_a, sum_to_n_b, sum_to_n_c } from "./index"; + +const cases = [-1, 0, 1, 5, 100]; +const expected = [0, 0, 1, 15, 5050]; + +describe("sum_to_a implementations", () => { + cases.forEach((n, idx) => { + it(`sum_to_n_a(${n}) should return ${expected[idx]}`, () => { + expect(sum_to_n_a(n)).toBe(expected[idx]); + }); + }); +}); + +describe("sum_to_b implementations", () => { + cases.forEach((n, idx) => { + it(`sum_to_n_b(${n}) should return ${expected[idx]}`, () => { + expect(sum_to_n_b(n)).toBe(expected[idx]); + }); + }); +}); + +describe("sum_to_c implementations", () => { + cases.forEach((n, idx) => { + it(`sum_to_n_c(${n}) should return ${expected[idx]}`, () => { + expect(sum_to_n_c(n)).toBe(expected[idx]); + }); + }); +}); diff --git a/src/problem4/index.ts b/src/problem4/index.ts new file mode 100644 index 000000000..b11c5061f --- /dev/null +++ b/src/problem4/index.ts @@ -0,0 +1,65 @@ +/** + * Problem 4: Sum to n + * + * Write a function that takes a number n and returns the sum of all numbers from 1 to n. + * Provide 3 unique implementations of the following function in TypeScript. + * + * Comment on the complexity or efficiency of each function. + * + * Input: `n` - any integer + * + * Assuming: + * - This input will always produce a result lesser than `Number.MAX_SAFE_INTEGER`. + * - This input will always be a positive integer greater than 0. + * currently the test show that its start from 1 (what show in output return) + * so not sure if we have an negative or zero case, where will we start from and how the incremental be like? + * + * Output: `return` - summation to `n`, i.e. `sum_to_n(5) === 1 + 2 + 3 + 4 + 5 === 15`. + */ + + +/** + * Implementation 1: Iterative through a loop, start from 1 to n and add each number to the total. + * Time Complexity: O(n) - We need to iterate through all numbers from 1 to n. + * Space Complexity: O(1) - We only use a constant amount of space to store the sum. + */ +const sum_to_n_a = (n: number): number => { + if (n <= 0) return 0; // Handle edge case for non-positive integers + let total = 0; + for (let i = 1; i <= n; i++) { + total += i; + } + return total; +} + +/** + * Implementation 2: Using recursion, we can define the sum to n as n plus the sum to n-1 until we reach the base case of 0. + * Time Complexity: O(n) - In the worst case, we will have n recursive calls until we reach the base case. + * Space Complexity: O(n) - Each recursive call adds a layer to the call stack, we will have n layers in the worst case. + */ +const sum_to_n_b = (n: number): number => { + if (n <= 0) return 0; // Handle edge case for non-positive integers + if (n === 1) return 1; + return n + sum_to_n_b(n - 1); +} + +/** + * Implementation 3: Using the mathematical formula for the sum of the first n natural numbers, which is n(n + 1) / 2. + * Time Complexity: O(1) - We perform a constant number of operations regardless of the value of n. + * Space Complexity: O(1) - We only use a constant amount of space to store the result. + */ +const sum_to_n_c = (n: number): number => { + if (n <= 0) return 0; // Handle edge case for non-positive integers + return n * (n + 1) / 2; +} + +const example_n = 5; +console.log(`sum_to_n_a(${example_n}) = ${sum_to_n_a(example_n)}`); +console.log(`sum_to_n_b(${example_n}) = ${sum_to_n_b(example_n)}`); +console.log(`sum_to_n_c(${example_n}) = ${sum_to_n_c(example_n)}`); + +export { + sum_to_n_a, + sum_to_n_b, + sum_to_n_c +} \ No newline at end of file diff --git a/src/problem4/jest.config.js b/src/problem4/jest.config.js new file mode 100644 index 000000000..86f88fb90 --- /dev/null +++ b/src/problem4/jest.config.js @@ -0,0 +1,11 @@ +const { createDefaultPreset } = require("ts-jest"); + +const tsJestTransformCfg = createDefaultPreset().transform; + +/** @type {import("jest").Config} **/ +module.exports = { + testEnvironment: "node", + transform: { + ...tsJestTransformCfg, + }, +}; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..278a01a69 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "types": ["node", "jest"], + "target": "esnext", + "module": "commonjs", + "lib": ["esnext", "dom"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src", "**/*.test.ts"] +} From fb89196c0cb7e787da2b475aafc5a2febf92a691 Mon Sep 17 00:00:00 2001 From: thanhncc391 Date: Wed, 18 Mar 2026 11:23:06 +0700 Subject: [PATCH 2/4] feat: implement simple crud service for user management 1. add simple service structure 2. add test case for core service 3. add error handling middleware 4. add postman api collection for testing 5. add readme for problem 5 Co-authored-by: Thanh Nguyen --- .gitignore | 4 +- package-lock.json | 2074 +++++++++- package.json | 12 +- src/problem5/README.md | 94 + src/problem5/app.ts | 19 + src/problem5/collection.json | 160 + src/problem5/configs/error.middleware.ts | 8 + src/problem5/domain/dto/user.dto.ts | 10 + .../domain/repositories/user.repository.ts | 10 + src/problem5/domain/services/user.service.ts | 9 + src/problem5/jest.config.js | 11 + src/problem5/ports/primary/user.controller.ts | 63 + .../ports/primary/user.service-impl.ts | 61 + .../ports/secondary/database/database.ts | 43 + .../database/user.repository-impl.ts | 74 + src/problem5/tests/services/user.test.ts | 82 + yarn.lock | 3479 +++++++++++++++++ 17 files changed, 6178 insertions(+), 35 deletions(-) create mode 100644 src/problem5/README.md create mode 100644 src/problem5/app.ts create mode 100644 src/problem5/collection.json create mode 100644 src/problem5/configs/error.middleware.ts create mode 100644 src/problem5/domain/dto/user.dto.ts create mode 100644 src/problem5/domain/repositories/user.repository.ts create mode 100644 src/problem5/domain/services/user.service.ts create mode 100644 src/problem5/jest.config.js create mode 100644 src/problem5/ports/primary/user.controller.ts create mode 100644 src/problem5/ports/primary/user.service-impl.ts create mode 100644 src/problem5/ports/secondary/database/database.ts create mode 100644 src/problem5/ports/secondary/database/user.repository-impl.ts create mode 100644 src/problem5/tests/services/user.test.ts create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index d8eda8755..15f111899 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,6 @@ dist/* coverage/* logs/* *.log -*.tsbuildinfo \ No newline at end of file +*.tsbuildinfo + +*.db \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 47dd7df40..f53df4dc7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,10 +8,15 @@ "name": "99tech-problems", "version": "1.0.0", "dependencies": { + "@types/sqlite3": "^3.1.11", + "express": "^5.2.1", + "sqlite": "^5.1.1", + "sqlite3": "^6.0.1", "ts-node": "^10.9.2", "typescript": "^5.9.3" }, "devDependencies": { + "@types/express": "^5.0.6", "@types/jest": "^30.0.0", "@types/node": "^25.5.0", "jest": "^30.3.0", @@ -571,6 +576,19 @@ "tslib": "^2.4.0" } }, + "node_modules/@gar/promise-retry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.2.tgz", + "integrity": "sha512-Lm/ZLhDZcBECta3TmCQSngiQykFdfw+QtI1/GYMsZd4l3nG+P8WLB16XuS7WaBGLQ+9E+cOcWQsth9cayuGt8g==", + "license": "MIT", + "optional": true, + "dependencies": { + "retry": "^0.13.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -589,6 +607,18 @@ "node": ">=12" } }, + "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==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.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", @@ -1017,6 +1047,69 @@ "@tybys/wasm-util": "^0.10.0" } }, + "node_modules/@npmcli/agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", + "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", + "license": "ISC", + "optional": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^11.2.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "license": "BlueOak-1.0.0", + "optional": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@npmcli/fs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", + "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", + "license": "ISC", + "optional": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/redact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", + "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", + "license": "ISC", + "optional": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1148,6 +1241,59 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "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", @@ -1195,6 +1341,50 @@ "undici-types": "~7.18.0" } }, + "node_modules/@types/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sqlite3": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.11.tgz", + "integrity": "sha512-KYF+QgxAnnAh7DWPdNDroxkDI3/MspH1NMx6m/N/6fT1G6+jvsw4/ZePt8R8cr7ta58aboeTfYFBDxTJ5yv15w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -1495,6 +1685,29 @@ "win32" ] }, + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "license": "ISC", + "optional": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -1519,6 +1732,16 @@ "node": ">=0.4.0" } }, + "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", + "optional": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1713,6 +1936,26 @@ "dev": true, "license": "MIT" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/baseline-browser-mapping": { "version": "2.10.8", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", @@ -1726,6 +1969,50 @@ "node": ">=6.0.0" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -1793,6 +2080,30 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1800,6 +2111,151 @@ "dev": true, "license": "MIT" }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.3.tgz", + "integrity": "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==", + "license": "ISC", + "optional": true, + "dependencies": { + "@npmcli/fs": "^5.0.0", + "fs-minipass": "^3.0.0", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^13.0.0", + "unique-filename": "^5.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/cacache/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "optional": true, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "optional": true, + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "license": "BlueOak-1.0.0", + "optional": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "optional": true, + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "optional": true, + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "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/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1868,6 +2324,15 @@ "node": ">=10" } }, + "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==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/ci-info": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", @@ -2014,17 +2479,57 @@ "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" - }, - "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==", + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "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==", "license": "MIT" }, "node_modules/cross-spawn": { @@ -2046,7 +2551,6 @@ "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.3" @@ -2060,6 +2564,21 @@ } } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dedent": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", @@ -2075,6 +2594,15 @@ } } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -2085,6 +2613,24 @@ "node": ">=0.10.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -2104,6 +2650,20 @@ "node": ">=0.3.1" } }, + "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": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2111,6 +2671,12 @@ "dev": true, "license": "MIT" }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.313", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", @@ -2138,6 +2704,34 @@ "dev": true, "license": "MIT" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -2148,6 +2742,36 @@ "is-arrayish": "^0.2.1" } }, + "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/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2158,6 +2782,12 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -2182,6 +2812,15 @@ "node": ">=4" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -2223,6 +2862,15 @@ "node": ">= 0.8.0" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, "node_modules/expect": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", @@ -2241,6 +2889,56 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "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", @@ -2258,6 +2956,51 @@ "bser": "2.1.1" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -2289,6 +3032,43 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2311,6 +3091,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "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" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2331,6 +3120,30 @@ "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" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -2341,6 +3154,19 @@ "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" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -2354,6 +3180,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, "node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -2376,11 +3208,23 @@ "url": "https://github.com/sponsors/isaacs" } }, + "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" + } + }, "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, + "devOptional": true, "license": "ISC" }, "node_modules/handlebars": { @@ -2415,6 +3259,30 @@ "node": ">=8" } }, + "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" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -2422,6 +3290,61 @@ "dev": true, "license": "MIT" }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -2432,21 +3355,57 @@ "node": ">=10.17.0" } }, - "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, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "BSD-3-Clause" + }, + "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, + "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" @@ -2456,7 +3415,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -2478,9 +3437,33 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, "license": "ISC" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2508,6 +3491,12 @@ "node": ">=6" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -3356,6 +4345,30 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "license": "ISC" }, + "node_modules/make-fetch-happen": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.5.tgz", + "integrity": "sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==", + "license": "ISC", + "optional": true, + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/agent": "^4.0.0", + "@npmcli/redact": "^4.0.0", + "cacache": "^20.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^6.0.0", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -3366,6 +4379,36 @@ "tmpl": "1.0.5" } }, + "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/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -3373,6 +4416,31 @@ "dev": true, "license": "MIT" }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -3383,6 +4451,18 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", @@ -3403,7 +4483,6 @@ "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" @@ -3413,17 +4492,149 @@ "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" } }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", + "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^2.0.0", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + }, + "optionalDependencies": { + "iconv-lite": "^0.7.2" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC", + "optional": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC", + "optional": true + }, + "node_modules/minipass-sized": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", + "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, + "license": "MIT" + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", "license": "MIT" }, "node_modules/napi-postinstall": { @@ -3449,6 +4660,15 @@ "dev": true, "license": "MIT" }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -3456,6 +4676,103 @@ "dev": true, "license": "MIT" }, + "node_modules/node-abi": { + "version": "3.89.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", + "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.6.0.tgz", + "integrity": "sha512-gBVjCaqDlRUk0EwoPNKzIr9KkS9041G/q31IBShPs1Xz6UTA+EXdZADbzqAJQrpDRq71CIMnOP5VMut3SL0z5Q==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-gyp": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.2.0.tgz", + "integrity": "sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^15.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "license": "BlueOak-1.0.0", + "optional": true, + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "license": "ISC", + "optional": true, + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -3470,6 +4787,22 @@ "dev": true, "license": "MIT" }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "license": "ISC", + "optional": true, + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3493,11 +4826,34 @@ "node": ">=8" } }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -3564,6 +4920,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + }, + "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", @@ -3600,6 +4969,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3654,6 +5032,16 @@ "dev": true, "license": "ISC" }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3665,7 +5053,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -3697,6 +5085,33 @@ "node": ">=8" } }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/pretty-format": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", @@ -3725,6 +5140,39 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "license": "ISC", + "optional": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/pure-rand": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", @@ -3742,6 +5190,69 @@ ], "license": "MIT" }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -3749,6 +5260,20 @@ "dev": true, "license": "MIT" }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3782,6 +5307,58 @@ "node": ">=8" } }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -3792,6 +5369,57 @@ "semver": "bin/semver.js" } }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3815,6 +5443,78 @@ "node": ">=8" } }, + "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==", + "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" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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" + } + }, + "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==", + "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" + } + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -3828,6 +5528,51 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -3838,6 +5583,47 @@ "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", + "optional": true, + "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", + "optional": true, + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "optional": true, + "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", @@ -3866,6 +5652,52 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/sqlite": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz", + "integrity": "sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==", + "license": "MIT" + }, + "node_modules/sqlite3": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-6.0.1.tgz", + "integrity": "sha512-X0czUUMG2tmSqJpEQa3tCuZSHKIx8PwM53vLZzKp/o6Rpy25fiVfjdbnZ988M8+O3ZWR1ih0K255VumCb3MAnQ==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^8.0.0", + "prebuild-install": "^7.1.3", + "tar": "^7.5.10" + }, + "engines": { + "node": ">=20.17.0" + }, + "optionalDependencies": { + "node-gyp": "12.x" + }, + "peerDependencies": { + "node-gyp": "12.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/ssri": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", + "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -3879,6 +5711,24 @@ "node": ">=10" } }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -4082,6 +5932,65 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/tar": { + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", + "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -4143,6 +6052,23 @@ "node": "*" } }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -4150,6 +6076,15 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/ts-jest": { "version": "29.4.6", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", @@ -4280,6 +6215,18 @@ "license": "0BSD", "optional": true }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -4303,6 +6250,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -4336,6 +6297,41 @@ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, + "node_modules/unique-filename": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz", + "integrity": "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==", + "license": "ISC", + "optional": true, + "dependencies": { + "unique-slug": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/unique-slug": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-6.0.0.tgz", + "integrity": "sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==", + "license": "ISC", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", @@ -4402,6 +6398,12 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, "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", @@ -4423,6 +6425,15 @@ "node": ">=10.12.0" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -4555,7 +6566,6 @@ "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": { diff --git a/package.json b/package.json index 4702ede13..023abe0cc 100644 --- a/package.json +++ b/package.json @@ -4,17 +4,25 @@ "npm": "10.9.0", "scripts": { "dev-4": "ts-node ./src/problem4/index.ts", - "test-4": "jest --config ./src/problem4/jest.config.js" + "test-4": "jest --config ./src/problem4/jest.config.js", + "dev-5": "ts-node ./src/problem5/app.ts", + "test-5": "jest --config ./src/problem5/jest.config.js" }, "dependencies": { + "@types/sqlite3": "^3.1.11", + "express": "^5.2.1", + "sqlite": "^5.1.1", + "sqlite3": "^6.0.1", "ts-node": "^10.9.2", "typescript": "^5.9.3" }, "devDependencies": { + "@types/express": "^5.0.6", "@types/jest": "^30.0.0", "@types/node": "^25.5.0", "jest": "^30.3.0", "jest-util": "^30.3.0", "ts-jest": "^29.4.6" - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/src/problem5/README.md b/src/problem5/README.md new file mode 100644 index 000000000..79a2b45b7 --- /dev/null +++ b/src/problem5/README.md @@ -0,0 +1,94 @@ +# Problem 5 +Develop a backend server with ExpressJS. You are required to build a set of CRUD interface that allow a user to interact with the service. You are required to use TypeScript for this task. + +1. Interface functionalities: + 1. Create a resource. + 2. List resources with basic filters. + 3. Get details of a resource. + 4. Update resource details. + 5. Delete a resource. +2. You should connect your backend service with a simple database for data persistence + +**Implementation** +This project implements a backend service using **Hexagonal Architecture** (also known as Ports and Adapters) combined with **Domain Driven Design (DDD)** principles. + +## Project Structure + +- **domain/** + - Contains the core business logic and interfaces (DTOs (), repositories, services). + - This layer is independent of external frameworks and technologies. + +- **ports/** + - **primary/** + - Contains controllers and service implementations that handle user requests, input, and interactions. + - Acts as the entry point for the application (e.g., HTTP controllers). + - **secondary/** + - Contains adapters for third-party connections such as databases, AWS, or other external services. + - Implements interfaces defined in the domain layer. + +- **configs/** + - Contains configuration files and middleware (e.g., error handling, auth, infra, ...). + +- **tests/** + - Contains unit and integration tests for services and other components. + +## Architectural Overview + +- **Hexagonal Architecture** separates the core business logic from external concerns, making the system flexible and easy to adapt to new requirements. +- **Domain Driven Design** focuses on modeling the business domain with rich, meaningful abstractions. + +### Domain Layer +- Defines interfaces and business rules. +- No dependencies on frameworks or external systems. + +### Ports +- **Primary Port:** Handles incoming requests (controllers, service implementations). +- **Secondary Port:** Manages outgoing connections (database, external APIs, etc.). + +## How to Use +- Add new business logic in the `domain/` folder. +- Implement interfaces in the `ports/secondary/` folder for external integrations. +- Handle user requests in the `ports/primary/` folder. + +## Testing +- Tests are located in the `tests/` directory. + +--- + +For more details, see the code structure and comments in each folder. +## How to Run + +1. In the root folder, run: + ```bash + npm install + ``` +2. Start the service: + ```bash + npm run dev-5 + ``` + +The service will start on **localhost:3000**. + +The collections for this app is linked at `src/problem5/collection.json` + +## How to Test + +1. In the root folder, run: + ```bash + npm install + ``` +2. Run the tests: + ```bash + npm run test-5 + ``` + +## Additional Notes + +- **Environment** No environment variables are required for setup convenience. +- **Authentication:** This project does not implement any authentication methods, as they are not required by the current specifications. +- **Database:** The service uses SQLite, which requires no further setup or configuration. + + +## Issues + +- If another application is already running on port 3000, this app will stop by default and not start. Ensure port 3000 is available before running the service. \ No newline at end of file diff --git a/src/problem5/app.ts b/src/problem5/app.ts new file mode 100644 index 000000000..3a3219af5 --- /dev/null +++ b/src/problem5/app.ts @@ -0,0 +1,19 @@ +import express from 'express'; +import userRouter from './ports/primary/user.controller'; +import errorHandler from './configs/error.middleware'; + +const app = express(); +const port = 3000; + +app.use(express.json()); +app.use(errorHandler); + +app.get('/health', (req, res) => { + res.json({ status: 'ok' }); +}); + +app.use('/users', userRouter); + +app.listen(port, () => { + console.log(`Server running on http://localhost:${port}`); +}); diff --git a/src/problem5/collection.json b/src/problem5/collection.json new file mode 100644 index 000000000..11075d9d2 --- /dev/null +++ b/src/problem5/collection.json @@ -0,0 +1,160 @@ +{ + "info": { + "_postman_id": "fa1c55f7-bbab-49b7-a6e6-c4e6eef2209b", + "name": "CRUD User Service", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "43373642", + "_collection_link": "https://go.postman.co/collection/43373642-fa1c55f7-bbab-49b7-a6e6-c4e6eef2209b?source=collection_link" + }, + "item": [ + { + "name": "Find user by", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{BASE_URL}}/users?name=abc&email=a@gmail.com", + "host": [ + "{{BASE_URL}}" + ], + "path": [ + "users" + ], + "query": [ + { + "key": "name", + "value": "abc" + }, + { + "key": "email", + "value": "a@gmail.com" + } + ] + } + }, + "response": [] + }, + { + "name": "Add user", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"email\": \"user1@gmail.com\",\r\n \"name\": \"user1\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{BASE_URL}}/users", + "host": [ + "{{BASE_URL}}" + ], + "path": [ + "users" + ] + } + }, + "response": [] + }, + { + "name": "Get user by id", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{BASE_URL}}/users/5968eeee-2730-47e9-9021-556a6305f2e2", + "host": [ + "{{BASE_URL}}" + ], + "path": [ + "users", + "5968eeee-2730-47e9-9021-556a6305f2e2" + ] + } + }, + "response": [] + }, + { + "name": "Update user", + "request": { + "auth": { + "type": "noauth" + }, + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"email\": \"user1@gmail.com\",\r\n \"name\": \"user1(updated)\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{BASE_URL}}/users/5968eeee-2730-47e9-9021-556a6305f2e2", + "host": [ + "{{BASE_URL}}" + ], + "path": [ + "users", + "5968eeee-2730-47e9-9021-556a6305f2e2" + ] + } + }, + "response": [] + }, + { + "name": "Delete user", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "{{BASE_URL}}/users/5968eeee-2730-47e9-9021-556a6305f2e2", + "host": [ + "{{BASE_URL}}" + ], + "path": [ + "users", + "5968eeee-2730-47e9-9021-556a6305f2e2" + ] + } + }, + "response": [] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "packages": {}, + "requests": {}, + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "packages": {}, + "requests": {}, + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "BASE_URL", + "value": "localhost:3000" + } + ] +} \ No newline at end of file diff --git a/src/problem5/configs/error.middleware.ts b/src/problem5/configs/error.middleware.ts new file mode 100644 index 000000000..cbdeb79e4 --- /dev/null +++ b/src/problem5/configs/error.middleware.ts @@ -0,0 +1,8 @@ +import type { Request, Response, NextFunction } from 'express'; + +const errorHandler = (err: any, req: Request, res: Response, next: NextFunction) => { + const status = err.status || 400; + res.status(status).json({ error: err.message || 'An error occurred' }); +}; + +export default errorHandler; \ No newline at end of file diff --git a/src/problem5/domain/dto/user.dto.ts b/src/problem5/domain/dto/user.dto.ts new file mode 100644 index 000000000..6b4c0cae3 --- /dev/null +++ b/src/problem5/domain/dto/user.dto.ts @@ -0,0 +1,10 @@ +export interface User { + id: string; + name: string; + email: string; +} + +export interface UserFilter { + name?: string; + email?: string; +} \ No newline at end of file diff --git a/src/problem5/domain/repositories/user.repository.ts b/src/problem5/domain/repositories/user.repository.ts new file mode 100644 index 000000000..19cd10cd2 --- /dev/null +++ b/src/problem5/domain/repositories/user.repository.ts @@ -0,0 +1,10 @@ +import { User, UserFilter } from "../dto/user.dto"; + + +export interface UserRepository { + create(user: Omit): Promise; + list(filter?: UserFilter): Promise; + get(id: string): Promise; + update(id: string, user: Partial>): Promise; + delete(id: string): Promise; +} diff --git a/src/problem5/domain/services/user.service.ts b/src/problem5/domain/services/user.service.ts new file mode 100644 index 000000000..66c05b2bb --- /dev/null +++ b/src/problem5/domain/services/user.service.ts @@ -0,0 +1,9 @@ +import { User, UserFilter } from "../dto/user.dto"; + +export interface UserService { + createUser(user: Omit): Promise; + listBy(filter?: UserFilter): Promise; + getUser(id: string): Promise; + updateUser(id: string, user: Partial>): Promise; + deleteUser(id: string): Promise; +} diff --git a/src/problem5/jest.config.js b/src/problem5/jest.config.js new file mode 100644 index 000000000..86f88fb90 --- /dev/null +++ b/src/problem5/jest.config.js @@ -0,0 +1,11 @@ +const { createDefaultPreset } = require("ts-jest"); + +const tsJestTransformCfg = createDefaultPreset().transform; + +/** @type {import("jest").Config} **/ +module.exports = { + testEnvironment: "node", + transform: { + ...tsJestTransformCfg, + }, +}; \ No newline at end of file diff --git a/src/problem5/ports/primary/user.controller.ts b/src/problem5/ports/primary/user.controller.ts new file mode 100644 index 000000000..c3c435674 --- /dev/null +++ b/src/problem5/ports/primary/user.controller.ts @@ -0,0 +1,63 @@ +import express, { Request, Response, NextFunction } from 'express'; +import { userService } from './user.service-impl'; + +const userRouter = express.Router(); + +userRouter.get('/', async (req: Request, res: Response, next: NextFunction) => { + try { + const users = await userService.listBy(req.query); + res.json(users); + } catch (err) { + next(err); + } +}); + +userRouter.post('/', async (req: Request, res: Response, next: NextFunction) => { + try { + const user = await userService.createUser(req.body); + res.status(201).json(user); + } catch (err) { + next(err); + } +}); + +userRouter.get('/:id', async (req: Request, res: Response, next: NextFunction) => { + try { + const user = await userService.getUser(req.params.id); + if (user) { + res.json(user); + } else { + res.status(404).json({ error: 'User not found' }); + } + } catch (err) { + next(err); + } +}); + +userRouter.put('/:id', async (req: Request, res: Response, next: NextFunction) => { + try { + const user = await userService.updateUser(req.params.id, req.body); + if (user) { + res.json(user); + } else { + res.status(404).json({ error: 'User not found' }); + } + } catch (err) { + next(err); + } +}); + +userRouter.delete('/:id', async (req: Request, res: Response, next: NextFunction) => { + try { + const success = await userService.deleteUser(req.params.id); + if (success) { + res.status(204).send(); + } else { + res.status(404).json({ error: 'User not found' }); + } + } catch (err) { + next(err); + } +}); + +export default userRouter; diff --git a/src/problem5/ports/primary/user.service-impl.ts b/src/problem5/ports/primary/user.service-impl.ts new file mode 100644 index 000000000..bce58049d --- /dev/null +++ b/src/problem5/ports/primary/user.service-impl.ts @@ -0,0 +1,61 @@ +import { User, UserFilter } from "../../domain/dto/user.dto"; +import { UserRepository } from "../../domain/repositories/user.repository"; +import { UserService } from "../../domain/services/user.service"; +import { userRepository } from "../secondary/database/user.repository-impl"; + +class UserServiceImpl implements UserService { + private readonly repository: UserRepository; + private static instance: UserServiceImpl; + + public constructor(repository: UserRepository) { + this.repository = repository; + } + + // Make sure the instance is created only once and shared across the application (dependency injection) + public getInstance(): UserServiceImpl { + if (!UserServiceImpl.instance) { + UserServiceImpl.instance = new UserServiceImpl(this.repository); + } + return UserServiceImpl.instance; + } + + async createUser(user: Omit): Promise { + return this.repository.create(user); + } + + async listBy(filter?: UserFilter): Promise { + if (filter) { + // Only keep 'name' and 'email' keys in the filter object + filter = { + name: filter.name, + email: filter.email + }; + } + return this.repository.list(filter); + } + + async getUser(id: string | string[]): Promise { + if (Array.isArray(id)) { + return this.repository.get(id[0]); + } + return this.repository.get(id); + } + + async updateUser(id: string | string[], user: Partial>): Promise { + if (Array.isArray(id)) { + return this.repository.update(id[0], user); + } + return this.repository.update(id, user); + } + + async deleteUser(id: string | string[]): Promise { + if (Array.isArray(id)) { + return this.repository.delete(id[0]); + } + return this.repository.delete(id); + } +} + +const userService = new UserServiceImpl(userRepository).getInstance(); + +export { userService, UserServiceImpl }; \ No newline at end of file diff --git a/src/problem5/ports/secondary/database/database.ts b/src/problem5/ports/secondary/database/database.ts new file mode 100644 index 000000000..f9ad7f8a0 --- /dev/null +++ b/src/problem5/ports/secondary/database/database.ts @@ -0,0 +1,43 @@ +import sqlite3 from 'sqlite3'; +import { open, Database } from 'sqlite'; + +sqlite3.verbose(); + +export async function connectToDatabase(): Promise { + const db = await open({ + filename: './app.db', + driver: sqlite3.Database + }); + await db.exec(` + CREATE TABLE IF NOT EXISTS users ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + email TEXT NOT NULL UNIQUE + ) + `); + return db; +} + +class DatabaseConnection { + private static instance: DatabaseConnection + private db: Database | null = null; + + private constructor() {} + + public static getInstance(): DatabaseConnection { + if (!DatabaseConnection.instance) { + DatabaseConnection.instance = new DatabaseConnection(); + } + return DatabaseConnection.instance; + } + + public async getDatabase(): Promise { + this.db = this.db ?? await connectToDatabase(); + return this.db; + } +} + +// By default the database only initializes when the first repository tries to access it +const databaseConnection = DatabaseConnection.getInstance(); + +export { databaseConnection }; \ No newline at end of file diff --git a/src/problem5/ports/secondary/database/user.repository-impl.ts b/src/problem5/ports/secondary/database/user.repository-impl.ts new file mode 100644 index 000000000..8eb0eec55 --- /dev/null +++ b/src/problem5/ports/secondary/database/user.repository-impl.ts @@ -0,0 +1,74 @@ +import { User, UserFilter } from "../../../domain/dto/user.dto"; +import { UserRepository } from "../../../domain/repositories/user.repository"; +import { databaseConnection } from "./database"; + +class UserRepositoryImpl implements UserRepository { + private static instance: UserRepositoryImpl; + + public getInstance(): UserRepositoryImpl { + if (!UserRepositoryImpl.instance) { + UserRepositoryImpl.instance = new UserRepositoryImpl(); + } + return UserRepositoryImpl.instance; + } + + async create(user: Omit): Promise { + const db = await databaseConnection.getDatabase() + const id = crypto.randomUUID(); + // Use ? for value to prevent SQL injection + await db.run( + 'INSERT INTO users (id, name, email) VALUES (?, ?, ?)', + [id, user.name, user.email] + ); + return { id, ...user }; + } + + async list(filter?: UserFilter): Promise { + const db = await databaseConnection.getDatabase() + let query = 'SELECT * FROM users'; + const params: any[] = []; + if (filter) { + const conditions: string[] = []; + if (filter.name) { + conditions.push('name LIKE ?'); + params.push(`%${filter.name}%`); + } + if (filter.email) { + conditions.push('email LIKE ?'); + params.push(`%${filter.email}%`); + } + if (conditions.length > 0) { + query += ' WHERE ' + conditions.join(' AND '); + } + } + return await db.all(query, params); + } + + async get(id: string): Promise { + const db = await databaseConnection.getDatabase() + const user = await db.get('SELECT * FROM users WHERE id = ?', [id]); + return user || null; + } + + async update(id: string, user: Partial>): Promise { + const db = await databaseConnection.getDatabase() + const existingUser = await db.get('SELECT * FROM users WHERE id = ?', [id]); + if (!existingUser) return null; + const updatedUser = { ...existingUser, ...user }; + await db.run( + 'UPDATE users SET name = ?, email = ? WHERE id = ?', + [updatedUser.name, updatedUser.email, id] + ); + return updatedUser; + } + + async delete(id: string): Promise { + const db = await databaseConnection.getDatabase() + const result = await db.run('DELETE FROM users WHERE id = ?', [id]); + return typeof result?.changes === "number" && result.changes > 0; + } +} + +const userRepository = new UserRepositoryImpl().getInstance(); + +export { userRepository }; diff --git a/src/problem5/tests/services/user.test.ts b/src/problem5/tests/services/user.test.ts new file mode 100644 index 000000000..3e1fd1989 --- /dev/null +++ b/src/problem5/tests/services/user.test.ts @@ -0,0 +1,82 @@ +import { UserServiceImpl } from '../../ports/primary/user.service-impl'; +import { User, UserFilter } from '../../domain/dto/user.dto'; +import { UserRepository } from '../../domain/repositories/user.repository'; + + +class MockUserRepository implements UserRepository { + private users: User[] = []; + private idCounter = 1; + + async create(user: Omit): Promise { + const newUser: User = { id: String(this.idCounter++), ...user }; + this.users.push(newUser); + return newUser; + } + + async list(filter?: UserFilter): Promise { + if (!filter) return [...this.users]; + return this.users.filter(u => { + return (!filter.name || u.name === filter.name) && (!filter.email || u.email === filter.email); + }); + } + + async get(id: string): Promise { + return this.users.find(u => u.id === id) || null; + } + + async update(id: string, user: Partial>): Promise { + const idx = this.users.findIndex(u => u.id === id); + if (idx === -1) return null; + this.users[idx] = { ...this.users[idx], ...user }; + return this.users[idx]; + } + + async delete(id: string): Promise { + const idx = this.users.findIndex(u => u.id === id); + if (idx === -1) return false; + this.users.splice(idx, 1); + return true; + } +} + +describe('UserService (with mock repository)', () => { + let userService: UserServiceImpl; + let createdUser: User; + const testUser = { name: 'Test User', email: 'testuser@example.com' }; + + beforeAll(() => { + userService = new UserServiceImpl(new MockUserRepository()); + }); + + it('should create a user', async () => { + createdUser = await userService.createUser(testUser); + expect(createdUser).toHaveProperty('id'); + expect(createdUser.name).toBe(testUser.name); + expect(createdUser.email).toBe(testUser.email); + }); + + it('should list users', async () => { + const users = await userService.listBy(); + expect(Array.isArray(users)).toBe(true); + expect(users.length).toBeGreaterThan(0); + }); + + it('should get user details', async () => { + const user = await userService.getUser(createdUser.id); + expect(user).not.toBeNull(); + expect(user?.id).toBe(createdUser.id); + }); + + it('should update user details', async () => { + const updated = await userService.updateUser(createdUser.id, { name: 'Updated User' }); + expect(updated).not.toBeNull(); + expect(updated?.name).toBe('Updated User'); + }); + + it('should delete a user', async () => { + const result = await userService.deleteUser(createdUser.id); + expect(result).toBe(true); + const user = await userService.getUser(createdUser.id); + expect(user).toBeNull(); + }); +}); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..710b80d5d --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3479 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== + dependencies: + "@babel/helper-validator-identifier" "^7.28.5" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.28.6": + version "7.29.0" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz" + integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0 || ^8.0.0-0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.0 || ^8.0.0-0", "@babel/core@^7.11.0 || ^8.0.0-beta.1", "@babel/core@^7.23.9", "@babel/core@^7.27.4", "@babel/core@>=7.0.0-beta.0 <8": + version "7.29.0" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz" + integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-compilation-targets" "^7.28.6" + "@babel/helper-module-transforms" "^7.28.6" + "@babel/helpers" "^7.28.6" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/traverse" "^7.29.0" + "@babel/types" "^7.29.0" + "@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" + +"@babel/generator@^7.27.5", "@babel/generator@^7.29.0": + version "7.29.1" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz" + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== + dependencies: + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.28.6": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz" + integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== + dependencies: + "@babel/compat-data" "^7.28.6" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + +"@babel/helper-module-imports@^7.28.6": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz" + integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== + dependencies: + "@babel/traverse" "^7.28.6" + "@babel/types" "^7.28.6" + +"@babel/helper-module-transforms@^7.28.6": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz" + integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== + dependencies: + "@babel/helper-module-imports" "^7.28.6" + "@babel/helper-validator-identifier" "^7.28.5" + "@babel/traverse" "^7.28.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.8.0": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz" + integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.28.6": + version "7.29.2" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz" + integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw== + dependencies: + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": + version "7.29.2" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz" + integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== + dependencies: + "@babel/types" "^7.29.0" + +"@babel/plugin-syntax-async-generators@^7.8.4": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz" + integrity sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw== + dependencies: + "@babel/helper-plugin-utils" "^7.28.6" + +"@babel/plugin-syntax-import-meta@^7.10.4": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.27.1": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz" + integrity sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w== + dependencies: + "@babel/helper-plugin-utils" "^7.28.6" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.27.1": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz" + integrity sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A== + dependencies: + "@babel/helper-plugin-utils" "^7.28.6" + +"@babel/template@^7.28.6": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz" + integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== + dependencies: + "@babel/code-frame" "^7.28.6" + "@babel/parser" "^7.28.6" + "@babel/types" "^7.28.6" + +"@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": + version "7.29.0" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" + debug "^4.3.1" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.6", "@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cspotcode/source-map-support@^0.8.0": + 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== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@gar/promise-retry@^1.0.0": + version "1.0.2" + resolved "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.2.tgz" + integrity sha512-Lm/ZLhDZcBECta3TmCQSngiQykFdfw+QtI1/GYMsZd4l3nG+P8WLB16XuS7WaBGLQ+9E+cOcWQsth9cayuGt8g== + dependencies: + retry "^0.13.1" + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + 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" + +"@isaacs/fs-minipass@^4.0.0": + version "4.0.1" + resolved "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz" + integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== + dependencies: + minipass "^7.0.4" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + 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" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/console/-/console-30.3.0.tgz" + integrity sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww== + dependencies: + "@jest/types" "30.3.0" + "@types/node" "*" + chalk "^4.1.2" + jest-message-util "30.3.0" + jest-util "30.3.0" + slash "^3.0.0" + +"@jest/core@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/core/-/core-30.3.0.tgz" + integrity sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw== + dependencies: + "@jest/console" "30.3.0" + "@jest/pattern" "30.0.1" + "@jest/reporters" "30.3.0" + "@jest/test-result" "30.3.0" + "@jest/transform" "30.3.0" + "@jest/types" "30.3.0" + "@types/node" "*" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + ci-info "^4.2.0" + exit-x "^0.2.2" + graceful-fs "^4.2.11" + jest-changed-files "30.3.0" + jest-config "30.3.0" + jest-haste-map "30.3.0" + jest-message-util "30.3.0" + jest-regex-util "30.0.1" + jest-resolve "30.3.0" + jest-resolve-dependencies "30.3.0" + jest-runner "30.3.0" + jest-runtime "30.3.0" + jest-snapshot "30.3.0" + jest-util "30.3.0" + jest-validate "30.3.0" + jest-watcher "30.3.0" + pretty-format "30.3.0" + slash "^3.0.0" + +"@jest/diff-sequences@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz" + integrity sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA== + +"@jest/environment@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz" + integrity sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw== + dependencies: + "@jest/fake-timers" "30.3.0" + "@jest/types" "30.3.0" + "@types/node" "*" + jest-mock "30.3.0" + +"@jest/expect-utils@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz" + integrity sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA== + dependencies: + "@jest/get-type" "30.1.0" + +"@jest/expect@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-30.3.0.tgz" + integrity sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg== + dependencies: + expect "30.3.0" + jest-snapshot "30.3.0" + +"@jest/fake-timers@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.3.0.tgz" + integrity sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ== + dependencies: + "@jest/types" "30.3.0" + "@sinonjs/fake-timers" "^15.0.0" + "@types/node" "*" + jest-message-util "30.3.0" + jest-mock "30.3.0" + jest-util "30.3.0" + +"@jest/get-type@30.1.0": + version "30.1.0" + resolved "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz" + integrity sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA== + +"@jest/globals@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-30.3.0.tgz" + integrity sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA== + dependencies: + "@jest/environment" "30.3.0" + "@jest/expect" "30.3.0" + "@jest/types" "30.3.0" + jest-mock "30.3.0" + +"@jest/pattern@30.0.1": + version "30.0.1" + resolved "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz" + integrity sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA== + dependencies: + "@types/node" "*" + jest-regex-util "30.0.1" + +"@jest/reporters@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-30.3.0.tgz" + integrity sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "30.3.0" + "@jest/test-result" "30.3.0" + "@jest/transform" "30.3.0" + "@jest/types" "30.3.0" + "@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.3.0" + jest-util "30.3.0" + jest-worker "30.3.0" + slash "^3.0.0" + string-length "^4.0.2" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@30.0.5": + version "30.0.5" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz" + integrity sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA== + dependencies: + "@sinclair/typebox" "^0.34.0" + +"@jest/snapshot-utils@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.3.0.tgz" + integrity sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g== + dependencies: + "@jest/types" "30.3.0" + chalk "^4.1.2" + graceful-fs "^4.2.11" + natural-compare "^1.4.0" + +"@jest/source-map@30.0.1": + version "30.0.1" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz" + integrity sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + callsites "^3.1.0" + graceful-fs "^4.2.11" + +"@jest/test-result@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-30.3.0.tgz" + integrity sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ== + dependencies: + "@jest/console" "30.3.0" + "@jest/types" "30.3.0" + "@types/istanbul-lib-coverage" "^2.0.6" + collect-v8-coverage "^1.0.2" + +"@jest/test-sequencer@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.3.0.tgz" + integrity sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA== + dependencies: + "@jest/test-result" "30.3.0" + graceful-fs "^4.2.11" + jest-haste-map "30.3.0" + slash "^3.0.0" + +"@jest/transform@^29.0.0 || ^30.0.0", "@jest/transform@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-30.3.0.tgz" + integrity sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A== + dependencies: + "@babel/core" "^7.27.4" + "@jest/types" "30.3.0" + "@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.3.0" + jest-regex-util "30.0.1" + jest-util "30.3.0" + pirates "^4.0.7" + slash "^3.0.0" + write-file-atomic "^5.0.1" + +"@jest/types@^29.0.0 || ^30.0.0", "@jest/types@30.3.0": + version "30.3.0" + resolved "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz" + integrity sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw== + dependencies: + "@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" + +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + 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== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.5" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@npmcli/agent@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz" + integrity sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA== + dependencies: + agent-base "^7.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^11.2.1" + socks-proxy-agent "^8.0.3" + +"@npmcli/fs@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz" + integrity sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og== + dependencies: + semver "^7.3.5" + +"@npmcli/redact@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz" + integrity sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q== + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pkgr/core@^0.2.9": + version "0.2.9" + resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz" + integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== + +"@sinclair/typebox@^0.34.0": + version "0.34.48" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz" + integrity sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA== + +"@sinonjs/commons@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^15.0.0": + version "15.1.1" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz" + integrity sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw== + dependencies: + "@sinonjs/commons" "^3.0.1" + +"@tsconfig/node10@^1.0.7": + version "1.0.12" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz" + integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@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== + dependencies: + "@babel/types" "^7.0.0" + +"@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== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@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== + dependencies: + "@babel/types" "^7.28.2" + +"@types/body-parser@*": + version "1.19.6" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz" + integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@^5.0.0": + version "5.1.1" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz" + integrity sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^5.0.6": + version "5.0.6" + resolved "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz" + integrity sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/serve-static" "^2" + +"@types/http-errors@*": + version "2.0.5" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz" + integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.1", "@types/istanbul-lib-coverage@^2.0.6": + 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== + +"@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== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.4": + 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== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^30.0.0": + version "30.0.0" + resolved "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz" + integrity sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA== + dependencies: + expect "^30.0.0" + pretty-format "^30.0.0" + +"@types/node@*", "@types/node@^25.5.0": + version "25.5.0" + resolved "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz" + integrity sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw== + dependencies: + undici-types "~7.18.0" + +"@types/qs@*": + version "6.15.0" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz" + integrity sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/send@*": + version "1.2.1" + resolved "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz" + integrity sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ== + dependencies: + "@types/node" "*" + +"@types/serve-static@^2": + version "2.2.0" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz" + integrity sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + +"@types/sqlite3@^3.1.11": + version "3.1.11" + resolved "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.11.tgz" + integrity sha512-KYF+QgxAnnAh7DWPdNDroxkDI3/MspH1NMx6m/N/6fT1G6+jvsw4/ZePt8R8cr7ta58aboeTfYFBDxTJ5yv15w== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@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== + +"@types/yargs@^17.0.33": + version "17.0.35" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz" + integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== + dependencies: + "@types/yargs-parser" "*" + +"@ungap/structured-clone@^1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + +"@unrs/resolver-binding-win32-x64-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz" + integrity sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g== + +abbrev@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz" + integrity sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA== + +accepts@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz" + integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== + dependencies: + mime-types "^3.0.0" + negotiator "^1.0.0" + +acorn-walk@^8.1.1: + version "8.3.5" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz" + integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.16.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== + +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + +ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-styles@^6.1.0: + version "6.2.3" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + +anymatch@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +"babel-jest@^29.0.0 || ^30.0.0", babel-jest@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz" + integrity sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ== + dependencies: + "@jest/transform" "30.3.0" + "@types/babel__core" "^7.20.5" + babel-plugin-istanbul "^7.0.1" + babel-preset-jest "30.3.0" + chalk "^4.1.2" + graceful-fs "^4.2.11" + slash "^3.0.0" + +babel-plugin-istanbul@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz" + integrity sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA== + 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" + +babel-plugin-jest-hoist@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.3.0.tgz" + integrity sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg== + dependencies: + "@types/babel__core" "^7.20.5" + +babel-preset-current-node-syntax@^1.2.0: + 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== + 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" + +babel-preset-jest@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.3.0.tgz" + integrity sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ== + dependencies: + babel-plugin-jest-hoist "30.3.0" + babel-preset-current-node-syntax "^1.2.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +baseline-browser-mapping@^2.9.0: + version "2.10.8" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz" + integrity sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@^2.2.1: + version "2.2.2" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz" + integrity sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA== + dependencies: + bytes "^3.1.2" + content-type "^1.0.5" + debug "^4.4.3" + http-errors "^2.0.0" + iconv-lite "^0.7.0" + on-finished "^2.4.1" + qs "^6.14.1" + raw-body "^3.0.1" + type-is "^2.0.1" + +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + dependencies: + balanced-match "^1.0.0" + +brace-expansion@^5.0.2: + version "5.0.4" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz" + integrity sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg== + dependencies: + balanced-match "^4.0.2" + +browserslist@^4.24.0, "browserslist@>= 4.21.0": + version "4.28.1" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz" + integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== + dependencies: + 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" + +bs-logger@^0.2.6: + version "0.2.6" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bytes@^3.1.2, bytes@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^20.0.1: + version "20.0.3" + resolved "https://registry.npmjs.org/cacache/-/cacache-20.0.3.tgz" + integrity sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw== + dependencies: + "@npmcli/fs" "^5.0.0" + fs-minipass "^3.0.0" + glob "^13.0.0" + lru-cache "^11.1.0" + minipass "^7.0.3" + minipass-collect "^2.0.1" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^7.0.2" + ssri "^13.0.0" + unique-filename "^5.0.0" + +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + 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== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bound@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001759: + version "1.0.30001780" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz" + integrity sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ== + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz" + integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== + +ci-info@^4.2.0: + version "4.4.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz" + integrity sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg== + +cjs-module-lexer@^2.1.0: + 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== + +cliui@^8.0.1: + 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== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz" + integrity sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +content-disposition@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz" + integrity sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q== + +content-type@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^2.0.0: + 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== + +cookie-signature@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz" + integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== + +cookie@^0.7.1: + version "0.7.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.3, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.4.0, debug@^4.4.3, debug@4: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +dedent@^1.6.0: + version "1.7.2" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz" + integrity sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA== + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.3.1: + 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== + +depd@^2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +detect-libc@^2.0.0: + version "2.1.2" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + +detect-newline@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff@^4.0.1: + version "4.0.4" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz" + integrity sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.5.263: + version "1.5.313" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz" + integrity sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +encodeurl@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + 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== + dependencies: + once "^1.4.0" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +error-ex@^1.3.1: + version "1.3.4" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz" + integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== + dependencies: + is-arrayish "^0.2.1" + +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + 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== + dependencies: + es-errors "^1.3.0" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +etag@^1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + 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" + +exit-x@^0.2.2: + 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== + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +expect@^30.0.0, expect@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz" + integrity sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q== + dependencies: + "@jest/expect-utils" "30.3.0" + "@jest/get-type" "30.1.0" + jest-matcher-utils "30.3.0" + jest-message-util "30.3.0" + jest-mock "30.3.0" + jest-util "30.3.0" + +exponential-backoff@^3.1.1: + version "3.1.3" + resolved "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz" + integrity sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA== + +express@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/express/-/express-5.2.1.tgz" + integrity sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== + dependencies: + accepts "^2.0.0" + body-parser "^2.2.1" + content-disposition "^1.0.0" + content-type "^1.0.5" + cookie "^0.7.1" + cookie-signature "^1.2.1" + debug "^4.4.0" + depd "^2.0.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + finalhandler "^2.1.0" + fresh "^2.0.0" + http-errors "^2.0.0" + merge-descriptors "^2.0.0" + mime-types "^3.0.0" + on-finished "^2.4.1" + once "^1.4.0" + parseurl "^1.3.3" + proxy-addr "^2.0.7" + qs "^6.14.0" + range-parser "^1.2.1" + router "^2.2.0" + send "^1.1.0" + serve-static "^2.2.0" + statuses "^2.0.1" + type-is "^2.0.1" + vary "^1.1.2" + +fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: + 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== + +fb-watchman@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +finalhandler@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz" + integrity sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA== + dependencies: + debug "^4.4.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + on-finished "^2.4.1" + parseurl "^1.3.3" + statuses "^2.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +foreground-child@^3.1.0: + version "3.3.1" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== + dependencies: + cross-spawn "^7.0.6" + signal-exit "^4.0.1" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz" + integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== + dependencies: + minipass "^7.0.3" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + 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== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + 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" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + +glob@^10.5.0: + version "10.5.0" + resolved "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz" + integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== + 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" + +glob@^13.0.0: + version "13.0.6" + resolved "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz" + integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== + dependencies: + minimatch "^10.2.2" + minipass "^7.1.3" + path-scurry "^2.0.2" + +glob@^7.1.4: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.2.11, graceful-fs@^4.2.6: + 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== + +handlebars@^4.7.8: + version "4.7.8" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-cache-semantics@^4.1.1: + version "4.2.0" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz" + integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== + +http-errors@^2.0.0, http-errors@^2.0.1, http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== + dependencies: + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" + +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +https-proxy-agent@^7.0.1: + version "7.0.6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@^0.7.0, iconv-lite@^0.7.2, iconv-lite@~0.7.0: + version "0.7.2" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz" + integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +import-local@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4, inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +ip-address@^10.0.1: + version "10.1.0" + resolved "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz" + integrity sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-fullwidth-code-point@^3.0.0: + 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== + +is-generator-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isexe@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz" + integrity sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + 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== + +istanbul-lib-instrument@^6.0.0, istanbul-lib-instrument@^6.0.2: + 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== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^5.0.0: + 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== + dependencies: + "@jridgewell/trace-mapping" "^0.3.23" + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + +istanbul-reports@^3.1.3: + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz" + integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jest-changed-files@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.3.0.tgz" + integrity sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA== + dependencies: + execa "^5.1.1" + jest-util "30.3.0" + p-limit "^3.1.0" + +jest-circus@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-30.3.0.tgz" + integrity sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA== + dependencies: + "@jest/environment" "30.3.0" + "@jest/expect" "30.3.0" + "@jest/test-result" "30.3.0" + "@jest/types" "30.3.0" + "@types/node" "*" + chalk "^4.1.2" + co "^4.6.0" + dedent "^1.6.0" + is-generator-fn "^2.1.0" + jest-each "30.3.0" + jest-matcher-utils "30.3.0" + jest-message-util "30.3.0" + jest-runtime "30.3.0" + jest-snapshot "30.3.0" + jest-util "30.3.0" + p-limit "^3.1.0" + pretty-format "30.3.0" + pure-rand "^7.0.0" + slash "^3.0.0" + stack-utils "^2.0.6" + +jest-cli@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-30.3.0.tgz" + integrity sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw== + dependencies: + "@jest/core" "30.3.0" + "@jest/test-result" "30.3.0" + "@jest/types" "30.3.0" + chalk "^4.1.2" + exit-x "^0.2.2" + import-local "^3.2.0" + jest-config "30.3.0" + jest-util "30.3.0" + jest-validate "30.3.0" + yargs "^17.7.2" + +jest-config@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz" + integrity sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w== + dependencies: + "@babel/core" "^7.27.4" + "@jest/get-type" "30.1.0" + "@jest/pattern" "30.0.1" + "@jest/test-sequencer" "30.3.0" + "@jest/types" "30.3.0" + babel-jest "30.3.0" + 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.3.0" + jest-docblock "30.2.0" + jest-environment-node "30.3.0" + jest-regex-util "30.0.1" + jest-resolve "30.3.0" + jest-runner "30.3.0" + jest-util "30.3.0" + jest-validate "30.3.0" + parse-json "^5.2.0" + pretty-format "30.3.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz" + integrity sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ== + dependencies: + "@jest/diff-sequences" "30.3.0" + "@jest/get-type" "30.1.0" + chalk "^4.1.2" + pretty-format "30.3.0" + +jest-docblock@30.2.0: + version "30.2.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz" + integrity sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA== + dependencies: + detect-newline "^3.1.0" + +jest-each@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-30.3.0.tgz" + integrity sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA== + dependencies: + "@jest/get-type" "30.1.0" + "@jest/types" "30.3.0" + chalk "^4.1.2" + jest-util "30.3.0" + pretty-format "30.3.0" + +jest-environment-node@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.3.0.tgz" + integrity sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ== + dependencies: + "@jest/environment" "30.3.0" + "@jest/fake-timers" "30.3.0" + "@jest/types" "30.3.0" + "@types/node" "*" + jest-mock "30.3.0" + jest-util "30.3.0" + jest-validate "30.3.0" + +jest-haste-map@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.3.0.tgz" + integrity sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA== + dependencies: + "@jest/types" "30.3.0" + "@types/node" "*" + anymatch "^3.1.3" + fb-watchman "^2.0.2" + graceful-fs "^4.2.11" + jest-regex-util "30.0.1" + jest-util "30.3.0" + jest-worker "30.3.0" + picomatch "^4.0.3" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.3" + +jest-leak-detector@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.3.0.tgz" + integrity sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ== + dependencies: + "@jest/get-type" "30.1.0" + pretty-format "30.3.0" + +jest-matcher-utils@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz" + integrity sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA== + dependencies: + "@jest/get-type" "30.1.0" + chalk "^4.1.2" + jest-diff "30.3.0" + pretty-format "30.3.0" + +jest-message-util@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz" + integrity sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@jest/types" "30.3.0" + "@types/stack-utils" "^2.0.3" + chalk "^4.1.2" + graceful-fs "^4.2.11" + picomatch "^4.0.3" + pretty-format "30.3.0" + slash "^3.0.0" + stack-utils "^2.0.6" + +jest-mock@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz" + integrity sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog== + dependencies: + "@jest/types" "30.3.0" + "@types/node" "*" + jest-util "30.3.0" + +jest-pnp-resolver@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@30.0.1: + 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== + +jest-resolve-dependencies@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.3.0.tgz" + integrity sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw== + dependencies: + jest-regex-util "30.0.1" + jest-snapshot "30.3.0" + +jest-resolve@*, jest-resolve@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.3.0.tgz" + integrity sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g== + dependencies: + chalk "^4.1.2" + graceful-fs "^4.2.11" + jest-haste-map "30.3.0" + jest-pnp-resolver "^1.2.3" + jest-util "30.3.0" + jest-validate "30.3.0" + slash "^3.0.0" + unrs-resolver "^1.7.11" + +jest-runner@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-30.3.0.tgz" + integrity sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw== + dependencies: + "@jest/console" "30.3.0" + "@jest/environment" "30.3.0" + "@jest/test-result" "30.3.0" + "@jest/transform" "30.3.0" + "@jest/types" "30.3.0" + "@types/node" "*" + chalk "^4.1.2" + emittery "^0.13.1" + exit-x "^0.2.2" + graceful-fs "^4.2.11" + jest-docblock "30.2.0" + jest-environment-node "30.3.0" + jest-haste-map "30.3.0" + jest-leak-detector "30.3.0" + jest-message-util "30.3.0" + jest-resolve "30.3.0" + jest-runtime "30.3.0" + jest-util "30.3.0" + jest-watcher "30.3.0" + jest-worker "30.3.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.3.0.tgz" + integrity sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng== + dependencies: + "@jest/environment" "30.3.0" + "@jest/fake-timers" "30.3.0" + "@jest/globals" "30.3.0" + "@jest/source-map" "30.0.1" + "@jest/test-result" "30.3.0" + "@jest/transform" "30.3.0" + "@jest/types" "30.3.0" + "@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.3.0" + jest-message-util "30.3.0" + jest-mock "30.3.0" + jest-regex-util "30.0.1" + jest-resolve "30.3.0" + jest-snapshot "30.3.0" + jest-util "30.3.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.3.0.tgz" + integrity sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ== + 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.3.0" + "@jest/get-type" "30.1.0" + "@jest/snapshot-utils" "30.3.0" + "@jest/transform" "30.3.0" + "@jest/types" "30.3.0" + babel-preset-current-node-syntax "^1.2.0" + chalk "^4.1.2" + expect "30.3.0" + graceful-fs "^4.2.11" + jest-diff "30.3.0" + jest-matcher-utils "30.3.0" + jest-message-util "30.3.0" + jest-util "30.3.0" + pretty-format "30.3.0" + semver "^7.7.2" + synckit "^0.11.8" + +"jest-util@^29.0.0 || ^30.0.0", jest-util@^30.3.0, jest-util@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz" + integrity sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg== + dependencies: + "@jest/types" "30.3.0" + "@types/node" "*" + chalk "^4.1.2" + ci-info "^4.2.0" + graceful-fs "^4.2.11" + picomatch "^4.0.3" + +jest-validate@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz" + integrity sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q== + dependencies: + "@jest/get-type" "30.1.0" + "@jest/types" "30.3.0" + camelcase "^6.3.0" + chalk "^4.1.2" + leven "^3.1.0" + pretty-format "30.3.0" + +jest-watcher@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.3.0.tgz" + integrity sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w== + dependencies: + "@jest/test-result" "30.3.0" + "@jest/types" "30.3.0" + "@types/node" "*" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + emittery "^0.13.1" + jest-util "30.3.0" + string-length "^4.0.2" + +jest-worker@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz" + integrity sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ== + dependencies: + "@types/node" "*" + "@ungap/structured-clone" "^1.3.0" + jest-util "30.3.0" + merge-stream "^2.0.0" + supports-color "^8.1.1" + +"jest@^29.0.0 || ^30.0.0", jest@^30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz" + integrity sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg== + dependencies: + "@jest/core" "30.3.0" + "@jest/types" "30.3.0" + import-local "^3.2.0" + jest-cli "30.3.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.2" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz" + integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-parse-even-better-errors@^2.3.0: + 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== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^11.0.0, lru-cache@^11.1.0: + version "11.2.7" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz" + integrity sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA== + +lru-cache@^11.2.1: + version "11.2.7" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz" + integrity sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^4.0.0: + 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== + dependencies: + semver "^7.5.3" + +make-error@^1.1.1, make-error@^1.3.6: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^15.0.0: + version "15.0.5" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.5.tgz" + integrity sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg== + dependencies: + "@gar/promise-retry" "^1.0.0" + "@npmcli/agent" "^4.0.0" + "@npmcli/redact" "^4.0.0" + cacache "^20.0.1" + http-cache-semantics "^4.1.1" + minipass "^7.0.2" + minipass-fetch "^5.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^1.0.0" + proc-log "^6.0.0" + ssri "^13.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +media-typer@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz" + integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== + +merge-descriptors@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz" + integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-types@^3.0.0, mime-types@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz" + integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== + dependencies: + mime-db "^1.54.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimatch@^10.2.2: + version "10.2.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz" + integrity sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg== + dependencies: + brace-expansion "^5.0.2" + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.4: + version "9.0.9" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz" + integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== + dependencies: + brace-expansion "^2.0.2" + +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass-collect@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz" + integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== + dependencies: + minipass "^7.0.3" + +minipass-fetch@^5.0.0: + version "5.0.2" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz" + integrity sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ== + dependencies: + minipass "^7.0.3" + minipass-sized "^2.0.0" + minizlib "^3.0.1" + optionalDependencies: + iconv-lite "^0.7.2" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz" + integrity sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA== + dependencies: + minipass "^7.1.2" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.0.4, minipass@^7.1.2, minipass@^7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== + +minizlib@^3.0.1, minizlib@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz" + integrity sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw== + dependencies: + minipass "^7.1.2" + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== + +napi-postinstall@^0.3.0: + version "0.3.4" + resolved "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz" + integrity sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-abi@^3.3.0: + version "3.89.0" + resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz" + integrity sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA== + dependencies: + semver "^7.3.5" + +node-addon-api@^8.0.0: + version "8.6.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.6.0.tgz" + integrity sha512-gBVjCaqDlRUk0EwoPNKzIr9KkS9041G/q31IBShPs1Xz6UTA+EXdZADbzqAJQrpDRq71CIMnOP5VMut3SL0z5Q== + +node-gyp@12.x: + version "12.2.0" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-12.2.0.tgz" + integrity sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + graceful-fs "^4.2.6" + make-fetch-happen "^15.0.0" + nopt "^9.0.0" + proc-log "^6.0.0" + semver "^7.3.5" + tar "^7.5.4" + tinyglobby "^0.2.12" + which "^6.0.0" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.27: + version "2.0.36" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz" + integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== + +nopt@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz" + integrity sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw== + dependencies: + abbrev "^4.0.0" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +on-finished@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz" + integrity sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json-from-dist@^1.0.0: + 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== + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + 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" + +parseurl@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^1.11.1: + 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" + +path-scurry@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz" + integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + +path-to-regexp@^8.0.0: + version "8.3.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz" + integrity sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +"picomatch@^3 || ^4", picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +pirates@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz" + integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== + +pkg-dir@^4.2.0: + 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== + dependencies: + find-up "^4.0.0" + +prebuild-install@^7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^2.0.0" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +pretty-format@^30.0.0, pretty-format@30.3.0: + version "30.3.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz" + integrity sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ== + dependencies: + "@jest/schemas" "30.0.5" + ansi-styles "^5.2.0" + react-is "^18.3.1" + +proc-log@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz" + integrity sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ== + +proxy-addr@^2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pump@^3.0.0: + version "3.0.4" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz" + integrity sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pure-rand@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz" + integrity sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ== + +qs@^6.14.0, qs@^6.14.1: + version "6.15.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz" + integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== + dependencies: + side-channel "^1.1.0" + +range-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz" + integrity sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA== + dependencies: + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.7.0" + unpipe "~1.0.0" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-is@^18.3.1: + 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== + +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-cwd@^3.0.0: + 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== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +router@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/router/-/router-2.2.0.tgz" + integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== + dependencies: + debug "^4.4.0" + depd "^2.0.0" + is-promise "^4.0.0" + parseurl "^1.3.3" + path-to-regexp "^8.0.0" + +safe-buffer@^5.0.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5: + version "7.7.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + +semver@^7.5.3: + version "7.7.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + +semver@^7.5.4: + version "7.7.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + +semver@^7.7.2: + version "7.7.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + +semver@^7.7.3: + version "7.7.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + +send@^1.1.0, send@^1.2.0: + version "1.2.1" + resolved "https://registry.npmjs.org/send/-/send-1.2.1.tgz" + integrity sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ== + dependencies: + debug "^4.4.3" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + fresh "^2.0.0" + http-errors "^2.0.1" + mime-types "^3.0.2" + ms "^2.1.3" + on-finished "^2.4.1" + range-parser "^1.2.1" + statuses "^2.0.2" + +serve-static@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz" + integrity sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw== + dependencies: + encodeurl "^2.0.0" + escape-html "^1.0.3" + parseurl "^1.3.3" + send "^1.2.0" + +setprototypeof@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + 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" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + 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== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + 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" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + 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" + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^8.0.3: + version "8.0.5" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.7" + resolved "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz" + integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A== + dependencies: + ip-address "^10.0.1" + smart-buffer "^4.2.0" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +sqlite@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz" + integrity sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q== + +sqlite3@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/sqlite3/-/sqlite3-6.0.1.tgz" + integrity sha512-X0czUUMG2tmSqJpEQa3tCuZSHKIx8PwM53vLZzKp/o6Rpy25fiVfjdbnZ988M8+O3ZWR1ih0K255VumCb3MAnQ== + dependencies: + bindings "^1.5.0" + node-addon-api "^8.0.0" + prebuild-install "^7.1.3" + tar "^7.5.10" + optionalDependencies: + node-gyp "12.x" + +ssri@^13.0.0: + version "13.0.1" + resolved "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz" + integrity sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ== + dependencies: + minipass "^7.0.3" + +stack-utils@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +statuses@^2.0.1, statuses@^2.0.2, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string-length@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +"string-width-cjs@npm:string-width@^4.2.0": + 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" + +string-width@^4.1.0, string-width@^4.2.0: + 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" + +string-width@^4.2.3: + 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" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + 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" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + 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" + +strip-ansi@^7.0.1: + version "7.2.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz" + integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== + dependencies: + ansi-regex "^6.2.2" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + 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== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +synckit@^0.11.8: + version "0.11.12" + resolved "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz" + integrity sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ== + dependencies: + "@pkgr/core" "^0.2.9" + +tar-fs@^2.0.0: + version "2.1.4" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz" + integrity sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^7.5.10, tar@^7.5.4: + version "7.5.11" + resolved "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz" + integrity sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ== + dependencies: + "@isaacs/fs-minipass" "^4.0.0" + chownr "^3.0.0" + minipass "^7.1.2" + minizlib "^3.1.0" + yallist "^5.0.0" + +test-exclude@^6.0.0: + 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== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +tinyglobby@^0.2.12: + version "0.2.15" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +toidentifier@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +ts-jest@^29.4.6: + version "29.4.6" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz" + integrity sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA== + dependencies: + bs-logger "^0.2.6" + fast-json-stable-stringify "^2.1.0" + handlebars "^4.7.8" + json5 "^2.2.3" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.7.3" + type-fest "^4.41.0" + yargs-parser "^21.1.1" + +ts-node@^10.9.2, ts-node@>=9.0.0: + version "10.9.2" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +type-detect@4.0.8: + 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== + +type-fest@^0.21.3: + 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== + +type-fest@^4.41.0: + version "4.41.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz" + integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== + +type-is@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz" + integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== + dependencies: + content-type "^1.0.5" + media-typer "^1.1.0" + mime-types "^3.0.0" + +typescript@^5.9.3, typescript@>=2.7, "typescript@>=4.3 <6": + version "5.9.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + +uglify-js@^3.1.4: + 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== + +undici-types@~7.18.0: + version "7.18.2" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz" + integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== + +unique-filename@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz" + integrity sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg== + dependencies: + unique-slug "^6.0.0" + +unique-slug@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-6.0.0.tgz" + integrity sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw== + dependencies: + imurmurhash "^0.1.4" + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unrs-resolver@^1.7.11: + version "1.11.1" + resolved "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz" + integrity sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg== + dependencies: + napi-postinstall "^0.3.0" + optionalDependencies: + "@unrs/resolver-binding-android-arm-eabi" "1.11.1" + "@unrs/resolver-binding-android-arm64" "1.11.1" + "@unrs/resolver-binding-darwin-arm64" "1.11.1" + "@unrs/resolver-binding-darwin-x64" "1.11.1" + "@unrs/resolver-binding-freebsd-x64" "1.11.1" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.11.1" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.11.1" + "@unrs/resolver-binding-linux-arm64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-arm64-musl" "1.11.1" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-riscv64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-riscv64-musl" "1.11.1" + "@unrs/resolver-binding-linux-s390x-gnu" "1.11.1" + "@unrs/resolver-binding-linux-x64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-x64-musl" "1.11.1" + "@unrs/resolver-binding-wasm32-wasi" "1.11.1" + "@unrs/resolver-binding-win32-arm64-msvc" "1.11.1" + "@unrs/resolver-binding-win32-ia32-msvc" "1.11.1" + "@unrs/resolver-binding-win32-x64-msvc" "1.11.1" + +update-browserslist-db@^1.2.0: + 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== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +v8-compile-cache-lib@^3.0.1: + 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== + +v8-to-istanbul@^9.0.1: + 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== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +vary@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +which@^2.0.1: + 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" + +which@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/which/-/which-6.0.1.tgz" + integrity sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg== + dependencies: + isexe "^4.0.0" + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + 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" + +wrap-ansi@^7.0.0: + 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" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yallist@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz" + integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From dc67b449d3bc75d17e168df9dc2a78b1aa594393 Mon Sep 17 00:00:00 2001 From: thanhncc391 Date: Wed, 18 Mar 2026 14:22:01 +0700 Subject: [PATCH 3/4] feat: resolve problem 6 add readme to describe the requirements and guide to solve problem 6 add flow diagram to illustrate the solution approach for problem 6 Co-authored-by: Thanh Nguyen --- src/problem6/README.md | 145 ++++++++++++++++++++++++++++++++++ src/problem6/flow-diagram.png | Bin 0 -> 59018 bytes 2 files changed, 145 insertions(+) create mode 100644 src/problem6/README.md create mode 100644 src/problem6/flow-diagram.png diff --git a/src/problem6/README.md b/src/problem6/README.md new file mode 100644 index 000000000..199ced864 --- /dev/null +++ b/src/problem6/README.md @@ -0,0 +1,145 @@ + +# Problem 6 - Scoreboard System Specification + +## A. Functional Requirements +- Display the top 10 users’ scores +- Support real-time updates for all connected users +- Allow users to increment their score by 1 +- Validate user authentication and authorization +- Prevent unauthorized score modifications +- Ensure score data is durable and recoverable + +## B. Non-Functional Requirements +- Support high request rates and frequent reads +- Optimize for low-latency, read-heavy workloads +- Scale horizontally across all services +- Ensure eventual consistency between systems +- Provide high availability and fault tolerance +- Enforce rate limiting to prevent abuse and DDoS + +## C. System Architecture + +### C.1 Write Flow + - Client sends a score increment request to the API + - API validates authentication and rate limits the request + - Score is updated in Redis synchronously + - An event is published to a queue for asynchronous persistence + - A background worker consumes events and writes to PostgreSQL + +### C.2 Read Flow + - Clients request leaderboard data from the API + - API reads directly from Redis + - The top 10 users are returned with minimal latency + +### C.3 Real-Time Updates + - When a score changes, an event is published + - WebSocket servers broadcast updated leaderboard data to connected clients + - Clients update their UI in real time + +## D. Step-by-Step Implementation Guide + +### D.1 Frontend + - Displays the top 10 leaderboard + - Connects to backend using WebSocket (preferred) or polling + - Sends score increment requests + - Applies client-side rate limiting (1 request per 10 seconds) + - Updates UI in real time when receiving new data + +### D.2 Backend API (Stateless) + - Receive score update requests + - Authenticate and authorize users + - Enforce server-side rate limiting (1 update per user every 10 seconds) + - Update score in Redis using atomic operations + - Publish events for asynchronous persistence + - Broadcast leaderboard updates via a pub/sub mechanism, then broadcast with WebSocket + +**Key Design Choices:** + - No locking is required; Redis operations are atomic + - Stateless design allows horizontal scaling + - API does not directly depend on database performance + +## E. Data Storing + +### E.1 Redis (Primary Data Store) + - Stores leaderboard using sorted sets (ZSET) + - Acts as the real-time source of truth + - Strategy: Write-Behind (Asynchronous Persistence) + - Key format: leaderboard:{category} + - Operations: Increment score (ZINCRBY), Fetch top 10 (ZREVRANGE) + +### E.2 PostgreSQL (Persistence Layer) + - Stores durable user score data + - Used for recovery, analytics, and long-term storage + - Updated asynchronously via background workers + +### E.3 Queue / Worker + - Queue receives score update events + - Worker processes events and writes to PostgreSQL + - Supports batching and retry mechanisms + +#### Pros + - Redis is always up-to-date due to write-first design + - Cache misses only occur during cold start or failure recovery + +#### Cons + - Redis can only be scale vertical, else we will need a strategy to sync between redis instance if scale + - PostgreSQL is updated asynchronously, need a strategy to prevent data loss + +## F. Security + - Authenticate all API requests + - Authorize score updates for valid users only + - Rate limiting is enforced on both client and server + - Input validation is applied to all incoming requests + +## G. Infrastructure + +### G.1 API Layer + - Stateless services behind a load balancer + - Scales horizontally based on CPU and request rate + +### G.2 Redis + - Managed service (cluster mode recommended) + - Scales based on memory usage and throughput + +### G.3 PostgreSQL + - Managed database service + - Scales vertically and with read replicas + - Tuned based on IOPS and CPU usage + +### G.4 CDN (Optional) + - Used for serving static frontend assets + - Can cache leaderboard responses with short TTL if slight delay is acceptable + +--- + +## H. Scaling Strategy (AWS preferred) + - API servers scale horizontally with traffic + - Redis scales via sharding when memory or throughput limits are reached + - PostgreSQL scales via increased IOPS and read replicas + - WebSocket layer scales using pub/sub distribution + - Use SNS Fan-out to public the topic after redis update + For update to Postgres, can use lambda as worker + For websocket broadcast, can use event bridge event to trigger the websocket server + +--- + +## I. Failure Handling + +### I.1 Redis Failure + - Rebuild leaderboard from PostgreSQL snapshot or event logs + +### I.2 Queue Failure + - Use durable messaging with retry support + +### I.3 Database Failure + - Retry writes through worker + - Buffer events temporarily until recovery + +--- + +## J. Future Improvements + - Multi-region deployment for global users + - Sharding leaderboard by category + - Time-based leaderboards (daily, weekly resets) + - Snapshot and replay mechanisms + - Load test (k6) and security test (burp suite) \ No newline at end of file diff --git a/src/problem6/flow-diagram.png b/src/problem6/flow-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..93d7388a48f7a65b0a5136d618c3682b1c3b7c0f GIT binary patch literal 59018 zcmb@v2|U#6`v$DlDXC5+QBo%o6DqXGQY0Z1#vEjv$}W`M*jkQMLMcQcJ7bx$4Kh@U z?CX$S%1-v(@ZQgm>U2)O{_p#q&*yy1jBoROzRz+m*L_{L+h>$ynOC!~W?*1omOFJq zg@Iw2Km5=5+e-K(N%R2={8(bCA}hs^P_nHH-Yhpbu6Ue*;kg&n%=s1Ye%0ku8kP(U z8?4a(OPcgK?HCx^Ipt0qSF^+SHaa+}Q7N;722v_g=_iDwRJ^ZSa9!9Grzv>$IiE^O z_Y#xojrVq?wyxL}x-_MF6DCw#zU;)UL($}1t=Og5*v%=UPgjP9ULW0XX_M=z>tV~U zok*w6KFSa9_t7m~U2;!u$UYlyPfbV}{&ZgGOm?Hg*u()LAzR*?y}g&>b+ViAo)uxT z>qLZw-xr>(sHotQt4}peB8R5w-p1cl@a@z~)8(zgh=^cKY7$b&Yy9F)jL26H%LtP9 zmKR>m-#}U8_a84*HjK+ZXJz=?p7{~X07JmAo}S*@Oz&E84*0v`{&ytm5kU2$=WAG+S|uXoGQ&o>@|JUl$@9lBFA=M_trI2@5D5Hi@eZtZK^ zlMtNU`gJT3XGm35YSilLI<1=u>VFWpdnQBuwCGd*lR4nM?Jx-ocyXD}n}JIv4oh=_f+vi+O8J zYZD`C2_|{u)GYg9eL3`tC!Ss@O|T(GJIljr37-ZZA2hAV_1OA2UUqx-c#}h{ZGTg7 zb>By_StGHpo_t8lyw8p_3UfBvO^vP1aB_5VqICE4pv!~({bTSHf`}H`t7CkBT9a?H ztlZQ{rSjwWLmZ|37xN~Z?xvLV@5=TX8=R3Cn(nlAH0ha@PuCIR%9WT&DG@#Z7mEC3nDD77 zf@wqA*=xs+HNLP_{*&YjhTv64Ecbt%Bl_3Nx8k#kii#dd>nA$DvhKpX4-Nk6XsLM$N`1^`LoE+)KYDPAP*J)22iXEwUN)P<>YUm}z~o zg154YX5Dxd&7rw+JiA$y;xJl`XLB$LE^?|$GEk1!CaarBXoq#rsl|5Z@Hq{z+qTQWgBOf{E{-h8_E2cTKNK{Ue`Y6v_d0wz{Xlb=m zJEq+H*D=YE_W8vnRJf0WF|y0JRC9TxT(;-tR`asNw!)E)A<3S5yVjP+V(`?z z3ri~ZM{VxB&YN95=R0%OMPr1Ok`+31bloHGWRn_!_-V&LU&`~-UJ{eH%rg2;D(-pm zbeFP()PqQ!P;#@2g6wvOzk}?CR#9eL1bfDXoJpK>6L~gkz%o>vf497ho0;vv38C42 z(&pL2sRA!r55&(6S<;M$CZ}p2RSH{{*$0 zVs_b{M?W8)z6{pK<}DcG0fOK*QQu0Xql%>x<8jU+gE&HGzD3~vF)LbE$O__gXo-Yy zj8p1oA)iLA$OkSGQl*(AcN3lvT(?j6T%5{RcD}#~UcO8KET5Gzbj_2r0$cinrCb>+UJZU$mL667yK>jDop8P#?h0Zs zn0DDmBYpL_tp_hX^9xH8D>>NYl^gNJO@cE%bO>io8TF-rYvvBcB?ggnyV}O5u_~IO zf?0J>C5vWnWYNa7rtc|XEc;K>J{+nssXtUNtT(jDayz927p^>ib6kz7vj_!%<+`I@wRV_IKKHZKoPo&1owbb(1K z7j1|&yNXrEvAowYg^SIZQ%mZ9jk4vH$;%TKT{WcO&oAaASQ`I)bCqrAlaO+E!u01V zr}1Wk*}P>ixN@|dtI4GlZKm1GV}i5IOk?VPW9YiK5rW;mwdD6&F!`%q!OFFCC357D z1SeA1vrNmRz5MF6?x~GM*-srWSto2fvc~}&lQcG6o>kW`>(v!TD=9xZd?Q$HQfGSPdG^lKSG44< z%_&+Sha-A)%8pFS)%9=VPse);R7orBO0W}f`jeHAaDM-R@G-uouWbUu8D&pW$UDun)>9F; zk6W%LFfLERcVzG)yM18z;B-&Y3%JRc#GgEO*KyRp2=4yegqseu_C6^vd#XZ~&>I(< zqp@nFz23Y#&u#8K9-``77#$@grJ~aOk!jlME^lWXCI{d`j)@YP-v2nomQAK9L$0-jAS!OmLDOUp7y^sC?%deqRCOI<$bU# zrS-h1?Eur1-NTXhUP{&GEE$Pxlg%6BWC`o|o!VJAEZ*%L^DW<=?e+Y>d^vLS58qJe zo8PTSmv&E?up)gva+ac~sHljU`&;MBpCIXq>o{c8jP=!zesJULmX$PeGL#Qz>L6A1 zkJ+okR9KJPv!^jl9Uhr2zF*TA$88=QnZdQ?K=wGL->7!DFlBCbx?by~!;D03!H*%` z;wSU59SSED%^-@e^yE1Dut~hJ=}tB*dY(C{N?MUjxp`@-HLTNhw@!9s_Bo!esT}Im zDYAjyXt9c^c02{F|9adSe+JQHpIG&7S!owt*hbboJ(0J@b)9F%c%~X9N>_5u?CO%# zxwKkxq9fzb=-K{@BQMC3<#{>XBXu=SRp!q)_83_Q9_)L?IJeDWV5erfMZ}lyy~;?^ z(!0OScdth11D698c%@sDtZSLXi+Dy@244n6QtsE}i`gHvD>@u_R4m!KF~3f5sQUfT z711{Za^b({C|5Hn;GfYC5Zdq%c0Op<**@)FA~Aevw70ghN$T$<>C4nEzbPlQ-sb7$ z2d|KJ0X$iV(`1`p#(0*4h<$6@*ycY@XAM~RG&#SZkIELswX?M8dWBO`he|Te=6G#S z2;Mfm(SgbP+Cn-6xdc@-$;+G zhrT8c@;C9jTtroB&RKdSOf+udcevy71C-Fk5H(GrN6|5Ao!78|gt z^)!LpBV!`eeY8QSv`3lT9NTbvg85j~M}$6fYL>G%|5DyuM2#(AC` zW9O0QT`s-5V`;h}7w4Fe52G+xc;7@PlM^qiti~ z$iqXh{l#73oIJDX({xxB_(o@L3P&62)#>gH4vx>TwhkcV3sc6-xA2l-bs;8J#Wy)o%UH(f4`0swOP+db*;5Q?nss*};o8d4|=9I?JhkNAM$!?qk^c%=d7Q7PHR)bie;Z3ZxGeNDP_n<&5f*K&fgk3^0~|A zjqMPvf4u6r^xBH(%9BP@dX?7wedArDtj%Rldd#UVZ8Lt`T}G~O*mRzsYOBqzqPS$> ztgWqWAlNvjGT8R%)0>$mr?Z<$$9ACnOj#MFEtG9;nl^oiXWDzE##Aqq6nki5s)JX3bk(&A1RZr8|ynL;#?Wc|Cnr8 z8L2omR4ABoK4&G$_RO*Fh+ zP2>r7RB@TA47RE_B^y=8X=Kb!^@v=|UE`FUH$GY)>k`{MH#?qjrP_m!m$#fU-V`h2 zzPXEv)1l^Zy7Z3t3By{-=FFSa_Z$+zr6|emJTM<%Y<_XECgD-P6da7sWcX-DNt*X6 z28N6SkUL1v&C>d~ckE685aMdWUD)II9zQk_T(bWPH&_EJJ#b*~-_^81I_5-*HE+(U zdv^W??2k4f)mGXhX3_Y$5+WiayN639$zQQ8(qFz@PBVjf1tle^WRI~<7R=Amc@zS? z@j3nSam`g29>dckbkm9P2YgC1+nECQ)FXO~|9$%VSXRNi>V>U2+H?}Z%E3-!{xij79io2 z(PZDj!OSVqFbfXps?zOwm-(SPy(6d+!t9Xz2RuEaH9CG=l|(Y-u=2uk3DIy`{+@ZZW%=w|I9BpH9MY7f=#1-sNwPrr#-NGQ7Gw(j){5hcU4_{ zcH$#3KHfu9i$X{Va`>DcEdsYKL8~)wfd=T?WVpT9I~>3T7FO1JH<&OhV_2>AvP`T3 zYTDX?TrotVe5vGIrqgfe>vO+s4n>?`N0I+Ua|oWT2w6{_Jb4uSplf`Z<+tU%ZF{=9 zx{NPfN`_>~dG^jXXrdGapgIyZR=su+U^9-dIq$|1iEtZmwfkN0fGu&!9kuCwMh*>+ zhKG)GQ4bdFNr{0Fi? z&*JUIhxGLIbGIFMFe)w4#qwz$`&&KAzVENAd>Bk0e-1b1cZ&C@V=W~ib4Xs>s$51B zCQo9jGwhLMtkB@3V_gcSU56BSa{P0ni0-@fqdhgsw#`oD&y;aI?<D0qUd#99KZp?ksbamR-um28C$&eRpdH@+X z`@Zr-FhAl0FPCYiT@FFdwX#Sc5|))!+v>i0+@B$^HS(Gu$k%3&-hDNVFJnxTUnlFy zk}&rdlkJa3-?Hi$4t>f;K~(3bc~g*T3Yb-x4sEI?V=#AXAHUV{L(Ps!yA=a;1((6b zhGc5~{J+Xs#q;E8N3equ;72LsvK3B4`8-ntIqR&8_UEA-@9D;i@0PDWbc1nSb#}8u zDgGqu7@QlUIodcGqRL}DXuHvOb4v(dW9QzUczE;X%800_`oe{O3o!=5PM?}OPEJnl zm*h$M<#>&Lm_zUzd6d*3=xZ+xHa8D*=i}p30lx)v-p3!~K_cloHC7h#|A)2V%J=j4 zXR~~Fx_aGY_&0C>H}~6NUyX$nTjWaX2|$z&=)T?q->t2!9m{D{>05(K%=+Bb=KG^n zr+>16T(~soD-aA12(}X-AThf}KKH}^S|P`tN=1xmj{d=NGJ*TdhgRbizCQANSed7q z?z?Mcg?Xz&yRQ;i`%fl`&zRgH{n>#+19a>mKz|Xy%QvvDqVs6q=;24_cFa93=S!+N zdR=arj~)rma`JUZguO9XnH^7$b;e#WdsC7)kddBom@IXzdo@;#Q3}TsCgZHEt8RFx z^^W!cQE%YAZ$hgp!PWVsu9<@5AxCbZM_SM0Lf>xZA7#QD#h-DVv_2X1;4-=8iu-Gd zpU=vgrPn%R-#*wJQ|IVXNidn)Px9fBC?(OBQ*ZhSrJHFrPen%HTl zuiovp`SZC@pHX{u&foStJFP@+sIF0$^DdBx7cmKOv~gAo|OGqhh}t7zF(ysutG5O!JWz^_Mg z*)A^enkfZ~SbNQz+Z$8N8Z%Ozl-k2(h(SIPQGYNJ(^*zO!N;=Q??3-U>-TNZY7rJL z*OK=>6*4g}EZfslSJ$w5MXp>M|C)QQ?y(|5Ju&*Y!#O=FGA*a6o0%&DR`Iv78lN3K z&8&q@@R82L^su?ul|7UqKlj81g%jQ4#fMEaL+?|CL@r_X9Br-PBRNasZkEW#bQ!Ko zjOS$S4II6zv!Xxca@LJzj;R!pe(XV``$Plg%7V?#`g>($WTv`fNml)o@j5M)tvWjS zQyEeJS@4nb78DW^YQN_n$2lbTC3sMY#u*zEJ91nW>J4ZPuv%L6sXK*)ALXyndv)Fb zR&GXC`7E4LMe385mW})Gsq-gP7kxCA&e1(_Qk+&CG#w<^1qp?jb1O&295TG7B3C+9z06tM!*?VnoG3kcj3 z!#Ou%WJ&#pb*rh=F7Wox$>9gHvb;yFmH)dm2xg`!bLHtbg_~G5@nh91`+~3ezZ#di znb7Xz5fJ7hZLo4&pBdMe^XkL%OI163NNXEI+1Ud^Nqnh)SsWh_zZJ5Vav+Kt5`%tO z!(3BT#vg+X2{vgsqNyBT!ju&}SW+I4Wc=sA`(u|G?$$a0FqBQR=-ygjy za(mr;6bMHV768WbSUoBn{+j` zikjiwt4xFqZLe|JzY{@8=j&>0`GC|m@JzJCEh^MG$)psCF3ynb8q6`9bv<8EGEUH^FO z0pScel@F~k>cqdlGPYk&ixmJ#^HKZHCo&v$H4pGh8Q4g!4FO zw$J5Y3$}==xQ>W;e395YfwA6>>o17tb;f$K$4h~Y>nPxVUu8|}7-J3QyBtKau$-#s%OW6fb+af-Pxx~8DxdXFle zwAyr&@u#viRFdX~ZD)9JL?a%%t!6iGmag8j{x`#UlS~!XudWH$74}duXhWtk`)`k8 zAFgiPymj`-bF+`ds_G}2k!O+ERk-G*qU4L-%DP+q_rnjw#}uAX&q@LOqNRH~ zQLV`eThUKW@Jx-f(l~ZaLxTX=GUR1Xg&_JWTcsA0Dxt8f-a?@>P$4-{0vr=_)1R7z z6O|&b4)AMW&CQIc4ZCv4h3IG&RQkK$XjV;2)4X;|OPx}ct&+fdR#KKo^q4uqvU)jR z5w;xex3!!+P<6f_n#8Q5XNnD3ITpLFQ67!S?klz@ucw(Pug}1=_6FOl@xyg)?61bn zy3_mtToyfW;T&eGh^&IhIiY1sR(PIyQv&wMHQS*5N{Z6DD*qvZ&w&7Er9KtQ$0oJW z$N5N1v?o{WiG;&;*kocVo?Wboz<0_2LwbmN_oHb~Sfhf{MN2Bh0yTrq#Ph z`)m$B*lg5Y=ELVjkO$cG*o8?*4=y+>MK<^2cC3doRCrWW?DOa4z}lFa#C%f%UOg(W zsE9RIcwU? zfl2!WfK(&zFM4$WWak&;G^XLOb^c1k(RkqysrWe3x~JM`a;QyoZf4l${{8cu*Oj6H z<;eKttuRt&LW)UDRB@U4$k`_ii^y6>pN(G{iimGag)3gn69OUIM zM>ax&PXQbLHSq|+J7?$U{S@j8 z+x|xygP*A+9Z4#cS_?Iz#Jakk;zP|5U1$-fQyy#TEnC|uKeY-W%HoGPimBOFMAux_(2f#pe?pMQJu_ua54*N(l!dwK^2CFJIwbU1RSC+v#$55=i~ zM2U%(Wl+9<({!*d7Pog1?fMVOR`3J16W?M7u}LFf7l)>4W2xnM%7u_G$>x8slG3y{ z59BUTfY8%?$&tY`p{KpFfbhY~`9P^UK^w3-^jyH7LRZ`ZdetHcCfCo$hh^CE!1P#O zEc4cbuvyPZ2yr(BXD`k)1i@xz2~C6^eg~kS%~#h(RvQ4B4Ub4+zcyyT5^q1Z>`-!m z5j<5GKrl_Fw|`(@JU}ep(JLPwa6Gw*$2@*4T3wVw7D4yalUJV63YFXJ+5tC}e zmY3J`X+5NDPf;7?G4G52i^X*t$v0)wM)M=$dnVIgfXzC=P7e9D}_qM!b&BkPkWC5meghLGX3}; zAl}=zZ;cHN&s@3koC4mdtm{{u3^)Lv(HopI#~3*sp8;ZHj-Cc!=+t$$y?uQ*4|jku zRP;^;j+p~cd3?iddcK%~`jZZ$cew9U5XI@(j;B5tT(`Sm*1ZdvS$}X>_DKA!4CVbl zi@IYHIxAMJ$e0-_v~Ib^*zIws>DHv*)-o;(MnRUt`XSz-PsHcp!_F`-3FEOTW4QyF zpMS<^*dVRH9?_CAR7l^k%3{S!YrwJ+!TohdZZ)s?s4TYKdT&d2=5UEBI6||GuHB6; zbF?uVp*~uMIrC2nYneP7k7=ELwC{MBtXH+N%arQM(~dmrBqp9JiI1u&1_;X;1ldQT za-`_K1%8gUA^`0omhGpt9S7gG)2v?Fp4HZlfBjmj(Q&xA8;m~v>OJ$Pm-#68B5R;t z^?dXKKEu_o4jU?t+J_E|=vrHD~J^%<%I0 z4@iy9HI@5!E?j`wMaStrvh~X)jPL7T+O`i*0`eVC8>=sEI#Bn~n)9dShA-sJZRp^A zO*#MHkvDVw9z56xwwC6c4KX1UoyEnqJv=4Y>RkCsECq`TIJp`QXE4vKO^GV? zEA3E~ky#P^;P&5!Q%{O!W*i*~4ZUid;{JmUOm~L=8s7aA4j&tt^bUuhYWgU%e?;L@ z_Ga@K{Wa|I2ON@C%wsmZlU_j^W;#MJf!Q^c3&_vR3gVp!HdB_`QtcSNr5}BG=)7X8r5(UMdX;U`JmG{!&ZneO#$oza!??0RzB0{53 zvX?DF)Z(%avHPacCoTt)p1lU!n2O^kgBafQOI1%Bw};w9>3nDv@)<2yGf8tsFvUdr z*zdoiv;Z4JY`)KzGOno>eT~+e(m1YN0*9@$Za#xMsMNkaCX?#JXGc-b;W^=X8q(M0 zYQM9m0tAV97N-`V6*72(n|ZtWSomHK(ppH|mV2$@J$H`doV%tV!eUtp1ICCchAM_m z=Yqn;AmwDAwf7b#hq^v#p&n1#9{t-|$Kt6KE*#~OvFVA*CO-SE!dFX6+eYMJb6=~v z$;B36v-lJY1O(QQ1QXPs67FBeywd3iozHB8cIs_ABr-GXWjG}wV|z!;fT~z)iP;pL za7M;@pvJtU7?$B+c4`Z*svpPH0q4}pblwAP<&2QkHR@WX8lLY%WbeJKXJ&D&0H>g- zy*;Z@XqQ4t5|F<5v9uPU8`6~xcUnx7owH|V*);0}E%p>cw*909n?q#_`CxNr_4WjB zwTPkUSgThblDf|yjZz~t3c9E|I{`#$GEPry;$t8_0_0W1kx;qb(Er@ip^Og!Y=>2R zW|yWo2R=Kq%dNUQ=Byr{gIR>Im2RQ^?*%7|%PR;mvpz@IoeVDXEBjQFB&|w3W3lPY zg4x;UQu2z|1SdsWZnHO|1Epo8c*B_P9zUX^MV#fj`BEgqDs|$n>G&$|qufS!_;7A3 zQ&NfR^co;_4T*TYL_;O_a`Bqwn|><-;DfjS*1&IC(?$avUf7gT{dk!NEBO=@ahnSP zqpEaZi!vuvRjlyqI zu`Aumj`|r!XcoA~caOF_+cMcBxa}Ty{8~K|7>9z!vVfECHRD$?M;D(4T&Sz!N!j$N zi-8W{cCC@+pmW$mJXW&?$A}5tT`uf=`H9j+>u>TC!-3?iHI#s@Gw=4S*;ayf+jVo~onzP0F823C*2w&l4>JHnI z`vEpuhWdN|{!8vhYogT^aewwb;S(1j?zOXi{+56x#(QOPP%~|Xq$X&OyoF`jNL30% zT%SYrH9qS78}T72hA~zRc0LDb0YZt_m7@b4bO$8sci5E#m}v;W1vxlJEp_6Z&1U@` z_34261+Ik>)Ej?cm7D{;j18yHwsl8hECDGX;@R?w)pqQ|YFK|zaE0ZnzTu*|Fa4Mh z{yu;v+Jmu}nx|*+%N~S}8)G>M1Iq8|h-P)#8Bbs1lIX;ic;Y;2zE4||?TU#}n$AFh zF1FGq?}~<|X4UIy{^IHVH*i)4`r_O!d4Qu4SAt*DWETj?tAxKtk1CQBrUOOG&#tULp>5WP_uIh6buh z{d%>#uChbH8}C9J?H@Vff6OF6f=5V@G}@E+KRp{1-Vu_E9Bnb3vw+VpDk-U+8tnm< zgMg}OCXenS5w25jO3m$E2UK-bJyvA*OZjz^9hf%&QIAIGf!4XIr!E2;0_8v^`Fn_>Be4(m!7 z?QhnJRgX`c=LEnk6?P2AfX1dY|AdsVlaf9PM)Z>NdL-0;7Uy&Q3Y)`W%2BSO-aNbb z9?T8kaby@QEG_#Y1Wd|9W!NR1Gbw8v4KC*1EpL76zIe%H z3#gZ3fE_$XYo0STU-F`FX1ElmsTmMt-_AydJ?m=6Ud4l^gxj{d&1Ru{6%vY(C%wc-p;x7jaBdSJmcA!Nm0OJgv}Zb z(>f&Qp09(PgyWH*q@;@<#jpnmFR7PmF8~KfQIQJy80YKh<)$&3^ z{+eH0rYHD9nsRU9Ci~>PT+e>mbZP;Gkw}#?@KmHB)@V$2E zOJE1Wg=&(Hxu9%Ud6*kJJ3DX@jEs!D!$B%i`%kvsH|m1QNqGf@O2`i)oM}@r2?-@l zo*OUeDJf0h52X#)WDyR;I-N;q6UmEvFv z$yPL&j0IGycnY``8?AeTdb#s{7RuA1B+%jQkU$CyC*Uy#2pf54*!By!-YhH>%s$8I zIB?BVeC*F@M4T1no}U!gSRCG7M#p(FB2p=k2&6S-al%O1bbmG}mXxK5KF2$aV!!(* zGFn9eA_~C2t3d|_>b<DxB&Pzhu{-YW2peS(75S1+F1ORnw0oW&prNXog9Xo4)&@nrV^4sl zWCEB-fRKUb{|&TQK*mkuze1=4*QC`!(MCc~yx0lQ!dS7PQ@?UqT3RIUIct>HA_2=)3)}hj@L5a+#G?3L^_Vo(_L+H@3Nia zMM2z#McynctG!7t&{NIKJgli!Onol1!<=RzFdF(b^YKAObTF;gKr>NSu1M>m_7x_m zcXY|KCH;~oT~;P>nCZ=$K~iAtM3JNLRd#i<7V#o#7Q*d6{8L&L+i zweG1w;ts}zzWl(92G$c0`WgYA_1^Hr$QDkfxy*M-G!RQ_;6aTS<*5L)icWrdU|lZ5 zYV`IFOMtk8O+&)DjCa7n8tJMW&EcFqgXopXP-d9Ewhovi{lxrTFXT`L(wyJYVQG+@PnZ8Kregx6ABXE~>SCoZT z&%WIr=;dT`$zkoI)s0fq4}xd@)-ps%!2&WI*bGaSU=Zwd&`jCG$b;rRYoEG7Qh=X@XnKZNvu7N zB66wCdAk>(<{vTouXKD3$xjcy7<4-DBp-@LWHz8E(l-kLtbv~kBHZaq6{%QxhXtc{ z?p$0zK)|oD{>}VWhz)Efdq#vwh#YLPTMb9UPtxpZ>atvj{YZWuv?ZU zm$qI;NAJBVG80H#?pIb4u(F`Hw|AnE{U{K?j-_l?ymJl;?cG=T+Ha1c*Un`uE9Y5@3MnYd0^d`m34Uq0I-E+gJU*V%LybN``ulQsb_R;YqLG zs)}5qB2Z?MCX}4qJke4%%^}h#d}N_=_@_>RJ#(ddO9|euII02b_cu(h)2XTEx_K`BCKf-uo=k$ z!DN{!)=$(v3*PfxVWr=W-eQJW=gcIhJ4lp^U!r+S%b}SfSHygEZfpo=g~z zne<0c)43^Md#<*4uu=?3il1r`I7E_wjNUL|ma!OX_zd5T#uXTH;P&8&#v@869 zRbNU?HEP&q>s$+ z97X%s)zS_>41BsosKS*MAKg4VMiy; zl`|leN&jkaepI`K+uA_b4&95>V_uWh#2N@a;oSaCCyEi@9t*34mgaQsQ?&N_$mj9Gx=@(+iGh36nwpB z`mu!c|H41F9Jm3MiTxLIPkBSlxYsm)|2%WK9QdlMdVT!-qGD8|_;`3^fiiu&XL`RD z`;2_CDarW!yGt~iTHcUrLa|xu%FKLa57SwQ65__PyC6m zf;aZq)SeK9BP{|YFbeRJ3BXStg_N+~?L=*0a~{x-d9RU3@Z;--`_iZ4>nDtJ45w_c zSnMjo2IG*EYm3iNd&+T}qcZUkcSCk*(bBwmWf_Bq*ne9tC4KSQ^;N2B>7vqXM63@N z1&7f)g$ZWzxPt%}7Nd!{t4pu>v*TGEIiu-RAbA7}tuMR(s^3#3WADt45WB?S_YPDn z?(GaG9|Zq@B5O9troVpOpvwkhV1*ce*j$yrVrU(EeBwK&q|LKgEqQnTHoL;?Z;>qN z*Z|y*cXfhWMfQw1&34x7_X8g@Wb}I2E*JH(hhbWslN{V*w<+MbFvxb&tHg!|h?9=| zB?{M+C27e@VuL59*V`Gg@3FMBw0^yc$1ZDp129`{k+ZuDH56g{p-;;jr0VTctV}LR zNo;^BiIqKA_4$-Vj%$`&W}}2Q1!5YQd4Rj4tD)wjCGRtp{K;VKw~)(D-pUjigL2J> z>OUD6p2_|*yGtG&?*C#Mq$s(b92mKPL*_vg{v-NynX({kF5cUOK$|+FfCGAW5EC4E z#{AfF`9;yS6ilTOLyU$n$OiXlLEIq{@OpxV7O->MKQ6!P+SI_|YD zC}g~2YQQO4=X3i-LkNQ?^OQy-ZEGqPWhw1N{u`~^4pdJXdtb`-Qe3pc-zWJftAu_A z4FXJb$sZ2p0m^;atq>Kmqfi0VT33}~Aso%7^_d?XRW)P;{|?-Cx2Rn3cHu}(j522q zSp%olrVz(8gBoN0Uw#QP1OnT5lkbyrJ-6(a8gH=lq6fb(koG=84U6pp5Bm8Yxoqur zG4ueoRq@ZynL@amk6Lb&oxQm(S^E=z^4z$~oZkq!3=hvX1p?RvsMES@U4(#0Wx?N; zn3p^`GBsK15|m6X3%ZiaCME)ztkoW<>Sknur{-zoPgYd+2oyHjpo|uuvzQ6oF0a57LXk^NnjviXQFv4o6fQEsLTB zrhrAE3eP_bR_(6-YhoYo3JF_xt0ALu?E|M%M^xEC2#4&4bm<54YpS!fh(8(fQWMyfu!EEy z?Yl-_bi@;|`}2iOJZ1S7WGG4@Q+q@%voP5US&lpyr>Rluk}W)Ro?~!KDUtNQIvHeg&Wz-mn4Q!Eg+RR3e5` zdr&(l1~X*u>Ae8fZ(RH>`o*oSI_m1`pkVL)%JQ8odT8e|yBd|~H+75H^!_PV0h}bW z#iv7UmcH}*f`k=G5FaHVR>eHEWjp1T*Q?R3gu z&^@F@0z~NF-T8<&7fg#5f?PmBJ~G)6T-ZOZ;EgmmijNP?TaLC ztFoVKEXss{@g5`qn;%5ls@_Oi1ZhxDplwt6z=xbZU5bPCE%Kmq5j37sK2i_mT9$p?cnxzXk^w4vE6Mx~)r1$-E?{NF!_S$;yi}Q`2x}jr;dc5XB_@5G0g2Us3)`|@r zLnMbL<4Ayc+7FgjgG9}KR!pwDI{q=25z;Orh&$yX2{H#P^57KHWE|7gTdus3SmcC7Tv9w~1?P~DAn5`Q9`4zP9-AbdJ?(xhqV()FX0UHs(2yEWbNlr0Au z;dp%8IizZm{otiXfSHd%+D(5fAMoU``mX?IpZbqx*w-O52lS8v;-TzI=$`|_(5n#qRugB*wC zKz{oY!3SKtV3uJNs&HvSTI*^gcpN)eW`?+}$kahtfmCa!RM56d7_zE0s*LOko|}o< zEQr5kzNGK->~wz(pd67*f|+GautDW+eW3?i%d_I`&d2swuJAr?WE3Ni*0L0lL%DX| zJpI)D=-``;SPhMsj0{l+rc>JdqIJb$X=K6GRI!Iwe{rhnAQ<})R(7^)kDlk**J zpgmQomcBM>vK7?P10ouAQ&WEF-QM_rP=SATmld+=4E)`E^S!oOK^TwB^n9-^Xi7o1 zmh|2|s~4^S?)Ksp^9>@26H2+LlQ{9+GSgSGL zs@xi<#98}rKdm3>st|qrgJA@2MZai^oQj;>?ZvnorPZZwbM&bcE3EcUqRKJjc2FD5`elP)Z#Z~Ip&NFQ)T1+g~h#0_?X zbrKFL*b}VT1vmr4iNF6`rUs&bq#7F>BxFOeeFmg)_OObes_YBToLEtkn?#U4X$DuawuMYZ3d29;^A-XYb z+I}`N`l;bfzGn9=W{J768MWAwva5AgZ}$($Ykp$M-<!l5ldgmBbju zuEck-PhMf1T-~FL?QTB2a;|cR8u89S{3>Smw0Q}njAqq{5CC6gGj#zLk39vE=)@;v z4RdhTyAhEX_tJ+!Z1F9(G+=&Zi4`C(>A;p|o zHjRz3NVKLNsS=-P{-acOr2qV<$-A>nAhUFHnTr&Arjm1E?KBF6PC>gn)i~0_hY$5l z@&{x{sZOXw1d>{CJ6cJUu^IXHVLcLe4ldInBHYn!j$}mFnjjX&RG?mfg+V3DA>J^Z z`1T1}z@R*3NNF9jfF(xQvQxfzV7hI*w5-DUV-ESQXQ3)JXN+)bG7Dw@ZwMH9uXhi+ ztN*^4q|!AS8T$l4ItgXj5})r_I>6}i^4q?aWBjtIyL52U-46u>aXVKs-^Dcj?PuAh zYT4LrjCCRJF2xfGRFkgW$n%MEfB<0M*b7v49>0IXDY;I0SJu&83ijUeJZt>${yU+E z1RH6OqqQwOglfD<+)2zi$H*adMv~_gXTpJOH^e!^hgiF$8yDZ(K9i0ZOPn0W_8sih zwGtJ5W7_LxXl-L?lFDOEbw-TqSt)h&x7?e7&UiDAz@%#8;$BMS13KU7zWd2sqsU$5WHtNd|SLWT$Dxrm|2 zx?n47!4@D0t*Lx>P`mhU)rd)qiYY~k9N}xE80hrG52Tq@ z#vVCm8UtX%@qR>77ox~e`f>dUjF|PKO;a=@MB&0p+BpvJMXvtDxk+pexNIth;_J7N z#AMc%*fjG|s|}1=%z|a1+;KMiQhlo8^DL-0)?VUg%j%@2B5V%zPpNx;QFdWhAd>FW zT7rYi+i6E=Fi|<{5W-AU(+UoWb2K^9t*)?65tkQ`RkZJY0H04@X5toSW&KHGkfP?` zW~9h>gEWrrvJ%-pbu_0tC3#P%-$!hv?tPIRt-V!l2`Wkgzv;Yv!jfTq$ja5K%@V&W zGW@8l$(c%Q(Uoh_jH{_`37!X?m=E-`DXy8FwU`dY)uS;A5>ooy@uu{*-YKYWs3Rkt z-edpqkKhaJ8I9CTmuGr>l*F=v@+3E}haq{)a(IOjf6#s!{RpGDmKDCUE8TS)9*s%mGF)igdz^=PsWo}fPE zUANcgkLI}=V$1Y4>xQB-h8HI=J<{Y#B|r59vy5(5_Gg}ti82qq=pmPJAU$L}Wp4kj zD#?*Hi_z-BKohn4)*CJb$+|vq&&g?_=$i$kLf;P&^_!QKd6%5+JUrhlomV ze41cW`Pb`s-L>=6uZ=#UdBjS8z`=kSXWDsO8FYd%j@FfZ`5%D=dAHi7IX)O*1yR&f zs9nIJ9HfQ|BzwY0X9x)FL4^YB5iTPL78fZS3o(EkH#hfK>ZeBwZBL}=W#W{SlmJPW zET`YRB`eNUVC{}_Hk zaM_q?p9JkxOa+(8MM2_P2X7Ix-Fpq1VvLwJ(rOfxmXiIhgSf z@h70|-@ftIW%+wRX@HtkcJ%eY<~uTA?gM!TRM>#zz^|En%1_(IpR$6>qfp?*X+-m< z-(@}Ag|7GLerWch@1SC!C^qLNa}xQgjV<&{Glo82@e&!wF?)MOVHmf&j5Fjb{eNbStenlve;R{ z%z^7oPUG6ptag9*mK|rIH?sA+oo<~`lC&6+yPx0O247AC(z#nyplY|!>%mgOV2On$$Oh+(`>%N zuYi@Ia%S&h>zi`SqqgD6WXDMhW)9IR5UhpaeySn(LOenyXYkVky!A8S;-3P(>l)B< z38NlYc5kP2uW6V#;qA|QD$;=iq>yhH`RmKXpj-c9lji@Th5c{c1;C#iN7cQB&6~u& z&K_OFe;0aTLPXw)8fk^NZU3^Z7V*D-fALHB>i-X03)M?Ler=0@=8CR&Y_X2r3$L%X z&u30w$aLuU^Pc1Dwn9vfZ#pZWOImaNf`hXQ@yQ56)Jnbd93;t+k;Whr1e(jkhb^aH zAT1wKf1#&`q`M*Qig)ifH7yL*#Ls}Z{i1a9aVfp8d) zTBy-Aﳽ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

@uEa-%C!_Bx#=F{GCw5=acyHMH$*#BE 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 literal 0 HcmV?d00001 From 5a2fa8be4467f2d823bce7b882e16d270d031e72 Mon Sep 17 00:00:00 2001 From: thanhncc391 Date: Wed, 18 Mar 2026 16:57:48 +0700 Subject: [PATCH 4/4] feat: patch for problem 6 - leaderboard system add sql schema design add backend interface design add logic flow in the schema design add techstack and expected performance in the readme Co-authored-by: Thanh Nguyen --- src/problem6/README.md | 67 +++++++++++++++++++++++++----- src/problem6/backend.interface.ts | 47 +++++++++++++++++++++ src/problem6/flow-diagram.png | Bin 59018 -> 82888 bytes src/problem6/schema.sql | 34 +++++++++++++++ 4 files changed, 138 insertions(+), 10 deletions(-) create mode 100644 src/problem6/backend.interface.ts create mode 100644 src/problem6/schema.sql diff --git a/src/problem6/README.md b/src/problem6/README.md index 199ced864..33e0a2112 100644 --- a/src/problem6/README.md +++ b/src/problem6/README.md @@ -1,6 +1,50 @@ # Problem 6 - Scoreboard System Specification +### Software Requirements + +1. We have a website with a score board, which shows the top 10 user’s scores. +2. We want live update of the score board. +3. User can do an action (which we do not need to care what the action is), completing this action will increase the user’s score. +4. Upon completion the action will dispatch an API call to the application server to update the score. +5. We want to prevent malicious users from increasing scores without authorization. + +### Idea + +With the current implementation below, the CCU numbers will mostly base on the scale for the websocket service. + +We will try to distribute the event through a pub/sub model, so its can reduce the load needed to websocket service. + +Roughly this can handle 10,000 concurrent users per service instance (without scaling), assuming typical server specs: + +- 2–4 vCPUs +- 4–8 GB RAM +- Optimized Node.js WebSocket server (e.g., ws or socket.io) +- Proper OS/network tuning (file descriptors, keepalive, etc.) + +Actual capacity may vary based on message frequency, code efficiency, and network conditions. + +### Techstack + +**Backend:** +- Node.js (Express or Fastify for API service) for fast iops operation +- Redis (real-time data store, Pub/Sub) +- PostgreSQL (durable storage) +- WebSocket (ws or socket.io for real-time updates) +- AWS SQS/SNS/EventBridge (for event-driven communication) +- Docker (containerization) + +**Frontend:** +- React.js (leaderboard UI) +- WebSocket client (native or socket.io-client) +- Axios or Fetch API (for HTTP requests) + +**Infrastructure/DevOps:** +- AWS (EC2, Fargate, Elasticache for Redis, RDS for PostgreSQL, SQS/SNS/EventBridge) +- Nginx (reverse proxy, load balancing) +- Terraform or AWS CDK (infrastructure as code) +- GitHub Actions (CI/CD) + ## A. Functional Requirements - Display the top 10 users’ scores - Support real-time updates for all connected users @@ -42,8 +86,8 @@ - Displays the top 10 leaderboard - Connects to backend using WebSocket (preferred) or polling - Sends score increment requests - - Applies client-side rate limiting (1 request per 10 seconds) - - Updates UI in real time when receiving new data + - Applies client-side rate limiting (1 request per 10 seconds per user) + - Updates UI in real time when receiving new data if changed ### D.2 Backend API (Stateless) - Receive score update requests @@ -52,6 +96,7 @@ - Update score in Redis using atomic operations - Publish events for asynchronous persistence - Broadcast leaderboard updates via a pub/sub mechanism, then broadcast with WebSocket + - Implemented with microservice: api service, postgres worker service and websocket service **Key Design Choices:** - No locking is required; Redis operations are atomic @@ -80,22 +125,24 @@ #### Pros - Redis is always up-to-date due to write-first design - Cache misses only occur during cold start or failure recovery + - Data is backup into Postgres in case of restart or Redis crashed #### Cons - Redis can only be scale vertical, else we will need a strategy to sync between redis instance if scale - - PostgreSQL is updated asynchronously, need a strategy to prevent data loss + - PostgreSQL is updated asynchronously, can cause data loss ## F. Security - Authenticate all API requests - Authorize score updates for valid users only - Rate limiting is enforced on both client and server - - Input validation is applied to all incoming requests + - Input validation is applied to all incoming requests (normally support by library) ## G. Infrastructure ### G.1 API Layer - - Stateless services behind a load balancer - - Scales horizontally based on CPU and request rate + - Stateless services behind a load balancer (for api and websocket server mainly) + - Scales horizontally, normally based on CPU and request rate, number of message base for the websocket + - If scaling is not productive for the realtime category, can use serverless with AWS Fargate ### G.2 Redis - Managed service (cluster mode recommended) @@ -103,11 +150,11 @@ ### G.3 PostgreSQL - Managed database service - - Scales vertically and with read replicas + - Scales vertically and with read replicas (if needed) - Tuned based on IOPS and CPU usage ### G.4 CDN (Optional) - - Used for serving static frontend assets + - Used for serving static frontend assets, serve globally users - Can cache leaderboard responses with short TTL if slight delay is acceptable --- @@ -115,7 +162,7 @@ ## H. Scaling Strategy (AWS preferred) - API servers scale horizontally with traffic - Redis scales via sharding when memory or throughput limits are reached - - PostgreSQL scales via increased IOPS and read replicas + - PostgreSQL scales via increased IOPS throughput and read replicas - WebSocket layer scales using pub/sub distribution - Use SNS Fan-out to public the topic after redis update For update to Postgres, can use lambda as worker @@ -129,7 +176,7 @@ - Rebuild leaderboard from PostgreSQL snapshot or event logs ### I.2 Queue Failure - - Use durable messaging with retry support + - Use durable messaging with retry support (dead letter queue) ### I.3 Database Failure - Retry writes through worker diff --git a/src/problem6/backend.interface.ts b/src/problem6/backend.interface.ts new file mode 100644 index 000000000..ea12c374e --- /dev/null +++ b/src/problem6/backend.interface.ts @@ -0,0 +1,47 @@ +// User authentication and management +interface UserService { + authenticate(username: string, password: string): User | null + getUserById(userId: number): User | null + createUser(username: string, email: string, password: string): User +} + +// Score management +interface ScoreService { + getScore(userId: number): number + incrementScore(userId: number, delta: number): void + getTopNUsers(n: number): Array<{ userId: number, score: number }> +} + +// Event logging for durability and analytics +interface ScoreEventService { + logEvent(userId: number, delta: number, eventType: string): void + getEventsForUser(userId: number): Array +} + +// Leaderboard snapshotting (optional) +interface LeaderboardSnapshotService { + saveSnapshot(data: any): void + getLatestSnapshot(): any +} + +// WebSocket broadcasting +interface WebSocketBroadcastService { + broadcastLeaderboardUpdate(leaderboard: Array<{ userId: number, score: number }>): void + sendUserNotification(userId: number, message: string): void +} + +// Example data types +type User = { + id: number + username: string + email: string + // ...other fields +} + +type ScoreEvent = { + id: number + userId: number + delta: number + eventType: string + createdAt: Date +} \ No newline at end of file diff --git a/src/problem6/flow-diagram.png b/src/problem6/flow-diagram.png index 93d7388a48f7a65b0a5136d618c3682b1c3b7c0f..b8665e6b81be13858c7533e1c8a06ac9298ddb74 100644 GIT binary patch literal 82888 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

URYR|2j4(R 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ﳽ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

@uEa-%C!_Bx#=F{GCw5=acyHMH$*#BE zD0zLB=wfptcTsFhbHSQ2e2QPwt21;gg$oYU86*0HJDnHX4h7Au5nj%8RKR^sSMHxz ztsFnv_b3`({+@mc5J%i9=R z&y2BF3$E@JRGE97`<60|*Lq3AoZYJ91@;2EK^2qtW=FA>GHWvPU~;3Zx=f7N;cwBs@hFF^*????NMjgC;&qVBSuWv9*XX@T0FvXyBQixC7Aj`XEbHYjU1oY@saN#XbI}ZVZIm|?r}oUQwuj^| z4q8_-WzH8vQ;n$>0pd0prNGm@n5%tK2z8}J*5#LPVj!d&| zXwTU5;$?0#8T=tQz2!<~-#flH?NrpYe%KsceRkE2#`_Fb7~B#2`kI_`V^iHj z)c5UGZ_BRK&zt2kev_@4$%q8t`{k7CmBw7)D}M z6$gMJ>dMB;AfoJx7ME^HKCzT-I~ns9pFK4~W=lW#X3jk}4|KSZJS*Op+Ttpvr#|+x8qRf1%&c?I^mU<>Vm#&(Qc1S?i zsg~SlQFY9nCJR4xgDyMzo*(m&a2$Jq&;}(n?}Nl7TROWRF2XCJxXD?^a?Yk>GDp69 zy5t1;=H=^`7K`DQ+?Kr9AloT?bIpy#qJag|$|MQbkm)fZDHC_d;_av@F-~pG|BP}0 zn*r>|vdl`cY71YQYp*F6UbWG_(N--voh*&b$}fpYR~SV(q1~cl$lZ%l&NDjG6t^+B z8Qb#QH`)Eh9yVnCs@C99u8pjzX;#-NAAt<-4#Vne#p61S8|J93PP?aTM@hw+l5Pc1VKNb?TWaEf`Sq1(`rBT zb`WWUG|6lVklNmMB+0WF4How7A4q45juM@Xhti26^e+K5-?OtA<@<~(aw#sv$ALyI zu;9TR`3N}9FVPR0WV+a#NaOFhw4(q_ddkO8F*Lb_w1G`l>E;7biIlE}F;c)IHt`A?j4o)V7Z>;TLe^Et8QgZz&Ti2pN2S0DvG61Q zS(rfrjvGsx8%`4AFZ;5lrw^^nH=ZnSL;l^MB)pMNzND4iZmEbw2AesQX>HCQC*(Bb zL#*Fed!Ui?szc?%`#81EJD>NO7o*&&4JxuUS8JAs&)r;+-E<;S3AA*1nV;PDo^_MaYw6;_RW#y`i=#+#k^y?=7OftRJ3g&8M7lBBs^UmF+B?^ z-vTv$xpMK7)M=fRt%Hz4K0aI$1ID4I-Q;8|+ylIuu1vL$7FdvtOc5+;U{6 zO^+NBw(Ux7NzG9zdjdN;ljBbK;Ojbk6$*B>g7xB-PwzA8?z>?$!f9>2O}Qv<>iPc= z=!{0HIS@i4wiYt-$}q8aD2l)jnKP1wmrTQ9{aS zV!mxDTBnVt9ShR^0A69k1^rQS3sdswa`YEr&VJTDWkhr_Wb)}DF8EABBiSiq-+24U z3{F1`ZZ)->#Mf&N8g2Oy6!+c8ked2*zW8b;;rE|B7r_#& znYt57{z!Q>5^!v83KX5TR9@L4!&N-=IcVtP$zrc3T6{Kfq~wF^g-z0vMLrTVt=;6& z=Hbkqid%-R9hj2U@ATcoD)@W7G)eDecF@(BxsydJgF35IR6HNhgTp({A#`=wMtvbW z1#fp2#L|j;mlxEQHq06$Ywiio*o8 zN@^TN>%OY&cEpjZez{jU48EW^_i703o^~??PT4i8P!zITrIUG}wRjVf<>T}x$v?ji z7N3cdA^XvMGB2xSG5;;aGokb+CBw}_1*|sg&)(%d%#-mDR@R1f@ZseJl6?H0WXYkH zz}BwxuBmT-kO#;yq&(6^{EyHQaTMhBS zAk0EIx*%R{giHtNoYsn0Dv!+ZYi^h}c73a?reap?n$rkl zuvh-Wp0AxEu(8%R2hHm_31#-kHp{`Q{D{3PE^ir%mYFAcw%WBBt}{{5Yhq;_vM1)| z{xy~{r!`qk=`6A&bU7}&{8Dm^SPq4(?SAj3{HJYxU2FcXb9j7-+(UslTw4DOo3A(Q zMn>;)+KydiI!>tFx)9^Q&*tm+2(`XtyLk6b)RsZ#Y)fY)MbwK0OXa+W1aY*N+y>PPcVS-Azw?hmQ zBW$@QUm}3~%E}BOQId1m#`9=gnJu9$-i-;!TXtRwQjTnwsW7s+rM$Aak6_qdbwyEg3+T)ax9 zZzT4B$yJ67o*mH#mCn}`Y)F0_H1H_EIC9SCj(**BwiC1$)bz7cv=mm+p?PlJ^a<8~ z9>K8)4EsV+Vq{b_c0O16`>JQv;8N`A&EoP^k&SNLt1I)^t?7^Js+}RCG1f_;=QAKa8D&X0wPCmJB@L zfErAM)>^z3rnV{BSRnVv3C|*CmA@U^8?LWVYw741z>}f8q45$B5sile*D4k?>0l)? z#{jEk3eMb};3j)B8SH6)+rvO}ME^#bK()QB)irZ$Cx+U|bEak&h`^|CHE)o#Q1p?FRUcv(xtOPMmmLLE`F0M5vz?0>o=eQ~*9S+?QRj}p$x z(OX?alP>k_nE@)nM_Sks5>TOWpwO0LvBR%&L$mWVB-z@su&POrJMZ&24|oRTQGmIM zXRTWkLG+wjdvhI%YEaC=#WdFlnhldFnm}^O3D8gdh-Gf=*uEzQckgfQO$+gE4w^7n z&Rr5=9JCQAnLkFn`-P@;WjJC7mpD7;I2J3Pj5V+?0x+Ltl`4YOMCVUmHQL=okv0dn z$6&fhPoLIgoW1yhfi+cul!P>3h# zZ^G(7&LqS+Qx9FAg8VDqv#6oXo9+m+><#T%_9*FHH1RFMYIi8dfBtWC}({I!<@{#zeP*1fsUqM!kj z7Ka)Wq{#um8@)cX$6x)?A$$6^BV>W;-1aDMN;wx7D1gW*3;EOkEv48YYaA39{lj@P zpy}*wi9@?6XF!ZM+~wO%Bf2xqFklbxSh90Z_H)s%p*r&A<!jeEzvr}*wte1b`$x~(EzUf)DnBgbe_N9IcBP%2=kM4T2!Ue^pT}+OTY#k8 z!eG&U{W7RzJI1lbcqAb$tp4Tqs+sO6r|7qPMRKltC^dVk?opyU8~g+2Th|C18r$4R zoT1vlUuF@!u63XDo4>%#RWC-1*~O8~;V|pWsU!?tB{$()2Z?GpJJ0o!&T!;hyKRhA z1bKfz(=h9~%p8IK^!{A!OKT24GS_*xCO?%EwGTx&J*PuOm(XA(7`iWMsvfd;Roy-sEf(%l*KZf!Ac z`NJ;=R#ve}GCQ@Djs-?r^E<1Zr>aZv9k0NZQH=6eU%Tx4q^XE5X5&$&xh`r?X^dg8 zNaO6+h8rkr`Z&O5n0R-@jU~EKOc8G0L%O0VaeGq*=Faz8;#HGCoh-6Max9q8eG(?bql)|BL z2>@>j+LPG9gFXDiz(@2wryd3%vxH|kqX{H{ zc@Yyh;uN0Lw#@*2r4vB_rKlDu_LgI|=>Me!{MUgbQQ~0n{|Yux$&^S-Us!j(b+!`cd{bh^(AN_0T;Rr?IH|QgQWM%n>gJPP7 z8`O`%CH~*u4`Tcv1|<-D{J#DWxsHEpOR%q-LjDg8JjCBWvEL35`EH+W_}63pKcGax z!O)$ic}WENU1t0SBmCpRAxhRqmnQ?Er>wl1qpSywUHt#Bfc#&aet)w`K4~TgE8p*O zC=6xT!%`H|?g_XbPs@q1nk8lYcSpq60dGKDBR*`nVFY!E-1tv*CY%Pq#IZjo|1*ho zza=a3^T^}-w?E?l7cC8@57ljnx5!@gNBRoO5)upjX5#$oKtSZ3ps>M!3T1HceQz3w z$Ntd^6IqnKtpDf6)*@|?wA#-mBQy2C8|0zo>z^m<0^4gGYy!1^_5r#pAlyRiwRemq z*Z)(ak;(!DjRwzHIPRmFmmEeFf$D<re@g46oC!h0-f*BtR zgC&L$oqG>cvYU_icZ6OARllVs1RYn< zps=b^HP(UVwXL9%d%DkX5*H7Q{;28ASIx?Rjd#|@^4`ezCuDQ&3&EBXWQCN5t>k*x41%Xpc zMiZy#j~}=*5J4DJ6D^$QUxs!un55+&k1|m~>jI+v=?nJ3+TZQC zDg)gk6ggzCOz`p1*=|#$I|lLjz4^Mcepo<G<3Uv8X#ok?HpcbfOM z{d5{bVnBYTk2D;It~;4pwQv7iXWeFxe%y3bsBuTS{9b~PbCD#RZrKfJC+qNic|`d5 zbR*ZAxgN;xty#m(3T5yKF!c=Z`DNSe@q7XD>i$x7ZkNV+`x*FiMc#swKZNkZIpWhm&8jPJ{q$W%dHRCW16_XAK&sP+IKh81%eil{pQU{ zXgvhoP!EKG8zO{t%uMC_e4L$QPyO1h=g0OOM)Xx|2KDm+JBuW!dito{SuS6`JU*BH zAB-8=3O}i>|8Z?YT5W&di_fV*oDyplKR9Po%WuNS1I2bmr{;yfdUk+t8|kzAPlUn# zQuuadb3D`pVHTjq>H>9)B#Y)lA=n}+a$0nyog8*0?t&2J;@tSJ<2`8SfH#eWI`Ldj zy=bI8Xz)Z``1u*-(Km_DE!jD;>n~t;_|)vA_qfcxRCoB$4-cW6&hW^UoZ%8F*%-UC zCigCT*Va(Ha4&qACs-w!eBmcYNZw(w84c7blH!;tntCS*NOpgEq#Vj_?> zO^8b6r>SIxdY7B*^yx_me6TLKH1Xhoxj0^O4o4iYZx$WW!c!1VKZZ0E($-f8!=hwg zJYW6M+*g8YRZzU(+QtGcPXEAqjc9&KrWgowB7rPD)*Katj0OLm%6-pA0s&DlILj1M z)sd3WAq39331a2s1)R0y!a{B&n*b;BRwOrr&>GjyOIuA?4p9bOn;Va)7G)`tfwr?9 z;wQ7p#bApdlZM{5^-s4_@Q}o2RyRc=dYrrWMyNJCkFWiOtOct+ zDwD#`KyZ*l^nFF0^A5ZbR`ah{M^dLlx zvp$>#*U0>D^8WZng1~YSvfOM6(I_<80W^uZ_qDGkBV}%!WA7f%YUAkL{wv#(&`!Z^ zle)VzXurnlZvjk5gMeKG~ zvH#NU1coiRGpn&XXqAGMy*|)1#wT()4=>abi||u7oS~=JXE=A@f_lO|61wbcjc0FY z=SK5IUYF!QGot+NBYT4BiN)h-GU*VU9vRcSh7S{j2#+Y9P_%HRKYE1lv?;^q`%dCt zaiT7y`G4E0E;84h4-V$iRi_UY8^lcH`I$9^Ne6u2Rw|+t0WOz#P=Fi6XrbRcGn^_`FNz}|odSBQM;Bu?@dcL-#D#>xR zh1(o;6=P%li- zs?iScx2-wa=l{94l&#&sz1{e+fjc|fN$G`QcowCtQNoq<7a|9xdk<43pHWP1da0kG zJ(v;HwWZh*e1kS4goe%N5|#4SokHE)m-BVH9Xh0Nh57069UE(Eo2ohu1v1)?qu$Rf zq3>q;^@uY06&KN!wN^oCaBfSFQHh&Q9AAH)^ql??i8gu zJHv%qy*BD5Oa|+UH_BxTbf`kY>b@VwktJb!+9ylERi$Zg1LvLkD%x6iYuZ{6xp_QOP>GBih%4P;F8k5-Ax`kAw5&mF0f zWR%8zck5>0RimzJ*jZh+>`rA3oePo2s_xRiIe=ys6)dXdjw$2eQt-#?>plDK71s~- zzL;6rqL?Sn)3Fj1Awq!gE2 zy-x-s!Y!|~Y2pUga4Ci9{6K8O1-pjH>7#}?&;uDO!IhO%-DF=n>H5CtxVQ%n%AKRT z{$=O29Mh4Q&C-Qzj{PTR0sY`Z8amTe@QzU z2DOIiS@#?ZL3m#gK_GZCiDhp)|4crLm1*;?I>S5d0^J*ob_Vo~-$NQix!GmzsK`<~ zOf$rVF?UbN9JP8XWvRy8(EB{^V4h9}r+os^OONA1fx5i%p))J0EJ5K<9OjM`xQ$wx zoDw)CZ7No^FsDA~_qkgORr!(2n#d&^Hb|SSS4zUd9`b#a#_3rfM0>PQD!Hb23+^U% zlN&Mxi)YKx(X!yE&XGUfzwYVLu}$7`bS@DSx`)6hK%t^yruPcD-%QK)d{mpt3>4=A zS+r@$uk9s0u~SpJEX1A7ixS3-icn)+AnXxeYc=;XH=Ozor$l?PPV7ZKW%%Ei!v}wwO7_nn4OT3Bwkalh?m;2 zed-Q6n0_*SP~|x;8aK>I$H-X3^>#?CMdtb|JLq)VUdMBmkY~)b2PR<2$&+1Qn{Nu&L6MTDjfN=I2 zD$iajW<=o?y7IB=FK33D$J8rE4sm?s7Tdby@Y3=+Zw9R?AN?`nWA_Es1D; zUXF<$8tPU`Q|!N^$C#F9c_SUuk;B}-bdj!vEr*z<+`Ihe0z{<>xAiCUA*a7-Liy&*c8eP4{X`^jU=ti#Mp`1lr0&N9mi9vY?x`DJ?@e?)l;xk zw6#4t%VCNGxoTErM?!|VJ3V)%X{nXx z9u|FkG~&k^gWkDD;~X!Iia(Sx{iOV9?b=e@`;eY9#%Z}*+^8SDLzZ^v2wwU7mqdxo zGEst^ns36Q9C(DumT0bZVj5-7C)0Nh+c;oWy-YjKwQictI$r;!31D&%juv*R2JtC}tduUEL)5VoF_l&pMoHR{_XbO!hcQXaIT84x{ z3Cg`e9*x`8D7+R}8W=EP-}vZgLrmyhi?K(#)mF2Qi>vvjbzR8k7q@!{Z3}7CqIs)O ze71GhzVjM(`MOOUPnnoazHZJqZai1<#gXrYG56%c9UJ3_0^jO}^m%)^_1ktt+snxq zY7)zAhp?pPp@#2KHu`ErYg)-=PgS-aik&%-Nvm>D9dEGL`shXDW4ku%m(FUPlEx&2 ze8980_IxDh4oP=%Q`>oRzaK@$4SHD(V(LLcPk7pr)r1~bn@gW+KA^83U_5-w!johb zRrg$*F#ZfSIoU3u=|VoPpN_&@bNSc2d%F6*W{QzmLlJfz7PJS6g!Z_IK~|HPLgRGG z2@AtiE*>=T_b4p^0{oGXyc9Q{;T?QYDeR+Tx${#wUB;2+9P&fg3>}07^Gj( zPS?IDZ9Pv`3Ow-8Zu!7$a8%|czoSwsEHz~`g{zUv^?QYB_8mPXd3s{IZ>py}U2h!3 zz}ushK1wl`lUz1(lJ61j(XV17@c1H7R#(Wp2lI|v&-eM_E;6XveIw&HQX6t2@Uo0k zLRX9*AxSN{Ko+q4exosqbAeoM`}oFenA-3zIS&oZ^`L^{_w|}M90v){ggyPT!$xJg z@o-1Ia4Cm)vvG9Q#<1GxB9Xe|{cHDi_dj)o&6M)>>=E?c0S&FWQ12;o?tEb!d)9ZF zX{Oa0S~-|UI!Dy*jD&|VQMyJ2qI+6o=lfw*4?`ahy!HmAk{fp8m&V1Z5AU?uRQ!?B*TS}DgMKSkGpp9a*c7vYs?<A1@=4(kl3(qqq4BOH#mdt1l?o@w zBM+eNE*FteQ4s{xzU(tDAOso0$p4 z%xZS^7rF&Hmu}_k9=nL+u-2rk{e0>PwtYnQjAQ+Q!c0kucX?~8m5lPORyUb)k8EZz z5vw~^U5zGKC7YkDc)6~5V`tcEuKO-$Gcqge6esq7(RH)B)KZLIy~OI;yXss6?$oBw z$MvcQy*drlmdRFaPxxUbu;mmt^u-G++!VQHl=3AzV%&Wu{25W9yoX;kX z*>IOE*3F35Y{T7uw0dN}eQ4(F2VF;TN1q>dDH~K$S23h>>{reb>^%G4ti}3Sf8mOQ zWB2tmQIhE)0)f@7tGcYOjziOQZ*dEemu{?OrbU_@^7YsHv<1d1t}c)=RnBl!e$njq zWP2|guXxnR{qgvq>(}X+UCCyPlM&_N6zcgF*4COJS?9QXO%alSZct5E2ik#qpW5y+ z`Suu#^O6Di?O;W)3J^UjP~>j3qlNxmR?N;(UdjAQt#_RdFhFpV}*NN3D2pN~2Po%jThF{8cPDYVE4wfY> zob)wIoCuWb2{!12N17^2(crVj8F=%|v_8P7G~RFqOg(b)wkI zzQs*A{CZw^0RaHI^5(%5MT)XcR>vzwFO0q&=f2fcq@iV*M1AIt08gV#?(Wi~2Ps`o ze0oBSt`|s{GaaRe9*Qh!23Y+~HQ9C@>$2n&_bFTISVF6~8C91$tQ_rug2y~_qz#q(ffw|xvfbm{UEmZ);W&q zgMg%OhE8P z-zw6{i069DJ*DL8p~R5R40lGxZBFGw?MHg=G4`!-J`I0#z+?1=LZ5QIL!vi+p0BhE z>FU_$2%q<9CPTd2VE3p3p!`xb-|oq!r6pK3v5m1Oq&IlBW;4!QSH~fu=6soFKB2Mv zt=0zCyUKxs3NLcjR9sKiPGzqivVuI%Y$k+fHY_@0m+l!73W8 zV6}8KaSa?g4@o(Bn^BK`>5@2GI74|ezc}s=A%{Z@Yq`y$dw|}ySXgH$8`%u8-aN}&9f1YRc2a=Qs%J|r*FLkE=yr0B`QGnpSKzTp-wpn z7G8hVC=c|uo7*{t16G9t_kAcYS*`nD9kEkfUu{9p#H2kgGL}bWXhc~(Eci0Y^P_N$ zGBp9azVDrqmA(!asBMS#k&$uuoO#QqyBzjw$=%5$~q zU0q%({Qj7&a3{X1%E}QazVYkC?g}o3Utqo^+Zo@m!g2)!Az&W<9)17 zuAKc^+H~6W`o!euS;c1*spm<8jj~d;`Wzg@SI=bjJbx2>-8&-#0+GB0&EpGcLM1D9 z=Jf3mf=ybdRMLyN18PyQf0;sRa(e5XeX7Pox7|TZBvV#A?N`N$x`1z^>^iH88qiLj z@MvO(eP<#gKbH!D-4(y3{J3k+6Yr1NY0VWU6ZnvaB!;hYPlr8!th7;=LN}wyy`V^H zn?gAL?D4>mM-Tp%hPL+PTSC9{CT{j$LOi;c3M*e6;R>tyIRES{tPYOf=*kTR z1$Xdpg9QZzThThV+>;I^_ud*?&*SVN~w zb9L|sW>e~}B{a?}>Lnf)@W9DdnI07lRd*#7C_4JZEKw8^ZLZWr9QYOO@8>oYsNd-* zHk#%eOUr~D@~*z}1-&*cS5U3_8C~eG)Z^(HNeEYP^tD9br3=&Eb?Hp0@37@lsPPn? zTel)l5Vltk-7c@DlE$@Rn8n%3gwGc87c@}wIv^4q>NkhC~?a`i?X zk5tk8&~zq24*sKe+Sr4Sx#c|x=a;GsyE&358N$7mzMjfdeP>^&BVjQRWO<5Jh0S+s z&NN?#J;vb5M=n&L+iUK5a>n$Yu=&UOF$+gR@sfIYs2&P-4DBZ&Pj}Y&Kc0Uk9wQLe zN+R#x`R=n-+{8`IRKN8oB#$}m_+;W>Ba(ny>I~EFA&}y$sCImU%KqGwpt^Mji$8Z< z$x_`QeE9=5D+W&H(?x33AG9zY?S`wlm%Npr<;?u!7X++Nm1aiem?DuBZv2%+CwN7N z<%8yQ^K$c(m6>4VM0%EYYF~LIRK_Hhn}1DuWn?;CP}(c0{?y4gpS1}YDymee)K8rh zy6_lgeQB_mcjZBk^7FT5=;-J^MMVi1cD3Q^n9NlJ`eyH4Ou(e(aW!1(Xbl!7J3-*l1n)-`$G-6bc3M;_X8Sr>|S6BMDu&{4iN5hY0lIM7vO|^d4|*0uiCR zcK!ROKr+%Gmu|tw$G>hpuiOyKCOqqP3}P))4qi9*OX9N^F5qE(8_M{6GvUF#s5Qts zS}3VwX2#mv*H@`S9c&-_a&wolA;v%92)n$K6EBYXR9lS3?Q>5U&*oiNwOP$kMshvS za={lgXN9|)GZ3)R_??@+Q(Ie`3nB{XM~_~>fqm4vWJ{%6b-lQzqfDrn)}(OhKKI`C zcN@_ErRp?Ns)`EVEtrZ81-3fzFiLHUa=bah5Al8V3&q`5TNe#id+lmJRKLZ32j69m8rWkwYThNmg&Gk>Ur>++JfCea7k=5@ z*(%@7C$H@&yHrf;?d1hk^KG1q!oJ6U)O~uh$h}#n{ADQ+fv4X$H)n&swSLfEcGJ<( zcDfO}1Mqw)UT2zR9c}M|6Vf;)9edR4gX=iZdxpVE|Aj3dCEjW?-s4A)9+gHULN71( z5?T{>n%RyGW(^K=#F3ikVWZrglY z(!IXub$(+isw%D=cgtzz@;@Fu5i2`uR;h9bBosb~(a#PRQAG*+krl8PyG>;&-&I)s-e&F6|0%Uzdj{* zk@$_vZhHQ;lP9Hf&vIEEKXSxvV`{XdRI-lDb3icK%g3kk;}7p=x~eC4izfLF5?#MY zq074UgtSOKU52C`cWafFb9U9DV+;7 zeevimE)HXoJbhjX>B`4-CtrMAf0zX4!5q0Bt)LCs#r0@pQU-x;2{)tFp|`(cE)KJ> zy$Qb7-d->FDr*SJjVr*;d+@Lgv2A|GdXy+qWA*Q8HhboOMIO>PA3mHZf2^}VAEIek z#vd6x^RHD7|9MqR<7NQ~mCDAfS(}g1AYg!j^c1wWf9Cj&AZ4b-5U~rI&;eV6SM?48KhW^~`(_j79++@sysf6=MF_OEro~AG9%UMpfAY`q3=6+{PG2Rn zk64Q7H?NM-O67+saG8amlKgP}>5J}^DIaAQ19)S|c%lqeREMAZ+Xyn)zto%@&CW#G zf4fv6=ekN11b@GNJ48@50PlK`uh^ek{ZKC+EBB9|YS-T1WqwwPS^a^&1yKcjy*Yra zx=7fDRFsEdKY$$wzRn|=c9+p=KX38<@3o#IwO)Y1kwUE(zG`s(xm^vzUX6TxxuLDC zZRzb3dDr#m2*`LeG9)1T#H^fq?$%621%qZUl)=-G0s1Qg2R3J%QUJiahM5B zFQqG7(=#$6Er2JpAAggZU&;D9I*P1W{SMz7HF9Ean;l8qfAW8g`oBNJ_&hH!uVGUT zDJ7*pK5IE4&f9=mRhf9RSAkHwT$Tg6sxId3Olx=No zah`(&|Ia)9=Nk2Mqy_&k%fO%OgoA~Q%**WTTgf1)oIOg1f^`o0Gu|d0f$?=gK>1f0 zp99(be?LyxXZN4C=RJ4i1^nZO9!N?emG}SgZ9sFhBZZQ&l^QPPBPT*FPn|l|(%K3^ zQ_Y~W(C?Q3DtVmJ<+1udFF}Jj4~C@py?X~WG&B|gm8S_Pxc}3mZy6l)l}(a+HSk>P zuaR$-g;NTAo71NL6bZL~XfeBqL1Y9-6datuz`%cw?(0GHH*TDy55NPtU=_gODviZW zzTwLdAS>#hNBL*kNSTw8l73D}Aq4TziGl;QiX%0o3Dw?t-wZ&!e2QZ9uThDFD>(8& zmyl78PxN1g?tV=3Q$m3J9Bb)a2*Z&tx8q1C4lyb64HRqTlGukGSpxzBS_cQ2;aT>x zUFuj@d;06fzJEV}BO1g^`ulRAo=k1OHhc0PLmCdR2!r@F$W~{&R_>$u|KmEaf8Xr# z($Xg(U|9k*p4UH~D+H&=mBKw;+8^A(4e*#ha@#(FV3?xQ-R@+OHeGrs1K)@rQsDVv4D?xmsoaa_ZO}G z3D?rqXfI2wx#fWAp8ea4IyqKTgAa1_^gT z$h%Z~IpR}sv8ux{ctd_$AU*Yinq_2SBEFj&Y@?FSUJ$@(X=$m0=I`sgAi3MG+4N!w zj3}Q#kfW190ePPXVqz5#L%Bf@o{6t$SkH)o8;EcqrpdDkiRWX@g80FOp@tn|H>3OQK}h_mR@*r+ zK z?C09x^xoT5EDt7^wwBhXgai@D&mdJJbw8}6(=y3vQqqxNHE!2c3>rHp+JQyzYLHZ{ zW^3klg|m^!Y}c!o>kyib(f2n}dwu09 z!jt=O%ZL)@El97Ar-gb(9^-3gIJIQHe{e*y408kkMUs}5b^%*J&CITkU@ORGj{uZX z0Y)JB$24DQ)m6KCWVs43OWxnXJ~_{wjXY1_XLbh{D^DK9Zrd`Q|ji#+_(npM(};dBYYmG_fNUV7Pk2sfcXywsy!J(9H0^k zbMSQNt9ZXrUCLF`?X!>m#3Y(^b#?eQ5e@&(v4xkPUp1VlD}IJ$Z||rg;tW`G{DXt9 zSdj=Z!GRu5Kj*l(lx7dwE$y6%{}V^I`g=#{cgQcAKX?jkReX+`*Bzk_tU>o;$^KKQ zuxZAO19mv#>joVRX`u`T5GG`1W~##}TZ6pCd!d>?>(8inSB96edJ^swi35Hv=M?*A z;W5bVA=|s%A!Lc!T%Jxhdnkqd%3sdv_nwf+ltWQUe%2u2p6mRO3j@2-t#_W(Jf+{a z@NVTeU!qbR)=NGWy2FST@Gd{#VT|HGLAnBhKeH=->yc+KTi;q3mFd)LDM`M&xs_nB zf<~geR^%N!rBKr59OycZeV%&warJ?0f#;o;-f>?)rFi#CV20y5pQf+WdwGitOV+wq`+M76lgeP~#{0%>0ez$o=$$vn znth*T^^Lh>@5a5l^rH=_e11KSU$X?@!#|h(4mhRb41)-DlJXVRmSkQFvl&?TytyMy zeM0-mQ{Il3to&irE8)S9bv7wmhD|?dmx~)DRqvv|1RA?b^2O`x87}f@c0KYq1qF%f zT-__HYW69d0Z(4!=jB~5f8C!K?nhpdjT)Ex|GK;KaH!k1J(4zCWy?}hPa?Y_dm?QV zlHH&z$&xL5wqzHTY>}-!oihCv4%-WWM@g0jNP4nQF4xB^6EJ?n zwfZm>hNG_Z=EL)|W-@0%UqZ@!C9fzTu9v-bJ|8p?(}xBQ!hu(X)O4OuKn9#^c=B>< z&fU=a$JN8>@CB4jN#|ZXB~5(hAN6AFkjmz*-Y>>=;_KZsm4`$*n71C$^f#ztE)qOFeXJ$g1O19*q(0N6X}Q6Iv&n_iAphPTy@9C*f74PcU87s6jIy!>fFPA zZL`@(k|SzD0-q#bXg7NVaN0L&algxXt~Y$%<6^j1S$1 z<&-Y94%5v#I2y(Z6@fkW_(u0(W5t%X>{9nL&6SS2(E{0}64#!!m{niUr5>ze{7C8y zx5_XUq6oo782?a>f=6wW%uKUs5@oMIb}oRoB9}U;F;OobJT&=|SgW9FdDZ8Wxwn0# z;1d^V63hUnca??8CSwmXeUp>pGDgPFE(d5HHL-4!WF5Qg)p6BFh&<(iiMMOS?kbKQ z#_EN|ISj>m1t3CfoC$x59}sJ5#_gooy}|B78r97N7IDjQ+@O`nea{3j@f6mou!OI7 zY^rSt;l?6OrFx_`po7(pwzv)wm9K8*b;3u)2}{+}PuwVNc@MEriLlUB3B563&!iA- zdzz_6J0D#^M_6A zSJ79kewvxx7L*}kpqcsnY?O8Fi{bMblpuuw{w@ul;?|k4ujt^-j$RXLRL}>0id~Md^!}$S zBo=Dci$@3#@~-w?5{_xjyfo9}tU=!Bd7-ZI#eSN@61cq3NXb-qp~SUKZ+i_cKB72h z(JP=EjScIYHB(P0ZSXi`R~p|Y+e0c>Epw(Vs4MeK)oVYwyWdIkK%4ipRyrJMM)HzG zt2q;UNU<&U`FpfM;k@*G%i|lAEu6`*T+7c|PC8?IQ`}gSvQr$Kxi8!oAf==7wQ}=$~0tH&DwQv0z5rOoY1^IXZ1p0e4)E#DXK zs2|Q1p7JULDkDKxF||IjIp^t<33|h_WH(EoEBI62*Zkp9xJ+xlFHyJKEX*SQL#4+H z=Vq(8EB>eRQo`O4uDs(0Q7^8O`anon+rphd?X9t86;RAH@(2e2!ij`{8JY*-E*#vj z7{&=Q8;lifzu$3=e^nYm>fsZ(f^tUQs9v&lMpWe`N4jiH*^~({1HD23Z4J|hd)-X! zGZc`U02D>REUfT1xe2-Ck0>=A-*9g=b6Q?o4oJVDY$)@is=@@vnLqyLJvZ_+l z+5p93qHf0XQc0Iweg-^a>1+abn%s15<%ZZE;6=_XVyP}*ReVf~k6A9IT~1e0Q<{x& zYQ(XOyVy;YeAiquQo1%mW@k6omZKw)lTfbj{wfo@C)JIC+Pg_Jr0qg~r*-bWK6A8- zk4yF1V3N@c+x;IyJ&^et?gb+Rb2#Y|O>#QNr{^c1owVM;e0M^%Ht95ucf5$*w)FhL zF4`83EyA+#OEn*^bI^o_hk@kZgj6-t-AC3X~xTVg`W{891y z6YiADdSGEPqhrKeowUt+zXg8CGQP)w&Q??~H8AicS(A?FlJN%|m0nW{Z}WhIdtoM4 z*zmkNMXw}%2i(Q{ikyvVXDlbPs?)9+Sz|O%2IS`LI6?P0>~ln(`X6z9LS5>{$HEvD z^$e$#=hjmB$4}pmcJJZx7iY1eEh+R1R$NvSINFtAliS%;LCR61rcQoTrvg+TH@Z*v ziz%%vke@YErp~J5scR%jH%qb&QT-^FA6AjwR6&SP7V)i}98xKo7}k7mHjA@YxK;Tz zvl??TYRr`aZ${eq*~lqi0GmZZ?b#bkXW=$E+@9KwJ@TGzrd&$VMi2KagG{z% z*Tg5*Ts1;XE$zy9+E5yF18J?-ce1>bhk3UB&~nY0=pDQR3_dW!n<7u#ea!8$|G90U zqAg1Nhp!3@zK=T<4;?}^sXRM{2ew@s86K9oa^;|yxOm~bvu$8s?|~e-GJ1vd<#U=W z(%O$NX?j&=vsV)s(?7+xw_J71d3BoGA)Qyc%Q+~uXg+(GNwO_lJ7kO9!F%`3QV09vBoIfT7)>c*0f z*$DbFx6xf>W1tbquq3@6#-o<4dYemT0e4B@6xJKR{Y@jls> zE>V;3Ny!vOLg|{7GM5PA%n#0nt+YM#uuzYB-``G{B`GLh@EUvd<|(g-G~_>x+HjjD zE>})0RkhEus^nnEzjB*-yh-5xVvx}|yveJZ&E1`!_~+J3jK(V*Sw6<8g2fs_4U+GN z7TgT0UCV7IY&&qNrCrAOJu!q79)c??ALIOj2exOa6q2!5uHelifdD{i)OWSoYcwod zZQqI^yu_c0b!h$ObWE^c>awt%`zfR?A{kdvYkRC?`PHgKpdr}#31c(2^+AJrVXi$Y zith{WFL)i_eVXe@|4w*I!X6@gw_uq3_;D9BDPGPBu9Z}gab2MsxIiQr`1q(XN}8IS z>)TVWe)Y_l;B2pGP|i)K|d|ILM4vN%P|Q z3&lP2-Xg#58UhICgQuzg*k5(tID)wA2s zB_JaG2@y7)P=lXBrv>CEe_|~RJ&;ZS9%Q}4ib&~u~kOC3?DEP&T zD>s4<%uik%fgUM*U2vQJ43sKy7k={K9H#3$xEu+9HhLxR*~p+kR~}7@(3MeBqc^UP z;k4f&_mDVpd}<00-_bMKn_z{T3Y?_ z_Pof$SAx;gZ^6@_0;W=lszmg3088IIbok;Qw={Z1BmX+*wcPGa)(nYKBgxU%%78+# z2DUjdJ|5#s%}VdUmdH^CSk)20s_O2Cg*8E<0%oJPU<^kCfVyo@G%Q(s3m;;a^#@0xEP1 zCLf&}jy&~op@HTX_1N$LAd?7QUS2B9jXiqXg5qSCqwd|iw}DC!cKdHRQ~g7lXgi>I zNH7rm7z(Z%{@QQ5n{}$M1aOVR; zACZU~aPOdb6GbUvSEonA(^WpL4=|a1qzy0DxCcd~dL=$q`5@4={Ki>UNrPK39zr5K zHWA@n%S)I472cKat^TQX`?oTg)$ardsuwi%GK16D_P=Gj*VzG3q;-=2`$uv|#BDM6=M_OHddV83 zcGDnJD-F=^s9*WOKrClM(aN?}c|w2w*YS@@^8Z4JB|68|!h9hHuyCOHZ!QERw+0}B z__Jj|BobWrwf-BDY-&~p z@p(WoLu>Nd{vjrTf8rB=zo7r&CPN7_ao64v_&+j@0BC!4Tx0kXH}+p~j&m*vI;)&5 zCUP~p>?g3t5ijMJ>*~>n-%l!#{kX%h8h|dnhrd&z>y< zqVM{`j3Mvo=D(x!*U0$ALZ$Ro$pDO=IpG6T>^tPA90EvI!sEvq{r&whn81pgAQIUL zr{EqiW~%Vr4%vX*fwe`thh~_eZiWzvZ(Hog+Pq=FTQ6vmPh7pqi5wOhTUr9C*aFxXB6zJq)HkM%3$oe7Ii$@zV*xoA}9?EX@;4%*;qJcynPiGrip# zUeECiQ8bX%e5`N;J7X(IXzDM+Usf(Q1iF*lG45~lkA*7%zvK(x?SS#mSGx<5>P!?0^AlscXub?dF+D=tSp4lt*#7o3PIV0Fr3<^ND2 zm$Z6);&+|Jy4q<+Y+y0Nngof&1EL&f*WSYyEWf=&rB&BC2cl#Ovbv$oc|}vVE%it7 z8M}l`X<_QFfH|IDBTY?&h3e(2SG_>&&VhSILqmfnIPk>{jgR}hGb}TT!1{n~MNa@% zdWot!)*H@y9lIvg7oW#Ot`BWD7iONB=nMfu@dgai$;WYqf?}KDR|fK{{31NjS>HmS zyR6y;%F|+Yg-8!D_}mDF|CPXhO^#;0@9|;2Rs!4TCd}Dw$sI{AKn#vTtOR40aa|b< z8wr6H(AtOM3~;SZIXQ_UAs?tQ6JZY`DiJ0edxA505R=e0xc(Z2&O$)j-;ItAMDHeY zV~!tYY6gP+Z4k_94MH)c@gS=4VU=h2U}_(Y+m9N(9@v%TX!pUlPR!3|GN=r$0A1r0 z;>%%z@kv=(*^*+WO*W%=fzkFn8X(Baz`!aPj0<-kZMPzYHbO7BM%>tZS^|MEhg+HF zYqxqs+4BZ5N&DzwQ#RtTkhpPhavnF3-48C)zCd~D57b71lc1Xi?9F(f-9bUw^QJ8E z(IZmJLIOSUW9cpT>p>?B2Kd`6u}+)7%ZVMCQTBp|4Fl^*_%5`{YX|J37O<5Ggkf#H zV1(k`YW~)1Woj=PNeMQ>o9qj)?S<+u!Jz|GSdl_z^aJ$|1HtUJ3*C%za%77A?2rWc zRs7;c8Y=<2m4G%3N60-tfFf)JSG=cqu7b}B1O?VDewhvvx{HJE%Lg;FvVcj~>snc! zSeXQuly2BE+Z~YPV^|gLY2{)h)^zydwAsF3cPRTgV#?fIMrQrWZw5TF3_$pqJN1^i z0TM-Uzon(84=6zO1c3?N=#%%$hpfQ%O-z$gQ6LyKv9x4}wlf@$+Bv*{<6or?)1$|EvH2I* zk9wHY3$iJs_D5_oBuaN9M_`g@IYPFyQ z4cM(k2cVdSDP1fYPu;$S#&rSH{uX?o+3nG4dlO~UL@`Hz5+G!-&D=b}x?5&+_?6Vk zqHS&TQEC{0#|__#!ybtRy;0>yOSe3IY=s6zdHt-`@^rT`*!UG-&*=lPApnbR^h>2^ zLlgCMw4OFLHYlvTp6dy`%s`^?+ED-uT!SG3tv;6xm3-hg@cF0&aL5{YHc5DeXXE47 z(DOMC9oks{>*FU=PgEvKMbQV6QTc-U{mkjp(%=>W@=BK#x?k1YH>5@ar$vTe)f^H> zB{0~+go=$Y6}c3qxRqn8-oUs&Pr$b>L2w3N8d}J02@;$B-5UKvw2vPM@b?#xFjD)e zF1oD)L-|-yPdeL0KgIEiz{hpa1i$Z8PWy?m_X~~8@M7`WxTQ|T@+R7{&>w!+4Yo&)w*EyE@Ka=_`S!do;SNkr zxC|qu^K-xfYDe+P(nN;ak~0OX6blShyqg{eOUR*tBoO>!s^QLWVG?oxdeW{VCflL% zyv?JXqYwUPyI|NK1|Z;U26_`F{~LDOpPFx;toDj6oM7YOp`@F*;dA#@@l9Wh#CP9Q zRy1Eu%4sou{IdDAVlHKIbF&)goiG^a1@KeXbt1zR%^$i}NKn&p`_XS=Vp0MwO69(2 z&y#t#AZ;(`9g)BUxrJpgW443a0a%du)nPE9?>1um{FRr58=9I9j3zKJGpB0nmlGTt zpg~{?Zb$$WPUh)=+=rxOFp)i0Pdk}j!sbT}rN0(CM!+;(y0S){M^8_C#_@+3Rcugf zWuT~TEKXK0ue(>MJ8;D5do2OPOS?NkkbXBZG9??%CUtO};zDj*xYoKCTHn}%mzZJg zCiH{xzP^*yo@BdT;Wij76UdA@KYvyd7~q?Wz2d@$4P^v4fLdw}0~dHldhxO|06-?L zyLa!#=h+?vAGj=!V~XX283msg49bTH{b!!{E5^s!c64-Hz^S(C2xfQfkH8tQp>);I z?fk}Pc2D!ld)XGI;nORY_HFyl7_g_h--+AMluaS8e6Sqq)?1trJ6hvt1oN(E=NEL3 zn0$9kzqVJHSJ<#pegH397Zw%e56d|Dpcb4yMb!$fbht!f#FR$tc5+(Lm`9HLtIDyFw2uVA!*xTUAY^zV$86B zbr}G z=SCZMO3(cw{|#5C?Pfn{h6ZoFGraeVZd|7**c)l9?)?zmk?w-s07i3ohxKO)II+sXevB7a^`66b#S1jh7@C(B`ZxI9}^4-Dr?fHG1l!Jl`dVUK&}(l)A12RnVJ3yy8fH{`|SelNu_f zBU@mMDIFv;yn<8&vKnHwy{3f+slntt6#{Vqs7O6(gRBRM%C&%ia_ng(fKeeiC?

8}kPqkH>Ns%`EsqlFCrB*osR+Cq7Um5Cv;gc<8z8F4dMfr1LK7s3>TaTy8pqAL zsKc9)rQmH)`uSm(E}TD4wa2M%2b3M^(9Z;7UuKlbut+*zG*8^p+}<7}YC900oV*DE zOb*3@&fiTI!ETfqkd+@|D4E^^$@C7nuogY{-C)89OM0%jFj<(3iyTFPP(>+!mb@w_vEnO%GKWaN4kYA%X%QF}kGw`(;(KtpJOYw6t@-C93yP9|W{D@e}hZ zFKVgn1&^9x&P34gu&D%$y+_CSDBN=|@633RtdmM49W`E@7{f~lsowY31TKmp9Wf$)xn@5Ipb79!M& z+I;_RgX|MwfGi?01d?MUl>$UK~}#Rpu?l1_610@3o7N+SM~?( z0biIh$=P-#%0j1<3fCw+oQZZMmV!I zvQ6nw5eLFs#?Ga2hl-AUZK#pm_t+u{s)T|e26e+2mNM{}spvqN<7%rQXhkd712%v^ zK^bJfJ}~<_J|$%fbgpee!EOaY_XeK;7UD<4oq*HgNY{r&=t2IwgY%a?{Jt@5ID# zOL0F=&l_M;h?CllRvjjW1i)~CZkY8ar>aVa&VCq0QevFtPmOA@0FnQ#23u=H0ijfk zh_%f6c5VnagJig>zWyyN=oE^K7%LEUFM{S3Oai8;Z+v@q5DCMf!ndCPes!u_3=mnc zojHB}{7F;OLq#*$xJ#h-%mu$?0dOcs%2qrC|urNJ*e<&YLC@4_m z=jTs?FAS2O4-F509Qz!aw^#EYL;d7Dn^?}nxQ98IQifXhK)v2<=7Bnt zXzSLn2BJRpCNwL-M}@~~r$#XAFt8F{Lokvo4PT}J=r{{V|3IAs6; diff --git a/src/problem6/schema.sql b/src/problem6/schema.sql new file mode 100644 index 000000000..444c2eba7 --- /dev/null +++ b/src/problem6/schema.sql @@ -0,0 +1,34 @@ +-- Sample SQL schema for a simple leaderboard system + +-- Users table: stores user info and authentication data +CREATE TABLE users ( + id SERIAL PRIMARY KEY, + username VARCHAR(64) NOT NULL UNIQUE, + email VARCHAR(128) NOT NULL UNIQUE, + password_hash VARCHAR(256) NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT NOW(), + updated_at TIMESTAMP NOT NULL DEFAULT NOW() +); + +-- Scores table: stores the current score for each user +CREATE TABLE scores ( + user_id INTEGER PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE, + score INTEGER NOT NULL DEFAULT 0, + updated_at TIMESTAMP NOT NULL DEFAULT NOW() +); + +-- Score events: audit log for score changes (for recovery, analytics, replay) +CREATE TABLE score_events ( + id BIGSERIAL PRIMARY KEY, + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + delta INTEGER NOT NULL, -- e.g., +1 for increment + event_type VARCHAR(32) NOT NULL, -- e.g., 'increment', 'admin_adjust' + created_at TIMESTAMP NOT NULL DEFAULT NOW() +); + +-- Optional: leaderboard snapshots for recovery to redis +CREATE TABLE leaderboard_snapshots ( + id BIGSERIAL PRIMARY KEY, + snapshot_time TIMESTAMP NOT NULL DEFAULT NOW(), + data JSONB NOT NULL -- stores top N users and scores as JSON +); \ No newline at end of file