diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..94835f7a7816969a6a1404d925fb3e1bfba77385
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,96 @@
+# Dependencies
+node_modules/
+/.pnp
+.pnp.js
+
+# Production
+/dist
+/build
+
+# Development
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# Logs
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Coverage directory used by tools like istanbul
+coverage/
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# ESLint cache
+.eslintcache
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Vite cache
+.vite
+
+# Next.js build output
+.next
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Storybook build outputs
+.out
+.storybook-out
+
+# Temporary folders
+tmp/
+temp/
+
+# IDE
+.vscode/
+.idea/
+*.swp
+*.swo
+*~
+
+# OS
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..f7fc5f1804ad07fa949f04ced7796c49e34e8498
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,25 @@
+FROM python:3.9-slim
+
+RUN useradd -m -u 1000 user
+
+RUN apt-get update && apt-get install -y curl && \
+ curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
+ apt-get install -y nodejs && \
+ apt-get clean && rm -rf /var/lib/apt/lists/*
+
+USER user
+ENV PATH="/home/user/.local/bin:$PATH"
+
+WORKDIR /app
+
+COPY --chown=user package*.json ./
+
+RUN npm ci
+
+COPY --chown=user . .
+
+RUN npm run build
+
+EXPOSE 7860
+
+CMD ["python", "-m", "http.server", "7860", "--directory", "dist"]
\ No newline at end of file
diff --git a/README.md b/README.md
index 88543906e04a624e3a7770c0575a76c9dd962448..7db73db0aa6603a0880c9540a7582af12bef351e 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,10 @@
---
-title: Musical Chess
-emoji: 🏆
-colorFrom: green
-colorTo: green
+title: Musical Chess Arena
+emoji: 🎵♟️
+colorFrom: purple
+colorTo: blue
sdk: docker
-pinned: false
-license: mit
-short_description: Train chess with audio cues for moves and initiative.
----
-
-Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
+sdk_version: "4.40.0"
+app_file: app.py
+pinned: true
+---
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..34ed6d0849c52dc2b75d345e66b06eb77b963ec6
--- /dev/null
+++ b/index.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+ 🎵♟️ Musical Chess Arena
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nginx.conf b/nginx.conf
new file mode 100644
index 0000000000000000000000000000000000000000..c33aa19e8cff0693ac96777e52062f65d9bc4644
--- /dev/null
+++ b/nginx.conf
@@ -0,0 +1,31 @@
+events {
+ worker_connections 1024;
+}
+
+http {
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ server {
+ listen 7860;
+ server_name localhost;
+ root /usr/share/nginx/html;
+ index index.html;
+
+ gzip on;
+ gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
+
+ location / {
+ try_files $uri $uri/ /index.html;
+ }
+
+ location /assets/ {
+ expires 1y;
+ add_header Cache-Control "public, immutable";
+ }
+
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-XSS-Protection "1; mode=block" always;
+ }
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..145e6988ce25a5902e83b55d32fe56734c434768
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,4221 @@
+{
+ "name": "musical-chess",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "musical-chess",
+ "version": "1.0.0",
+ "dependencies": {
+ "@xenova/transformers": "^2.17.2",
+ "chess.js": "^1.0.0-beta.8",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@types/node": "^20.10.0",
+ "@types/react": "^18.2.43",
+ "@types/react-dom": "^18.2.17",
+ "@typescript-eslint/eslint-plugin": "^6.14.0",
+ "@typescript-eslint/parser": "^6.14.0",
+ "@vitejs/plugin-react": "^4.2.1",
+ "eslint": "^8.55.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.5",
+ "typescript": "^5.2.2",
+ "vite": "^5.0.8"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz",
+ "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz",
+ "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.27.1",
+ "@babel/helper-compilation-targets": "^7.27.1",
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helpers": "^7.27.1",
+ "@babel/parser": "^7.27.1",
+ "@babel/template": "^7.27.1",
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1",
+ "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/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz",
+ "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.27.1",
+ "@babel/types": "^7.27.1",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.2",
+ "@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-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz",
+ "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "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.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "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.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz",
+ "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz",
+ "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.27.1"
+ },
+ "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.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz",
+ "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.27.1",
+ "@babel/parser": "^7.27.1",
+ "@babel/template": "^7.27.1",
+ "@babel/types": "^7.27.1",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz",
+ "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "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/@eslint-community/eslint-utils": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
+ "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@huggingface/jinja": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.2.2.tgz",
+ "integrity": "sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "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/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "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/@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.1",
+ "@protobufjs/inquire": "^1.1.0"
+ }
+ },
+ "node_modules/@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz",
+ "integrity": "sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz",
+ "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz",
+ "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz",
+ "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz",
+ "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz",
+ "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz",
+ "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz",
+ "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz",
+ "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz",
+ "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz",
+ "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz",
+ "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz",
+ "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz",
+ "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz",
+ "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz",
+ "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz",
+ "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz",
+ "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz",
+ "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz",
+ "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz",
+ "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==",
+ "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.20.7",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
+ "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
+ "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/long": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
+ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "20.17.50",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.50.tgz",
+ "integrity": "sha512-Mxiq0ULv/zo1OzOhwPqOA13I81CV/W3nvd3ChtQZRT5Cwz3cr0FKo/wMSsbTqL3EXpaBAEQhva2B8ByRkOIh9A==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.19.2"
+ }
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.14",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.22",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.22.tgz",
+ "integrity": "sha512-vUhG0YmQZ7kL/tmKLrD3g5zXbXXreZXB3pmROW8bg3CnLnpjkRVwUlLne7Ufa2r9yJ8+/6B73RzhAek5TBKh2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "node_modules/@types/semver": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz",
+ "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
+ "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/type-utils": "6.21.0",
+ "@typescript-eslint/utils": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
+ "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
+ "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz",
+ "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/utils": "6.21.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
+ "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
+ "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "9.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
+ "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
+ "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.0.tgz",
+ "integrity": "sha512-JuLWaEqypaJmOJPLWwO335Ig6jSgC1FTONCWAxnqcQthLTK/Yc9aH6hr9z/87xciejbQcnP3GnA1FWUSWeXaeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.26.10",
+ "@babel/plugin-transform-react-jsx-self": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-source": "^7.25.9",
+ "@rolldown/pluginutils": "1.0.0-beta.9",
+ "@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"
+ }
+ },
+ "node_modules/@xenova/transformers": {
+ "version": "2.17.2",
+ "resolved": "https://registry.npmjs.org/@xenova/transformers/-/transformers-2.17.2.tgz",
+ "integrity": "sha512-lZmHqzrVIkSvZdKZEx7IYY51TK0WDrC8eR0c5IMnBsO8di8are1zzw8BlLhyO2TklZKLN5UffNGs1IJwT6oOqQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@huggingface/jinja": "^0.2.2",
+ "onnxruntime-web": "1.14.0",
+ "sharp": "^0.32.0"
+ },
+ "optionalDependencies": {
+ "onnxruntime-node": "1.14.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
+ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/b4a": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
+ "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/bare-events": {
+ "version": "2.5.4",
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz",
+ "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==",
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/bare-fs": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz",
+ "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "bare-events": "^2.5.4",
+ "bare-path": "^3.0.0",
+ "bare-stream": "^2.6.4"
+ },
+ "engines": {
+ "bare": ">=1.16.0"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-os": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz",
+ "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "bare": ">=1.14.0"
+ }
+ },
+ "node_modules/bare-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
+ "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "bare-os": "^3.0.1"
+ }
+ },
+ "node_modules/bare-stream": {
+ "version": "2.6.5",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz",
+ "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "streamx": "^2.21.0"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*",
+ "bare-events": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ },
+ "bare-events": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz",
+ "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==",
+ "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": {
+ "caniuse-lite": "^1.0.30001716",
+ "electron-to-chromium": "^1.5.149",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001718",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz",
+ "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chess.js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.2.0.tgz",
+ "integrity": "sha512-QWdfpAkMslQ48hDDoEzEko6GbYTAKKx4UdXAPEF8nFnAuqp+woyL8LHSbziRP8u1aMAbnlOF0YkXF4ui0Nsubg==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "license": "ISC"
+ },
+ "node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
+ "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.157",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.157.tgz",
+ "integrity": "sha512-/0ybgsQd1muo8QlnuTpKwtl0oX5YMlUGbm8xyqgDU00motRkKFFbUJySAQBWcY79rVqNLWIWa87BGVGClwAB2w==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "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/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.20",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz",
+ "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=8.40"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "license": "(MIT OR WTFPL)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-fifo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
+ "license": "MIT"
+ },
+ "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/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatbuffers": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz",
+ "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==",
+ "license": "SEE LICENSE IN LICENSE.txt"
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "license": "MIT"
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+ "license": "MIT"
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/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/glob/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/guid-typescript": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz",
+ "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==",
+ "license": "ISC"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "license": "MIT"
+ },
+ "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/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/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/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
+ "license": "Apache-2.0"
+ },
+ "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/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "license": "MIT"
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/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/napi-build-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
+ "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
+ "license": "MIT"
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-abi": {
+ "version": "3.75.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz",
+ "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
+ "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onnx-proto": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz",
+ "integrity": "sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA==",
+ "license": "MIT",
+ "dependencies": {
+ "protobufjs": "^6.8.8"
+ }
+ },
+ "node_modules/onnxruntime-common": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz",
+ "integrity": "sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew==",
+ "license": "MIT"
+ },
+ "node_modules/onnxruntime-node": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz",
+ "integrity": "sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w==",
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32",
+ "darwin",
+ "linux"
+ ],
+ "dependencies": {
+ "onnxruntime-common": "~1.14.0"
+ }
+ },
+ "node_modules/onnxruntime-web": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz",
+ "integrity": "sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw==",
+ "license": "MIT",
+ "dependencies": {
+ "flatbuffers": "^1.12.0",
+ "guid-typescript": "^1.0.9",
+ "long": "^4.0.0",
+ "onnx-proto": "^4.0.4",
+ "onnxruntime-common": "~1.14.0",
+ "platform": "^1.3.6"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/platform": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
+ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==",
+ "license": "MIT"
+ },
+ "node_modules/postcss": {
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
+ "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.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prebuild-install": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
+ "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^2.0.0",
+ "node-abi": "^3.3.0",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^4.0.0",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0"
+ },
+ "bin": {
+ "prebuild-install": "bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/prebuild-install/node_modules/tar-fs": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz",
+ "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==",
+ "license": "MIT",
+ "dependencies": {
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
+ }
+ },
+ "node_modules/prebuild-install/node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/protobufjs": {
+ "version": "6.11.4",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz",
+ "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==",
+ "hasInstallScript": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/long": "^4.0.1",
+ "@types/node": ">=13.7.0",
+ "long": "^4.0.0"
+ },
+ "bin": {
+ "pbjs": "bin/pbjs",
+ "pbts": "bin/pbts"
+ }
+ },
+ "node_modules/pump": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
+ "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "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/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/rc/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react": {
+ "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/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz",
+ "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.7"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.41.1",
+ "@rollup/rollup-android-arm64": "4.41.1",
+ "@rollup/rollup-darwin-arm64": "4.41.1",
+ "@rollup/rollup-darwin-x64": "4.41.1",
+ "@rollup/rollup-freebsd-arm64": "4.41.1",
+ "@rollup/rollup-freebsd-x64": "4.41.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.41.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.41.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.41.1",
+ "@rollup/rollup-linux-arm64-musl": "4.41.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.41.1",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.41.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.41.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.41.1",
+ "@rollup/rollup-linux-x64-gnu": "4.41.1",
+ "@rollup/rollup-linux-x64-musl": "4.41.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.41.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.41.1",
+ "@rollup/rollup-win32-x64-msvc": "4.41.1",
+ "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/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/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": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sharp": {
+ "version": "0.32.6",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz",
+ "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "color": "^4.2.3",
+ "detect-libc": "^2.0.2",
+ "node-addon-api": "^6.1.0",
+ "prebuild-install": "^7.1.1",
+ "semver": "^7.5.4",
+ "simple-get": "^4.0.1",
+ "tar-fs": "^3.0.4",
+ "tunnel-agent": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/simple-get": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decompress-response": "^6.0.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/streamx": {
+ "version": "2.22.0",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz",
+ "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-fifo": "^1.3.2",
+ "text-decoder": "^1.1.0"
+ },
+ "optionalDependencies": {
+ "bare-events": "^2.2.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar-fs": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.9.tgz",
+ "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==",
+ "license": "MIT",
+ "dependencies": {
+ "pump": "^3.0.0",
+ "tar-stream": "^3.1.5"
+ },
+ "optionalDependencies": {
+ "bare-fs": "^4.0.1",
+ "bare-path": "^3.0.0"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
+ "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
+ "license": "MIT",
+ "dependencies": {
+ "b4a": "^1.6.4",
+ "fast-fifo": "^1.2.0",
+ "streamx": "^2.15.0"
+ }
+ },
+ "node_modules/text-decoder": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
+ "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "b4a": "^1.6.4"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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-api-utils": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz",
+ "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.19.8",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+ "license": "MIT"
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/vite": {
+ "version": "5.4.19",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz",
+ "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==",
+ "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/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..bf7973df4cf3a82bca6f22785dffdd12a4b1f8cd
--- /dev/null
+++ b/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "musical-chess",
+ "version": "1.0.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview",
+ "start": "python3 -m http.server 3000 --directory dist"
+ },
+ "dependencies": {
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "chess.js": "^1.0.0-beta.8",
+ "@xenova/transformers": "^2.17.2"
+ },
+ "devDependencies": {
+ "@types/node": "^20.10.0",
+ "@types/react": "^18.2.43",
+ "@types/react-dom": "^18.2.17",
+ "@typescript-eslint/eslint-plugin": "^6.14.0",
+ "@typescript-eslint/parser": "^6.14.0",
+ "@vitejs/plugin-react": "^4.2.1",
+ "eslint": "^8.55.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.5",
+ "typescript": "^5.2.2",
+ "vite": "^5.0.8"
+ }
+}
\ No newline at end of file
diff --git a/public/assets/pieces/dark/rotated/Chess_Bdt45.svg b/public/assets/pieces/dark/rotated/Chess_Bdt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0a48f21a5feab3f1f86bd571dd99162bf6b9487e
--- /dev/null
+++ b/public/assets/pieces/dark/rotated/Chess_Bdt45.svg
@@ -0,0 +1,78 @@
+
+
diff --git a/public/assets/pieces/dark/rotated/Chess_Ndt45.svg b/public/assets/pieces/dark/rotated/Chess_Ndt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8c732b997d1c777532a3b9e15a97ce1fe83be19c
--- /dev/null
+++ b/public/assets/pieces/dark/rotated/Chess_Ndt45.svg
@@ -0,0 +1,22 @@
+
+
+
diff --git a/public/assets/pieces/dark/rotated/Chess_fdt45.svg b/public/assets/pieces/dark/rotated/Chess_fdt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2e9387e42184df4916c532d688d6f0134081ae7c
--- /dev/null
+++ b/public/assets/pieces/dark/rotated/Chess_fdt45.svg
@@ -0,0 +1,25 @@
+
+
+
diff --git a/public/assets/pieces/dark/rotated/Chess_gdt45.svg b/public/assets/pieces/dark/rotated/Chess_gdt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..37f06c9a77908ad0822fc2273711eb40083fcc0e
--- /dev/null
+++ b/public/assets/pieces/dark/rotated/Chess_gdt45.svg
@@ -0,0 +1,157 @@
+
+
+
diff --git a/public/assets/pieces/dark/rotated/Chess_hdt45.svg b/public/assets/pieces/dark/rotated/Chess_hdt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3bf141204ea0805e9a38ce65c52a3c6ce7fa743f
--- /dev/null
+++ b/public/assets/pieces/dark/rotated/Chess_hdt45.svg
@@ -0,0 +1,66 @@
+
+
+
diff --git a/public/assets/pieces/dark/rotated/Chess_mdt45.svg b/public/assets/pieces/dark/rotated/Chess_mdt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..47af94144c857058e57441b1f54f9677a2984ce7
--- /dev/null
+++ b/public/assets/pieces/dark/rotated/Chess_mdt45.svg
@@ -0,0 +1,133 @@
+
+
+
diff --git a/public/assets/pieces/dark/upright/Chess_bdt45.svg b/public/assets/pieces/dark/upright/Chess_bdt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b6a8006147a6d7e5828d5e7826efcd0f2c7f9379
--- /dev/null
+++ b/public/assets/pieces/dark/upright/Chess_bdt45.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/public/assets/pieces/dark/upright/Chess_kdt45.svg b/public/assets/pieces/dark/upright/Chess_kdt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ba2ac9fbcef040d1ba98f9802f779197d7cb9b61
--- /dev/null
+++ b/public/assets/pieces/dark/upright/Chess_kdt45.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/public/assets/pieces/dark/upright/Chess_ndt45.svg b/public/assets/pieces/dark/upright/Chess_ndt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..203c6fea853f78c40207a51f9f47d53660e4d4a0
--- /dev/null
+++ b/public/assets/pieces/dark/upright/Chess_ndt45.svg
@@ -0,0 +1,22 @@
+
+
+
diff --git a/public/assets/pieces/dark/upright/Chess_pdt45.svg b/public/assets/pieces/dark/upright/Chess_pdt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b534de8f724f4fbeb01ac04b9f6cbb9408c6babc
--- /dev/null
+++ b/public/assets/pieces/dark/upright/Chess_pdt45.svg
@@ -0,0 +1,5 @@
+
+
+
diff --git a/public/assets/pieces/dark/upright/Chess_qdt45.svg b/public/assets/pieces/dark/upright/Chess_qdt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e55773452c6721d8d177702852c7aa912cde2c87
--- /dev/null
+++ b/public/assets/pieces/dark/upright/Chess_qdt45.svg
@@ -0,0 +1,27 @@
+
+
+
diff --git a/public/assets/pieces/dark/upright/Chess_rdt45.svg b/public/assets/pieces/dark/upright/Chess_rdt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..4eec43c42b1bc84a3985a8f3556d4a7c03b51f84
--- /dev/null
+++ b/public/assets/pieces/dark/upright/Chess_rdt45.svg
@@ -0,0 +1,39 @@
+
+
+
diff --git a/public/assets/pieces/white/rotated/Chess_Blt45.svg b/public/assets/pieces/white/rotated/Chess_Blt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..bd42de5da2cf701fa5ae6ed5e3386fabb0b9694f
--- /dev/null
+++ b/public/assets/pieces/white/rotated/Chess_Blt45.svg
@@ -0,0 +1,79 @@
+
+
diff --git a/public/assets/pieces/white/rotated/Chess_Nlt45.svg b/public/assets/pieces/white/rotated/Chess_Nlt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..11bf6fac03691faa9ec54f131be56951e772e48a
--- /dev/null
+++ b/public/assets/pieces/white/rotated/Chess_Nlt45.svg
@@ -0,0 +1,117 @@
+
+
+
diff --git a/public/assets/pieces/white/rotated/Chess_flt45.svg b/public/assets/pieces/white/rotated/Chess_flt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c902f1206d1bec916d38e76f9e9af5b886904ca3
--- /dev/null
+++ b/public/assets/pieces/white/rotated/Chess_flt45.svg
@@ -0,0 +1,115 @@
+
+
+
diff --git a/public/assets/pieces/white/rotated/Chess_glt45.svg b/public/assets/pieces/white/rotated/Chess_glt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e7bd02914a6b9c3d7e30f1367328f7108fb8c271
--- /dev/null
+++ b/public/assets/pieces/white/rotated/Chess_glt45.svg
@@ -0,0 +1,157 @@
+
+
+
diff --git a/public/assets/pieces/white/rotated/Chess_hlt45.svg b/public/assets/pieces/white/rotated/Chess_hlt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..80945cfdf55fd9e0e1d76eb71560683cd98456bb
--- /dev/null
+++ b/public/assets/pieces/white/rotated/Chess_hlt45.svg
@@ -0,0 +1,87 @@
+
+
+
diff --git a/public/assets/pieces/white/rotated/Chess_mlt45.svg b/public/assets/pieces/white/rotated/Chess_mlt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..95f34634809a1a49e09eed62e76d0d1824cb62f8
--- /dev/null
+++ b/public/assets/pieces/white/rotated/Chess_mlt45.svg
@@ -0,0 +1,117 @@
+
+
+
diff --git a/public/assets/pieces/white/upright/Chess_blt45.svg b/public/assets/pieces/white/upright/Chess_blt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..18f034d5286be1f3abca0bcb53144347a6a44a37
--- /dev/null
+++ b/public/assets/pieces/white/upright/Chess_blt45.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/public/assets/pieces/white/upright/Chess_klt45.svg b/public/assets/pieces/white/upright/Chess_klt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..632ca1afee7acd7c4535bba30f80015f53ce0438
--- /dev/null
+++ b/public/assets/pieces/white/upright/Chess_klt45.svg
@@ -0,0 +1,9 @@
+
+
\ No newline at end of file
diff --git a/public/assets/pieces/white/upright/Chess_nlt45.svg b/public/assets/pieces/white/upright/Chess_nlt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..92feeee00048ff463c967004861f9c8705933138
--- /dev/null
+++ b/public/assets/pieces/white/upright/Chess_nlt45.svg
@@ -0,0 +1,19 @@
+
+
+
diff --git a/public/assets/pieces/white/upright/Chess_plt45.svg b/public/assets/pieces/white/upright/Chess_plt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b265fe1b41d1bd3bbe1ec07df4f881c6e26c985c
--- /dev/null
+++ b/public/assets/pieces/white/upright/Chess_plt45.svg
@@ -0,0 +1,5 @@
+
+
+
diff --git a/public/assets/pieces/white/upright/Chess_qlt45.svg b/public/assets/pieces/white/upright/Chess_qlt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8df7c8f92b5227eaa8db8d326e094c0a9b8d3a07
--- /dev/null
+++ b/public/assets/pieces/white/upright/Chess_qlt45.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/public/assets/pieces/white/upright/Chess_rlt45.svg b/public/assets/pieces/white/upright/Chess_rlt45.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ac03578ecfe15336d28ebfe49c3e9cc5be10f007
--- /dev/null
+++ b/public/assets/pieces/white/upright/Chess_rlt45.svg
@@ -0,0 +1,25 @@
+
+
+
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..8454e888183ae09909e1ebb296ccfe0ad961fd08
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,178 @@
+import { useState, useEffect, useRef } from 'react'
+import { ChessBoard } from './components/ChessBoard'
+import { GameControls } from './components/GameControls'
+import { PromotionDialog } from './components/PromotionDialog'
+import { AudioInfoPopup } from './components/AudioInfoPopup'
+import { useChessGame } from './hooks/useChessGame'
+import { AudioEngine } from './engines/AudioEngine'
+import './styles/App.css'
+
+function App() {
+ const {
+ gameState,
+ draggedPiece,
+ selectedModel,
+ startNewGame,
+ resignGame,
+ togglePlayerColor,
+ selectSquare,
+ attemptMove,
+ completePromotion,
+ startDrag,
+ endDrag,
+ changeModel
+ } = useChessGame()
+
+ const [audioEnabled, setAudioEnabled] = useState(false)
+ const [showAudioInfo, setShowAudioInfo] = useState(false)
+ const [volumeSettings, setVolumeSettings] = useState<{ ambient: number, game: number}>({
+ ambient: 0.8, // Default even louder for ambient beats
+ game: 0.08 // 8% default for game sounds (scaled)
+ })
+ const audioEngineRef = useRef(null)
+
+ // Initialize audio engine
+ useEffect(() => {
+ audioEngineRef.current = new AudioEngine()
+
+ return () => {
+ if (audioEngineRef.current) {
+ audioEngineRef.current.cleanup()
+ }
+ }
+ }, [])
+
+ // Handle audio state changes
+ useEffect(() => {
+ if (audioEngineRef.current) {
+ if (audioEnabled) {
+ audioEngineRef.current.setVolume(0.7)
+ audioEngineRef.current.setBoardFlipped(gameState.playerColor === 'b')
+ if (gameState.gameActive) {
+ audioEngineRef.current.updatePositionAudio(gameState.board, gameState.playerColor)
+ }
+ } else {
+ audioEngineRef.current.setVolume(0)
+ audioEngineRef.current.stopAllAudio()
+ }
+ }
+ }, [audioEnabled, gameState.gameActive, gameState.playerColor])
+
+ // Handle move audio
+ useEffect(() => {
+ if (audioEnabled && audioEngineRef.current && gameState.gameHistory.length > 0) {
+ const lastMove = gameState.gameHistory[gameState.gameHistory.length - 1]
+ audioEngineRef.current.playMoveSound(lastMove.moveData, gameState.board, lastMove.capturedPiece)
+ }
+ }, [gameState.gameHistory.length, audioEnabled])
+
+ // Handle position audio updates
+ useEffect(() => {
+ if (audioEnabled && audioEngineRef.current && gameState.gameActive) {
+ audioEngineRef.current.updateInitiativeVolumes(gameState.board, gameState.playerColor)
+ }
+ }, [gameState.board.fen(), audioEnabled, gameState.gameActive, gameState.playerColor])
+
+ // Stop audio when game ends
+ useEffect(() => {
+ if (audioEngineRef.current && gameState.gameOver) {
+ audioEngineRef.current.stopPositionAudio()
+ }
+ }, [gameState.gameOver])
+
+ const handleStartGame = () => {
+ startNewGame()
+
+ // Enable audio context on user interaction
+ if (audioEnabled && audioEngineRef.current) {
+ audioEngineRef.current.ensureAudioContext()
+ }
+ }
+
+ const handleToggleAudio = () => {
+ setAudioEnabled(!audioEnabled)
+
+ // Enable audio context on user interaction if turning on
+ if (!audioEnabled && audioEngineRef.current) {
+ audioEngineRef.current.ensureAudioContext()
+ }
+ }
+
+ const handleVolumeChange = (type: "ambient" | "game", value: number) => {
+ setVolumeSettings(prev => ({
+ ...prev,
+ [type]: value
+ }))
+
+ // Update audio engine with new volume
+ if (audioEngineRef.current) {
+ switch (type) {
+ case 'ambient':
+ audioEngineRef.current.setAmbientVolume(value)
+ break
+ case 'game':
+ audioEngineRef.current.setGameVolume(value)
+ break
+ }
+ }
+ }
+
+ return (
+
+
+
+
🎵♟️ Musical Chess
+
+
+
+
+
+
+
+
+
setShowAudioInfo(false)}
+ />
+
+ )
+}
+
+export default App
\ No newline at end of file
diff --git a/src/ErrorBoundary.tsx b/src/ErrorBoundary.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..269eeaad823c964187ba2dcc817dd35c9fff7b96
--- /dev/null
+++ b/src/ErrorBoundary.tsx
@@ -0,0 +1,69 @@
+import React from 'react'
+
+export class ErrorBoundary extends React.Component<{
+ children: React.ReactNode
+},{
+ hasError: boolean
+ error?: Error
+} > {
+ constructor(props: {
+ children: React.ReactNode
+ }) {
+ super(props)
+ this.state = { hasError: false }
+ }
+
+ static getDerivedStateFromError(error: Error): {
+ hasError: boolean
+ error?: Error
+ } {
+ return { hasError: true, error }
+ }
+
+ componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
+ console.error('Error caught by boundary:', error, errorInfo)
+ }
+
+ render() {
+ if (this.state.hasError) {
+ return (
+
+
🎵♟️ Musical Chess Arena
+
+
Something went wrong!
+
Error: {this.state.error?.message}
+
+ {this.state.error?.stack}
+
+
+
+
+ )
+ }
+
+ return this.props.children
+ }
+}
\ No newline at end of file
diff --git a/src/components/AudioInfoPopup.tsx b/src/components/AudioInfoPopup.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..21c88412ed541a2ebf021102a01cc6982d27e2ef
--- /dev/null
+++ b/src/components/AudioInfoPopup.tsx
@@ -0,0 +1,56 @@
+import React from 'react'
+import '../styles/AudioInfoPopup.css'
+
+export const AudioInfoPopup: React.FC<{
+ isVisible: boolean
+ onClose: () => void
+}> = ({
+ isVisible,
+ onClose
+}) => {
+ if (!isVisible) return null
+
+ return (
+
+
e.stopPropagation()}>
+
+
🎵 How muscial chess works
+
+
+
+
+
+ 🎯 Initiative Tempo
+ A steady beat represents your position strength:
+
+ - Frequency: A2 (110 Hz)
+ - Tempo: Speed increases with your initiative (up to 120 BPM). No beat = no initiative. Faster beat = stronger position.
+
+
+
+
+ 🎼 Square-Based Move Notes
+ Each square has a unique musical note based on its position:
+
+
Files (left to right): A, B, C♭, C, D, D♭, E, F
+ Ranks (bottom to top): 8 octaves (1st-8th)
+
+ Every move plays two quick beats:
+
+ - First beat: Origin square note.
+ - Second beat: Destination square note.
+
+
+
+
+ ⚡ Special Move Notes
+
+ - Capture: Pop sound.
+ - Danger: Sharp tone (1000 Hz) when piece threatens capture.
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/ChessBoard.tsx b/src/components/ChessBoard.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..e39a2f0d09be6a07e9cad815ffc8baa111a6327e
--- /dev/null
+++ b/src/components/ChessBoard.tsx
@@ -0,0 +1,169 @@
+import React, { useCallback, useState } from 'react'
+import { Square } from 'chess.js'
+import { ChessPiece } from './ChessPiece'
+import { GameState, DraggedPiece } from '../types/chess'
+import { isSquareLight } from '../utils/chessUtils'
+import { AudioEngine } from '../engines/AudioEngine'
+import '../styles/ChessBoard.css'
+import '../styles/ChessSquare.css'
+
+export const ChessBoard: React.FC<{
+ gameState: GameState
+ draggedPiece: DraggedPiece | null
+ audioEngine: AudioEngine | null
+ onSquareClick: (square: Square) => void
+ onPieceDragStart: (square: Square) => void
+ onPieceDrop: (targetSquare: Square | null) => void
+}> = ({
+ gameState,
+ draggedPiece,
+ audioEngine,
+ onSquareClick,
+ onPieceDragStart,
+ onPieceDrop
+}) => {
+ const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 })
+ const [isDragging, setIsDragging] = useState(false)
+
+ const handleMouseMove = useCallback((event: React.MouseEvent) => {
+ setMousePosition({ x: event.clientX, y: event.clientY })
+ }, [])
+
+ const handleSquareClick = useCallback((square: Square) => {
+ if (!isDragging) {
+ onSquareClick(square)
+ }
+ }, [onSquareClick, isDragging])
+
+ const handleMouseDown = useCallback((square: Square) => {
+ const piece = gameState.board.get(square)
+ if (piece && piece.color === gameState.playerColor) {
+ setIsDragging(true)
+ onPieceDragStart(square)
+ }
+ }, [gameState, onPieceDragStart])
+
+ const handleMouseUp = useCallback((square: Square) => {
+ if (isDragging) {
+ onPieceDrop(square)
+ setIsDragging(false)
+ }
+ }, [isDragging, onPieceDrop])
+
+ const renderSquares = () => {
+ const renderedSquares = []
+
+ for (let rank = 8; rank >= 1; rank--) {
+ for (let file = 0; file < 8; file++) {
+ const square = (String.fromCharCode(97 + file) + rank) as Square
+
+ let displayFile = file
+ let displayRank = rank
+
+ if (gameState.playerColor === 'b') {
+ displayFile = 7 - file
+ displayRank = 9 - rank
+ }
+
+ const piece = gameState.board.get(square) || null
+ const isSelected = gameState.selectedSquare === square
+ const isLegalMove = gameState.legalMoves.some(move => move.to === square)
+ const isDraggedSquare = draggedPiece?.square === square
+ const isLight = isSquareLight(square)
+
+ renderedSquares.push(
+ handleSquareClick(square)}
+ onMouseDown={() => handleMouseDown(square)}
+ onMouseUp={() => handleMouseUp(square)}
+ >
+ {piece && !isDraggedSquare && (
+
+
+
+ )}
+
+ {isLegalMove && (
+
+ )}
+
+ )
+ }
+ }
+
+ return renderedSquares
+ }
+
+ const renderDraggedPiece = () => {
+ if (!draggedPiece) return null
+
+ return (
+
+
+
+ )
+ }
+
+ return (
+
+
+
+ {renderSquares()}
+
+
+
+
+ {Array.from({ length: 8 }, (_, i) => {
+ const fileIndex = gameState.playerColor === 'w' ? i : 7 - i
+ const fileLabel = String.fromCharCode(97 + fileIndex)
+ const noteName = audioEngine?.getFileNoteName(fileIndex) || ''
+ return (
+
+ {fileLabel}
+ ({noteName})
+
+ )
+ })}
+
+
+ {Array.from({ length: 8 }, (_, i) => {
+ const rankIndex = gameState.playerColor === 'w' ? 8 - i : i + 1
+ const octave = gameState.playerColor === 'w' ? 8 - i : i + 1
+ return (
+
+ {rankIndex}
+ (♪{octave})
+
+ )
+ })}
+
+
+
+ {renderDraggedPiece()}
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/ChessPiece.tsx b/src/components/ChessPiece.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..aec1ce32218323780cc89f096d4c89882147c06b
--- /dev/null
+++ b/src/components/ChessPiece.tsx
@@ -0,0 +1,48 @@
+import React from 'react'
+import { ChessPiece as ChessPieceType } from '../types/chess'
+import '../styles/ChessPiece.css'
+
+export const ChessPiece: React.FC<{
+ piece: ChessPieceType
+ size: number
+}> = ({
+ piece,
+ size,
+}) => {
+
+ const getPieceImagePath = () => {
+ const color = piece.color === 'w' ? 'white' : 'dark'
+ const orientation = 'upright'
+
+ const pieceFileMap: { [key: string]: string } = {
+ 'k': piece.color === 'w' ? 'Chess_klt45.svg' : 'Chess_kdt45.svg',
+ 'q': piece.color === 'w' ? 'Chess_qlt45.svg' : 'Chess_qdt45.svg',
+ 'r': piece.color === 'w' ? 'Chess_rlt45.svg' : 'Chess_rdt45.svg',
+ 'b': piece.color === 'w' ? 'Chess_blt45.svg' : 'Chess_bdt45.svg',
+ 'n': piece.color === 'w' ? 'Chess_nlt45.svg' : 'Chess_ndt45.svg',
+ 'p': piece.color === 'w' ? 'Chess_plt45.svg' : 'Chess_pdt45.svg'
+ }
+
+ const fileName = pieceFileMap[piece.type]
+ return `/assets/pieces/${color}/${orientation}/${fileName}`
+ }
+
+ return (
+
+
})
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/GameControls.tsx b/src/components/GameControls.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..607c831b12d5e9f40b7a334edabe7d65c11008c2
--- /dev/null
+++ b/src/components/GameControls.tsx
@@ -0,0 +1,152 @@
+import React from 'react'
+import { GameState, CHESS_MODELS } from '../types/chess'
+import { VolumeSlider } from './VolumeSlider'
+import '../styles/GameControls.css'
+
+export const GameControls: React.FC<{
+ gameState: GameState
+ audioEnabled: boolean
+ volumeSettings: {
+ ambient: number
+ game: number
+ }
+ selectedModel: string
+ onStartGame: () => void
+ onResignGame: () => void
+ onToggleColor: () => void
+ onToggleAudio: () => void
+ onVolumeChange: (type: "ambient" | "game", value: number) => void
+ onModelChange: (modelId: string) => void
+}> = ({
+ gameState,
+ audioEnabled,
+ volumeSettings,
+ selectedModel,
+ onStartGame,
+ onResignGame,
+ onToggleColor,
+ onToggleAudio,
+ onVolumeChange,
+ onModelChange
+}) => {
+ const getMainButtonText = () => {
+ if (gameState.gameActive) {
+ return '❌ Resign Game'
+ }
+ return '🎮 Start Game'
+ }
+
+ const getMainButtonAction = () => {
+ if (gameState.gameActive) {
+ return onResignGame
+ }
+ return onStartGame
+ }
+
+ const getColorButtonText = () => {
+ return `⚪ Play as ${gameState.playerColor === 'w' ? 'White' : 'Black'}`
+ }
+
+ const getAudioButtonText = () => {
+ return `🔊 Audio: ${audioEnabled ? 'ON' : 'OFF'}`
+ }
+
+ const getGameStatus = () => {
+ if (gameState.aiModelLoading) {
+ return (
+
+ Loading AI model
+
+ )
+ }
+
+ if (gameState.gameActive) {
+ if (gameState.aiThinking) {
+ return (
+
+ AI is thinking
+
+ )
+ } else if (gameState.board.turn() === gameState.playerColor) {
+ return `Your turn (${gameState.playerColor === 'w' ? 'White' : 'Black'})`
+ } else {
+ return `AI turn (${gameState.playerColor === 'w' ? 'Black' : 'White'})`
+ }
+ } else if (gameState.gameResult?.isGameOver) {
+ return gameState.gameResult.message
+ } else {
+ const aiStatusText = gameState.aiModelLoaded ? '' : ' (AI: Fallback mode)'
+ return `Click 'Start Game' to begin${aiStatusText}`
+ }
+ }
+
+ return (
+
+
+ {getGameStatus()}
+
+
+
+
+
+ {!gameState.gameActive && (
+ <>
+
+
+
+
+
+
+ >
+ )}
+
+
+
+
+ {audioEnabled && (
+
+
Audio Volume
+
+ onVolumeChange('ambient', value)}
+ />
+
+ onVolumeChange('game', value)}
+ />
+
+ )}
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/PromotionDialog.tsx b/src/components/PromotionDialog.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7a711c152ca11fc7d78c08d1cfe2eb38b892a1f3
--- /dev/null
+++ b/src/components/PromotionDialog.tsx
@@ -0,0 +1,47 @@
+import React from 'react'
+import { Color, PieceSymbol } from 'chess.js'
+import { ChessPiece } from './ChessPiece'
+import '../styles/PromotionDialog.css'
+
+export const PromotionDialog: React.FC<{
+ isVisible: boolean
+ color: Color
+ onSelect: (piece: 'q' | 'r' | 'b' | 'n') => void
+}> = ({
+ isVisible,
+ color,
+ onSelect
+}) => {
+ if (!isVisible) return null
+
+ const promotionPieces: Array<{ type: 'q' | 'r' | 'b' | 'n'; symbol: string }> = [
+ { type: 'q', symbol: color === 'w' ? '♕' : '♛' },
+ { type: 'r', symbol: color === 'w' ? '♖' : '♜' },
+ { type: 'b', symbol: color === 'w' ? '♗' : '♝' },
+ { type: 'n', symbol: color === 'w' ? '♘' : '♞' }
+ ]
+
+ return (
+
+
+
+ Choose Promotion Piece
+
+
+ {promotionPieces.map(({ type, symbol }) => (
+
+ ))}
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/components/VolumeSlider.tsx b/src/components/VolumeSlider.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..059d5c4d464bfc0b119d86566c20bf10487d01ce
--- /dev/null
+++ b/src/components/VolumeSlider.tsx
@@ -0,0 +1,43 @@
+import React from 'react'
+import '../styles/VolumeSlider.css'
+
+export const VolumeSlider: React.FC<{
+ label: string
+ value: number
+ onChange: (value: number) => void
+ min?: number
+ max?: number
+ step?: number
+}> = ({
+ label,
+ value,
+ onChange,
+ min = 0,
+ max = 1,
+ step = 0.01
+}) => {
+ const handleChange = (event: React.ChangeEvent) => {
+ const newValue = parseFloat(event.target.value)
+ onChange(newValue)
+ }
+
+ const percentage = Math.round((value / max) * 100)
+
+ return (
+
+
+
+ {percentage}%
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/engines/AudioEngine.ts b/src/engines/AudioEngine.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aae35a59af73f3b3b8ce50fc7706229d2b629fe5
--- /dev/null
+++ b/src/engines/AudioEngine.ts
@@ -0,0 +1,311 @@
+import { Chess, Square, Move, PieceSymbol, Color } from 'chess.js'
+import { PositionEvaluator } from './PositionEvaluator'
+
+export class AudioEngine {
+ private audioContext: AudioContext | null = null
+ private masterGain: GainNode | null = null
+ private isActive: boolean = false
+ private volume: number = 0.7
+ private ambientVolume: number = 0.8
+ private gameVolume: number = 0.048
+ private userInterval: NodeJS.Timeout | null = null
+ private boardFlipped: boolean = false
+
+ private noteFrequencies = {
+ 'A': 27.50, // A0
+ 'B': 30.87, // B0
+ 'Cb': 32.70, // C1♭
+ 'C': 32.70, // C1
+ 'D': 36.71, // D1
+ 'Db': 34.65, // D1♭
+ 'E': 41.20, // E1
+ 'F': 43.65 // F1
+ }
+ private fileNotes = ['A', 'B', 'Cb', 'C', 'D', 'Db', 'E', 'F']
+
+ private fileFrequencies = [
+ this.noteFrequencies.A,
+ this.noteFrequencies.B,
+ this.noteFrequencies.Cb,
+ this.noteFrequencies.C,
+ this.noteFrequencies.D,
+ this.noteFrequencies.Db,
+ this.noteFrequencies.E,
+ this.noteFrequencies.F
+ ]
+ private userInitiativeFreq = 110.0 // A2
+
+ constructor() {
+ this.initialize()
+ }
+
+ private async initialize() {
+ try {
+ this.audioContext = new (window.AudioContext || (window as any).webkitAudioContext)()
+ this.masterGain = this.audioContext.createGain()
+ this.masterGain.connect(this.audioContext.destination)
+ this.masterGain.gain.value = this.volume
+ this.isActive = true
+ console.log('Audio engine initialized')
+ } catch (error) {
+ console.error('Failed to initialize audio engine:', error)
+ this.isActive = false
+ }
+ }
+
+ setBoardFlipped(flipped: boolean) {
+ this.boardFlipped = flipped
+ }
+
+ private getSquareFrequency(square: Square): number {
+ const file = square.charCodeAt(0) - 97
+ const rank = parseInt(square[1]) - 1
+ const actualFile = this.boardFlipped ? 7 - file : file
+ const actualRank = this.boardFlipped ? 7 - rank : rank
+ const baseFreq = this.fileFrequencies[actualFile]
+ const octaveMultiplier = Math.pow(2, actualRank)
+ return baseFreq * octaveMultiplier
+ }
+
+ getFileNoteName(fileIndex: number): string {
+ const actualFile = this.boardFlipped ? 7 - fileIndex : fileIndex
+ return this.fileNotes[actualFile]
+ }
+
+ setVolume(volume: number) {
+ this.volume = Math.max(0, Math.min(1, volume))
+ if (this.masterGain) {
+ this.masterGain.gain.value = this.volume
+ }
+ if (this.volume === 0) {
+ this.stopAllAudio()
+ }
+ }
+
+ setAmbientVolume(volume: number) {
+ this.ambientVolume = Math.max(0, Math.min(1, volume))
+ }
+
+ setGameVolume(volume: number) {
+ this.gameVolume = Math.max(0, Math.min(0.1, volume * 0.1))
+ }
+
+ getAmbientVolume(): number {
+ return this.ambientVolume
+ }
+
+ getGameVolume(): number {
+ return this.gameVolume / 0.1
+ }
+
+ async ensureAudioContext() {
+ if (!this.audioContext) {
+ await this.initialize()
+ }
+
+ if (this.audioContext?.state === 'suspended') {
+ await this.audioContext.resume()
+ }
+ }
+
+ private createTone(frequency: number, duration: number, fadeOut: boolean = true, volume: number = 0.4): Promise {
+ return new Promise((resolve) => {
+ if (!this.audioContext || !this.masterGain || this.volume === 0) {
+ resolve()
+ return
+ }
+
+ const oscillator = this.audioContext.createOscillator()
+ const gainNode = this.audioContext.createGain()
+
+ oscillator.connect(gainNode)
+ gainNode.connect(this.masterGain)
+
+ oscillator.frequency.value = frequency
+ oscillator.type = 'sine'
+
+ const now = this.audioContext.currentTime
+ gainNode.gain.setValueAtTime(volume, now)
+
+ if (fadeOut) {
+ gainNode.gain.exponentialRampToValueAtTime(0.001, now + duration)
+ } else {
+ gainNode.gain.setValueAtTime(volume, now + duration - 0.01)
+ gainNode.gain.exponentialRampToValueAtTime(0.001, now + duration)
+ }
+
+ oscillator.start(now)
+ oscillator.stop(now + duration)
+
+ oscillator.onended = () => resolve()
+ })
+ }
+
+ async playMoveSound(move: Move, board: Chess, capturedPiece?: any) {
+ if (!this.isActive || this.volume === 0) return
+
+ try {
+ await this.ensureAudioContext()
+ const originFreq = this.getSquareFrequency(move.from as Square)
+ const destFreq = this.getSquareFrequency(move.to as Square)
+ const beatDuration = 0.2
+ const pauseDuration = 0.08
+ await this.createTone(originFreq, beatDuration, false, this.gameVolume)
+ await new Promise(resolve => setTimeout(resolve, pauseDuration * 1000))
+ await this.createTone(destFreq, beatDuration, false, this.gameVolume)
+ if (capturedPiece) {
+ await new Promise(resolve => setTimeout(resolve, pauseDuration * 1000))
+ await this.createCaptureSound()
+ } else {
+ const canCapture = this.checkForDanger(move.to as Square, board)
+ if (canCapture) {
+ await new Promise(resolve => setTimeout(resolve, pauseDuration * 1000))
+ await this.createDangerSound()
+ }
+ }
+ } catch (error) {
+ console.error('Error playing move sound:', error)
+ }
+ }
+
+ private async createCaptureSound() {
+ if (!this.audioContext || !this.masterGain) return
+ const duration = 0.2
+ const now = this.audioContext.currentTime
+ const frequencies = [400, 800, 1200]
+ const oscillators: OscillatorNode[] = []
+ const gainNodes: GainNode[] = []
+
+ frequencies.forEach((freq, index) => {
+ const oscillator = this.audioContext!.createOscillator()
+ const gainNode = this.audioContext!.createGain()
+ oscillator.connect(gainNode)
+ gainNode.connect(this.masterGain!)
+ oscillator.frequency.value = freq
+ oscillator.type = 'sine'
+ const harmonic_volume = this.gameVolume * (1 / (index + 1))
+ gainNode.gain.setValueAtTime(harmonic_volume, now)
+ gainNode.gain.exponentialRampToValueAtTime(0.001, now + duration)
+ oscillator.start(now)
+ oscillator.stop(now + duration)
+ oscillators.push(oscillator)
+ gainNodes.push(gainNode)
+ })
+
+ return new Promise(resolve => {
+ oscillators[oscillators.length - 1].onended = () => resolve()
+ })
+ }
+
+ private async createDangerSound() {
+ if (!this.audioContext || !this.masterGain) return
+ const duration = 0.15
+ const now = this.audioContext.currentTime
+ const oscillator = this.audioContext.createOscillator()
+ const gainNode = this.audioContext.createGain()
+ oscillator.connect(gainNode)
+ gainNode.connect(this.masterGain)
+ oscillator.frequency.value = 1000
+ oscillator.type = 'sawtooth'
+ gainNode.gain.setValueAtTime(this.gameVolume, now)
+ gainNode.gain.exponentialRampToValueAtTime(0.001, now + duration)
+ oscillator.start(now)
+ oscillator.stop(now + duration)
+
+ return new Promise(resolve => {
+ oscillator.onended = () => resolve()
+ })
+ }
+
+ private checkForDanger(square: Square, board: Chess): boolean {
+ try {
+ const moves = board.moves({ square, verbose: true })
+ return moves.some((move: any) => move.captured)
+ } catch {
+ return false
+ }
+ }
+
+
+ async updatePositionAudio(board: Chess, userColor: Color = 'w') {
+ if (!this.isActive || this.volume === 0) return
+
+ try {
+ await this.ensureAudioContext()
+ this.startContinuousInitiativeAudio(board, userColor)
+ } catch (error) {
+ console.error('Error updating position audio:', error)
+ }
+ }
+
+ private startContinuousInitiativeAudio(board: Chess, userColor: Color = 'w') {
+ if (!this.audioContext || !this.masterGain) return
+ this.stopPositionAudio()
+ const userInitiative = PositionEvaluator.getInitiative(board, userColor)
+ const userBeatsPerMinute = userInitiative * 120
+ if (userBeatsPerMinute > 0) {
+ const userInterval = (60 / userBeatsPerMinute) * 1000
+ this.userInterval = setInterval(() => {
+ this.playInitiativeBeat(this.userInitiativeFreq)
+ }, userInterval)
+ }
+ }
+
+ private async playInitiativeBeat(frequency: number) {
+ if (!this.audioContext || !this.masterGain || this.volume === 0) return
+ const oscillator = this.audioContext.createOscillator()
+ const gainNode = this.audioContext.createGain()
+ oscillator.connect(gainNode)
+ gainNode.connect(this.masterGain)
+ oscillator.frequency.value = frequency
+ oscillator.type = 'sine'
+ const now = this.audioContext.currentTime
+ const duration = 0.1
+ const volume = this.ambientVolume
+ gainNode.gain.setValueAtTime(volume, now)
+ gainNode.gain.exponentialRampToValueAtTime(0.001, now + duration)
+ oscillator.start(now)
+ oscillator.stop(now + duration)
+ }
+
+ updateInitiativeVolumes(board: Chess, userColor: Color = 'w') {
+ this.startContinuousInitiativeAudio(board, userColor)
+ }
+
+ stopPositionAudio() {
+ if (this.userInterval) {
+ clearInterval(this.userInterval)
+ this.userInterval = null
+ }
+ }
+
+ stopAllAudio() {
+ this.stopPositionAudio()
+ if (this.audioContext) {
+ try {
+ if (this.masterGain) {
+ this.masterGain.disconnect()
+ this.masterGain = this.audioContext.createGain()
+ this.masterGain.connect(this.audioContext.destination)
+ this.masterGain.gain.value = this.volume
+ }
+ } catch (error) {
+ console.error('Error stopping audio:', error)
+ }
+ }
+ }
+
+ isPlaying(): boolean {
+ return this.userInterval !== null
+ }
+
+ cleanup() {
+ this.stopAllAudio()
+ this.isActive = false
+
+ if (this.audioContext) {
+ this.audioContext.close()
+ this.audioContext = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/engines/ChessAI.ts b/src/engines/ChessAI.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ee5687322c96e20867863e8879926936aaca4429
--- /dev/null
+++ b/src/engines/ChessAI.ts
@@ -0,0 +1,129 @@
+import { Chess, Move } from 'chess.js'
+import { pipeline } from '@xenova/transformers'
+
+export class ChessAI {
+ private model: any = null
+ private isLoading: boolean = false
+ private modelId: string
+ constructor(modelId: string = 'mlabonne/chesspythia-70m') {
+ this.modelId = modelId
+ }
+
+ async initialize(): Promise {
+ if (this.model || this.isLoading) return
+
+ this.isLoading = true
+ try {
+ this.model = await pipeline('text-generation', this.modelId)
+ } catch (error) {
+ console.error('Failed to load chess model:', error)
+ this.model = null
+ } finally {
+ this.isLoading = false
+ }
+ }
+
+ async getMove(chess: Chess, timeLimit: number = 10000): Promise {
+ if (!this.model) {
+ console.log('Using fallback AI (model not loaded)')
+ return this.getFallbackMove(chess)
+ }
+
+ try {
+ const legalMoves = chess.moves({ verbose: true })
+ if (legalMoves.length === 0) return null
+ const prompt = this.createChessPrompt(chess)
+ const startTime = Date.now()
+ const result = await Promise.race([
+ this.generateMove(prompt, legalMoves),
+ new Promise((_, reject) =>
+ setTimeout(() => reject(new Error('Timeout')), timeLimit)
+ )
+ ])
+ const elapsedTime = Date.now() - startTime
+ console.log(`AI move generated in ${elapsedTime}ms`)
+ return result || this.getFallbackMove(chess)
+ } catch (error) {
+ console.error('Error generating AI move:', error)
+ return this.getFallbackMove(chess)
+ }
+ }
+
+ private async generateMove(prompt: string, legalMoves: Move[]): Promise {
+ if (!this.model) return null
+
+ try {
+ const output = await this.model(prompt, {
+ max_new_tokens: 10,
+ temperature: 0.7
+ })
+ const generatedText = Array.isArray(output) ? output[0]?.generated_text : output.generated_text
+ console.log('Model output:', generatedText)
+ const move = this.parseMove(generatedText, legalMoves)
+ return move
+ } catch (error) {
+ console.error('Error in model generation:', error)
+ return null
+ }
+ }
+
+ private createChessPrompt(chess: Chess): string {
+ const turn = chess.turn()
+ const moveNumber = chess.moveNumber()
+ if (turn === 'w') {
+ return `${moveNumber}.`
+ } else {
+ return `${moveNumber}...`
+ }
+ }
+
+ private parseMove(generatedText: string, legalMoves: Move[]): Move | null {
+ if (!generatedText) return null
+ const cleanText = generatedText.trim().replace(/[+#]$/, '')
+ for (const move of legalMoves) {
+ if (move.san === cleanText || move.lan === cleanText) {
+ return move
+ }
+ }
+ for (const move of legalMoves) {
+ if (move.san.startsWith(cleanText) || cleanText.includes(move.san)) {
+ return move
+ }
+ }
+ console.log(`Could not parse move "${cleanText}" from legal moves:`, legalMoves.map(m => m.san))
+ return null
+ }
+
+ private getFallbackMove(chess: Chess): Move | null {
+ const legalMoves = chess.moves({ verbose: true })
+ if (legalMoves.length === 0) return null
+ let candidateMoves = legalMoves.filter(move => move.captured)
+ if (candidateMoves.length === 0) {
+ candidateMoves = legalMoves.filter(move => {
+ chess.move(move)
+ const isCheck = chess.inCheck()
+ chess.undo()
+ return isCheck
+ })
+ }
+ if (candidateMoves.length === 0) {
+ candidateMoves = legalMoves
+ }
+ const randomIndex = Math.floor(Math.random() * candidateMoves.length)
+ return candidateMoves[randomIndex]
+ }
+
+ isModelLoaded(): boolean {
+ return this.model !== null
+ }
+
+ isModelLoading(): boolean {
+ return this.isLoading
+ }
+
+ getModelInfo(): string {
+ if (this.isLoading) return 'Loading...'
+ if (this.model) return `${this.modelId} (Loaded)`
+ return `${this.modelId} (Not loaded)`
+ }
+}
\ No newline at end of file
diff --git a/src/engines/PositionEvaluator.ts b/src/engines/PositionEvaluator.ts
new file mode 100644
index 0000000000000000000000000000000000000000..595c36ea9c7152633df896f5f2bbec2a006f11ad
--- /dev/null
+++ b/src/engines/PositionEvaluator.ts
@@ -0,0 +1,443 @@
+import { Chess, Square, PieceSymbol, Color } from 'chess.js'
+
+export class PositionEvaluator {
+ private static readonly PIECE_VALUES: Record = {
+ 'p': 100,
+ 'n': 320,
+ 'b': 330,
+ 'r': 500,
+ 'q': 900,
+ 'k': 20000
+ }
+
+ private static readonly PAWN_TABLE = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 50, 50, 50, 50, 50, 50, 50, 50,
+ 10, 10, 20, 30, 30, 20, 10, 10,
+ 5, 5, 10, 25, 25, 10, 5, 5,
+ 0, 0, 0, 20, 20, 0, 0, 0,
+ 5, -5,-10, 0, 0,-10, -5, 5,
+ 5, 10, 10,-20,-20, 10, 10, 5,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ ]
+
+ private static readonly KNIGHT_TABLE = [
+ -50,-40,-30,-30,-30,-30,-40,-50,
+ -40,-20, 0, 0, 0, 0,-20,-40,
+ -30, 0, 10, 15, 15, 10, 0,-30,
+ -30, 5, 15, 20, 20, 15, 5,-30,
+ -30, 0, 15, 20, 20, 15, 0,-30,
+ -30, 5, 10, 15, 15, 10, 5,-30,
+ -40,-20, 0, 5, 5, 0,-20,-40,
+ -50,-40,-30,-30,-30,-30,-40,-50
+ ]
+
+ private static readonly BISHOP_TABLE = [
+ -20,-10,-10,-10,-10,-10,-10,-20,
+ -10, 0, 0, 0, 0, 0, 0,-10,
+ -10, 0, 5, 10, 10, 5, 0,-10,
+ -10, 5, 5, 10, 10, 5, 5,-10,
+ -10, 0, 10, 10, 10, 10, 0,-10,
+ -10, 10, 10, 10, 10, 10, 10,-10,
+ -10, 5, 0, 0, 0, 0, 5,-10,
+ -20,-10,-10,-10,-10,-10,-10,-20
+ ]
+
+ private static readonly ROOK_TABLE = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 10, 10, 10, 10, 10, 10, 5,
+ -5, 0, 0, 0, 0, 0, 0, -5,
+ -5, 0, 0, 0, 0, 0, 0, -5,
+ -5, 0, 0, 0, 0, 0, 0, -5,
+ -5, 0, 0, 0, 0, 0, 0, -5,
+ -5, 0, 0, 0, 0, 0, 0, -5,
+ 0, 0, 0, 5, 5, 0, 0, 0
+ ]
+
+ private static readonly QUEEN_TABLE = [
+ -20,-10,-10, -5, -5,-10,-10,-20,
+ -10, 0, 0, 0, 0, 0, 0,-10,
+ -10, 0, 5, 5, 5, 5, 0,-10,
+ -5, 0, 5, 5, 5, 5, 0, -5,
+ 0, 0, 5, 5, 5, 5, 0, -5,
+ -10, 5, 5, 5, 5, 5, 0,-10,
+ -10, 0, 5, 0, 0, 0, 0,-10,
+ -20,-10,-10, -5, -5,-10,-10,-20
+ ]
+
+ private static readonly KING_MIDDLE_GAME_TABLE = [
+ -30,-40,-40,-50,-50,-40,-40,-30,
+ -30,-40,-40,-50,-50,-40,-40,-30,
+ -30,-40,-40,-50,-50,-40,-40,-30,
+ -30,-40,-40,-50,-50,-40,-40,-30,
+ -20,-30,-30,-40,-40,-30,-30,-20,
+ -10,-20,-20,-20,-20,-20,-20,-10,
+ 20, 20, 0, 0, 0, 0, 20, 20,
+ 20, 30, 10, 0, 0, 10, 30, 20
+ ]
+
+ private static readonly KING_END_GAME_TABLE = [
+ -50,-40,-30,-20,-20,-30,-40,-50,
+ -30,-20,-10, 0, 0,-10,-20,-30,
+ -30,-10, 20, 30, 30, 20,-10,-30,
+ -30,-10, 30, 40, 40, 30,-10,-30,
+ -30,-10, 30, 40, 40, 30,-10,-30,
+ -30,-10, 20, 30, 30, 20,-10,-30,
+ -30,-30, 0, 0, 0, 0,-30,-30,
+ -50,-30,-30,-30,-30,-30,-30,-50
+ ]
+
+ /**
+ * Evaluates the current position from White's perspective
+ * Positive values favor White, negative values favor Black
+ */
+ public static evaluatePosition(board: Chess): number {
+ if (board.isGameOver()) {
+ if (board.isCheckmate()) {
+ return board.turn() === 'w' ? -30000 : 30000
+ }
+ return 0 // draw
+ }
+
+ let score = 0
+ const isEndGame = this.isEndGame(board)
+
+ // material and positional evaluation
+ for (let rank = 0; rank < 8; rank++) {
+ for (let file = 0; file < 8; file++) {
+ const square = (String.fromCharCode(97 + file) + (rank + 1)) as Square
+ const piece = board.get(square)
+
+ if (piece) {
+ const pieceValue = this.evaluatePiece(piece.type, piece.color, rank, file, isEndGame)
+ score += piece.color === 'w' ? pieceValue : -pieceValue
+ }
+ }
+ }
+
+ // mobility bonus
+ const { whiteMobility, blackMobility } = this.calculateMobility(board)
+ score += (whiteMobility - blackMobility) * 10
+
+ // king safety in middle game
+ if (!isEndGame) {
+ score += this.evaluateKingSafety(board, 'w')
+ score -= this.evaluateKingSafety(board, 'b')
+ }
+
+ // pawn structure
+ score += this.evaluatePawnStructure(board)
+
+ // center control
+ score += this.evaluateCenterControl(board)
+
+ return score
+ }
+
+ private static evaluatePiece(
+ pieceType: PieceSymbol,
+ color: Color,
+ rank: number,
+ file: number,
+ isEndGame: boolean
+ ): number {
+ const index = rank * 8 + file
+ const flippedIndex = color === 'w' ? (7 - rank) * 8 + file : index
+
+ let value = this.PIECE_VALUES[pieceType]
+
+ switch (pieceType) {
+ case 'p':
+ value += this.PAWN_TABLE[flippedIndex]
+ break
+ case 'n':
+ value += this.KNIGHT_TABLE[flippedIndex]
+ break
+ case 'b':
+ value += this.BISHOP_TABLE[flippedIndex]
+ break
+ case 'r':
+ value += this.ROOK_TABLE[flippedIndex]
+ break
+ case 'q':
+ value += this.QUEEN_TABLE[flippedIndex]
+ break
+ case 'k':
+ if (isEndGame) {
+ value += this.KING_END_GAME_TABLE[flippedIndex]
+ } else {
+ value += this.KING_MIDDLE_GAME_TABLE[flippedIndex]
+ }
+ break
+ }
+
+ return value
+ }
+
+ private static isEndGame(board: Chess): boolean {
+ let materialCount = 0
+ const squares = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
+
+ for (const file of squares) {
+ for (let rank = 1; rank <= 8; rank++) {
+ const square = (file + rank) as Square
+ const piece = board.get(square)
+ if (piece && piece.type !== 'k' && piece.type !== 'p') {
+ materialCount += this.PIECE_VALUES[piece.type]
+ }
+ }
+ }
+
+ return materialCount < 2500
+ }
+
+ private static evaluateKingSafety(board: Chess, color: Color): number {
+ const kingSquare = this.findKing(board, color)
+ if (!kingSquare) return 0
+
+ let safety = 0
+ const kingFile = kingSquare.charCodeAt(0) - 97
+ const kingRank = parseInt(kingSquare[1]) - 1
+
+ // check for pawn shield
+ const pawnShieldRank = color === 'w' ? kingRank + 1 : kingRank - 1
+ if (pawnShieldRank >= 0 && pawnShieldRank < 8) {
+ for (let file = Math.max(0, kingFile - 1); file <= Math.min(7, kingFile + 1); file++) {
+ const shieldSquare = (String.fromCharCode(97 + file) + (pawnShieldRank + 1)) as Square
+ const piece = board.get(shieldSquare)
+ if (piece && piece.type === 'p' && piece.color === color) {
+ safety += 30
+ }
+ }
+ }
+
+ return safety
+ }
+
+ private static evaluatePawnStructure(board: Chess): number {
+ let score = 0
+ const files = [0, 0, 0, 0, 0, 0, 0, 0]
+
+ // count pawns
+ for (let file = 0; file < 8; file++) {
+ let whitePawns = 0
+ let blackPawns = 0
+
+ for (let rank = 0; rank < 8; rank++) {
+ const square = (String.fromCharCode(97 + file) + (rank + 1)) as Square
+ const piece = board.get(square)
+ if (piece && piece.type === 'p') {
+ if (piece.color === 'w') whitePawns++
+ else blackPawns++
+ }
+ }
+
+ // penalty for doubled pawns
+ if (whitePawns > 1) score -= (whitePawns - 1) * 50
+ if (blackPawns > 1) score += (blackPawns - 1) * 50
+
+ files[file] = whitePawns - blackPawns
+ }
+
+ // penalty for isolated pawns
+ for (let file = 0; file < 8; file++) {
+ if (files[file] !== 0) {
+ const leftFile = file > 0 ? files[file - 1] : 0
+ const rightFile = file < 7 ? files[file + 1] : 0
+
+ if (leftFile === 0 && rightFile === 0) {
+ score -= Math.abs(files[file]) * 20
+ }
+ }
+ }
+
+ return score
+ }
+
+ private static evaluateCenterControl(board: Chess): number {
+ let score = 0
+ const centerSquares = ['d4', 'd5', 'e4', 'e5']
+
+ for (const square of centerSquares) {
+ const piece = board.get(square as Square)
+ if (piece) {
+ const value = piece.type === 'p' ? 20 : 10
+ score += piece.color === 'w' ? value : -value
+ }
+ }
+
+ return score
+ }
+
+ private static findKing(board: Chess, color: Color): Square | null {
+ const squares = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
+
+ for (const file of squares) {
+ for (let rank = 1; rank <= 8; rank++) {
+ const square = (file + rank) as Square
+ const piece = board.get(square)
+ if (piece && piece.type === 'k' && piece.color === color) {
+ return square
+ }
+ }
+ }
+
+ return null
+ }
+
+ private static calculateMobility(board: Chess): { whiteMobility: number, blackMobility: number } {
+ const originalFen = board.fen()
+ const currentTurn = board.turn()
+
+ let whiteMobility = 0
+ let blackMobility = 0
+
+ if (currentTurn === 'w') {
+ whiteMobility = board.moves().length
+
+ const fenParts = originalFen.split(' ')
+ fenParts[1] = 'b'
+ try {
+ const blackTurnFen = fenParts.join(' ')
+ const blackBoard = new Chess(blackTurnFen)
+ blackMobility = blackBoard.moves().length
+ } catch {
+ blackMobility = 0
+ }
+ } else {
+ blackMobility = board.moves().length
+ const fenParts = originalFen.split(' ')
+ fenParts[1] = 'w'
+ try {
+ const whiteTurnFen = fenParts.join(' ')
+ const whiteBoard = new Chess(whiteTurnFen)
+ whiteMobility = whiteBoard.moves().length
+ } catch {
+ whiteMobility = 0
+ }
+ }
+
+ return { whiteMobility, blackMobility }
+ }
+
+
+ public static evaluateForColor(board: Chess, color: Color): number {
+ const evaluation = this.evaluatePosition(board)
+ return color === 'w' ? evaluation : -evaluation
+ }
+
+
+ public static getInitiative(board: Chess, color: Color): number {
+ const evaluation = this.evaluateForColor(board, color)
+ const gameActivity = this.calculateGameActivity(board)
+ const baseInitiative = Math.max(0, Math.min(1, (evaluation + 500) / 1000))
+ return baseInitiative * gameActivity
+ }
+
+
+ private static calculateGameActivity(board: Chess): number {
+ let activity = 0
+
+ // count pieces not on starting squares
+ const developmentScore = this.calculateDevelopment(board)
+ activity += Math.min(0.4, developmentScore / 8)
+
+ // count tactical opportunities
+ const tacticalScore = this.calculateTacticalActivity(board)
+ activity += Math.min(0.3, tacticalScore / 10)
+
+ // calc material imbalance
+ const materialImbalance = Math.abs(this.calculateMaterialBalance(board))
+ activity += Math.min(0.2, materialImbalance / 500)
+
+ // count king threats
+ const kingSafety = this.calculateKingThreats(board)
+ activity += Math.min(0.1, kingSafety / 5)
+
+ return Math.min(1, activity)
+ }
+
+ private static calculateDevelopment(board: Chess): number {
+ let development = 0
+
+ const startingPositions = {
+ 'b1': 'n', 'g1': 'n', 'c1': 'b', 'f1': 'b', 'd1': 'q', // white
+ 'b8': 'n', 'g8': 'n', 'c8': 'b', 'f8': 'b', 'd8': 'q' // black
+ }
+
+ for (const [square, expectedPiece] of Object.entries(startingPositions)) {
+ const piece = board.get(square as Square)
+ if (!piece || piece.type !== expectedPiece) {
+ development++
+ }
+ }
+
+ return development
+ }
+
+ private static calculateTacticalActivity(board: Chess): number {
+ let tactical = 0
+ const moves = board.moves({ verbose: true })
+
+ for (const move of moves) {
+ if (move.captured) tactical += 2 // captures
+ if (move.san.includes('+')) tactical += 1 // checks
+ if (move.san.includes('#')) tactical += 3 // checkmate
+ if (move.promotion) tactical += 2 // promotions
+ }
+
+ return tactical
+ }
+
+ private static calculateMaterialBalance(board: Chess): number {
+ let balance = 0
+ const squares = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
+
+ for (const file of squares) {
+ for (let rank = 1; rank <= 8; rank++) {
+ const square = (file + rank) as Square
+ const piece = board.get(square)
+ if (piece && piece.type !== 'k') {
+ const value = this.PIECE_VALUES[piece.type]
+ balance += piece.color === 'w' ? value : -value
+ }
+ }
+ }
+
+ return balance
+ }
+
+ private static calculateKingThreats(board: Chess): number {
+ let threats = 0
+ const whiteKing = this.findKing(board, 'w')
+ const blackKing = this.findKing(board, 'b')
+ if (whiteKing) threats += this.countAttacksNearSquare(board, whiteKing, 'b')
+ if (blackKing) threats += this.countAttacksNearSquare(board, blackKing, 'w')
+ return threats
+ }
+
+ private static countAttacksNearSquare(board: Chess, square: Square, attackingColor: Color): number {
+ let attacks = 0
+ const file = square.charCodeAt(0) - 97
+ const rank = parseInt(square[1]) - 1
+ for (let f = Math.max(0, file - 1); f <= Math.min(7, file + 1); f++) {
+ for (let r = Math.max(0, rank - 1); r <= Math.min(7, rank + 1); r++) {
+ const checkSquare = (String.fromCharCode(97 + f) + (r + 1)) as Square
+ try {
+ const moves = board.moves({ square: checkSquare, verbose: true })
+ const hasAttack = moves.some((move: any) => {
+ const piece = board.get(move.from)
+ return piece && piece.color === attackingColor &&
+ Math.abs(move.to.charCodeAt(0) - square.charCodeAt(0)) <= 1 &&
+ Math.abs(parseInt(move.to[1]) - parseInt(square[1])) <= 1
+ })
+ if (hasAttack) attacks++
+ } catch {
+ // ignore invalid moves
+ }
+ }
+ }
+
+ return attacks
+ }
+}
\ No newline at end of file
diff --git a/src/hooks/useChessGame.ts b/src/hooks/useChessGame.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7b8a33d87daf5b1458d5047143cc69a6e5463d26
--- /dev/null
+++ b/src/hooks/useChessGame.ts
@@ -0,0 +1,404 @@
+import { useState, useCallback, useRef, useEffect } from 'react'
+import { Chess, Square, Move, Color } from 'chess.js'
+import { GameState, GameHistoryEntry, DraggedPiece } from '../types/chess'
+import { evaluateGameState, isPotentialPromotion } from '../utils/chessUtils'
+import { ChessAI } from '../engines/ChessAI'
+
+export function useChessGame() {
+ const [gameState, setGameState] = useState({
+ board: new Chess(),
+ gameActive: false,
+ playerColor: 'w',
+ selectedSquare: null,
+ legalMoves: [],
+ gameHistory: [],
+ gameOver: false,
+ gameResult: null,
+ promotionMove: null,
+ promotionDialogActive: false,
+ aiThinking: false,
+ aiModelLoaded: false,
+ aiModelLoading: false
+ })
+ const [selectedModel, setSelectedModel] = useState('mlabonne/chesspythia-70m')
+
+ const [draggedPiece, setDraggedPiece] = useState(null)
+ const aiTimeoutRef = useRef()
+ const chessAI = useRef(null)
+
+ // init chess model
+ useEffect(() => {
+ const initializeAI = async () => {
+ setGameState(prev => ({ ...prev, aiModelLoading: true }))
+
+ chessAI.current = new ChessAI(selectedModel)
+
+ try {
+ await chessAI.current.initialize()
+ setGameState(prev => ({
+ ...prev,
+ aiModelLoaded: true,
+ aiModelLoading: false
+ }))
+ console.log(`Chess AI model ${selectedModel} loaded successfully`)
+ } catch (error) {
+ console.error(`Failed to load Chess AI model ${selectedModel}:`, error)
+ setGameState(prev => ({
+ ...prev,
+ aiModelLoaded: false,
+ aiModelLoading: false
+ }))
+ }
+ }
+
+ initializeAI()
+
+ return () => {
+ if (aiTimeoutRef.current) {
+ clearTimeout(aiTimeoutRef.current)
+ }
+ }
+ }, [selectedModel])
+
+ const startNewGame = useCallback(() => {
+ clearTimeout(aiTimeoutRef.current)
+
+ setGameState(prev => ({
+ ...prev,
+ board: new Chess(),
+ gameActive: true,
+ gameOver: false,
+ gameHistory: [],
+ selectedSquare: null,
+ legalMoves: [],
+ gameResult: null,
+ promotionDialogActive: false,
+ promotionMove: null,
+ aiThinking: false
+ }))
+
+ if (gameState.playerColor === 'b') {
+ setGameState(prev => ({ ...prev, aiThinking: true }))
+ aiTimeoutRef.current = setTimeout(() => {
+ makeAIMove()
+ }, 500)
+ }
+ }, [gameState.playerColor])
+
+ const resignGame = useCallback(() => {
+ clearTimeout(aiTimeoutRef.current)
+
+ const winner = gameState.playerColor === 'w' ? 'b' : 'w'
+ const gameResult = {
+ isGameOver: true,
+ winner: winner as Color,
+ message: `Game Over! ${gameState.playerColor === 'w' ? 'White' : 'Black'} resigned - ${winner === 'w' ? 'White' : 'Black'} wins!`,
+ terminationReason: 'resignation',
+ details: `${gameState.playerColor === 'w' ? 'White' : 'Black'} player resigned the game`
+ }
+
+ setGameState(prev => ({
+ ...prev,
+ gameActive: false,
+ gameOver: true,
+ gameResult,
+ aiThinking: false
+ }))
+ }, [gameState.playerColor])
+
+ const togglePlayerColor = useCallback(() => {
+ if (!gameState.gameActive) {
+ setGameState(prev => ({
+ ...prev,
+ playerColor: prev.playerColor === 'w' ? 'b' : 'w'
+ }))
+ }
+ }, [gameState.gameActive])
+
+ const selectSquare = useCallback((square: Square) => {
+ if (!gameState.gameActive || gameState.board.turn() !== gameState.playerColor || gameState.aiThinking) {
+ return
+ }
+
+ const piece = gameState.board.get(square)
+
+ if (piece && piece.color === gameState.playerColor) {
+ const moves = gameState.board.moves({ square, verbose: true })
+ setGameState(prev => ({
+ ...prev,
+ selectedSquare: square,
+ legalMoves: moves
+ }))
+ }
+ }, [gameState])
+
+ const attemptMove = useCallback((from: Square, to: Square) => {
+ console.log('attemptMove called:', from, 'to', to)
+
+ if (!gameState.gameActive || gameState.board.turn() !== gameState.playerColor) {
+ console.log('Move rejected: game not active or not player turn')
+ return false
+ }
+
+ if (isPotentialPromotion(gameState.board, from, to)) {
+ const possibleMoves = gameState.board.moves({ square: from, verbose: true })
+ const hasLegalPromotion = possibleMoves.some(move =>
+ move.to === to && move.promotion !== undefined
+ )
+
+ if (hasLegalPromotion) {
+ setGameState(prev => ({
+ ...prev,
+ promotionMove: { from, to, promotion: 'q' } as Move,
+ promotionDialogActive: true,
+ selectedSquare: null,
+ legalMoves: []
+ }))
+ return true
+ }
+ }
+
+ try {
+ const testBoard = new Chess(gameState.board.fen())
+ const move = testBoard.move({ from, to })
+
+ if (move) {
+ const historyEntry: GameHistoryEntry = {
+ move: move.san,
+ moveData: move,
+ player: 'Human',
+ timestamp: new Date(),
+ capturedPiece: move.captured ? { type: move.captured, color: gameState.board.turn() === 'w' ? 'b' : 'w' } : undefined
+ }
+
+ setGameState(prev => ({
+ ...prev,
+ board: testBoard,
+ gameHistory: [...prev.gameHistory, historyEntry],
+ selectedSquare: null,
+ legalMoves: []
+ }))
+
+ const gameResult = evaluateGameState(testBoard)
+ if (gameResult.isGameOver) {
+ setGameState(prev => ({
+ ...prev,
+ gameActive: false,
+ gameOver: true,
+ gameResult
+ }))
+ } else {
+ // trigger AI move
+ setGameState(prev => ({ ...prev, aiThinking: true }))
+ aiTimeoutRef.current = setTimeout(() => {
+ makeAIMove()
+ }, 1000)
+ }
+
+ return true
+ } else {
+ console.log('Move returned null/false')
+ }
+ } catch (error) {
+ console.log('Invalid move attempted:', error)
+ }
+
+ return false
+ }, [gameState])
+
+
+ const makeAIMove = useCallback(async () => {
+ if (!chessAI.current) {
+ setGameState(prev => ({ ...prev, aiThinking: false }))
+ return
+ }
+
+ try {
+ setGameState(prev => {
+ const currentBoard = new Chess(prev.board.fen())
+
+ if (!prev.gameActive || currentBoard.turn() === prev.playerColor) {
+ return { ...prev, aiThinking: false }
+ }
+
+ const possibleMoves = currentBoard.moves({ verbose: true })
+ if (possibleMoves.length === 0) {
+ return { ...prev, aiThinking: false }
+ }
+
+ chessAI.current!.getMove(currentBoard, 10000).then(aiMove => {
+
+ if (!aiMove) {
+ setGameState(prev => ({ ...prev, aiThinking: false }))
+ return
+ }
+
+ const moveResult = currentBoard.move(aiMove)
+ if (!moveResult) {
+ setGameState(prev => ({ ...prev, aiThinking: false }))
+ return
+ }
+
+ const historyEntry: GameHistoryEntry = {
+ move: moveResult.san,
+ moveData: moveResult,
+ player: 'AI',
+ timestamp: new Date(),
+ capturedPiece: moveResult.captured ? { type: moveResult.captured, color: currentBoard.turn() === 'w' ? 'b' : 'w' } : undefined
+ }
+
+ const gameResult = evaluateGameState(currentBoard)
+
+ setGameState(prev => ({
+ ...prev,
+ board: currentBoard,
+ gameHistory: [...prev.gameHistory, historyEntry],
+ aiThinking: false,
+ gameActive: !gameResult.isGameOver,
+ gameOver: gameResult.isGameOver,
+ gameResult: gameResult.isGameOver ? gameResult : null
+ }))
+ }).catch(error => {
+ console.error('Error in AI move generation:', error)
+ setGameState(prev => ({ ...prev, aiThinking: false }))
+ })
+
+ return prev
+ })
+
+ } catch (error) {
+ console.error('Error in AI move setup:', error)
+ setGameState(prev => ({ ...prev, aiThinking: false }))
+ }
+ }, [])
+
+ const completePromotion = useCallback((promotionPiece: 'q' | 'r' | 'b' | 'n') => {
+ if (!gameState.promotionMove) return
+
+ try {
+ const testBoard = new Chess(gameState.board.fen())
+ const move = testBoard.move({
+ from: gameState.promotionMove.from,
+ to: gameState.promotionMove.to,
+ promotion: promotionPiece
+ })
+
+ if (move) {
+ const historyEntry: GameHistoryEntry = {
+ move: move.san,
+ moveData: move,
+ player: 'Human',
+ timestamp: new Date(),
+ capturedPiece: move.captured ? { type: move.captured, color: gameState.board.turn() === 'w' ? 'b' : 'w' } : undefined
+ }
+
+ setGameState(prev => ({
+ ...prev,
+ board: testBoard,
+ gameHistory: [...prev.gameHistory, historyEntry],
+ selectedSquare: null,
+ legalMoves: [],
+ promotionDialogActive: false,
+ promotionMove: null
+ }))
+
+ const gameResult = evaluateGameState(testBoard)
+ if (gameResult.isGameOver) {
+ setGameState(prev => ({
+ ...prev,
+ gameActive: false,
+ gameOver: true,
+ gameResult
+ }))
+ } else {
+ setGameState(prev => ({ ...prev, aiThinking: true }))
+ aiTimeoutRef.current = setTimeout(() => {
+ makeAIMove()
+ }, 1000)
+ }
+ } else {
+ setGameState(prev => ({
+ ...prev,
+ promotionDialogActive: false,
+ promotionMove: null
+ }))
+ }
+ } catch (error) {
+ console.error('Error during promotion:', error)
+ setGameState(prev => ({
+ ...prev,
+ promotionDialogActive: false,
+ promotionMove: null
+ }))
+ }
+ }, [gameState.promotionMove, gameState.board, makeAIMove])
+
+ const startDrag = useCallback((square: Square) => {
+ if (!gameState.gameActive || gameState.board.turn() !== gameState.playerColor || gameState.aiThinking) {
+ return
+ }
+
+ const piece = gameState.board.get(square)
+ if (piece && piece.color === gameState.playerColor) {
+ setDraggedPiece({ piece, square })
+ const moves = gameState.board.moves({ square, verbose: true })
+ setGameState(prev => ({
+ ...prev,
+ selectedSquare: square,
+ legalMoves: moves
+ }))
+ }
+ }, [gameState])
+
+ const endDrag = useCallback((targetSquare: Square | null) => {
+ console.log('Ending drag at:', targetSquare, 'from:', draggedPiece?.square)
+
+ let moveSuccessful = false
+ if (draggedPiece && targetSquare && targetSquare !== draggedPiece.square) {
+ moveSuccessful = attemptMove(draggedPiece.square, targetSquare)
+ }
+ setDraggedPiece(null)
+
+ if (!moveSuccessful) {
+ setGameState(prev => ({
+ ...prev,
+ selectedSquare: null,
+ legalMoves: []
+ }))
+ }
+ }, [draggedPiece, attemptMove])
+
+ const getAIStatus = useCallback(() => {
+ if (!chessAI.current) return 'Not initialized'
+ return chessAI.current.getModelInfo()
+ }, [])
+
+ const changeModel = useCallback((modelId: string) => {
+ if (gameState.gameActive) return
+ setSelectedModel(modelId)
+ }, [gameState.gameActive])
+
+ useEffect(() => {
+ return () => {
+ if (aiTimeoutRef.current) {
+ clearTimeout(aiTimeoutRef.current)
+ }
+ }
+ }, [])
+
+ return {
+ gameState,
+ draggedPiece,
+ selectedModel,
+ startNewGame,
+ resignGame,
+ togglePlayerColor,
+ selectSquare,
+ attemptMove,
+ completePromotion,
+ startDrag,
+ endDrag,
+ getAIStatus,
+ changeModel
+ }
+}
\ No newline at end of file
diff --git a/src/main.tsx b/src/main.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..33c45cc5b3b3f815b6b98e2f3b03cdf3c88d4d5d
--- /dev/null
+++ b/src/main.tsx
@@ -0,0 +1,15 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import App from './App'
+import { ErrorBoundary } from './ErrorBoundary'
+import './styles/index.css'
+
+console.log('Starting Musical Chess React App...')
+
+ReactDOM.createRoot(document.getElementById('root')!).render(
+
+
+
+
+ ,
+)
\ No newline at end of file
diff --git a/src/styles/App.css b/src/styles/App.css
new file mode 100644
index 0000000000000000000000000000000000000000..2993c7a6b65a50413ad227391817982b07e4cfb4
--- /dev/null
+++ b/src/styles/App.css
@@ -0,0 +1,117 @@
+.app-container {
+ width: 100vw;
+ height: 100vh;
+ background-color: #323232;
+ color: white;
+ display: flex;
+ justify-content: center;
+ align-items: flex-start;
+ overflow: auto;
+ padding-top: 5vh;
+}
+
+.main-content {
+ display: flex;
+ flex-direction: column;
+ padding: 20px;
+ gap: 20px;
+ max-width: 100%;
+ max-height: 100%;
+}
+
+.header {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 20px;
+ position: relative;
+}
+
+.title {
+ font-size: 48px;
+ font-weight: bold;
+ margin: 0;
+ text-align: center;
+ color: #ffffff;
+}
+
+.audio-info-button {
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ border: none;
+ border-radius: 50%;
+ width: 50px;
+ height: 50px;
+ font-size: 24px;
+ cursor: pointer;
+ color: white;
+ transition: all 0.2s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
+}
+
+.audio-info-button:hover {
+ transform: scale(1.1);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+}
+
+.game-area {
+ display: flex;
+ gap: 50px;
+ align-items: flex-start;
+ justify-content: center;
+}
+
+.board-container {
+ position: relative;
+ flex-shrink: 0;
+}
+
+.sidebar {
+ width: 400px;
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ padding: 20px;
+ background-color: #464646;
+ border-radius: 10px;
+ height: fit-content;
+}
+
+@media (max-width: 1200px) {
+ .game-area {
+ flex-direction: column;
+ align-items: center;
+ gap: 30px;
+ }
+
+ .sidebar {
+ width: 100%;
+ max-width: 600px;
+ }
+
+ .title {
+ font-size: 36px;
+ text-align: center;
+ }
+}
+
+@media (max-width: 768px) {
+ .main-content {
+ padding: 10px;
+ }
+
+ .title {
+ font-size: 28px;
+ }
+
+ .board-container {
+ transform: scale(0.8);
+ transform-origin: top center;
+ }
+
+ .sidebar {
+ padding: 15px;
+ }
+}
\ No newline at end of file
diff --git a/src/styles/AudioInfoPopup.css b/src/styles/AudioInfoPopup.css
new file mode 100644
index 0000000000000000000000000000000000000000..0ef5025de7c18f740073b5ef304e627e7ebb78b1
--- /dev/null
+++ b/src/styles/AudioInfoPopup.css
@@ -0,0 +1,146 @@
+.audio-info-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.75);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 2000;
+}
+
+.audio-info-popup {
+ background: white;
+ border-radius: 12px;
+ padding: 0;
+ max-width: 600px;
+ max-height: 80vh;
+ width: 90%;
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+}
+
+.popup-header {
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ color: white;
+ padding: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.popup-header h2 {
+ margin: 0;
+ font-size: 1.5rem;
+ font-weight: 600;
+}
+
+.close-button {
+ background: none;
+ border: none;
+ color: white;
+ font-size: 2rem;
+ cursor: pointer;
+ padding: 0;
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: background-color 0.2s;
+}
+
+.close-button:hover {
+ background: rgba(255, 255, 255, 0.2);
+}
+
+.popup-content {
+ padding: 24px;
+ overflow-y: auto;
+ flex: 1;
+}
+
+.popup-content section {
+ margin-bottom: 24px;
+}
+
+.popup-content section:last-child {
+ margin-bottom: 0;
+}
+
+.popup-content h3 {
+ color: #333;
+ font-size: 1.25rem;
+ margin: 0 0 12px 0;
+ font-weight: 600;
+}
+
+.popup-content h4 {
+ color: #333;
+ font-size: 1.1rem;
+ margin: 0 0 8px 0;
+ font-weight: 600;
+}
+
+.popup-content p {
+ color: #555;
+ line-height: 1.6;
+ margin: 0 0 12px 0;
+}
+
+.popup-content ul {
+ color: #555;
+ line-height: 1.6;
+ margin: 0;
+ padding-left: 20px;
+}
+
+.popup-content li {
+ margin-bottom: 8px;
+}
+
+.note-mapping {
+ background: #f8f9fa;
+ border: 1px solid #e9ecef;
+ border-radius: 6px;
+ padding: 12px;
+ margin: 12px 0;
+ font-family: 'Courier New', monospace;
+}
+
+.note-mapping div {
+ margin-bottom: 6px;
+}
+
+.note-mapping div:last-child {
+ margin-bottom: 0;
+}
+
+strong {
+ color: #333;
+ font-weight: 600;
+}
+
+@media (max-width: 768px) {
+ .audio-info-popup {
+ width: 95%;
+ max-height: 90vh;
+ }
+
+ .popup-header {
+ padding: 16px;
+ }
+
+ .popup-header h2 {
+ font-size: 1.25rem;
+ }
+
+ .popup-content {
+ padding: 20px;
+ }
+}
\ No newline at end of file
diff --git a/src/styles/ChessBoard.css b/src/styles/ChessBoard.css
new file mode 100644
index 0000000000000000000000000000000000000000..38cef53f3d4f4b6913c66821b9b6c3feff4fa0e6
--- /dev/null
+++ b/src/styles/ChessBoard.css
@@ -0,0 +1,99 @@
+.chess-board {
+ position: relative;
+ user-select: none;
+}
+
+.board-container {
+ position: relative;
+ width: 600px;
+ height: 600px;
+}
+
+.board-squares {
+ position: relative;
+ width: 600px;
+ height: 600px;
+ border: 3px solid #ffffff;
+ border-radius: 4px;
+}
+
+.board-border {
+ position: absolute;
+ top: -3px;
+ left: -3px;
+ right: -3px;
+ bottom: -3px;
+ border: 3px solid #ffffff;
+ border-radius: 4px;
+ pointer-events: none;
+}
+
+.file-labels {
+ position: absolute;
+ bottom: -30px;
+ left: 0;
+ width: 600px;
+ height: 25px;
+ display: flex;
+}
+
+.file-label {
+ width: 75px;
+ height: 25px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ color: #ffffff;
+ font-weight: bold;
+ font-size: 14px;
+}
+
+.file-letter {
+ font-size: 16px;
+ margin-bottom: 2px;
+}
+
+.file-note {
+ font-size: 11px;
+ color: #cccccc;
+ font-weight: normal;
+}
+
+.rank-labels {
+ position: absolute;
+ left: -50px;
+ top: 0;
+ width: 45px;
+ height: 600px;
+ display: flex;
+ flex-direction: column;
+}
+
+.rank-label {
+ width: 45px;
+ height: 75px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ color: #ffffff;
+ font-weight: bold;
+ font-size: 14px;
+}
+
+.rank-number {
+ font-size: 16px;
+ margin-bottom: 2px;
+}
+
+.rank-octave {
+ font-size: 10px;
+ color: #cccccc;
+ font-weight: normal;
+}
+
+.dragged-piece {
+ pointer-events: none;
+ z-index: 1000;
+}
\ No newline at end of file
diff --git a/src/styles/ChessPiece.css b/src/styles/ChessPiece.css
new file mode 100644
index 0000000000000000000000000000000000000000..a0104a4d094bacca360f925a85a84aa5f1035dae
--- /dev/null
+++ b/src/styles/ChessPiece.css
@@ -0,0 +1,30 @@
+.chess-piece {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: inherit;
+ transition: opacity 0.2s ease;
+}
+
+.chess-piece.dragging {
+ opacity: 0.5;
+}
+
+.piece-image {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ pointer-events: none;
+ user-select: none;
+ -webkit-user-drag: none;
+}
+
+.piece-symbol {
+ font-family: 'Chess Merida', 'Chess Alpha', serif;
+ font-weight: bold;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ pointer-events: none;
+ user-select: none;
+}
\ No newline at end of file
diff --git a/src/styles/ChessSquare.css b/src/styles/ChessSquare.css
new file mode 100644
index 0000000000000000000000000000000000000000..79548069abc9633fa5330bc645bc9388c59a8470
--- /dev/null
+++ b/src/styles/ChessSquare.css
@@ -0,0 +1,60 @@
+.chess-square {
+ position: absolute;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ border-radius: 2px;
+}
+
+.chess-square.light {
+ background-color: #f0d9b5;
+}
+
+.chess-square.dark {
+ background-color: #b58863;
+}
+
+.chess-square.selected {
+ background-color: #ff6b6b !important;
+ box-shadow: inset 0 0 0 3px rgba(255, 107, 107, 0.8);
+}
+
+.chess-square.legal-move {
+ background-color: rgba(144, 238, 144, 0.6) !important;
+}
+
+.chess-square.drop-target {
+ background-color: rgba(255, 255, 0, 0.4) !important;
+}
+
+.chess-square:hover {
+ filter: brightness(1.1);
+}
+
+.piece-container {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: grab;
+}
+
+.piece-container:active {
+ cursor: grabbing;
+}
+
+.legal-move-indicator {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ width: 16px;
+ height: 16px;
+ background-color: rgba(0, 128, 0, 0.8);
+ border-radius: 50%;
+ pointer-events: none;
+}
+
+.chess-square.legal-move .legal-move-indicator {
+ background-color: rgba(0, 80, 0, 0.9);
+}
\ No newline at end of file
diff --git a/src/styles/GameControls.css b/src/styles/GameControls.css
new file mode 100644
index 0000000000000000000000000000000000000000..c7461317af97ee091165242d0e3be355b6bbb087
--- /dev/null
+++ b/src/styles/GameControls.css
@@ -0,0 +1,92 @@
+.game-controls {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+
+.game-status {
+ font-size: 20px;
+ font-weight: bold;
+ color: #ffffff;
+ text-align: center;
+ min-height: 30px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.control-buttons {
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+}
+
+.main-button {
+ background-color: #646464;
+}
+
+.color-button {
+ background-color: #646464;
+}
+
+.audio-button {
+ background-color: #646464;
+}
+
+.volume-controls {
+ margin-top: 20px;
+ padding: 20px;
+ background-color: rgba(255, 255, 255, 0.05);
+ border-radius: 8px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+.volume-controls-title {
+ margin: 0 0 16px 0;
+ font-size: 16px;
+ font-weight: 600;
+ color: #ffffff;
+ text-align: center;
+}
+
+.model-selector {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ padding: 12px;
+ background-color: rgba(255, 255, 255, 0.05);
+ border-radius: 8px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+.model-selector label {
+ font-size: 14px;
+ font-weight: 600;
+ color: #ffffff;
+}
+
+.model-dropdown {
+ padding: 8px 12px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 6px;
+ background-color: rgba(255, 255, 255, 0.1);
+ color: #ffffff;
+ font-size: 14px;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.model-dropdown:hover:not(:disabled) {
+ background-color: rgba(255, 255, 255, 0.15);
+ border-color: rgba(255, 255, 255, 0.3);
+}
+
+.model-dropdown:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+.model-dropdown option {
+ background-color: #2a2a2a;
+ color: #ffffff;
+}
\ No newline at end of file
diff --git a/src/styles/PromotionDialog.css b/src/styles/PromotionDialog.css
new file mode 100644
index 0000000000000000000000000000000000000000..4845635b5653bb90ad1531d3711fb241ab4b1821
--- /dev/null
+++ b/src/styles/PromotionDialog.css
@@ -0,0 +1,58 @@
+.promotion-dialog-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: rgba(0, 0, 0, 0.7);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 1000;
+}
+
+.promotion-dialog {
+ background-color: #282828;
+ border: 3px solid #ffffff;
+ border-radius: 10px;
+ padding: 20px;
+ min-width: 300px;
+ text-align: center;
+}
+
+.promotion-dialog-title {
+ font-size: 18px;
+ font-weight: bold;
+ margin-bottom: 20px;
+ color: #ffffff;
+}
+
+.promotion-buttons {
+ display: flex;
+ gap: 10px;
+ justify-content: center;
+}
+
+.promotion-button {
+ background-color: #505050;
+ color: white;
+ border: 2px solid #ffffff;
+ border-radius: 8px;
+ padding: 6px;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ width: 60px;
+ height: 60px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.promotion-button:hover {
+ background-color: #6e6e6e;
+ transform: translateY(-1px);
+}
+
+.promotion-button:active {
+ transform: translateY(0);
+}
\ No newline at end of file
diff --git a/src/styles/VolumeSlider.css b/src/styles/VolumeSlider.css
new file mode 100644
index 0000000000000000000000000000000000000000..a48df83583bba8cae2b7dd9d7670ccec0372c54b
--- /dev/null
+++ b/src/styles/VolumeSlider.css
@@ -0,0 +1,95 @@
+.volume-slider {
+ margin-bottom: 16px;
+}
+
+.volume-slider-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 8px;
+}
+
+.volume-slider-label {
+ font-size: 14px;
+ font-weight: 500;
+ color: #ffffff;
+}
+
+.volume-slider-value {
+ font-size: 12px;
+ color: #cccccc;
+ font-weight: 400;
+ min-width: 35px;
+ text-align: right;
+}
+
+.volume-slider-input {
+ width: 100%;
+ height: 6px;
+ border-radius: 3px;
+ background: #333333;
+ outline: none;
+ opacity: 0.7;
+ transition: opacity 0.2s;
+ cursor: pointer;
+}
+
+.volume-slider-input:hover {
+ opacity: 1;
+}
+
+.volume-slider-input::-webkit-slider-thumb {
+ appearance: none;
+ width: 18px;
+ height: 18px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ cursor: pointer;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+ transition: transform 0.2s ease;
+}
+
+.volume-slider-input::-webkit-slider-thumb:hover {
+ transform: scale(1.1);
+}
+
+.volume-slider-input::-moz-range-thumb {
+ width: 18px;
+ height: 18px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ cursor: pointer;
+ border: none;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+ transition: transform 0.2s ease;
+}
+
+.volume-slider-input::-moz-range-thumb:hover {
+ transform: scale(1.1);
+}
+
+.volume-slider-input::-webkit-slider-track {
+ width: 100%;
+ height: 6px;
+ cursor: pointer;
+ background: #333333;
+ border-radius: 3px;
+}
+
+.volume-slider-input::-moz-range-track {
+ width: 100%;
+ height: 6px;
+ cursor: pointer;
+ background: #333333;
+ border-radius: 3px;
+ border: none;
+}
+
+/* Progress fill effect */
+.volume-slider-input {
+ background: linear-gradient(to right,
+ #667eea 0%,
+ #764ba2 var(--progress, 0%),
+ #333333 var(--progress, 0%),
+ #333333 100%);
+}
\ No newline at end of file
diff --git a/src/styles/index.css b/src/styles/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..9a9a3abcb44ad49bd923db979645305065e2b8a0
--- /dev/null
+++ b/src/styles/index.css
@@ -0,0 +1,263 @@
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ background-color: #323232;
+ color: white;
+ overflow: hidden;
+ user-select: none;
+}
+
+#root {
+ width: 100vw;
+ height: 100vh;
+}
+
+.app-container {
+ width: 100%;
+ height: 100vh;
+ display: flex;
+ background-color: #323232;
+ overflow: hidden;
+}
+
+.main-content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 20px;
+}
+
+.title {
+ font-size: 48px;
+ font-weight: bold;
+ margin-bottom: 20px;
+ text-align: left;
+}
+
+.game-area {
+ display: flex;
+ gap: 50px;
+ flex: 1;
+}
+
+.board-container {
+ position: relative;
+}
+
+.sidebar {
+ width: 400px;
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ padding: 20px;
+ background-color: #464646;
+ border-radius: 10px;
+}
+
+.game-status {
+ font-size: 24px;
+ font-weight: bold;
+ margin-bottom: 20px;
+ color: #ffffff;
+}
+
+.button {
+ background-color: #646464;
+ color: white;
+ border: 2px solid #ffffff;
+ border-radius: 8px;
+ padding: 12px 16px;
+ font-size: 18px;
+ font-weight: bold;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ text-align: center;
+ min-height: 50px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.button:hover {
+ background-color: #828282;
+ transform: translateY(-1px);
+}
+
+.button:active {
+ transform: translateY(0);
+}
+
+.button:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+.button:disabled:hover {
+ background-color: #646464;
+ transform: none;
+}
+
+.info-panel {
+ background-color: #464646;
+ border-radius: 8px;
+ padding: 15px;
+ margin-top: 10px;
+}
+
+.info-title {
+ font-size: 16px;
+ font-weight: bold;
+ margin-bottom: 10px;
+ color: #ffffff;
+}
+
+.info-item {
+ font-size: 14px;
+ margin-bottom: 5px;
+ color: #ffffff;
+}
+
+.check-indicator {
+ color: #ff0000 !important;
+ font-weight: bold;
+}
+
+.game-over-panel {
+ background-color: #282828;
+ border: 3px solid #ffff00;
+ border-radius: 8px;
+ padding: 15px;
+ margin-top: 10px;
+}
+
+.game-over-title {
+ color: #ffff00;
+ font-size: 16px;
+ font-weight: bold;
+ margin-bottom: 10px;
+}
+
+.winner-text {
+ font-size: 14px;
+ margin-bottom: 5px;
+ font-weight: bold;
+}
+
+.winner-text.player-win {
+ color: #00ff00;
+}
+
+.winner-text.ai-win {
+ color: #ff6464;
+}
+
+.winner-text.draw {
+ color: #c8c8c8;
+}
+
+.termination-reason {
+ font-size: 14px;
+ color: #ffffff;
+ margin-bottom: 5px;
+}
+
+.termination-details {
+ font-size: 12px;
+ color: #b4b4b4;
+ line-height: 1.3;
+}
+
+.move-history {
+ max-height: 160px;
+ overflow-y: auto;
+ border-radius: 4px;
+ padding: 5px;
+ background-color: #323232;
+}
+
+.move-entry {
+ font-size: 12px;
+ margin-bottom: 3px;
+ padding: 2px 5px;
+ border-radius: 3px;
+ background-color: #464646;
+}
+
+.promotion-dialog {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ background-color: #282828;
+ border: 3px solid #ffffff;
+ border-radius: 10px;
+ padding: 20px;
+ z-index: 1000;
+ min-width: 300px;
+}
+
+.promotion-dialog-title {
+ text-align: center;
+ font-size: 18px;
+ font-weight: bold;
+ margin-bottom: 20px;
+ color: #ffffff;
+}
+
+.promotion-buttons {
+ display: flex;
+ gap: 10px;
+ justify-content: center;
+}
+
+.promotion-button {
+ background-color: #505050;
+ color: white;
+ border: 2px solid #ffffff;
+ border-radius: 8px;
+ padding: 15px;
+ font-size: 32px;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ width: 60px;
+ height: 60px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.promotion-button:hover {
+ background-color: #6e6e6e;
+ transform: translateY(-1px);
+}
+
+/* Loading and thinking indicators */
+.thinking-indicator {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ color: #ffaa00;
+ font-weight: bold;
+}
+
+.thinking-dots {
+ display: inline-block;
+}
+
+.thinking-dots::after {
+ content: '';
+ animation: thinking 1.5s infinite;
+}
+
+@keyframes thinking {
+ 0% { content: ''; }
+ 25% { content: '.'; }
+ 50% { content: '..'; }
+ 75% { content: '...'; }
+ 100% { content: ''; }
+}
\ No newline at end of file
diff --git a/src/types/chess.ts b/src/types/chess.ts
new file mode 100644
index 0000000000000000000000000000000000000000..78caf106da9090e65237395f73b25d573bd61824
--- /dev/null
+++ b/src/types/chess.ts
@@ -0,0 +1,91 @@
+import { Chess, Square, Move, Color, PieceSymbol } from 'chess.js'
+
+export type { Chess, Square, Move, Color, PieceSymbol }
+
+export interface ChessPiece {
+ type: PieceSymbol
+ color: Color
+}
+
+export interface GameState {
+ board: Chess
+ gameActive: boolean
+ playerColor: Color
+ selectedSquare: Square | null
+ legalMoves: Move[]
+ gameHistory: GameHistoryEntry[]
+ gameOver: boolean
+ gameResult: GameResult | null
+ promotionMove: Move | null
+ promotionDialogActive: boolean
+ aiThinking: boolean
+ aiModelLoaded: boolean
+ aiModelLoading: boolean
+}
+
+export interface GameHistoryEntry {
+ move: string
+ moveData: Move
+ player: 'Human' | 'AI'
+ timestamp: Date
+ capturedPiece?: ChessPiece
+}
+
+export interface GameResult {
+ isGameOver: boolean
+ winner: Color | null
+ message: string
+ terminationReason: string
+ details?: string
+}
+
+export interface DraggedPiece {
+ piece: ChessPiece
+ square: Square
+}
+
+export interface SquarePosition {
+ x: number
+ y: number
+}
+
+export interface AudioSettings {
+ enabled: boolean
+ volume: number
+}
+
+export enum GameTermination {
+ CHECKMATE = 'checkmate',
+ STALEMATE = 'stalemate',
+ INSUFFICIENT_MATERIAL = 'insufficient_material',
+ THREEFOLD_REPETITION = 'threefold_repetition',
+ FIFTY_MOVE_RULE = 'fifty_move_rule',
+ RESIGNATION = 'resignation',
+ TIMEOUT = 'timeout'
+}
+
+export interface PieceFrequencies {
+ [key: string]: number
+}
+
+export interface AudioEngineConfig {
+ sampleRate: number
+ volume: number
+ enabled: boolean
+}
+
+export const CHESS_MODELS: string[] = [
+ 'mlabonne/chesspythia-70m',
+ 'EleutherAI/pythia-70m-deduped',
+ 'nlpguy/amdchess-v9',
+ 'mlabonne/grandpythia-200k-70m',
+ 'facebook/opt-125m',
+ 'bharathrajcl/chess_llama_68m',
+ 'Locutusque/TinyMistral-248M-v2.5',
+ 'Q-bert/ChessGPT',
+ 'nlpguy/smolchess-v2',
+ 'nlpguy/amdchess-v2',
+ 'amd/AMD-Llama-135m',
+ 'nlpguy/amdchess-v5',
+ 'distilbert/distilgpt2'
+]
\ No newline at end of file
diff --git a/src/utils/chessUtils.ts b/src/utils/chessUtils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..61b6211039bbfb6f510a6673853a940e29657842
--- /dev/null
+++ b/src/utils/chessUtils.ts
@@ -0,0 +1,96 @@
+import { Chess, Square, Color } from 'chess.js'
+import { GameResult, GameTermination } from '../types/chess'
+
+export function evaluateGameState(chess: Chess): GameResult {
+ const isGameOver = chess.isGameOver()
+
+ if (!isGameOver) {
+ return {
+ isGameOver: false,
+ winner: null,
+ message: '',
+ terminationReason: ''
+ }
+ }
+
+ if (chess.isCheckmate()) {
+ const winner = chess.turn() === 'w' ? 'b' : 'w'
+ return {
+ isGameOver: true,
+ winner,
+ message: `Checkmate! ${winner === 'w' ? 'White' : 'Black'} wins!`,
+ terminationReason: GameTermination.CHECKMATE,
+ details: `${winner === 'w' ? 'White' : 'Black'} delivered checkmate`
+ }
+ }
+
+ if (chess.isStalemate()) {
+ return {
+ isGameOver: true,
+ winner: null,
+ message: 'Game drawn by stalemate!',
+ terminationReason: GameTermination.STALEMATE,
+ details: 'No legal moves available but king is not in check'
+ }
+ }
+
+ if (chess.isInsufficientMaterial()) {
+ return {
+ isGameOver: true,
+ winner: null,
+ message: 'Game drawn by insufficient material!',
+ terminationReason: GameTermination.INSUFFICIENT_MATERIAL,
+ details: 'Neither side has enough material to checkmate'
+ }
+ }
+
+ if (chess.isThreefoldRepetition()) {
+ return {
+ isGameOver: true,
+ winner: null,
+ message: 'Game drawn by threefold repetition!',
+ terminationReason: GameTermination.THREEFOLD_REPETITION,
+ details: 'The same position occurred three times'
+ }
+ }
+
+ if (chess.isDraw()) {
+ return {
+ isGameOver: true,
+ winner: null,
+ message: 'Game drawn!',
+ terminationReason: GameTermination.FIFTY_MOVE_RULE,
+ details: 'Draw by 50-move rule or other draw condition'
+ }
+ }
+
+ return {
+ isGameOver: true,
+ winner: null,
+ message: 'Game ended',
+ terminationReason: 'unknown'
+ }
+}
+
+export function isPotentialPromotion(chess: Chess, from: Square, to: Square): boolean {
+ const piece = chess.get(from)
+ if (!piece || piece.type !== 'p') return false
+
+ const toRank = parseInt(to[1])
+ return (piece.color === 'w' && toRank === 8) || (piece.color === 'b' && toRank === 1)
+}
+
+export function isSquareLight(square: Square): boolean {
+ const file = square.charCodeAt(0) - 97
+ const rank = parseInt(square[1]) - 1
+ return (file + rank) % 2 === 0
+}
+
+
+export function formatMoveTime(timestamp: Date): string {
+ return timestamp.toLocaleTimeString([], {
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit'
+ })
+}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..fc51fdbfa6ae0bdbd136ea3475f51292388f4ca2
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "strict": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
\ No newline at end of file
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 0000000000000000000000000000000000000000..099658cf3d29c0c21bc9b61d0a8b02652ddb92a9
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
\ No newline at end of file
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..af1334242992ee1ae4b9be89510f7797a2a6df3e
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,18 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+ base: './',
+ build: {
+ outDir: 'dist',
+ assetsDir: 'assets',
+ sourcemap: false,
+ minify: true,
+ },
+ server: {
+ port: 3000,
+ host: true
+ }
+})
\ No newline at end of file