From 4321ac1830c28c1693038c73b5df7083ae57ca70 Mon Sep 17 00:00:00 2001 From: Ngo Viet Anh Date: Wed, 29 Apr 2026 10:52:49 +0700 Subject: [PATCH 1/3] FE Code Challenger - solve problem 1 --- src/problem1/README.md | 51 ++++++++++++++++++++++++++++++++++++++++ src/problem1/solution.js | 45 +++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 src/problem1/README.md create mode 100644 src/problem1/solution.js diff --git a/src/problem1/README.md b/src/problem1/README.md new file mode 100644 index 0000000000..b1b6ed24bc --- /dev/null +++ b/src/problem1/README.md @@ -0,0 +1,51 @@ +# Problem 1: Three Ways to Sum to N + +This solution provides three unique JavaScript implementations of `sum_to_n`. + +## Files + +- `solution.js`: contains all three implementations. + +## Implementations + +1. `sum_to_n_a` + + Iterative loop approach. It loops from `1` to `|n|`, adds each number to an accumulator, and applies the original sign of `n`. + + Complexity: `O(n)` time, `O(1)` space. + +2. `sum_to_n_b` + + Mathematical approach using the Gauss formula: + + ```js + n * (n + 1) / 2 + ``` + + The implementation uses `Math.abs(n)` and reapplies the sign, so negative integers are handled consistently. + + Complexity: `O(1)` time, `O(1)` space. + +3. `sum_to_n_c` + + Array reduce approach. It builds a range from `1` to `|n|`, applies the sign, then sums the values with `reduce`. + + Complexity: `O(n)` time, `O(n)` space. + +## Notes + +The task states that `n` can be any integer. This implementation supports: + +- positive integers, for example `sum_to_n(5) === 15` +- zero, where `sum_to_n(0) === 0` +- negative integers, for example `sum_to_n(-3) === -6` + +## Quick test + +Open `solution.js` in a browser console or include it with a script tag. Then call: + +```js +sum_to_n_a(5); // 15 +sum_to_n_b(5); // 15 +sum_to_n_c(5); // 15 +``` diff --git a/src/problem1/solution.js b/src/problem1/solution.js new file mode 100644 index 0000000000..d92fda6485 --- /dev/null +++ b/src/problem1/solution.js @@ -0,0 +1,45 @@ +var sum_to_n_a = function(n) { + // Idea: Iterative approach. Use a loop to add each number from 1 to |n|. + // Complexity: Time O(n), Space O(1). + if (n === 0) { + return 0; + } + + var sign = n > 0 ? 1 : -1; + var total = 0; + + for (var i = 1; i <= Math.abs(n); i++) { + total += i * sign; + } + + return total; +}; + +var sum_to_n_b = function(n) { + // Idea: Mathematical approach. Use the Gauss formula n * (n + 1) / 2. + // Complexity: Time O(1), Space O(1). + if (n === 0) { + return 0; + } + + var absN = Math.abs(n); + var result = absN * (absN + 1) / 2; + + return n > 0 ? result : -result; +}; + +var sum_to_n_c = function(n) { + // Idea: Array reduce approach. Build a range from 1 to |n| and reduce it to a sum. + // Complexity: Time O(n), Space O(n). + if (n === 0) { + return 0; + } + + var sign = n > 0 ? 1 : -1; + + return Array.from({ length: Math.abs(n) }, function(_, index) { + return (index + 1) * sign; + }).reduce(function(total, current) { + return total + current; + }, 0); +}; From bc470b21628f97eecb93d3922c94d352d7d70fb3 Mon Sep 17 00:00:00 2001 From: Ngo Viet Anh Date: Wed, 29 Apr 2026 10:55:10 +0700 Subject: [PATCH 2/3] FE Code Challenger - solve problem 2 --- src/problem2/README.md | 35 + src/problem2/docs/screenshot.png | Bin 0 -> 104284 bytes src/problem2/index.html | 22 +- src/problem2/package-lock.json | 2625 +++++++++++++++++ src/problem2/package.json | 22 + src/problem2/postcss.config.js | 6 + src/problem2/script.js | 0 src/problem2/src/App.jsx | 144 + src/problem2/src/api/prices.js | 60 + src/problem2/src/components/MarketPanel.jsx | 37 + src/problem2/src/components/RatePanel.jsx | 14 + src/problem2/src/components/SubmitButton.jsx | 17 + src/problem2/src/components/SwapForm.jsx | 96 + src/problem2/src/components/SwitchButton.jsx | 15 + .../src/components/TokenAmountInput.jsx | 51 + src/problem2/src/components/TokenSelect.jsx | 133 + src/problem2/src/main.jsx | 10 + src/problem2/src/styles.css | 48 + src/problem2/src/utils/format.js | 18 + src/problem2/src/utils/swap.js | 50 + src/problem2/style.css | 8 - src/problem2/tailwind.config.js | 27 + src/problem2/vite.config.js | 6 + 23 files changed, 3419 insertions(+), 25 deletions(-) create mode 100644 src/problem2/README.md create mode 100644 src/problem2/docs/screenshot.png create mode 100644 src/problem2/package-lock.json create mode 100644 src/problem2/package.json create mode 100644 src/problem2/postcss.config.js delete mode 100644 src/problem2/script.js create mode 100644 src/problem2/src/App.jsx create mode 100644 src/problem2/src/api/prices.js create mode 100644 src/problem2/src/components/MarketPanel.jsx create mode 100644 src/problem2/src/components/RatePanel.jsx create mode 100644 src/problem2/src/components/SubmitButton.jsx create mode 100644 src/problem2/src/components/SwapForm.jsx create mode 100644 src/problem2/src/components/SwitchButton.jsx create mode 100644 src/problem2/src/components/TokenAmountInput.jsx create mode 100644 src/problem2/src/components/TokenSelect.jsx create mode 100644 src/problem2/src/main.jsx create mode 100644 src/problem2/src/styles.css create mode 100644 src/problem2/src/utils/format.js create mode 100644 src/problem2/src/utils/swap.js delete mode 100644 src/problem2/style.css create mode 100644 src/problem2/tailwind.config.js create mode 100644 src/problem2/vite.config.js diff --git a/src/problem2/README.md b/src/problem2/README.md new file mode 100644 index 0000000000..bb91a0166f --- /dev/null +++ b/src/problem2/README.md @@ -0,0 +1,35 @@ +# Problem 2: Fancy Form + +A Vite + React currency swap form using live token prices from Switcheo. + +## Preview + +![Currency swap form preview](./docs/screenshot.png) + +## Run locally + +```bash +npm install +npm run dev +``` + +Open the local URL printed by Vite, usually: + +```text +http://localhost:5173/ +``` + +## Build + +```bash +npm run build +``` + +## Features + +- Live token price loading with fallback demo prices. +- Token selector with token icons and USD prices. +- Automatic receive amount and exchange-rate calculation. +- Input validation for amount, same-token swaps, and insufficient balance. +- Mock swap confirmation with loading state. +- Responsive UI built with Tailwind CSS. diff --git a/src/problem2/docs/screenshot.png b/src/problem2/docs/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..b228bf88e6e72515ed17b82a36c19ef20d928069 GIT binary patch literal 104284 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 literal 0 HcmV?d00001 diff --git a/src/problem2/index.html b/src/problem2/index.html index 4058a68bff..cc5d6ab2e7 100644 --- a/src/problem2/index.html +++ b/src/problem2/index.html @@ -1,27 +1,15 @@ - + + + Fancy Form - - - - - -
-
Swap
- - - - - - - -
- +
+ diff --git a/src/problem2/package-lock.json b/src/problem2/package-lock.json new file mode 100644 index 0000000000..30cd74dbbe --- /dev/null +++ b/src/problem2/package-lock.json @@ -0,0 +1,2625 @@ +{ + "name": "problem2-fancy-form", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "problem2-fancy-form", + "version": "1.0.0", + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.5.0", + "postcss": "^8.5.12", + "tailwindcss": "^3.4.19", + "vite": "^5.4.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "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/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", + "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", + "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", + "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", + "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", + "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", + "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", + "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", + "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", + "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", + "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", + "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", + "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", + "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", + "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", + "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", + "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", + "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", + "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", + "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", + "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", + "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", + "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", + "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", + "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", + "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.23", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.23.tgz", + "integrity": "sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", + "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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 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/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "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/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.344", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", + "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "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/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "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/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "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", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "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==", + "license": "MIT" + }, + "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/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/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "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/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "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/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "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/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "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": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/postcss": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", + "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", + "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.2", + "@rollup/rollup-android-arm64": "4.60.2", + "@rollup/rollup-darwin-arm64": "4.60.2", + "@rollup/rollup-darwin-x64": "4.60.2", + "@rollup/rollup-freebsd-arm64": "4.60.2", + "@rollup/rollup-freebsd-x64": "4.60.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", + "@rollup/rollup-linux-arm-musleabihf": "4.60.2", + "@rollup/rollup-linux-arm64-gnu": "4.60.2", + "@rollup/rollup-linux-arm64-musl": "4.60.2", + "@rollup/rollup-linux-loong64-gnu": "4.60.2", + "@rollup/rollup-linux-loong64-musl": "4.60.2", + "@rollup/rollup-linux-ppc64-gnu": "4.60.2", + "@rollup/rollup-linux-ppc64-musl": "4.60.2", + "@rollup/rollup-linux-riscv64-gnu": "4.60.2", + "@rollup/rollup-linux-riscv64-musl": "4.60.2", + "@rollup/rollup-linux-s390x-gnu": "4.60.2", + "@rollup/rollup-linux-x64-gnu": "4.60.2", + "@rollup/rollup-linux-x64-musl": "4.60.2", + "@rollup/rollup-openbsd-x64": "4.60.2", + "@rollup/rollup-openharmony-arm64": "4.60.2", + "@rollup/rollup-win32-arm64-msvc": "4.60.2", + "@rollup/rollup-win32-ia32-msvc": "4.60.2", + "@rollup/rollup-win32-x64-gnu": "4.60.2", + "@rollup/rollup-win32-x64-msvc": "4.60.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "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/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/src/problem2/package.json b/src/problem2/package.json new file mode 100644 index 0000000000..864185796b --- /dev/null +++ b/src/problem2/package.json @@ -0,0 +1,22 @@ +{ + "name": "problem2-fancy-form", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --host 0.0.0.0", + "build": "vite build", + "preview": "vite preview --host 0.0.0.0" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.5.0", + "postcss": "^8.5.12", + "tailwindcss": "^3.4.19", + "vite": "^5.4.0" + } +} diff --git a/src/problem2/postcss.config.js b/src/problem2/postcss.config.js new file mode 100644 index 0000000000..ba80730477 --- /dev/null +++ b/src/problem2/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/src/problem2/script.js b/src/problem2/script.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/problem2/src/App.jsx b/src/problem2/src/App.jsx new file mode 100644 index 0000000000..9b61ced2cb --- /dev/null +++ b/src/problem2/src/App.jsx @@ -0,0 +1,144 @@ +import { useEffect, useMemo, useState } from "react"; +import SwapForm from "./components/SwapForm.jsx"; +import { fetchTokenPrices } from "./api/prices.js"; +import { formatCurrency, formatNumber, parseFormattedNumber } from "./utils/format.js"; +import { calculateOutput, createBalances, validateSwap } from "./utils/swap.js"; + +export default function App() { + const [tokens, setTokens] = useState([]); + const [balances, setBalances] = useState({}); + const [priceSource, setPriceSource] = useState("loading"); + const [amountText, setAmountText] = useState(""); + const [fromSymbol, setFromSymbol] = useState(""); + const [toSymbol, setToSymbol] = useState(""); + const [isSubmitting, setIsSubmitting] = useState(false); + const [successMessage, setSuccessMessage] = useState(""); + + useEffect(() => { + let isMounted = true; + + fetchTokenPrices().then(({ source, tokens: loadedTokens }) => { + if (!isMounted) { + return; + } + + setTokens(loadedTokens); + setBalances(createBalances(loadedTokens)); + setPriceSource(source); + setFromSymbol(loadedTokens.some((token) => token.symbol === "ETH") ? "ETH" : loadedTokens[0]?.symbol || ""); + setToSymbol(loadedTokens.some((token) => token.symbol === "USDC") ? "USDC" : loadedTokens[1]?.symbol || ""); + }); + + return () => { + isMounted = false; + }; + }, []); + + const fromToken = useMemo(() => tokens.find((token) => token.symbol === fromSymbol), [fromSymbol, tokens]); + const toToken = useMemo(() => tokens.find((token) => token.symbol === toSymbol), [toSymbol, tokens]); + const amount = parseFormattedNumber(amountText); + const fromBalance = balances[fromSymbol] || 0; + const toBalance = balances[toSymbol] || 0; + const hasAmount = amountText !== "" && Number.isFinite(amount) && amount > 0; + const outputAmount = calculateOutput(amount, fromToken, toToken); + const outputText = hasAmount ? formatNumber(outputAmount, 8) : ""; + const errorMessage = validateSwap({ amountText, amount, balance: fromBalance, fromSymbol, toSymbol }); + const isFormLocked = isSubmitting || priceSource === "loading"; + const canSubmit = !errorMessage && hasAmount && !isFormLocked && Boolean(fromToken && toToken); + const rateLabel = fromToken && toToken + ? `1 ${fromToken.symbol} = ${formatNumber(fromToken.price / toToken.price, 8)} ${toToken.symbol}` + : ""; + + function clearSuccess() { + setSuccessMessage(""); + } + + function handleAmountChange(nextAmount) { + clearSuccess(); + setAmountText(nextAmount); + } + + function handleFromTokenChange(nextSymbol) { + clearSuccess(); + setFromSymbol(nextSymbol); + + // Keep selections distinct to avoid an awkward "same token" error state. + if (nextSymbol && nextSymbol === toSymbol) { + setToSymbol(fromSymbol); + } + } + + function handleToTokenChange(nextSymbol) { + clearSuccess(); + setToSymbol(nextSymbol); + + if (nextSymbol && nextSymbol === fromSymbol) { + setFromSymbol(toSymbol); + } + } + + function handleSwitch() { + clearSuccess(); + if (!fromSymbol || !toSymbol) { + return; + } + setFromSymbol(toSymbol); + setToSymbol(fromSymbol); + } + + function handleSubmit(event) { + event.preventDefault(); + clearSuccess(); + + if (!canSubmit) { + return; + } + + setIsSubmitting(true); + + // Simulate a backend swap request before updating the local wallet balances. + window.setTimeout(() => { + const receivedAmount = outputAmount; + + setBalances((currentBalances) => ({ + ...currentBalances, + [fromSymbol]: (currentBalances[fromSymbol] || 0) - amount, + [toSymbol]: (currentBalances[toSymbol] || 0) + receivedAmount + })); + setAmountText(""); + setIsSubmitting(false); + setSuccessMessage( + `Swap confirmed: ${formatNumber(amount, 6)} ${fromSymbol} for ${outputText} ${toSymbol}.` + ); + }, 900); + } + + return ( +
+ +
+ ); +} diff --git a/src/problem2/src/api/prices.js b/src/problem2/src/api/prices.js new file mode 100644 index 0000000000..1140f807c6 --- /dev/null +++ b/src/problem2/src/api/prices.js @@ -0,0 +1,60 @@ +const PRICE_URL = "https://interview.switcheo.com/prices.json"; +const ICON_URL = "https://raw.githubusercontent.com/Switcheo/token-icons/main/tokens/"; + +const FALLBACK_PRICES = [ + { currency: "ETH", price: 1645.9337373737374 }, + { currency: "WBTC", price: 26002.82202020202 }, + { currency: "ATOM", price: 7.186657333333334 }, + { currency: "OSMO", price: 0.3772974333333333 }, + { currency: "SWTH", price: 0.004039850455012084 }, + { currency: "USDC", price: 1 }, + { currency: "USD", price: 1 } +]; + +export function normalizePrices(items) { + // The API can include repeated currencies, so keep only the latest price per token. + const latestByCurrency = {}; + + items.forEach((item) => { + if (!item.currency || typeof item.price !== "number") { + return; + } + + const existing = latestByCurrency[item.currency]; + const itemTime = item.date ? new Date(item.date).getTime() : 0; + const existingTime = existing?.date ? new Date(existing.date).getTime() : -1; + + if (!existing || itemTime >= existingTime) { + latestByCurrency[item.currency] = item; + } + }); + + return Object.keys(latestByCurrency) + .sort() + .map((currency) => ({ + symbol: currency, + price: latestByCurrency[currency].price, + icon: `${ICON_URL}${currency}.svg` + })); +} + +export async function fetchTokenPrices() { + try { + const response = await fetch(PRICE_URL); + + if (!response.ok) { + throw new Error("Price request failed"); + } + + return { + source: "live", + tokens: normalizePrices(await response.json()) + }; + } catch { + // Keep the form usable during network issues or local review without internet access. + return { + source: "demo", + tokens: normalizePrices(FALLBACK_PRICES) + }; + } +} diff --git a/src/problem2/src/components/MarketPanel.jsx b/src/problem2/src/components/MarketPanel.jsx new file mode 100644 index 0000000000..bfb9cc1a9f --- /dev/null +++ b/src/problem2/src/components/MarketPanel.jsx @@ -0,0 +1,37 @@ +export default function MarketPanel({ routeLabel }) { + return ( +
+
+

Cross-chain swap

+

+ Swap assets with confident execution +

+

+ Get a live quote, review fees, and confirm a simulated settlement—built as a polished interview challenge submission. +

+
+ +
+ Best route + {routeLabel || "Loading market"} + + +
+ ); +} diff --git a/src/problem2/src/components/RatePanel.jsx b/src/problem2/src/components/RatePanel.jsx new file mode 100644 index 0000000000..5252a39005 --- /dev/null +++ b/src/problem2/src/components/RatePanel.jsx @@ -0,0 +1,14 @@ +export default function RatePanel({ rateLabel, hasAmount }) { + return ( +
+
+ Rate + {rateLabel || "Unavailable"} +
+
+ Price impact + {hasAmount ? "0.12%" : "0.00%"} +
+
+ ); +} diff --git a/src/problem2/src/components/SubmitButton.jsx b/src/problem2/src/components/SubmitButton.jsx new file mode 100644 index 0000000000..474f4989cd --- /dev/null +++ b/src/problem2/src/components/SubmitButton.jsx @@ -0,0 +1,17 @@ +export default function SubmitButton({ disabled, isSubmitting }) { + return ( + + ); +} diff --git a/src/problem2/src/components/SwapForm.jsx b/src/problem2/src/components/SwapForm.jsx new file mode 100644 index 0000000000..368ea1e75a --- /dev/null +++ b/src/problem2/src/components/SwapForm.jsx @@ -0,0 +1,96 @@ +import TokenAmountInput from "./TokenAmountInput.jsx"; +import SwitchButton from "./SwitchButton.jsx"; +import RatePanel from "./RatePanel.jsx"; +import SubmitButton from "./SubmitButton.jsx"; + +export default function SwapForm({ + tokens, + amountText, + outputText, + fromSymbol, + toSymbol, + fromBalanceLabel, + toBalanceLabel, + fromValueLabel, + toValueLabel, + rateLabel, + hasAmount, + priceSource, + errorMessage, + successMessage, + isSubmitting, + isFormLocked, + canSubmit, + onAmountChange, + onFromTokenChange, + onToTokenChange, + onSwitch, + onSubmit +}) { + const priceStatus = priceSource === "live" ? "Live prices" : priceSource === "demo" ? "Demo prices" : "Loading prices"; + + return ( +
+
+
+

Currency swap

+
+
+ {priceStatus} +
+
+ +
+ + +
+ +
+ + +
+ + + +

+ {errorMessage} +

+ + + +

+ {successMessage} +

+ + ); +} diff --git a/src/problem2/src/components/SwitchButton.jsx b/src/problem2/src/components/SwitchButton.jsx new file mode 100644 index 0000000000..f46f06a243 --- /dev/null +++ b/src/problem2/src/components/SwitchButton.jsx @@ -0,0 +1,15 @@ +export default function SwitchButton({ disabled, onClick }) { + return ( + + ); +} diff --git a/src/problem2/src/components/TokenAmountInput.jsx b/src/problem2/src/components/TokenAmountInput.jsx new file mode 100644 index 0000000000..94bc9be789 --- /dev/null +++ b/src/problem2/src/components/TokenAmountInput.jsx @@ -0,0 +1,51 @@ +import TokenSelect from "./TokenSelect.jsx"; + +export default function TokenAmountInput({ + label, + inputId, + amount, + balanceLabel, + valueLabel, + tokenValue, + tokens, + readOnly = false, + disabled = false, + onAmountChange, + onTokenChange +}) { + return ( +
+
+ + {balanceLabel} +
+ +
+
+ onAmountChange?.(event.target.value)} + className="h-full min-w-0 flex-1 border-0 bg-transparent text-[1.45rem] font-semibold leading-none tracking-tight text-slate-950 outline-none placeholder:text-slate-300 disabled:cursor-not-allowed disabled:opacity-60 min-[520px]:text-[1.55rem]" + /> +
+ +
+ +

{valueLabel}

+
+ ); +} diff --git a/src/problem2/src/components/TokenSelect.jsx b/src/problem2/src/components/TokenSelect.jsx new file mode 100644 index 0000000000..3819cb9dea --- /dev/null +++ b/src/problem2/src/components/TokenSelect.jsx @@ -0,0 +1,133 @@ +import { useEffect, useRef, useState } from "react"; +import { createPortal } from "react-dom"; +import { formatCurrency } from "../utils/format.js"; + +export default function TokenSelect({ ariaLabel, value, tokens, disabled = false, onChange }) { + const [isOpen, setIsOpen] = useState(false); + const [menuStyle, setMenuStyle] = useState(null); + const wrapperRef = useRef(null); + const buttonRef = useRef(null); + const selectedToken = tokens.find((token) => token.symbol === value); + + function updateMenuPosition() { + const buttonRect = buttonRef.current?.getBoundingClientRect(); + + if (!buttonRect) { + return; + } + + setMenuStyle({ + top: `${buttonRect.bottom + 8}px`, + left: `${Math.max(12, buttonRect.right - 240)}px`, + width: `${Math.max(220, buttonRect.width)}px` + }); + } + + useEffect(() => { + function handlePointerDown(event) { + if (!wrapperRef.current?.contains(event.target) && !event.target.closest("[data-token-menu]")) { + setIsOpen(false); + } + } + + function handleKeyDown(event) { + if (event.key === "Escape") { + setIsOpen(false); + } + } + + document.addEventListener("pointerdown", handlePointerDown); + document.addEventListener("keydown", handleKeyDown); + + return () => { + document.removeEventListener("pointerdown", handlePointerDown); + document.removeEventListener("keydown", handleKeyDown); + }; + }, []); + + useEffect(() => { + if (disabled) { + setIsOpen(false); + } + }, [disabled]); + + useEffect(() => { + if (!isOpen) { + return undefined; + } + + updateMenuPosition(); + window.addEventListener("resize", updateMenuPosition); + window.addEventListener("scroll", updateMenuPosition, true); + + return () => { + window.removeEventListener("resize", updateMenuPosition); + window.removeEventListener("scroll", updateMenuPosition, true); + }; + }, [isOpen, tokens.length]); + + function selectToken(symbol) { + onChange(symbol); + setIsOpen(false); + } + + return ( +
+ + + {isOpen && menuStyle ? createPortal( +
+ {tokens.map((token) => ( + + ))} +
, + document.body + ) : null} +
+ ); +} diff --git a/src/problem2/src/main.jsx b/src/problem2/src/main.jsx new file mode 100644 index 0000000000..4ecd9cfb14 --- /dev/null +++ b/src/problem2/src/main.jsx @@ -0,0 +1,10 @@ +import React from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App.jsx"; +import "./styles.css"; + +createRoot(document.getElementById("root")).render( + + + +); diff --git a/src/problem2/src/styles.css b/src/problem2/src/styles.css new file mode 100644 index 0000000000..9c644a3675 --- /dev/null +++ b/src/problem2/src/styles.css @@ -0,0 +1,48 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + color-scheme: light; + } + + * { + box-sizing: border-box; + } + + body { + @apply m-0 min-h-screen min-w-[360px] bg-slate-100 font-sans text-slate-950 antialiased; + background-image: + radial-gradient(620px 320px at 50% 0%, rgba(37, 99, 235, 0.12), transparent 60%), + linear-gradient(180deg, rgba(255, 255, 255, 0.72), rgba(255, 255, 255, 0)); + } + + button, + input, + select { + font: inherit; + } + + ::selection { + background: rgba(37, 99, 235, 0.22); + } +} + +@layer components { + .surface { + @apply rounded-2xl border border-slate-200/80 bg-white shadow-swap; + } + + .surface-outline { + @apply ring-1 ring-slate-900/5; + } + + .focus-ring { + @apply focus:outline-none focus-visible:ring-4 focus-visible:ring-accent/20; + } + + .subtle-divider { + @apply h-px w-full bg-gradient-to-r from-transparent via-ink/10 to-transparent; + } +} diff --git a/src/problem2/src/utils/format.js b/src/problem2/src/utils/format.js new file mode 100644 index 0000000000..0aa49d4ae1 --- /dev/null +++ b/src/problem2/src/utils/format.js @@ -0,0 +1,18 @@ +export function formatNumber(value, maximumDigits = 6) { + return new Intl.NumberFormat("en-US", { + maximumFractionDigits: maximumDigits, + minimumFractionDigits: 0 + }).format(value); +} + +export function formatCurrency(value) { + return new Intl.NumberFormat("en-US", { + style: "currency", + currency: "USD", + maximumFractionDigits: value >= 1 ? 2 : 6 + }).format(value); +} + +export function parseFormattedNumber(value) { + return Number(String(value).replace(/,/g, "")); +} diff --git a/src/problem2/src/utils/swap.js b/src/problem2/src/utils/swap.js new file mode 100644 index 0000000000..1e558ced53 --- /dev/null +++ b/src/problem2/src/utils/swap.js @@ -0,0 +1,50 @@ +const MOCK_BALANCES = [2.8, 1200, 460, 88, 15400, 940, 38, 720]; + +export function createBalances(tokens) { + // Mock wallet balances for this frontend-only challenge. + return tokens.reduce((result, token, index) => { + result[token.symbol] = MOCK_BALANCES[index % MOCK_BALANCES.length]; + return result; + }, {}); +} + +export function calculateOutput(amount, fromToken, toToken) { + if (!amount || !fromToken || !toToken) { + return 0; + } + + return (amount * fromToken.price) / toToken.price; +} + +export function validateSwap({ amountText, amount, balance, fromSymbol, toSymbol }) { + if (!fromSymbol || !toSymbol) { + return ""; + } + + if (fromSymbol === toSymbol) { + return "Choose two different currencies."; + } + + if (amountText !== "") { + const trimmed = String(amountText).trim(); + + // Allow partial inputs like "." while the user is typing. + if (trimmed === ".") { + return ""; + } + + if (!Number.isFinite(amount)) { + return "Enter a valid number."; + } + + if (amount <= 0) { + return "Enter an amount greater than zero."; + } + } + + if (amount > balance) { + return `Insufficient ${fromSymbol} balance.`; + } + + return ""; +} diff --git a/src/problem2/style.css b/src/problem2/style.css deleted file mode 100644 index 915af91c72..0000000000 --- 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/problem2/tailwind.config.js b/src/problem2/tailwind.config.js new file mode 100644 index 0000000000..6b9535c94f --- /dev/null +++ b/src/problem2/tailwind.config.js @@ -0,0 +1,27 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,jsx}" + ], + theme: { + extend: { + colors: { + ink: "#142019", + muted: "#66736b", + line: "#dce5dd", + soft: "#f4f8f5", + accent: { + DEFAULT: "#2563eb", + dark: "#1d4ed8", + soft: "#dbeafe" + } + }, + boxShadow: { + swap: "0 18px 48px rgba(20, 32, 25, 0.12)", + route: "0 18px 40px rgba(20, 32, 25, 0.08)" + } + } + }, + plugins: [] +}; diff --git a/src/problem2/vite.config.js b/src/problem2/vite.config.js new file mode 100644 index 0000000000..db1b19eebb --- /dev/null +++ b/src/problem2/vite.config.js @@ -0,0 +1,6 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + plugins: [react()] +}); From 2c4b11cef6024d725f3f55a6c68709419e83c2b4 Mon Sep 17 00:00:00 2001 From: Ngo Viet Anh Date: Wed, 29 Apr 2026 10:55:36 +0700 Subject: [PATCH 3/3] FE Code Challenger - solve problem 3 --- src/problem3/README.md | 163 ++++++++++++++++++++++++++++++++++++ src/problem3/refactored.tsx | 72 ++++++++++++++++ 2 files changed, 235 insertions(+) create mode 100644 src/problem3/README.md create mode 100644 src/problem3/refactored.tsx diff --git a/src/problem3/README.md b/src/problem3/README.md new file mode 100644 index 0000000000..245ba6d23c --- /dev/null +++ b/src/problem3/README.md @@ -0,0 +1,163 @@ +# Problem 3: Messy React + +## Issues found + +1. `WalletBalance` is missing the `blockchain` field. + + The code calls `balance.blockchain`, but the interface only defines `currency` and `amount`. This breaks TypeScript correctness and hides a real data-shape problem. + +2. `getPriority` uses `any`. + + `blockchain: any` removes type safety. It should be typed as a known blockchain string union or at least `string`. + +3. `getPriority` is recreated on every render. + + The function is declared inside the component. This is not a major issue by itself, but it is unnecessary because the priority mapping is static. Moving it outside the component is cleaner and avoids repeated allocation. + +4. The filter logic references an undefined variable. + + `lhsPriority` does not exist inside the filter callback. The intended variable is probably `balancePriority`. + +5. The filter condition is logically wrong. + + The current code returns `true` when `balance.amount <= 0`, meaning it keeps zero or negative balances and removes positive balances. For a wallet list, the expected behavior is usually to keep balances with `amount > 0`. + +6. The filter is harder to read than necessary. + + Nested `if` statements can be replaced with a direct boolean expression: + + ```ts + getPriority(balance.blockchain) > -99 && balance.amount > 0 + ``` + +7. `sort` comparator can return `undefined`. + + If two priorities are equal, the comparator returns nothing. A comparator should always return a number. This can lead to unstable or inconsistent sorting behavior. + +8. `prices` is included in the `useMemo` dependency array unnecessarily. + + `sortedBalances` does not use `prices`, so adding `prices` causes the filtering and sorting work to rerun whenever prices change. + +9. `formattedBalances` is calculated but not used. + + The code creates `formattedBalances`, but then maps over `sortedBalances` when rendering rows. Because of this, `balance.formatted` is unavailable in `rows`. + +10. The `rows` map uses the wrong type. + + `sortedBalances` contains `WalletBalance`, but the callback types `balance` as `FormattedWalletBalance`. That is incorrect unless the formatted data is actually used. + +11. Using array index as React key is an anti-pattern. + + `key={index}` can cause incorrect row reuse when the list order changes. A stable key such as `currency` or `blockchain-currency` should be used. + +12. `children` is destructured but never rendered. + + The component removes `children` from `props`, but does not render it. This can surprise callers and makes `Props extends BoxProps` less useful. + +13. `Props` is empty. + + `interface Props extends BoxProps {}` adds no new information. A type alias would be simpler unless extra props are expected later. + +14. Formatting work is not memoized. + + Formatting balances and building rows happen on every render. For small lists this is fine, but since the task asks about computational inefficiencies, the derived wallet row data should be memoized. + +15. The formatted amount uses default `toFixed()`. + + `toFixed()` defaults to zero decimal places. That may be fine for whole-number tokens, but most token balances need a defined precision such as `toFixed(2)` or a formatter. + +16. There is no fallback for missing prices. + + `prices[balance.currency] * balance.amount` becomes `NaN` if a token price is missing. It should default to `0` or handle unavailable prices explicitly. + +17. `classes.row` is used but not defined in the snippet. + + This may be defined outside the snippet, but as shown, it is an undeclared dependency. + +18. The indentation and formatting are inconsistent. + + Mixed tabs/spaces and missing semicolons make the code harder to review and maintain. + +## Refactored version + +```tsx +interface WalletBalance { + currency: string; + amount: number; + blockchain: string; +} + +interface FormattedWalletBalance extends WalletBalance { + formatted: string; + usdValue: number; +} + +type Prices = Record; +type Props = BoxProps; + +// Assumes BoxProps, WalletRow, useWalletBalances, usePrices, and classes are provided by the app. +const BLOCKCHAIN_PRIORITIES: Record = { + Osmosis: 100, + Ethereum: 50, + Arbitrum: 30, + Zilliqa: 20, + Neo: 20 +}; + +const getPriority = (blockchain: string): number => { + return BLOCKCHAIN_PRIORITIES[blockchain] ?? -99; +}; + +const WalletPage: React.FC = ({ children, ...rest }) => { + const balances = useWalletBalances(); + const prices: Prices = usePrices(); + + const sortedBalances = useMemo(() => { + return balances + .filter((balance: WalletBalance) => { + return getPriority(balance.blockchain) > -99 && balance.amount > 0; + }) + .sort((lhs: WalletBalance, rhs: WalletBalance) => { + return getPriority(rhs.blockchain) - getPriority(lhs.blockchain); + }); + }, [balances]); + + const formattedBalances = useMemo(() => { + return sortedBalances.map((balance: WalletBalance) => { + const price = prices[balance.currency] ?? 0; + + return { + ...balance, + formatted: balance.amount.toFixed(2), + usdValue: price * balance.amount + }; + }); + }, [sortedBalances, prices]); + + return ( +
+ {formattedBalances.map((balance: FormattedWalletBalance) => ( + + ))} + {children} +
+ ); +}; +``` + +## Why this version is better + +- TypeScript now matches the data actually used by the component. +- Filtering/sorting and price formatting are memoized separately, so price changes do not repeat unnecessary sorting work. +- The sort comparator always returns a number. +- Positive balances are kept and unsupported chains are filtered out. +- Missing prices no longer produce `NaN`. +- React keys are stable across reorders. +- Unused variables and incorrect types are removed. +- Static priority data is outside the component, so it is not recreated on every render. diff --git a/src/problem3/refactored.tsx b/src/problem3/refactored.tsx new file mode 100644 index 0000000000..ec327428c0 --- /dev/null +++ b/src/problem3/refactored.tsx @@ -0,0 +1,72 @@ +import React, { useMemo } from "react"; + +interface WalletBalance { + currency: string; + amount: number; + blockchain: string; +} + +interface FormattedWalletBalance extends WalletBalance { + formatted: string; + usdValue: number; +} + +type Prices = Record; +type Props = BoxProps; + +// Assumes BoxProps, WalletRow, useWalletBalances, usePrices, and classes are provided by the app. +const BLOCKCHAIN_PRIORITIES: Record = { + Osmosis: 100, + Ethereum: 50, + Arbitrum: 30, + Zilliqa: 20, + Neo: 20 +}; + +const getPriority = (blockchain: string): number => { + return BLOCKCHAIN_PRIORITIES[blockchain] ?? -99; +}; + +const WalletPage: React.FC = ({ children, ...rest }) => { + const balances = useWalletBalances(); + const prices: Prices = usePrices(); + + const sortedBalances = useMemo(() => { + return balances + .filter((balance: WalletBalance) => { + return getPriority(balance.blockchain) > -99 && balance.amount > 0; + }) + .sort((lhs: WalletBalance, rhs: WalletBalance) => { + return getPriority(rhs.blockchain) - getPriority(lhs.blockchain); + }); + }, [balances]); + + const formattedBalances = useMemo(() => { + return sortedBalances.map((balance: WalletBalance) => { + const price = prices[balance.currency] ?? 0; + + return { + ...balance, + formatted: balance.amount.toFixed(2), + usdValue: price * balance.amount + }; + }); + }, [sortedBalances, prices]); + + return ( +
+ {formattedBalances.map((balance: FormattedWalletBalance) => ( + + ))} + {children} +
+ ); +}; + +export default WalletPage;