rain1024 commited on
Commit
0fb0b85
·
0 Parent(s):

Initial commit: RAG Agent chat UI for Vietnamese law

Browse files

- RAG agent (main.py) with Azure OpenAI + ChromaDB
- FastAPI + Socket.IO backend (server.py)
- React 18 + Vite + Tailwind CSS chat frontend

.env.example ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ AZURE_OPENAI_API_KEY=
2
+ AZURE_OPENAI_ENDPOINT=
3
+ AZURE_OPENAI_API_VERSION=2024-12-01-preview
4
+ AZURE_OPENAI_DEPLOYMENT=gpt-5.2
5
+ AZURE_OPENAI_EMBEDDING_MODEL=text-embedding-3-large
.gitignore ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ # Environment variables
13
+ .env
14
+
15
+ # Vector store
16
+ chroma_db/
17
+
18
+ # Frontend
19
+ frontend/node_modules/
20
+ frontend/dist/
.python-version ADDED
@@ -0,0 +1 @@
 
 
1
+ 3.12
README.md ADDED
File without changes
frontend/index.html ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="vi">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Hỏi đáp Pháp luật Việt Nam</title>
7
+ </head>
8
+ <body>
9
+ <div id="root"></div>
10
+ <script type="module" src="/src/main.tsx"></script>
11
+ </body>
12
+ </html>
frontend/package-lock.json ADDED
@@ -0,0 +1,2856 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "rag-chat-ui",
3
+ "version": "0.1.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "rag-chat-ui",
9
+ "version": "0.1.0",
10
+ "dependencies": {
11
+ "react": "^18.3.1",
12
+ "react-dom": "^18.3.1",
13
+ "socket.io-client": "^4.8.0"
14
+ },
15
+ "devDependencies": {
16
+ "@types/react": "^18.3.12",
17
+ "@types/react-dom": "^18.3.1",
18
+ "@vitejs/plugin-react": "^4.3.4",
19
+ "autoprefixer": "^10.4.20",
20
+ "postcss": "^8.4.49",
21
+ "tailwindcss": "^3.4.16",
22
+ "typescript": "^5.6.3",
23
+ "vite": "^6.0.3"
24
+ }
25
+ },
26
+ "node_modules/@alloc/quick-lru": {
27
+ "version": "5.2.0",
28
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
29
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
30
+ "dev": true,
31
+ "license": "MIT",
32
+ "engines": {
33
+ "node": ">=10"
34
+ },
35
+ "funding": {
36
+ "url": "https://github.com/sponsors/sindresorhus"
37
+ }
38
+ },
39
+ "node_modules/@babel/code-frame": {
40
+ "version": "7.29.0",
41
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
42
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
43
+ "dev": true,
44
+ "license": "MIT",
45
+ "dependencies": {
46
+ "@babel/helper-validator-identifier": "^7.28.5",
47
+ "js-tokens": "^4.0.0",
48
+ "picocolors": "^1.1.1"
49
+ },
50
+ "engines": {
51
+ "node": ">=6.9.0"
52
+ }
53
+ },
54
+ "node_modules/@babel/compat-data": {
55
+ "version": "7.29.0",
56
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
57
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
58
+ "dev": true,
59
+ "license": "MIT",
60
+ "engines": {
61
+ "node": ">=6.9.0"
62
+ }
63
+ },
64
+ "node_modules/@babel/core": {
65
+ "version": "7.29.0",
66
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
67
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
68
+ "dev": true,
69
+ "license": "MIT",
70
+ "peer": true,
71
+ "dependencies": {
72
+ "@babel/code-frame": "^7.29.0",
73
+ "@babel/generator": "^7.29.0",
74
+ "@babel/helper-compilation-targets": "^7.28.6",
75
+ "@babel/helper-module-transforms": "^7.28.6",
76
+ "@babel/helpers": "^7.28.6",
77
+ "@babel/parser": "^7.29.0",
78
+ "@babel/template": "^7.28.6",
79
+ "@babel/traverse": "^7.29.0",
80
+ "@babel/types": "^7.29.0",
81
+ "@jridgewell/remapping": "^2.3.5",
82
+ "convert-source-map": "^2.0.0",
83
+ "debug": "^4.1.0",
84
+ "gensync": "^1.0.0-beta.2",
85
+ "json5": "^2.2.3",
86
+ "semver": "^6.3.1"
87
+ },
88
+ "engines": {
89
+ "node": ">=6.9.0"
90
+ },
91
+ "funding": {
92
+ "type": "opencollective",
93
+ "url": "https://opencollective.com/babel"
94
+ }
95
+ },
96
+ "node_modules/@babel/generator": {
97
+ "version": "7.29.1",
98
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
99
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
100
+ "dev": true,
101
+ "license": "MIT",
102
+ "dependencies": {
103
+ "@babel/parser": "^7.29.0",
104
+ "@babel/types": "^7.29.0",
105
+ "@jridgewell/gen-mapping": "^0.3.12",
106
+ "@jridgewell/trace-mapping": "^0.3.28",
107
+ "jsesc": "^3.0.2"
108
+ },
109
+ "engines": {
110
+ "node": ">=6.9.0"
111
+ }
112
+ },
113
+ "node_modules/@babel/helper-compilation-targets": {
114
+ "version": "7.28.6",
115
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
116
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
117
+ "dev": true,
118
+ "license": "MIT",
119
+ "dependencies": {
120
+ "@babel/compat-data": "^7.28.6",
121
+ "@babel/helper-validator-option": "^7.27.1",
122
+ "browserslist": "^4.24.0",
123
+ "lru-cache": "^5.1.1",
124
+ "semver": "^6.3.1"
125
+ },
126
+ "engines": {
127
+ "node": ">=6.9.0"
128
+ }
129
+ },
130
+ "node_modules/@babel/helper-globals": {
131
+ "version": "7.28.0",
132
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
133
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
134
+ "dev": true,
135
+ "license": "MIT",
136
+ "engines": {
137
+ "node": ">=6.9.0"
138
+ }
139
+ },
140
+ "node_modules/@babel/helper-module-imports": {
141
+ "version": "7.28.6",
142
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
143
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
144
+ "dev": true,
145
+ "license": "MIT",
146
+ "dependencies": {
147
+ "@babel/traverse": "^7.28.6",
148
+ "@babel/types": "^7.28.6"
149
+ },
150
+ "engines": {
151
+ "node": ">=6.9.0"
152
+ }
153
+ },
154
+ "node_modules/@babel/helper-module-transforms": {
155
+ "version": "7.28.6",
156
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
157
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
158
+ "dev": true,
159
+ "license": "MIT",
160
+ "dependencies": {
161
+ "@babel/helper-module-imports": "^7.28.6",
162
+ "@babel/helper-validator-identifier": "^7.28.5",
163
+ "@babel/traverse": "^7.28.6"
164
+ },
165
+ "engines": {
166
+ "node": ">=6.9.0"
167
+ },
168
+ "peerDependencies": {
169
+ "@babel/core": "^7.0.0"
170
+ }
171
+ },
172
+ "node_modules/@babel/helper-plugin-utils": {
173
+ "version": "7.28.6",
174
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
175
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
176
+ "dev": true,
177
+ "license": "MIT",
178
+ "engines": {
179
+ "node": ">=6.9.0"
180
+ }
181
+ },
182
+ "node_modules/@babel/helper-string-parser": {
183
+ "version": "7.27.1",
184
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
185
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
186
+ "dev": true,
187
+ "license": "MIT",
188
+ "engines": {
189
+ "node": ">=6.9.0"
190
+ }
191
+ },
192
+ "node_modules/@babel/helper-validator-identifier": {
193
+ "version": "7.28.5",
194
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
195
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
196
+ "dev": true,
197
+ "license": "MIT",
198
+ "engines": {
199
+ "node": ">=6.9.0"
200
+ }
201
+ },
202
+ "node_modules/@babel/helper-validator-option": {
203
+ "version": "7.27.1",
204
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
205
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
206
+ "dev": true,
207
+ "license": "MIT",
208
+ "engines": {
209
+ "node": ">=6.9.0"
210
+ }
211
+ },
212
+ "node_modules/@babel/helpers": {
213
+ "version": "7.28.6",
214
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
215
+ "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
216
+ "dev": true,
217
+ "license": "MIT",
218
+ "dependencies": {
219
+ "@babel/template": "^7.28.6",
220
+ "@babel/types": "^7.28.6"
221
+ },
222
+ "engines": {
223
+ "node": ">=6.9.0"
224
+ }
225
+ },
226
+ "node_modules/@babel/parser": {
227
+ "version": "7.29.0",
228
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
229
+ "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
230
+ "dev": true,
231
+ "license": "MIT",
232
+ "dependencies": {
233
+ "@babel/types": "^7.29.0"
234
+ },
235
+ "bin": {
236
+ "parser": "bin/babel-parser.js"
237
+ },
238
+ "engines": {
239
+ "node": ">=6.0.0"
240
+ }
241
+ },
242
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
243
+ "version": "7.27.1",
244
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
245
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
246
+ "dev": true,
247
+ "license": "MIT",
248
+ "dependencies": {
249
+ "@babel/helper-plugin-utils": "^7.27.1"
250
+ },
251
+ "engines": {
252
+ "node": ">=6.9.0"
253
+ },
254
+ "peerDependencies": {
255
+ "@babel/core": "^7.0.0-0"
256
+ }
257
+ },
258
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
259
+ "version": "7.27.1",
260
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
261
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
262
+ "dev": true,
263
+ "license": "MIT",
264
+ "dependencies": {
265
+ "@babel/helper-plugin-utils": "^7.27.1"
266
+ },
267
+ "engines": {
268
+ "node": ">=6.9.0"
269
+ },
270
+ "peerDependencies": {
271
+ "@babel/core": "^7.0.0-0"
272
+ }
273
+ },
274
+ "node_modules/@babel/template": {
275
+ "version": "7.28.6",
276
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
277
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
278
+ "dev": true,
279
+ "license": "MIT",
280
+ "dependencies": {
281
+ "@babel/code-frame": "^7.28.6",
282
+ "@babel/parser": "^7.28.6",
283
+ "@babel/types": "^7.28.6"
284
+ },
285
+ "engines": {
286
+ "node": ">=6.9.0"
287
+ }
288
+ },
289
+ "node_modules/@babel/traverse": {
290
+ "version": "7.29.0",
291
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
292
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
293
+ "dev": true,
294
+ "license": "MIT",
295
+ "dependencies": {
296
+ "@babel/code-frame": "^7.29.0",
297
+ "@babel/generator": "^7.29.0",
298
+ "@babel/helper-globals": "^7.28.0",
299
+ "@babel/parser": "^7.29.0",
300
+ "@babel/template": "^7.28.6",
301
+ "@babel/types": "^7.29.0",
302
+ "debug": "^4.3.1"
303
+ },
304
+ "engines": {
305
+ "node": ">=6.9.0"
306
+ }
307
+ },
308
+ "node_modules/@babel/types": {
309
+ "version": "7.29.0",
310
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
311
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
312
+ "dev": true,
313
+ "license": "MIT",
314
+ "dependencies": {
315
+ "@babel/helper-string-parser": "^7.27.1",
316
+ "@babel/helper-validator-identifier": "^7.28.5"
317
+ },
318
+ "engines": {
319
+ "node": ">=6.9.0"
320
+ }
321
+ },
322
+ "node_modules/@esbuild/aix-ppc64": {
323
+ "version": "0.25.12",
324
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
325
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
326
+ "cpu": [
327
+ "ppc64"
328
+ ],
329
+ "dev": true,
330
+ "license": "MIT",
331
+ "optional": true,
332
+ "os": [
333
+ "aix"
334
+ ],
335
+ "engines": {
336
+ "node": ">=18"
337
+ }
338
+ },
339
+ "node_modules/@esbuild/android-arm": {
340
+ "version": "0.25.12",
341
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
342
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
343
+ "cpu": [
344
+ "arm"
345
+ ],
346
+ "dev": true,
347
+ "license": "MIT",
348
+ "optional": true,
349
+ "os": [
350
+ "android"
351
+ ],
352
+ "engines": {
353
+ "node": ">=18"
354
+ }
355
+ },
356
+ "node_modules/@esbuild/android-arm64": {
357
+ "version": "0.25.12",
358
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
359
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
360
+ "cpu": [
361
+ "arm64"
362
+ ],
363
+ "dev": true,
364
+ "license": "MIT",
365
+ "optional": true,
366
+ "os": [
367
+ "android"
368
+ ],
369
+ "engines": {
370
+ "node": ">=18"
371
+ }
372
+ },
373
+ "node_modules/@esbuild/android-x64": {
374
+ "version": "0.25.12",
375
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
376
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
377
+ "cpu": [
378
+ "x64"
379
+ ],
380
+ "dev": true,
381
+ "license": "MIT",
382
+ "optional": true,
383
+ "os": [
384
+ "android"
385
+ ],
386
+ "engines": {
387
+ "node": ">=18"
388
+ }
389
+ },
390
+ "node_modules/@esbuild/darwin-arm64": {
391
+ "version": "0.25.12",
392
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
393
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
394
+ "cpu": [
395
+ "arm64"
396
+ ],
397
+ "dev": true,
398
+ "license": "MIT",
399
+ "optional": true,
400
+ "os": [
401
+ "darwin"
402
+ ],
403
+ "engines": {
404
+ "node": ">=18"
405
+ }
406
+ },
407
+ "node_modules/@esbuild/darwin-x64": {
408
+ "version": "0.25.12",
409
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
410
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
411
+ "cpu": [
412
+ "x64"
413
+ ],
414
+ "dev": true,
415
+ "license": "MIT",
416
+ "optional": true,
417
+ "os": [
418
+ "darwin"
419
+ ],
420
+ "engines": {
421
+ "node": ">=18"
422
+ }
423
+ },
424
+ "node_modules/@esbuild/freebsd-arm64": {
425
+ "version": "0.25.12",
426
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
427
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
428
+ "cpu": [
429
+ "arm64"
430
+ ],
431
+ "dev": true,
432
+ "license": "MIT",
433
+ "optional": true,
434
+ "os": [
435
+ "freebsd"
436
+ ],
437
+ "engines": {
438
+ "node": ">=18"
439
+ }
440
+ },
441
+ "node_modules/@esbuild/freebsd-x64": {
442
+ "version": "0.25.12",
443
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
444
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
445
+ "cpu": [
446
+ "x64"
447
+ ],
448
+ "dev": true,
449
+ "license": "MIT",
450
+ "optional": true,
451
+ "os": [
452
+ "freebsd"
453
+ ],
454
+ "engines": {
455
+ "node": ">=18"
456
+ }
457
+ },
458
+ "node_modules/@esbuild/linux-arm": {
459
+ "version": "0.25.12",
460
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
461
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
462
+ "cpu": [
463
+ "arm"
464
+ ],
465
+ "dev": true,
466
+ "license": "MIT",
467
+ "optional": true,
468
+ "os": [
469
+ "linux"
470
+ ],
471
+ "engines": {
472
+ "node": ">=18"
473
+ }
474
+ },
475
+ "node_modules/@esbuild/linux-arm64": {
476
+ "version": "0.25.12",
477
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
478
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
479
+ "cpu": [
480
+ "arm64"
481
+ ],
482
+ "dev": true,
483
+ "license": "MIT",
484
+ "optional": true,
485
+ "os": [
486
+ "linux"
487
+ ],
488
+ "engines": {
489
+ "node": ">=18"
490
+ }
491
+ },
492
+ "node_modules/@esbuild/linux-ia32": {
493
+ "version": "0.25.12",
494
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
495
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
496
+ "cpu": [
497
+ "ia32"
498
+ ],
499
+ "dev": true,
500
+ "license": "MIT",
501
+ "optional": true,
502
+ "os": [
503
+ "linux"
504
+ ],
505
+ "engines": {
506
+ "node": ">=18"
507
+ }
508
+ },
509
+ "node_modules/@esbuild/linux-loong64": {
510
+ "version": "0.25.12",
511
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
512
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
513
+ "cpu": [
514
+ "loong64"
515
+ ],
516
+ "dev": true,
517
+ "license": "MIT",
518
+ "optional": true,
519
+ "os": [
520
+ "linux"
521
+ ],
522
+ "engines": {
523
+ "node": ">=18"
524
+ }
525
+ },
526
+ "node_modules/@esbuild/linux-mips64el": {
527
+ "version": "0.25.12",
528
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
529
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
530
+ "cpu": [
531
+ "mips64el"
532
+ ],
533
+ "dev": true,
534
+ "license": "MIT",
535
+ "optional": true,
536
+ "os": [
537
+ "linux"
538
+ ],
539
+ "engines": {
540
+ "node": ">=18"
541
+ }
542
+ },
543
+ "node_modules/@esbuild/linux-ppc64": {
544
+ "version": "0.25.12",
545
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
546
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
547
+ "cpu": [
548
+ "ppc64"
549
+ ],
550
+ "dev": true,
551
+ "license": "MIT",
552
+ "optional": true,
553
+ "os": [
554
+ "linux"
555
+ ],
556
+ "engines": {
557
+ "node": ">=18"
558
+ }
559
+ },
560
+ "node_modules/@esbuild/linux-riscv64": {
561
+ "version": "0.25.12",
562
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
563
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
564
+ "cpu": [
565
+ "riscv64"
566
+ ],
567
+ "dev": true,
568
+ "license": "MIT",
569
+ "optional": true,
570
+ "os": [
571
+ "linux"
572
+ ],
573
+ "engines": {
574
+ "node": ">=18"
575
+ }
576
+ },
577
+ "node_modules/@esbuild/linux-s390x": {
578
+ "version": "0.25.12",
579
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
580
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
581
+ "cpu": [
582
+ "s390x"
583
+ ],
584
+ "dev": true,
585
+ "license": "MIT",
586
+ "optional": true,
587
+ "os": [
588
+ "linux"
589
+ ],
590
+ "engines": {
591
+ "node": ">=18"
592
+ }
593
+ },
594
+ "node_modules/@esbuild/linux-x64": {
595
+ "version": "0.25.12",
596
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
597
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
598
+ "cpu": [
599
+ "x64"
600
+ ],
601
+ "dev": true,
602
+ "license": "MIT",
603
+ "optional": true,
604
+ "os": [
605
+ "linux"
606
+ ],
607
+ "engines": {
608
+ "node": ">=18"
609
+ }
610
+ },
611
+ "node_modules/@esbuild/netbsd-arm64": {
612
+ "version": "0.25.12",
613
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
614
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
615
+ "cpu": [
616
+ "arm64"
617
+ ],
618
+ "dev": true,
619
+ "license": "MIT",
620
+ "optional": true,
621
+ "os": [
622
+ "netbsd"
623
+ ],
624
+ "engines": {
625
+ "node": ">=18"
626
+ }
627
+ },
628
+ "node_modules/@esbuild/netbsd-x64": {
629
+ "version": "0.25.12",
630
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
631
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
632
+ "cpu": [
633
+ "x64"
634
+ ],
635
+ "dev": true,
636
+ "license": "MIT",
637
+ "optional": true,
638
+ "os": [
639
+ "netbsd"
640
+ ],
641
+ "engines": {
642
+ "node": ">=18"
643
+ }
644
+ },
645
+ "node_modules/@esbuild/openbsd-arm64": {
646
+ "version": "0.25.12",
647
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
648
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
649
+ "cpu": [
650
+ "arm64"
651
+ ],
652
+ "dev": true,
653
+ "license": "MIT",
654
+ "optional": true,
655
+ "os": [
656
+ "openbsd"
657
+ ],
658
+ "engines": {
659
+ "node": ">=18"
660
+ }
661
+ },
662
+ "node_modules/@esbuild/openbsd-x64": {
663
+ "version": "0.25.12",
664
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
665
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
666
+ "cpu": [
667
+ "x64"
668
+ ],
669
+ "dev": true,
670
+ "license": "MIT",
671
+ "optional": true,
672
+ "os": [
673
+ "openbsd"
674
+ ],
675
+ "engines": {
676
+ "node": ">=18"
677
+ }
678
+ },
679
+ "node_modules/@esbuild/openharmony-arm64": {
680
+ "version": "0.25.12",
681
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
682
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
683
+ "cpu": [
684
+ "arm64"
685
+ ],
686
+ "dev": true,
687
+ "license": "MIT",
688
+ "optional": true,
689
+ "os": [
690
+ "openharmony"
691
+ ],
692
+ "engines": {
693
+ "node": ">=18"
694
+ }
695
+ },
696
+ "node_modules/@esbuild/sunos-x64": {
697
+ "version": "0.25.12",
698
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
699
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
700
+ "cpu": [
701
+ "x64"
702
+ ],
703
+ "dev": true,
704
+ "license": "MIT",
705
+ "optional": true,
706
+ "os": [
707
+ "sunos"
708
+ ],
709
+ "engines": {
710
+ "node": ">=18"
711
+ }
712
+ },
713
+ "node_modules/@esbuild/win32-arm64": {
714
+ "version": "0.25.12",
715
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
716
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
717
+ "cpu": [
718
+ "arm64"
719
+ ],
720
+ "dev": true,
721
+ "license": "MIT",
722
+ "optional": true,
723
+ "os": [
724
+ "win32"
725
+ ],
726
+ "engines": {
727
+ "node": ">=18"
728
+ }
729
+ },
730
+ "node_modules/@esbuild/win32-ia32": {
731
+ "version": "0.25.12",
732
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
733
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
734
+ "cpu": [
735
+ "ia32"
736
+ ],
737
+ "dev": true,
738
+ "license": "MIT",
739
+ "optional": true,
740
+ "os": [
741
+ "win32"
742
+ ],
743
+ "engines": {
744
+ "node": ">=18"
745
+ }
746
+ },
747
+ "node_modules/@esbuild/win32-x64": {
748
+ "version": "0.25.12",
749
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
750
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
751
+ "cpu": [
752
+ "x64"
753
+ ],
754
+ "dev": true,
755
+ "license": "MIT",
756
+ "optional": true,
757
+ "os": [
758
+ "win32"
759
+ ],
760
+ "engines": {
761
+ "node": ">=18"
762
+ }
763
+ },
764
+ "node_modules/@jridgewell/gen-mapping": {
765
+ "version": "0.3.13",
766
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
767
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
768
+ "dev": true,
769
+ "license": "MIT",
770
+ "dependencies": {
771
+ "@jridgewell/sourcemap-codec": "^1.5.0",
772
+ "@jridgewell/trace-mapping": "^0.3.24"
773
+ }
774
+ },
775
+ "node_modules/@jridgewell/remapping": {
776
+ "version": "2.3.5",
777
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
778
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
779
+ "dev": true,
780
+ "license": "MIT",
781
+ "dependencies": {
782
+ "@jridgewell/gen-mapping": "^0.3.5",
783
+ "@jridgewell/trace-mapping": "^0.3.24"
784
+ }
785
+ },
786
+ "node_modules/@jridgewell/resolve-uri": {
787
+ "version": "3.1.2",
788
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
789
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
790
+ "dev": true,
791
+ "license": "MIT",
792
+ "engines": {
793
+ "node": ">=6.0.0"
794
+ }
795
+ },
796
+ "node_modules/@jridgewell/sourcemap-codec": {
797
+ "version": "1.5.5",
798
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
799
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
800
+ "dev": true,
801
+ "license": "MIT"
802
+ },
803
+ "node_modules/@jridgewell/trace-mapping": {
804
+ "version": "0.3.31",
805
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
806
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
807
+ "dev": true,
808
+ "license": "MIT",
809
+ "dependencies": {
810
+ "@jridgewell/resolve-uri": "^3.1.0",
811
+ "@jridgewell/sourcemap-codec": "^1.4.14"
812
+ }
813
+ },
814
+ "node_modules/@nodelib/fs.scandir": {
815
+ "version": "2.1.5",
816
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
817
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
818
+ "dev": true,
819
+ "license": "MIT",
820
+ "dependencies": {
821
+ "@nodelib/fs.stat": "2.0.5",
822
+ "run-parallel": "^1.1.9"
823
+ },
824
+ "engines": {
825
+ "node": ">= 8"
826
+ }
827
+ },
828
+ "node_modules/@nodelib/fs.stat": {
829
+ "version": "2.0.5",
830
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
831
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
832
+ "dev": true,
833
+ "license": "MIT",
834
+ "engines": {
835
+ "node": ">= 8"
836
+ }
837
+ },
838
+ "node_modules/@nodelib/fs.walk": {
839
+ "version": "1.2.8",
840
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
841
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
842
+ "dev": true,
843
+ "license": "MIT",
844
+ "dependencies": {
845
+ "@nodelib/fs.scandir": "2.1.5",
846
+ "fastq": "^1.6.0"
847
+ },
848
+ "engines": {
849
+ "node": ">= 8"
850
+ }
851
+ },
852
+ "node_modules/@rolldown/pluginutils": {
853
+ "version": "1.0.0-beta.27",
854
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
855
+ "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
856
+ "dev": true,
857
+ "license": "MIT"
858
+ },
859
+ "node_modules/@rollup/rollup-android-arm-eabi": {
860
+ "version": "4.57.1",
861
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz",
862
+ "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==",
863
+ "cpu": [
864
+ "arm"
865
+ ],
866
+ "dev": true,
867
+ "license": "MIT",
868
+ "optional": true,
869
+ "os": [
870
+ "android"
871
+ ]
872
+ },
873
+ "node_modules/@rollup/rollup-android-arm64": {
874
+ "version": "4.57.1",
875
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz",
876
+ "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==",
877
+ "cpu": [
878
+ "arm64"
879
+ ],
880
+ "dev": true,
881
+ "license": "MIT",
882
+ "optional": true,
883
+ "os": [
884
+ "android"
885
+ ]
886
+ },
887
+ "node_modules/@rollup/rollup-darwin-arm64": {
888
+ "version": "4.57.1",
889
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz",
890
+ "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==",
891
+ "cpu": [
892
+ "arm64"
893
+ ],
894
+ "dev": true,
895
+ "license": "MIT",
896
+ "optional": true,
897
+ "os": [
898
+ "darwin"
899
+ ]
900
+ },
901
+ "node_modules/@rollup/rollup-darwin-x64": {
902
+ "version": "4.57.1",
903
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz",
904
+ "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==",
905
+ "cpu": [
906
+ "x64"
907
+ ],
908
+ "dev": true,
909
+ "license": "MIT",
910
+ "optional": true,
911
+ "os": [
912
+ "darwin"
913
+ ]
914
+ },
915
+ "node_modules/@rollup/rollup-freebsd-arm64": {
916
+ "version": "4.57.1",
917
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz",
918
+ "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==",
919
+ "cpu": [
920
+ "arm64"
921
+ ],
922
+ "dev": true,
923
+ "license": "MIT",
924
+ "optional": true,
925
+ "os": [
926
+ "freebsd"
927
+ ]
928
+ },
929
+ "node_modules/@rollup/rollup-freebsd-x64": {
930
+ "version": "4.57.1",
931
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz",
932
+ "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==",
933
+ "cpu": [
934
+ "x64"
935
+ ],
936
+ "dev": true,
937
+ "license": "MIT",
938
+ "optional": true,
939
+ "os": [
940
+ "freebsd"
941
+ ]
942
+ },
943
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
944
+ "version": "4.57.1",
945
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz",
946
+ "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==",
947
+ "cpu": [
948
+ "arm"
949
+ ],
950
+ "dev": true,
951
+ "license": "MIT",
952
+ "optional": true,
953
+ "os": [
954
+ "linux"
955
+ ]
956
+ },
957
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
958
+ "version": "4.57.1",
959
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz",
960
+ "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==",
961
+ "cpu": [
962
+ "arm"
963
+ ],
964
+ "dev": true,
965
+ "license": "MIT",
966
+ "optional": true,
967
+ "os": [
968
+ "linux"
969
+ ]
970
+ },
971
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
972
+ "version": "4.57.1",
973
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz",
974
+ "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==",
975
+ "cpu": [
976
+ "arm64"
977
+ ],
978
+ "dev": true,
979
+ "license": "MIT",
980
+ "optional": true,
981
+ "os": [
982
+ "linux"
983
+ ]
984
+ },
985
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
986
+ "version": "4.57.1",
987
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz",
988
+ "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==",
989
+ "cpu": [
990
+ "arm64"
991
+ ],
992
+ "dev": true,
993
+ "license": "MIT",
994
+ "optional": true,
995
+ "os": [
996
+ "linux"
997
+ ]
998
+ },
999
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
1000
+ "version": "4.57.1",
1001
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz",
1002
+ "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==",
1003
+ "cpu": [
1004
+ "loong64"
1005
+ ],
1006
+ "dev": true,
1007
+ "license": "MIT",
1008
+ "optional": true,
1009
+ "os": [
1010
+ "linux"
1011
+ ]
1012
+ },
1013
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
1014
+ "version": "4.57.1",
1015
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz",
1016
+ "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==",
1017
+ "cpu": [
1018
+ "loong64"
1019
+ ],
1020
+ "dev": true,
1021
+ "license": "MIT",
1022
+ "optional": true,
1023
+ "os": [
1024
+ "linux"
1025
+ ]
1026
+ },
1027
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
1028
+ "version": "4.57.1",
1029
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz",
1030
+ "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==",
1031
+ "cpu": [
1032
+ "ppc64"
1033
+ ],
1034
+ "dev": true,
1035
+ "license": "MIT",
1036
+ "optional": true,
1037
+ "os": [
1038
+ "linux"
1039
+ ]
1040
+ },
1041
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
1042
+ "version": "4.57.1",
1043
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz",
1044
+ "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==",
1045
+ "cpu": [
1046
+ "ppc64"
1047
+ ],
1048
+ "dev": true,
1049
+ "license": "MIT",
1050
+ "optional": true,
1051
+ "os": [
1052
+ "linux"
1053
+ ]
1054
+ },
1055
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
1056
+ "version": "4.57.1",
1057
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz",
1058
+ "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==",
1059
+ "cpu": [
1060
+ "riscv64"
1061
+ ],
1062
+ "dev": true,
1063
+ "license": "MIT",
1064
+ "optional": true,
1065
+ "os": [
1066
+ "linux"
1067
+ ]
1068
+ },
1069
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
1070
+ "version": "4.57.1",
1071
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz",
1072
+ "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==",
1073
+ "cpu": [
1074
+ "riscv64"
1075
+ ],
1076
+ "dev": true,
1077
+ "license": "MIT",
1078
+ "optional": true,
1079
+ "os": [
1080
+ "linux"
1081
+ ]
1082
+ },
1083
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
1084
+ "version": "4.57.1",
1085
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz",
1086
+ "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==",
1087
+ "cpu": [
1088
+ "s390x"
1089
+ ],
1090
+ "dev": true,
1091
+ "license": "MIT",
1092
+ "optional": true,
1093
+ "os": [
1094
+ "linux"
1095
+ ]
1096
+ },
1097
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
1098
+ "version": "4.57.1",
1099
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz",
1100
+ "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==",
1101
+ "cpu": [
1102
+ "x64"
1103
+ ],
1104
+ "dev": true,
1105
+ "license": "MIT",
1106
+ "optional": true,
1107
+ "os": [
1108
+ "linux"
1109
+ ]
1110
+ },
1111
+ "node_modules/@rollup/rollup-linux-x64-musl": {
1112
+ "version": "4.57.1",
1113
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz",
1114
+ "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==",
1115
+ "cpu": [
1116
+ "x64"
1117
+ ],
1118
+ "dev": true,
1119
+ "license": "MIT",
1120
+ "optional": true,
1121
+ "os": [
1122
+ "linux"
1123
+ ]
1124
+ },
1125
+ "node_modules/@rollup/rollup-openbsd-x64": {
1126
+ "version": "4.57.1",
1127
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz",
1128
+ "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==",
1129
+ "cpu": [
1130
+ "x64"
1131
+ ],
1132
+ "dev": true,
1133
+ "license": "MIT",
1134
+ "optional": true,
1135
+ "os": [
1136
+ "openbsd"
1137
+ ]
1138
+ },
1139
+ "node_modules/@rollup/rollup-openharmony-arm64": {
1140
+ "version": "4.57.1",
1141
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz",
1142
+ "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==",
1143
+ "cpu": [
1144
+ "arm64"
1145
+ ],
1146
+ "dev": true,
1147
+ "license": "MIT",
1148
+ "optional": true,
1149
+ "os": [
1150
+ "openharmony"
1151
+ ]
1152
+ },
1153
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
1154
+ "version": "4.57.1",
1155
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz",
1156
+ "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==",
1157
+ "cpu": [
1158
+ "arm64"
1159
+ ],
1160
+ "dev": true,
1161
+ "license": "MIT",
1162
+ "optional": true,
1163
+ "os": [
1164
+ "win32"
1165
+ ]
1166
+ },
1167
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
1168
+ "version": "4.57.1",
1169
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz",
1170
+ "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==",
1171
+ "cpu": [
1172
+ "ia32"
1173
+ ],
1174
+ "dev": true,
1175
+ "license": "MIT",
1176
+ "optional": true,
1177
+ "os": [
1178
+ "win32"
1179
+ ]
1180
+ },
1181
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
1182
+ "version": "4.57.1",
1183
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz",
1184
+ "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==",
1185
+ "cpu": [
1186
+ "x64"
1187
+ ],
1188
+ "dev": true,
1189
+ "license": "MIT",
1190
+ "optional": true,
1191
+ "os": [
1192
+ "win32"
1193
+ ]
1194
+ },
1195
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
1196
+ "version": "4.57.1",
1197
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz",
1198
+ "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==",
1199
+ "cpu": [
1200
+ "x64"
1201
+ ],
1202
+ "dev": true,
1203
+ "license": "MIT",
1204
+ "optional": true,
1205
+ "os": [
1206
+ "win32"
1207
+ ]
1208
+ },
1209
+ "node_modules/@socket.io/component-emitter": {
1210
+ "version": "3.1.2",
1211
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
1212
+ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
1213
+ "license": "MIT"
1214
+ },
1215
+ "node_modules/@types/babel__core": {
1216
+ "version": "7.20.5",
1217
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1218
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1219
+ "dev": true,
1220
+ "license": "MIT",
1221
+ "dependencies": {
1222
+ "@babel/parser": "^7.20.7",
1223
+ "@babel/types": "^7.20.7",
1224
+ "@types/babel__generator": "*",
1225
+ "@types/babel__template": "*",
1226
+ "@types/babel__traverse": "*"
1227
+ }
1228
+ },
1229
+ "node_modules/@types/babel__generator": {
1230
+ "version": "7.27.0",
1231
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
1232
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
1233
+ "dev": true,
1234
+ "license": "MIT",
1235
+ "dependencies": {
1236
+ "@babel/types": "^7.0.0"
1237
+ }
1238
+ },
1239
+ "node_modules/@types/babel__template": {
1240
+ "version": "7.4.4",
1241
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
1242
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
1243
+ "dev": true,
1244
+ "license": "MIT",
1245
+ "dependencies": {
1246
+ "@babel/parser": "^7.1.0",
1247
+ "@babel/types": "^7.0.0"
1248
+ }
1249
+ },
1250
+ "node_modules/@types/babel__traverse": {
1251
+ "version": "7.28.0",
1252
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
1253
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
1254
+ "dev": true,
1255
+ "license": "MIT",
1256
+ "dependencies": {
1257
+ "@babel/types": "^7.28.2"
1258
+ }
1259
+ },
1260
+ "node_modules/@types/estree": {
1261
+ "version": "1.0.8",
1262
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1263
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1264
+ "dev": true,
1265
+ "license": "MIT"
1266
+ },
1267
+ "node_modules/@types/prop-types": {
1268
+ "version": "15.7.15",
1269
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
1270
+ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
1271
+ "dev": true,
1272
+ "license": "MIT"
1273
+ },
1274
+ "node_modules/@types/react": {
1275
+ "version": "18.3.28",
1276
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz",
1277
+ "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==",
1278
+ "dev": true,
1279
+ "license": "MIT",
1280
+ "peer": true,
1281
+ "dependencies": {
1282
+ "@types/prop-types": "*",
1283
+ "csstype": "^3.2.2"
1284
+ }
1285
+ },
1286
+ "node_modules/@types/react-dom": {
1287
+ "version": "18.3.7",
1288
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
1289
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
1290
+ "dev": true,
1291
+ "license": "MIT",
1292
+ "peerDependencies": {
1293
+ "@types/react": "^18.0.0"
1294
+ }
1295
+ },
1296
+ "node_modules/@vitejs/plugin-react": {
1297
+ "version": "4.7.0",
1298
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
1299
+ "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
1300
+ "dev": true,
1301
+ "license": "MIT",
1302
+ "dependencies": {
1303
+ "@babel/core": "^7.28.0",
1304
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
1305
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
1306
+ "@rolldown/pluginutils": "1.0.0-beta.27",
1307
+ "@types/babel__core": "^7.20.5",
1308
+ "react-refresh": "^0.17.0"
1309
+ },
1310
+ "engines": {
1311
+ "node": "^14.18.0 || >=16.0.0"
1312
+ },
1313
+ "peerDependencies": {
1314
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
1315
+ }
1316
+ },
1317
+ "node_modules/any-promise": {
1318
+ "version": "1.3.0",
1319
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
1320
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
1321
+ "dev": true,
1322
+ "license": "MIT"
1323
+ },
1324
+ "node_modules/anymatch": {
1325
+ "version": "3.1.3",
1326
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
1327
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1328
+ "dev": true,
1329
+ "license": "ISC",
1330
+ "dependencies": {
1331
+ "normalize-path": "^3.0.0",
1332
+ "picomatch": "^2.0.4"
1333
+ },
1334
+ "engines": {
1335
+ "node": ">= 8"
1336
+ }
1337
+ },
1338
+ "node_modules/arg": {
1339
+ "version": "5.0.2",
1340
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
1341
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
1342
+ "dev": true,
1343
+ "license": "MIT"
1344
+ },
1345
+ "node_modules/autoprefixer": {
1346
+ "version": "10.4.24",
1347
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz",
1348
+ "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==",
1349
+ "dev": true,
1350
+ "funding": [
1351
+ {
1352
+ "type": "opencollective",
1353
+ "url": "https://opencollective.com/postcss/"
1354
+ },
1355
+ {
1356
+ "type": "tidelift",
1357
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
1358
+ },
1359
+ {
1360
+ "type": "github",
1361
+ "url": "https://github.com/sponsors/ai"
1362
+ }
1363
+ ],
1364
+ "license": "MIT",
1365
+ "dependencies": {
1366
+ "browserslist": "^4.28.1",
1367
+ "caniuse-lite": "^1.0.30001766",
1368
+ "fraction.js": "^5.3.4",
1369
+ "picocolors": "^1.1.1",
1370
+ "postcss-value-parser": "^4.2.0"
1371
+ },
1372
+ "bin": {
1373
+ "autoprefixer": "bin/autoprefixer"
1374
+ },
1375
+ "engines": {
1376
+ "node": "^10 || ^12 || >=14"
1377
+ },
1378
+ "peerDependencies": {
1379
+ "postcss": "^8.1.0"
1380
+ }
1381
+ },
1382
+ "node_modules/baseline-browser-mapping": {
1383
+ "version": "2.9.19",
1384
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz",
1385
+ "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==",
1386
+ "dev": true,
1387
+ "license": "Apache-2.0",
1388
+ "bin": {
1389
+ "baseline-browser-mapping": "dist/cli.js"
1390
+ }
1391
+ },
1392
+ "node_modules/binary-extensions": {
1393
+ "version": "2.3.0",
1394
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
1395
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
1396
+ "dev": true,
1397
+ "license": "MIT",
1398
+ "engines": {
1399
+ "node": ">=8"
1400
+ },
1401
+ "funding": {
1402
+ "url": "https://github.com/sponsors/sindresorhus"
1403
+ }
1404
+ },
1405
+ "node_modules/braces": {
1406
+ "version": "3.0.3",
1407
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
1408
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
1409
+ "dev": true,
1410
+ "license": "MIT",
1411
+ "dependencies": {
1412
+ "fill-range": "^7.1.1"
1413
+ },
1414
+ "engines": {
1415
+ "node": ">=8"
1416
+ }
1417
+ },
1418
+ "node_modules/browserslist": {
1419
+ "version": "4.28.1",
1420
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
1421
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
1422
+ "dev": true,
1423
+ "funding": [
1424
+ {
1425
+ "type": "opencollective",
1426
+ "url": "https://opencollective.com/browserslist"
1427
+ },
1428
+ {
1429
+ "type": "tidelift",
1430
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1431
+ },
1432
+ {
1433
+ "type": "github",
1434
+ "url": "https://github.com/sponsors/ai"
1435
+ }
1436
+ ],
1437
+ "license": "MIT",
1438
+ "peer": true,
1439
+ "dependencies": {
1440
+ "baseline-browser-mapping": "^2.9.0",
1441
+ "caniuse-lite": "^1.0.30001759",
1442
+ "electron-to-chromium": "^1.5.263",
1443
+ "node-releases": "^2.0.27",
1444
+ "update-browserslist-db": "^1.2.0"
1445
+ },
1446
+ "bin": {
1447
+ "browserslist": "cli.js"
1448
+ },
1449
+ "engines": {
1450
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1451
+ }
1452
+ },
1453
+ "node_modules/camelcase-css": {
1454
+ "version": "2.0.1",
1455
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
1456
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
1457
+ "dev": true,
1458
+ "license": "MIT",
1459
+ "engines": {
1460
+ "node": ">= 6"
1461
+ }
1462
+ },
1463
+ "node_modules/caniuse-lite": {
1464
+ "version": "1.0.30001769",
1465
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz",
1466
+ "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==",
1467
+ "dev": true,
1468
+ "funding": [
1469
+ {
1470
+ "type": "opencollective",
1471
+ "url": "https://opencollective.com/browserslist"
1472
+ },
1473
+ {
1474
+ "type": "tidelift",
1475
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1476
+ },
1477
+ {
1478
+ "type": "github",
1479
+ "url": "https://github.com/sponsors/ai"
1480
+ }
1481
+ ],
1482
+ "license": "CC-BY-4.0"
1483
+ },
1484
+ "node_modules/chokidar": {
1485
+ "version": "3.6.0",
1486
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
1487
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
1488
+ "dev": true,
1489
+ "license": "MIT",
1490
+ "dependencies": {
1491
+ "anymatch": "~3.1.2",
1492
+ "braces": "~3.0.2",
1493
+ "glob-parent": "~5.1.2",
1494
+ "is-binary-path": "~2.1.0",
1495
+ "is-glob": "~4.0.1",
1496
+ "normalize-path": "~3.0.0",
1497
+ "readdirp": "~3.6.0"
1498
+ },
1499
+ "engines": {
1500
+ "node": ">= 8.10.0"
1501
+ },
1502
+ "funding": {
1503
+ "url": "https://paulmillr.com/funding/"
1504
+ },
1505
+ "optionalDependencies": {
1506
+ "fsevents": "~2.3.2"
1507
+ }
1508
+ },
1509
+ "node_modules/chokidar/node_modules/glob-parent": {
1510
+ "version": "5.1.2",
1511
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1512
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1513
+ "dev": true,
1514
+ "license": "ISC",
1515
+ "dependencies": {
1516
+ "is-glob": "^4.0.1"
1517
+ },
1518
+ "engines": {
1519
+ "node": ">= 6"
1520
+ }
1521
+ },
1522
+ "node_modules/commander": {
1523
+ "version": "4.1.1",
1524
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
1525
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
1526
+ "dev": true,
1527
+ "license": "MIT",
1528
+ "engines": {
1529
+ "node": ">= 6"
1530
+ }
1531
+ },
1532
+ "node_modules/convert-source-map": {
1533
+ "version": "2.0.0",
1534
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1535
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1536
+ "dev": true,
1537
+ "license": "MIT"
1538
+ },
1539
+ "node_modules/cssesc": {
1540
+ "version": "3.0.0",
1541
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
1542
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
1543
+ "dev": true,
1544
+ "license": "MIT",
1545
+ "bin": {
1546
+ "cssesc": "bin/cssesc"
1547
+ },
1548
+ "engines": {
1549
+ "node": ">=4"
1550
+ }
1551
+ },
1552
+ "node_modules/csstype": {
1553
+ "version": "3.2.3",
1554
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
1555
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
1556
+ "dev": true,
1557
+ "license": "MIT"
1558
+ },
1559
+ "node_modules/debug": {
1560
+ "version": "4.4.3",
1561
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1562
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1563
+ "license": "MIT",
1564
+ "dependencies": {
1565
+ "ms": "^2.1.3"
1566
+ },
1567
+ "engines": {
1568
+ "node": ">=6.0"
1569
+ },
1570
+ "peerDependenciesMeta": {
1571
+ "supports-color": {
1572
+ "optional": true
1573
+ }
1574
+ }
1575
+ },
1576
+ "node_modules/didyoumean": {
1577
+ "version": "1.2.2",
1578
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
1579
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
1580
+ "dev": true,
1581
+ "license": "Apache-2.0"
1582
+ },
1583
+ "node_modules/dlv": {
1584
+ "version": "1.1.3",
1585
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
1586
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
1587
+ "dev": true,
1588
+ "license": "MIT"
1589
+ },
1590
+ "node_modules/electron-to-chromium": {
1591
+ "version": "1.5.286",
1592
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz",
1593
+ "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==",
1594
+ "dev": true,
1595
+ "license": "ISC"
1596
+ },
1597
+ "node_modules/engine.io-client": {
1598
+ "version": "6.6.4",
1599
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.4.tgz",
1600
+ "integrity": "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==",
1601
+ "license": "MIT",
1602
+ "dependencies": {
1603
+ "@socket.io/component-emitter": "~3.1.0",
1604
+ "debug": "~4.4.1",
1605
+ "engine.io-parser": "~5.2.1",
1606
+ "ws": "~8.18.3",
1607
+ "xmlhttprequest-ssl": "~2.1.1"
1608
+ }
1609
+ },
1610
+ "node_modules/engine.io-parser": {
1611
+ "version": "5.2.3",
1612
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
1613
+ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
1614
+ "license": "MIT",
1615
+ "engines": {
1616
+ "node": ">=10.0.0"
1617
+ }
1618
+ },
1619
+ "node_modules/esbuild": {
1620
+ "version": "0.25.12",
1621
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
1622
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
1623
+ "dev": true,
1624
+ "hasInstallScript": true,
1625
+ "license": "MIT",
1626
+ "bin": {
1627
+ "esbuild": "bin/esbuild"
1628
+ },
1629
+ "engines": {
1630
+ "node": ">=18"
1631
+ },
1632
+ "optionalDependencies": {
1633
+ "@esbuild/aix-ppc64": "0.25.12",
1634
+ "@esbuild/android-arm": "0.25.12",
1635
+ "@esbuild/android-arm64": "0.25.12",
1636
+ "@esbuild/android-x64": "0.25.12",
1637
+ "@esbuild/darwin-arm64": "0.25.12",
1638
+ "@esbuild/darwin-x64": "0.25.12",
1639
+ "@esbuild/freebsd-arm64": "0.25.12",
1640
+ "@esbuild/freebsd-x64": "0.25.12",
1641
+ "@esbuild/linux-arm": "0.25.12",
1642
+ "@esbuild/linux-arm64": "0.25.12",
1643
+ "@esbuild/linux-ia32": "0.25.12",
1644
+ "@esbuild/linux-loong64": "0.25.12",
1645
+ "@esbuild/linux-mips64el": "0.25.12",
1646
+ "@esbuild/linux-ppc64": "0.25.12",
1647
+ "@esbuild/linux-riscv64": "0.25.12",
1648
+ "@esbuild/linux-s390x": "0.25.12",
1649
+ "@esbuild/linux-x64": "0.25.12",
1650
+ "@esbuild/netbsd-arm64": "0.25.12",
1651
+ "@esbuild/netbsd-x64": "0.25.12",
1652
+ "@esbuild/openbsd-arm64": "0.25.12",
1653
+ "@esbuild/openbsd-x64": "0.25.12",
1654
+ "@esbuild/openharmony-arm64": "0.25.12",
1655
+ "@esbuild/sunos-x64": "0.25.12",
1656
+ "@esbuild/win32-arm64": "0.25.12",
1657
+ "@esbuild/win32-ia32": "0.25.12",
1658
+ "@esbuild/win32-x64": "0.25.12"
1659
+ }
1660
+ },
1661
+ "node_modules/escalade": {
1662
+ "version": "3.2.0",
1663
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1664
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1665
+ "dev": true,
1666
+ "license": "MIT",
1667
+ "engines": {
1668
+ "node": ">=6"
1669
+ }
1670
+ },
1671
+ "node_modules/fast-glob": {
1672
+ "version": "3.3.3",
1673
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
1674
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
1675
+ "dev": true,
1676
+ "license": "MIT",
1677
+ "dependencies": {
1678
+ "@nodelib/fs.stat": "^2.0.2",
1679
+ "@nodelib/fs.walk": "^1.2.3",
1680
+ "glob-parent": "^5.1.2",
1681
+ "merge2": "^1.3.0",
1682
+ "micromatch": "^4.0.8"
1683
+ },
1684
+ "engines": {
1685
+ "node": ">=8.6.0"
1686
+ }
1687
+ },
1688
+ "node_modules/fast-glob/node_modules/glob-parent": {
1689
+ "version": "5.1.2",
1690
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1691
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1692
+ "dev": true,
1693
+ "license": "ISC",
1694
+ "dependencies": {
1695
+ "is-glob": "^4.0.1"
1696
+ },
1697
+ "engines": {
1698
+ "node": ">= 6"
1699
+ }
1700
+ },
1701
+ "node_modules/fastq": {
1702
+ "version": "1.20.1",
1703
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
1704
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
1705
+ "dev": true,
1706
+ "license": "ISC",
1707
+ "dependencies": {
1708
+ "reusify": "^1.0.4"
1709
+ }
1710
+ },
1711
+ "node_modules/fill-range": {
1712
+ "version": "7.1.1",
1713
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1714
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1715
+ "dev": true,
1716
+ "license": "MIT",
1717
+ "dependencies": {
1718
+ "to-regex-range": "^5.0.1"
1719
+ },
1720
+ "engines": {
1721
+ "node": ">=8"
1722
+ }
1723
+ },
1724
+ "node_modules/fraction.js": {
1725
+ "version": "5.3.4",
1726
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
1727
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
1728
+ "dev": true,
1729
+ "license": "MIT",
1730
+ "engines": {
1731
+ "node": "*"
1732
+ },
1733
+ "funding": {
1734
+ "type": "github",
1735
+ "url": "https://github.com/sponsors/rawify"
1736
+ }
1737
+ },
1738
+ "node_modules/fsevents": {
1739
+ "version": "2.3.3",
1740
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1741
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1742
+ "dev": true,
1743
+ "hasInstallScript": true,
1744
+ "license": "MIT",
1745
+ "optional": true,
1746
+ "os": [
1747
+ "darwin"
1748
+ ],
1749
+ "engines": {
1750
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1751
+ }
1752
+ },
1753
+ "node_modules/function-bind": {
1754
+ "version": "1.1.2",
1755
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1756
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1757
+ "dev": true,
1758
+ "license": "MIT",
1759
+ "funding": {
1760
+ "url": "https://github.com/sponsors/ljharb"
1761
+ }
1762
+ },
1763
+ "node_modules/gensync": {
1764
+ "version": "1.0.0-beta.2",
1765
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1766
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1767
+ "dev": true,
1768
+ "license": "MIT",
1769
+ "engines": {
1770
+ "node": ">=6.9.0"
1771
+ }
1772
+ },
1773
+ "node_modules/glob-parent": {
1774
+ "version": "6.0.2",
1775
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1776
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1777
+ "dev": true,
1778
+ "license": "ISC",
1779
+ "dependencies": {
1780
+ "is-glob": "^4.0.3"
1781
+ },
1782
+ "engines": {
1783
+ "node": ">=10.13.0"
1784
+ }
1785
+ },
1786
+ "node_modules/hasown": {
1787
+ "version": "2.0.2",
1788
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
1789
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
1790
+ "dev": true,
1791
+ "license": "MIT",
1792
+ "dependencies": {
1793
+ "function-bind": "^1.1.2"
1794
+ },
1795
+ "engines": {
1796
+ "node": ">= 0.4"
1797
+ }
1798
+ },
1799
+ "node_modules/is-binary-path": {
1800
+ "version": "2.1.0",
1801
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1802
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1803
+ "dev": true,
1804
+ "license": "MIT",
1805
+ "dependencies": {
1806
+ "binary-extensions": "^2.0.0"
1807
+ },
1808
+ "engines": {
1809
+ "node": ">=8"
1810
+ }
1811
+ },
1812
+ "node_modules/is-core-module": {
1813
+ "version": "2.16.1",
1814
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
1815
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
1816
+ "dev": true,
1817
+ "license": "MIT",
1818
+ "dependencies": {
1819
+ "hasown": "^2.0.2"
1820
+ },
1821
+ "engines": {
1822
+ "node": ">= 0.4"
1823
+ },
1824
+ "funding": {
1825
+ "url": "https://github.com/sponsors/ljharb"
1826
+ }
1827
+ },
1828
+ "node_modules/is-extglob": {
1829
+ "version": "2.1.1",
1830
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1831
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1832
+ "dev": true,
1833
+ "license": "MIT",
1834
+ "engines": {
1835
+ "node": ">=0.10.0"
1836
+ }
1837
+ },
1838
+ "node_modules/is-glob": {
1839
+ "version": "4.0.3",
1840
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1841
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1842
+ "dev": true,
1843
+ "license": "MIT",
1844
+ "dependencies": {
1845
+ "is-extglob": "^2.1.1"
1846
+ },
1847
+ "engines": {
1848
+ "node": ">=0.10.0"
1849
+ }
1850
+ },
1851
+ "node_modules/is-number": {
1852
+ "version": "7.0.0",
1853
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1854
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1855
+ "dev": true,
1856
+ "license": "MIT",
1857
+ "engines": {
1858
+ "node": ">=0.12.0"
1859
+ }
1860
+ },
1861
+ "node_modules/jiti": {
1862
+ "version": "1.21.7",
1863
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
1864
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
1865
+ "dev": true,
1866
+ "license": "MIT",
1867
+ "peer": true,
1868
+ "bin": {
1869
+ "jiti": "bin/jiti.js"
1870
+ }
1871
+ },
1872
+ "node_modules/js-tokens": {
1873
+ "version": "4.0.0",
1874
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1875
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1876
+ "license": "MIT"
1877
+ },
1878
+ "node_modules/jsesc": {
1879
+ "version": "3.1.0",
1880
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1881
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1882
+ "dev": true,
1883
+ "license": "MIT",
1884
+ "bin": {
1885
+ "jsesc": "bin/jsesc"
1886
+ },
1887
+ "engines": {
1888
+ "node": ">=6"
1889
+ }
1890
+ },
1891
+ "node_modules/json5": {
1892
+ "version": "2.2.3",
1893
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1894
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1895
+ "dev": true,
1896
+ "license": "MIT",
1897
+ "bin": {
1898
+ "json5": "lib/cli.js"
1899
+ },
1900
+ "engines": {
1901
+ "node": ">=6"
1902
+ }
1903
+ },
1904
+ "node_modules/lilconfig": {
1905
+ "version": "3.1.3",
1906
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
1907
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
1908
+ "dev": true,
1909
+ "license": "MIT",
1910
+ "engines": {
1911
+ "node": ">=14"
1912
+ },
1913
+ "funding": {
1914
+ "url": "https://github.com/sponsors/antonk52"
1915
+ }
1916
+ },
1917
+ "node_modules/lines-and-columns": {
1918
+ "version": "1.2.4",
1919
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
1920
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
1921
+ "dev": true,
1922
+ "license": "MIT"
1923
+ },
1924
+ "node_modules/loose-envify": {
1925
+ "version": "1.4.0",
1926
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1927
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1928
+ "license": "MIT",
1929
+ "dependencies": {
1930
+ "js-tokens": "^3.0.0 || ^4.0.0"
1931
+ },
1932
+ "bin": {
1933
+ "loose-envify": "cli.js"
1934
+ }
1935
+ },
1936
+ "node_modules/lru-cache": {
1937
+ "version": "5.1.1",
1938
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1939
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1940
+ "dev": true,
1941
+ "license": "ISC",
1942
+ "dependencies": {
1943
+ "yallist": "^3.0.2"
1944
+ }
1945
+ },
1946
+ "node_modules/merge2": {
1947
+ "version": "1.4.1",
1948
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1949
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1950
+ "dev": true,
1951
+ "license": "MIT",
1952
+ "engines": {
1953
+ "node": ">= 8"
1954
+ }
1955
+ },
1956
+ "node_modules/micromatch": {
1957
+ "version": "4.0.8",
1958
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
1959
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
1960
+ "dev": true,
1961
+ "license": "MIT",
1962
+ "dependencies": {
1963
+ "braces": "^3.0.3",
1964
+ "picomatch": "^2.3.1"
1965
+ },
1966
+ "engines": {
1967
+ "node": ">=8.6"
1968
+ }
1969
+ },
1970
+ "node_modules/ms": {
1971
+ "version": "2.1.3",
1972
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1973
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1974
+ "license": "MIT"
1975
+ },
1976
+ "node_modules/mz": {
1977
+ "version": "2.7.0",
1978
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
1979
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
1980
+ "dev": true,
1981
+ "license": "MIT",
1982
+ "dependencies": {
1983
+ "any-promise": "^1.0.0",
1984
+ "object-assign": "^4.0.1",
1985
+ "thenify-all": "^1.0.0"
1986
+ }
1987
+ },
1988
+ "node_modules/nanoid": {
1989
+ "version": "3.3.11",
1990
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
1991
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
1992
+ "dev": true,
1993
+ "funding": [
1994
+ {
1995
+ "type": "github",
1996
+ "url": "https://github.com/sponsors/ai"
1997
+ }
1998
+ ],
1999
+ "license": "MIT",
2000
+ "bin": {
2001
+ "nanoid": "bin/nanoid.cjs"
2002
+ },
2003
+ "engines": {
2004
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
2005
+ }
2006
+ },
2007
+ "node_modules/node-releases": {
2008
+ "version": "2.0.27",
2009
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
2010
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
2011
+ "dev": true,
2012
+ "license": "MIT"
2013
+ },
2014
+ "node_modules/normalize-path": {
2015
+ "version": "3.0.0",
2016
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
2017
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
2018
+ "dev": true,
2019
+ "license": "MIT",
2020
+ "engines": {
2021
+ "node": ">=0.10.0"
2022
+ }
2023
+ },
2024
+ "node_modules/object-assign": {
2025
+ "version": "4.1.1",
2026
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2027
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
2028
+ "dev": true,
2029
+ "license": "MIT",
2030
+ "engines": {
2031
+ "node": ">=0.10.0"
2032
+ }
2033
+ },
2034
+ "node_modules/object-hash": {
2035
+ "version": "3.0.0",
2036
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
2037
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
2038
+ "dev": true,
2039
+ "license": "MIT",
2040
+ "engines": {
2041
+ "node": ">= 6"
2042
+ }
2043
+ },
2044
+ "node_modules/path-parse": {
2045
+ "version": "1.0.7",
2046
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
2047
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
2048
+ "dev": true,
2049
+ "license": "MIT"
2050
+ },
2051
+ "node_modules/picocolors": {
2052
+ "version": "1.1.1",
2053
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
2054
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
2055
+ "dev": true,
2056
+ "license": "ISC"
2057
+ },
2058
+ "node_modules/picomatch": {
2059
+ "version": "2.3.1",
2060
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2061
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2062
+ "dev": true,
2063
+ "license": "MIT",
2064
+ "engines": {
2065
+ "node": ">=8.6"
2066
+ },
2067
+ "funding": {
2068
+ "url": "https://github.com/sponsors/jonschlinkert"
2069
+ }
2070
+ },
2071
+ "node_modules/pify": {
2072
+ "version": "2.3.0",
2073
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2074
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
2075
+ "dev": true,
2076
+ "license": "MIT",
2077
+ "engines": {
2078
+ "node": ">=0.10.0"
2079
+ }
2080
+ },
2081
+ "node_modules/pirates": {
2082
+ "version": "4.0.7",
2083
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
2084
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
2085
+ "dev": true,
2086
+ "license": "MIT",
2087
+ "engines": {
2088
+ "node": ">= 6"
2089
+ }
2090
+ },
2091
+ "node_modules/postcss": {
2092
+ "version": "8.5.6",
2093
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
2094
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
2095
+ "dev": true,
2096
+ "funding": [
2097
+ {
2098
+ "type": "opencollective",
2099
+ "url": "https://opencollective.com/postcss/"
2100
+ },
2101
+ {
2102
+ "type": "tidelift",
2103
+ "url": "https://tidelift.com/funding/github/npm/postcss"
2104
+ },
2105
+ {
2106
+ "type": "github",
2107
+ "url": "https://github.com/sponsors/ai"
2108
+ }
2109
+ ],
2110
+ "license": "MIT",
2111
+ "peer": true,
2112
+ "dependencies": {
2113
+ "nanoid": "^3.3.11",
2114
+ "picocolors": "^1.1.1",
2115
+ "source-map-js": "^1.2.1"
2116
+ },
2117
+ "engines": {
2118
+ "node": "^10 || ^12 || >=14"
2119
+ }
2120
+ },
2121
+ "node_modules/postcss-import": {
2122
+ "version": "15.1.0",
2123
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
2124
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
2125
+ "dev": true,
2126
+ "license": "MIT",
2127
+ "dependencies": {
2128
+ "postcss-value-parser": "^4.0.0",
2129
+ "read-cache": "^1.0.0",
2130
+ "resolve": "^1.1.7"
2131
+ },
2132
+ "engines": {
2133
+ "node": ">=14.0.0"
2134
+ },
2135
+ "peerDependencies": {
2136
+ "postcss": "^8.0.0"
2137
+ }
2138
+ },
2139
+ "node_modules/postcss-js": {
2140
+ "version": "4.1.0",
2141
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
2142
+ "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
2143
+ "dev": true,
2144
+ "funding": [
2145
+ {
2146
+ "type": "opencollective",
2147
+ "url": "https://opencollective.com/postcss/"
2148
+ },
2149
+ {
2150
+ "type": "github",
2151
+ "url": "https://github.com/sponsors/ai"
2152
+ }
2153
+ ],
2154
+ "license": "MIT",
2155
+ "dependencies": {
2156
+ "camelcase-css": "^2.0.1"
2157
+ },
2158
+ "engines": {
2159
+ "node": "^12 || ^14 || >= 16"
2160
+ },
2161
+ "peerDependencies": {
2162
+ "postcss": "^8.4.21"
2163
+ }
2164
+ },
2165
+ "node_modules/postcss-load-config": {
2166
+ "version": "6.0.1",
2167
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
2168
+ "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
2169
+ "dev": true,
2170
+ "funding": [
2171
+ {
2172
+ "type": "opencollective",
2173
+ "url": "https://opencollective.com/postcss/"
2174
+ },
2175
+ {
2176
+ "type": "github",
2177
+ "url": "https://github.com/sponsors/ai"
2178
+ }
2179
+ ],
2180
+ "license": "MIT",
2181
+ "dependencies": {
2182
+ "lilconfig": "^3.1.1"
2183
+ },
2184
+ "engines": {
2185
+ "node": ">= 18"
2186
+ },
2187
+ "peerDependencies": {
2188
+ "jiti": ">=1.21.0",
2189
+ "postcss": ">=8.0.9",
2190
+ "tsx": "^4.8.1",
2191
+ "yaml": "^2.4.2"
2192
+ },
2193
+ "peerDependenciesMeta": {
2194
+ "jiti": {
2195
+ "optional": true
2196
+ },
2197
+ "postcss": {
2198
+ "optional": true
2199
+ },
2200
+ "tsx": {
2201
+ "optional": true
2202
+ },
2203
+ "yaml": {
2204
+ "optional": true
2205
+ }
2206
+ }
2207
+ },
2208
+ "node_modules/postcss-nested": {
2209
+ "version": "6.2.0",
2210
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
2211
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
2212
+ "dev": true,
2213
+ "funding": [
2214
+ {
2215
+ "type": "opencollective",
2216
+ "url": "https://opencollective.com/postcss/"
2217
+ },
2218
+ {
2219
+ "type": "github",
2220
+ "url": "https://github.com/sponsors/ai"
2221
+ }
2222
+ ],
2223
+ "license": "MIT",
2224
+ "dependencies": {
2225
+ "postcss-selector-parser": "^6.1.1"
2226
+ },
2227
+ "engines": {
2228
+ "node": ">=12.0"
2229
+ },
2230
+ "peerDependencies": {
2231
+ "postcss": "^8.2.14"
2232
+ }
2233
+ },
2234
+ "node_modules/postcss-selector-parser": {
2235
+ "version": "6.1.2",
2236
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
2237
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
2238
+ "dev": true,
2239
+ "license": "MIT",
2240
+ "dependencies": {
2241
+ "cssesc": "^3.0.0",
2242
+ "util-deprecate": "^1.0.2"
2243
+ },
2244
+ "engines": {
2245
+ "node": ">=4"
2246
+ }
2247
+ },
2248
+ "node_modules/postcss-value-parser": {
2249
+ "version": "4.2.0",
2250
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
2251
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
2252
+ "dev": true,
2253
+ "license": "MIT"
2254
+ },
2255
+ "node_modules/queue-microtask": {
2256
+ "version": "1.2.3",
2257
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2258
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2259
+ "dev": true,
2260
+ "funding": [
2261
+ {
2262
+ "type": "github",
2263
+ "url": "https://github.com/sponsors/feross"
2264
+ },
2265
+ {
2266
+ "type": "patreon",
2267
+ "url": "https://www.patreon.com/feross"
2268
+ },
2269
+ {
2270
+ "type": "consulting",
2271
+ "url": "https://feross.org/support"
2272
+ }
2273
+ ],
2274
+ "license": "MIT"
2275
+ },
2276
+ "node_modules/react": {
2277
+ "version": "18.3.1",
2278
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
2279
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
2280
+ "license": "MIT",
2281
+ "peer": true,
2282
+ "dependencies": {
2283
+ "loose-envify": "^1.1.0"
2284
+ },
2285
+ "engines": {
2286
+ "node": ">=0.10.0"
2287
+ }
2288
+ },
2289
+ "node_modules/react-dom": {
2290
+ "version": "18.3.1",
2291
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
2292
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
2293
+ "license": "MIT",
2294
+ "dependencies": {
2295
+ "loose-envify": "^1.1.0",
2296
+ "scheduler": "^0.23.2"
2297
+ },
2298
+ "peerDependencies": {
2299
+ "react": "^18.3.1"
2300
+ }
2301
+ },
2302
+ "node_modules/react-refresh": {
2303
+ "version": "0.17.0",
2304
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
2305
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
2306
+ "dev": true,
2307
+ "license": "MIT",
2308
+ "engines": {
2309
+ "node": ">=0.10.0"
2310
+ }
2311
+ },
2312
+ "node_modules/read-cache": {
2313
+ "version": "1.0.0",
2314
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
2315
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
2316
+ "dev": true,
2317
+ "license": "MIT",
2318
+ "dependencies": {
2319
+ "pify": "^2.3.0"
2320
+ }
2321
+ },
2322
+ "node_modules/readdirp": {
2323
+ "version": "3.6.0",
2324
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
2325
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
2326
+ "dev": true,
2327
+ "license": "MIT",
2328
+ "dependencies": {
2329
+ "picomatch": "^2.2.1"
2330
+ },
2331
+ "engines": {
2332
+ "node": ">=8.10.0"
2333
+ }
2334
+ },
2335
+ "node_modules/resolve": {
2336
+ "version": "1.22.11",
2337
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
2338
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
2339
+ "dev": true,
2340
+ "license": "MIT",
2341
+ "dependencies": {
2342
+ "is-core-module": "^2.16.1",
2343
+ "path-parse": "^1.0.7",
2344
+ "supports-preserve-symlinks-flag": "^1.0.0"
2345
+ },
2346
+ "bin": {
2347
+ "resolve": "bin/resolve"
2348
+ },
2349
+ "engines": {
2350
+ "node": ">= 0.4"
2351
+ },
2352
+ "funding": {
2353
+ "url": "https://github.com/sponsors/ljharb"
2354
+ }
2355
+ },
2356
+ "node_modules/reusify": {
2357
+ "version": "1.1.0",
2358
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
2359
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
2360
+ "dev": true,
2361
+ "license": "MIT",
2362
+ "engines": {
2363
+ "iojs": ">=1.0.0",
2364
+ "node": ">=0.10.0"
2365
+ }
2366
+ },
2367
+ "node_modules/rollup": {
2368
+ "version": "4.57.1",
2369
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz",
2370
+ "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==",
2371
+ "dev": true,
2372
+ "license": "MIT",
2373
+ "dependencies": {
2374
+ "@types/estree": "1.0.8"
2375
+ },
2376
+ "bin": {
2377
+ "rollup": "dist/bin/rollup"
2378
+ },
2379
+ "engines": {
2380
+ "node": ">=18.0.0",
2381
+ "npm": ">=8.0.0"
2382
+ },
2383
+ "optionalDependencies": {
2384
+ "@rollup/rollup-android-arm-eabi": "4.57.1",
2385
+ "@rollup/rollup-android-arm64": "4.57.1",
2386
+ "@rollup/rollup-darwin-arm64": "4.57.1",
2387
+ "@rollup/rollup-darwin-x64": "4.57.1",
2388
+ "@rollup/rollup-freebsd-arm64": "4.57.1",
2389
+ "@rollup/rollup-freebsd-x64": "4.57.1",
2390
+ "@rollup/rollup-linux-arm-gnueabihf": "4.57.1",
2391
+ "@rollup/rollup-linux-arm-musleabihf": "4.57.1",
2392
+ "@rollup/rollup-linux-arm64-gnu": "4.57.1",
2393
+ "@rollup/rollup-linux-arm64-musl": "4.57.1",
2394
+ "@rollup/rollup-linux-loong64-gnu": "4.57.1",
2395
+ "@rollup/rollup-linux-loong64-musl": "4.57.1",
2396
+ "@rollup/rollup-linux-ppc64-gnu": "4.57.1",
2397
+ "@rollup/rollup-linux-ppc64-musl": "4.57.1",
2398
+ "@rollup/rollup-linux-riscv64-gnu": "4.57.1",
2399
+ "@rollup/rollup-linux-riscv64-musl": "4.57.1",
2400
+ "@rollup/rollup-linux-s390x-gnu": "4.57.1",
2401
+ "@rollup/rollup-linux-x64-gnu": "4.57.1",
2402
+ "@rollup/rollup-linux-x64-musl": "4.57.1",
2403
+ "@rollup/rollup-openbsd-x64": "4.57.1",
2404
+ "@rollup/rollup-openharmony-arm64": "4.57.1",
2405
+ "@rollup/rollup-win32-arm64-msvc": "4.57.1",
2406
+ "@rollup/rollup-win32-ia32-msvc": "4.57.1",
2407
+ "@rollup/rollup-win32-x64-gnu": "4.57.1",
2408
+ "@rollup/rollup-win32-x64-msvc": "4.57.1",
2409
+ "fsevents": "~2.3.2"
2410
+ }
2411
+ },
2412
+ "node_modules/run-parallel": {
2413
+ "version": "1.2.0",
2414
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2415
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2416
+ "dev": true,
2417
+ "funding": [
2418
+ {
2419
+ "type": "github",
2420
+ "url": "https://github.com/sponsors/feross"
2421
+ },
2422
+ {
2423
+ "type": "patreon",
2424
+ "url": "https://www.patreon.com/feross"
2425
+ },
2426
+ {
2427
+ "type": "consulting",
2428
+ "url": "https://feross.org/support"
2429
+ }
2430
+ ],
2431
+ "license": "MIT",
2432
+ "dependencies": {
2433
+ "queue-microtask": "^1.2.2"
2434
+ }
2435
+ },
2436
+ "node_modules/scheduler": {
2437
+ "version": "0.23.2",
2438
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
2439
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
2440
+ "license": "MIT",
2441
+ "dependencies": {
2442
+ "loose-envify": "^1.1.0"
2443
+ }
2444
+ },
2445
+ "node_modules/semver": {
2446
+ "version": "6.3.1",
2447
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
2448
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
2449
+ "dev": true,
2450
+ "license": "ISC",
2451
+ "bin": {
2452
+ "semver": "bin/semver.js"
2453
+ }
2454
+ },
2455
+ "node_modules/socket.io-client": {
2456
+ "version": "4.8.3",
2457
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz",
2458
+ "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==",
2459
+ "license": "MIT",
2460
+ "dependencies": {
2461
+ "@socket.io/component-emitter": "~3.1.0",
2462
+ "debug": "~4.4.1",
2463
+ "engine.io-client": "~6.6.1",
2464
+ "socket.io-parser": "~4.2.4"
2465
+ },
2466
+ "engines": {
2467
+ "node": ">=10.0.0"
2468
+ }
2469
+ },
2470
+ "node_modules/socket.io-parser": {
2471
+ "version": "4.2.5",
2472
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz",
2473
+ "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==",
2474
+ "license": "MIT",
2475
+ "dependencies": {
2476
+ "@socket.io/component-emitter": "~3.1.0",
2477
+ "debug": "~4.4.1"
2478
+ },
2479
+ "engines": {
2480
+ "node": ">=10.0.0"
2481
+ }
2482
+ },
2483
+ "node_modules/source-map-js": {
2484
+ "version": "1.2.1",
2485
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
2486
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
2487
+ "dev": true,
2488
+ "license": "BSD-3-Clause",
2489
+ "engines": {
2490
+ "node": ">=0.10.0"
2491
+ }
2492
+ },
2493
+ "node_modules/sucrase": {
2494
+ "version": "3.35.1",
2495
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
2496
+ "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
2497
+ "dev": true,
2498
+ "license": "MIT",
2499
+ "dependencies": {
2500
+ "@jridgewell/gen-mapping": "^0.3.2",
2501
+ "commander": "^4.0.0",
2502
+ "lines-and-columns": "^1.1.6",
2503
+ "mz": "^2.7.0",
2504
+ "pirates": "^4.0.1",
2505
+ "tinyglobby": "^0.2.11",
2506
+ "ts-interface-checker": "^0.1.9"
2507
+ },
2508
+ "bin": {
2509
+ "sucrase": "bin/sucrase",
2510
+ "sucrase-node": "bin/sucrase-node"
2511
+ },
2512
+ "engines": {
2513
+ "node": ">=16 || 14 >=14.17"
2514
+ }
2515
+ },
2516
+ "node_modules/supports-preserve-symlinks-flag": {
2517
+ "version": "1.0.0",
2518
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2519
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
2520
+ "dev": true,
2521
+ "license": "MIT",
2522
+ "engines": {
2523
+ "node": ">= 0.4"
2524
+ },
2525
+ "funding": {
2526
+ "url": "https://github.com/sponsors/ljharb"
2527
+ }
2528
+ },
2529
+ "node_modules/tailwindcss": {
2530
+ "version": "3.4.19",
2531
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz",
2532
+ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==",
2533
+ "dev": true,
2534
+ "license": "MIT",
2535
+ "dependencies": {
2536
+ "@alloc/quick-lru": "^5.2.0",
2537
+ "arg": "^5.0.2",
2538
+ "chokidar": "^3.6.0",
2539
+ "didyoumean": "^1.2.2",
2540
+ "dlv": "^1.1.3",
2541
+ "fast-glob": "^3.3.2",
2542
+ "glob-parent": "^6.0.2",
2543
+ "is-glob": "^4.0.3",
2544
+ "jiti": "^1.21.7",
2545
+ "lilconfig": "^3.1.3",
2546
+ "micromatch": "^4.0.8",
2547
+ "normalize-path": "^3.0.0",
2548
+ "object-hash": "^3.0.0",
2549
+ "picocolors": "^1.1.1",
2550
+ "postcss": "^8.4.47",
2551
+ "postcss-import": "^15.1.0",
2552
+ "postcss-js": "^4.0.1",
2553
+ "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0",
2554
+ "postcss-nested": "^6.2.0",
2555
+ "postcss-selector-parser": "^6.1.2",
2556
+ "resolve": "^1.22.8",
2557
+ "sucrase": "^3.35.0"
2558
+ },
2559
+ "bin": {
2560
+ "tailwind": "lib/cli.js",
2561
+ "tailwindcss": "lib/cli.js"
2562
+ },
2563
+ "engines": {
2564
+ "node": ">=14.0.0"
2565
+ }
2566
+ },
2567
+ "node_modules/thenify": {
2568
+ "version": "3.3.1",
2569
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
2570
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
2571
+ "dev": true,
2572
+ "license": "MIT",
2573
+ "dependencies": {
2574
+ "any-promise": "^1.0.0"
2575
+ }
2576
+ },
2577
+ "node_modules/thenify-all": {
2578
+ "version": "1.6.0",
2579
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
2580
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
2581
+ "dev": true,
2582
+ "license": "MIT",
2583
+ "dependencies": {
2584
+ "thenify": ">= 3.1.0 < 4"
2585
+ },
2586
+ "engines": {
2587
+ "node": ">=0.8"
2588
+ }
2589
+ },
2590
+ "node_modules/tinyglobby": {
2591
+ "version": "0.2.15",
2592
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
2593
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
2594
+ "dev": true,
2595
+ "license": "MIT",
2596
+ "dependencies": {
2597
+ "fdir": "^6.5.0",
2598
+ "picomatch": "^4.0.3"
2599
+ },
2600
+ "engines": {
2601
+ "node": ">=12.0.0"
2602
+ },
2603
+ "funding": {
2604
+ "url": "https://github.com/sponsors/SuperchupuDev"
2605
+ }
2606
+ },
2607
+ "node_modules/tinyglobby/node_modules/fdir": {
2608
+ "version": "6.5.0",
2609
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
2610
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
2611
+ "dev": true,
2612
+ "license": "MIT",
2613
+ "engines": {
2614
+ "node": ">=12.0.0"
2615
+ },
2616
+ "peerDependencies": {
2617
+ "picomatch": "^3 || ^4"
2618
+ },
2619
+ "peerDependenciesMeta": {
2620
+ "picomatch": {
2621
+ "optional": true
2622
+ }
2623
+ }
2624
+ },
2625
+ "node_modules/tinyglobby/node_modules/picomatch": {
2626
+ "version": "4.0.3",
2627
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
2628
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
2629
+ "dev": true,
2630
+ "license": "MIT",
2631
+ "peer": true,
2632
+ "engines": {
2633
+ "node": ">=12"
2634
+ },
2635
+ "funding": {
2636
+ "url": "https://github.com/sponsors/jonschlinkert"
2637
+ }
2638
+ },
2639
+ "node_modules/to-regex-range": {
2640
+ "version": "5.0.1",
2641
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2642
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2643
+ "dev": true,
2644
+ "license": "MIT",
2645
+ "dependencies": {
2646
+ "is-number": "^7.0.0"
2647
+ },
2648
+ "engines": {
2649
+ "node": ">=8.0"
2650
+ }
2651
+ },
2652
+ "node_modules/ts-interface-checker": {
2653
+ "version": "0.1.13",
2654
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
2655
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
2656
+ "dev": true,
2657
+ "license": "Apache-2.0"
2658
+ },
2659
+ "node_modules/typescript": {
2660
+ "version": "5.9.3",
2661
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
2662
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
2663
+ "dev": true,
2664
+ "license": "Apache-2.0",
2665
+ "bin": {
2666
+ "tsc": "bin/tsc",
2667
+ "tsserver": "bin/tsserver"
2668
+ },
2669
+ "engines": {
2670
+ "node": ">=14.17"
2671
+ }
2672
+ },
2673
+ "node_modules/update-browserslist-db": {
2674
+ "version": "1.2.3",
2675
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
2676
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
2677
+ "dev": true,
2678
+ "funding": [
2679
+ {
2680
+ "type": "opencollective",
2681
+ "url": "https://opencollective.com/browserslist"
2682
+ },
2683
+ {
2684
+ "type": "tidelift",
2685
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
2686
+ },
2687
+ {
2688
+ "type": "github",
2689
+ "url": "https://github.com/sponsors/ai"
2690
+ }
2691
+ ],
2692
+ "license": "MIT",
2693
+ "dependencies": {
2694
+ "escalade": "^3.2.0",
2695
+ "picocolors": "^1.1.1"
2696
+ },
2697
+ "bin": {
2698
+ "update-browserslist-db": "cli.js"
2699
+ },
2700
+ "peerDependencies": {
2701
+ "browserslist": ">= 4.21.0"
2702
+ }
2703
+ },
2704
+ "node_modules/util-deprecate": {
2705
+ "version": "1.0.2",
2706
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2707
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
2708
+ "dev": true,
2709
+ "license": "MIT"
2710
+ },
2711
+ "node_modules/vite": {
2712
+ "version": "6.4.1",
2713
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",
2714
+ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==",
2715
+ "dev": true,
2716
+ "license": "MIT",
2717
+ "peer": true,
2718
+ "dependencies": {
2719
+ "esbuild": "^0.25.0",
2720
+ "fdir": "^6.4.4",
2721
+ "picomatch": "^4.0.2",
2722
+ "postcss": "^8.5.3",
2723
+ "rollup": "^4.34.9",
2724
+ "tinyglobby": "^0.2.13"
2725
+ },
2726
+ "bin": {
2727
+ "vite": "bin/vite.js"
2728
+ },
2729
+ "engines": {
2730
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
2731
+ },
2732
+ "funding": {
2733
+ "url": "https://github.com/vitejs/vite?sponsor=1"
2734
+ },
2735
+ "optionalDependencies": {
2736
+ "fsevents": "~2.3.3"
2737
+ },
2738
+ "peerDependencies": {
2739
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
2740
+ "jiti": ">=1.21.0",
2741
+ "less": "*",
2742
+ "lightningcss": "^1.21.0",
2743
+ "sass": "*",
2744
+ "sass-embedded": "*",
2745
+ "stylus": "*",
2746
+ "sugarss": "*",
2747
+ "terser": "^5.16.0",
2748
+ "tsx": "^4.8.1",
2749
+ "yaml": "^2.4.2"
2750
+ },
2751
+ "peerDependenciesMeta": {
2752
+ "@types/node": {
2753
+ "optional": true
2754
+ },
2755
+ "jiti": {
2756
+ "optional": true
2757
+ },
2758
+ "less": {
2759
+ "optional": true
2760
+ },
2761
+ "lightningcss": {
2762
+ "optional": true
2763
+ },
2764
+ "sass": {
2765
+ "optional": true
2766
+ },
2767
+ "sass-embedded": {
2768
+ "optional": true
2769
+ },
2770
+ "stylus": {
2771
+ "optional": true
2772
+ },
2773
+ "sugarss": {
2774
+ "optional": true
2775
+ },
2776
+ "terser": {
2777
+ "optional": true
2778
+ },
2779
+ "tsx": {
2780
+ "optional": true
2781
+ },
2782
+ "yaml": {
2783
+ "optional": true
2784
+ }
2785
+ }
2786
+ },
2787
+ "node_modules/vite/node_modules/fdir": {
2788
+ "version": "6.5.0",
2789
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
2790
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
2791
+ "dev": true,
2792
+ "license": "MIT",
2793
+ "engines": {
2794
+ "node": ">=12.0.0"
2795
+ },
2796
+ "peerDependencies": {
2797
+ "picomatch": "^3 || ^4"
2798
+ },
2799
+ "peerDependenciesMeta": {
2800
+ "picomatch": {
2801
+ "optional": true
2802
+ }
2803
+ }
2804
+ },
2805
+ "node_modules/vite/node_modules/picomatch": {
2806
+ "version": "4.0.3",
2807
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
2808
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
2809
+ "dev": true,
2810
+ "license": "MIT",
2811
+ "peer": true,
2812
+ "engines": {
2813
+ "node": ">=12"
2814
+ },
2815
+ "funding": {
2816
+ "url": "https://github.com/sponsors/jonschlinkert"
2817
+ }
2818
+ },
2819
+ "node_modules/ws": {
2820
+ "version": "8.18.3",
2821
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
2822
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
2823
+ "license": "MIT",
2824
+ "engines": {
2825
+ "node": ">=10.0.0"
2826
+ },
2827
+ "peerDependencies": {
2828
+ "bufferutil": "^4.0.1",
2829
+ "utf-8-validate": ">=5.0.2"
2830
+ },
2831
+ "peerDependenciesMeta": {
2832
+ "bufferutil": {
2833
+ "optional": true
2834
+ },
2835
+ "utf-8-validate": {
2836
+ "optional": true
2837
+ }
2838
+ }
2839
+ },
2840
+ "node_modules/xmlhttprequest-ssl": {
2841
+ "version": "2.1.2",
2842
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
2843
+ "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
2844
+ "engines": {
2845
+ "node": ">=0.4.0"
2846
+ }
2847
+ },
2848
+ "node_modules/yallist": {
2849
+ "version": "3.1.1",
2850
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
2851
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
2852
+ "dev": true,
2853
+ "license": "ISC"
2854
+ }
2855
+ }
2856
+ }
frontend/package.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "rag-chat-ui",
3
+ "private": true,
4
+ "version": "0.1.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "tsc && vite build",
9
+ "preview": "vite preview"
10
+ },
11
+ "dependencies": {
12
+ "react": "^18.3.1",
13
+ "react-dom": "^18.3.1",
14
+ "socket.io-client": "^4.8.0"
15
+ },
16
+ "devDependencies": {
17
+ "@types/react": "^18.3.12",
18
+ "@types/react-dom": "^18.3.1",
19
+ "@vitejs/plugin-react": "^4.3.4",
20
+ "autoprefixer": "^10.4.20",
21
+ "postcss": "^8.4.49",
22
+ "tailwindcss": "^3.4.16",
23
+ "typescript": "^5.6.3",
24
+ "vite": "^6.0.3"
25
+ }
26
+ }
frontend/postcss.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ };
frontend/src/App.tsx ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect, useRef, useState } from "react";
2
+ import { io, Socket } from "socket.io-client";
3
+ import ChatMessage from "./components/ChatMessage";
4
+
5
+ interface Message {
6
+ role: "user" | "assistant";
7
+ content: string;
8
+ }
9
+
10
+ const SOCKET_URL = `${window.location.protocol}//${window.location.hostname}:8000`;
11
+
12
+ export default function App() {
13
+ const [messages, setMessages] = useState<Message[]>([]);
14
+ const [input, setInput] = useState("");
15
+ const [loading, setLoading] = useState(false);
16
+ const [connected, setConnected] = useState(false);
17
+ const socketRef = useRef<Socket | null>(null);
18
+ const bottomRef = useRef<HTMLDivElement>(null);
19
+
20
+ useEffect(() => {
21
+ const socket = io(SOCKET_URL);
22
+ socketRef.current = socket;
23
+
24
+ socket.on("connect", () => setConnected(true));
25
+ socket.on("disconnect", () => setConnected(false));
26
+
27
+ socket.on("answer", (data: { answer?: string; error?: string }) => {
28
+ const content = data.answer ?? `Lỗi: ${data.error}`;
29
+ setMessages((prev) => [...prev, { role: "assistant", content }]);
30
+ setLoading(false);
31
+ });
32
+
33
+ return () => {
34
+ socket.disconnect();
35
+ };
36
+ }, []);
37
+
38
+ useEffect(() => {
39
+ bottomRef.current?.scrollIntoView({ behavior: "smooth" });
40
+ }, [messages, loading]);
41
+
42
+ const handleSend = () => {
43
+ const question = input.trim();
44
+ if (!question || loading || !connected) return;
45
+
46
+ setMessages((prev) => [...prev, { role: "user", content: question }]);
47
+ setInput("");
48
+ setLoading(true);
49
+ socketRef.current?.emit("ask", { question });
50
+ };
51
+
52
+ const handleKeyDown = (e: React.KeyboardEvent) => {
53
+ if (e.key === "Enter" && !e.shiftKey) {
54
+ e.preventDefault();
55
+ handleSend();
56
+ }
57
+ };
58
+
59
+ return (
60
+ <div className="flex flex-col h-screen bg-white">
61
+ {/* Header */}
62
+ <header className="bg-blue-700 text-white px-6 py-4 shadow-md">
63
+ <h1 className="text-xl font-bold">Hỏi đáp Pháp luật Việt Nam</h1>
64
+ <p className="text-blue-200 text-sm mt-0.5">
65
+ RAG Agent - Tra cứu văn bản pháp luật
66
+ </p>
67
+ </header>
68
+
69
+ {/* Messages */}
70
+ <main className="flex-1 overflow-y-auto px-4 py-6 md:px-8">
71
+ {messages.length === 0 && !loading && (
72
+ <div className="text-center text-gray-400 mt-20">
73
+ <p className="text-lg">Chào mừng bạn!</p>
74
+ <p className="text-sm mt-1">
75
+ Hãy đặt câu hỏi về pháp luật Việt Nam.
76
+ </p>
77
+ </div>
78
+ )}
79
+ {messages.map((msg, i) => (
80
+ <ChatMessage key={i} role={msg.role} content={msg.content} />
81
+ ))}
82
+ {loading && (
83
+ <div className="flex justify-start mb-4">
84
+ <div className="bg-gray-100 rounded-2xl px-4 py-3 text-gray-500">
85
+ <p className="text-sm font-medium mb-1 opacity-70">
86
+ Trợ lý Pháp luật
87
+ </p>
88
+ <span className="inline-flex gap-1">
89
+ <span className="w-2 h-2 bg-gray-400 rounded-full animate-bounce [animation-delay:0ms]" />
90
+ <span className="w-2 h-2 bg-gray-400 rounded-full animate-bounce [animation-delay:150ms]" />
91
+ <span className="w-2 h-2 bg-gray-400 rounded-full animate-bounce [animation-delay:300ms]" />
92
+ </span>
93
+ </div>
94
+ </div>
95
+ )}
96
+ <div ref={bottomRef} />
97
+ </main>
98
+
99
+ {/* Input */}
100
+ <footer className="border-t bg-white px-4 py-3 md:px-8">
101
+ <div className="flex items-center gap-3 max-w-4xl mx-auto">
102
+ <input
103
+ type="text"
104
+ className="flex-1 border border-gray-300 rounded-xl px-4 py-3 text-[15px] focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-50"
105
+ placeholder={
106
+ connected ? "Nhập câu hỏi..." : "Đang kết nối server..."
107
+ }
108
+ value={input}
109
+ onChange={(e) => setInput(e.target.value)}
110
+ onKeyDown={handleKeyDown}
111
+ disabled={!connected || loading}
112
+ />
113
+ <button
114
+ onClick={handleSend}
115
+ disabled={!input.trim() || loading || !connected}
116
+ className="bg-blue-600 text-white px-5 py-3 rounded-xl font-medium hover:bg-blue-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors"
117
+ >
118
+ Gửi
119
+ </button>
120
+ </div>
121
+ {!connected && (
122
+ <p className="text-center text-red-500 text-xs mt-2">
123
+ Chưa kết nối được server. Hãy chắc chắn backend đang chạy tại{" "}
124
+ {SOCKET_URL}
125
+ </p>
126
+ )}
127
+ </footer>
128
+ </div>
129
+ );
130
+ }
frontend/src/components/ChatMessage.tsx ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ interface ChatMessageProps {
2
+ role: "user" | "assistant";
3
+ content: string;
4
+ }
5
+
6
+ export default function ChatMessage({ role, content }: ChatMessageProps) {
7
+ const isUser = role === "user";
8
+
9
+ return (
10
+ <div className={`flex ${isUser ? "justify-end" : "justify-start"} mb-4`}>
11
+ <div
12
+ className={`max-w-[75%] rounded-2xl px-4 py-3 ${
13
+ isUser
14
+ ? "bg-blue-600 text-white"
15
+ : "bg-gray-100 text-gray-900"
16
+ }`}
17
+ >
18
+ <p className="text-sm font-medium mb-1 opacity-70">
19
+ {isUser ? "Bạn" : "Trợ lý Pháp luật"}
20
+ </p>
21
+ <div className="whitespace-pre-wrap text-[15px] leading-relaxed">
22
+ {content}
23
+ </div>
24
+ </div>
25
+ </div>
26
+ );
27
+ }
frontend/src/index.css ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ body {
6
+ margin: 0;
7
+ font-family:
8
+ -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
9
+ Arial, sans-serif;
10
+ }
frontend/src/main.tsx ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from "react";
2
+ import ReactDOM from "react-dom/client";
3
+ import App from "./App";
4
+ import "./index.css";
5
+
6
+ ReactDOM.createRoot(document.getElementById("root")!).render(
7
+ <React.StrictMode>
8
+ <App />
9
+ </React.StrictMode>,
10
+ );
frontend/tailwind.config.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ /** @type {import('tailwindcss').Config} */
2
+ export default {
3
+ content: ["./index.html", "./src/**/*.{ts,tsx}"],
4
+ theme: {
5
+ extend: {},
6
+ },
7
+ plugins: [],
8
+ };
frontend/tsconfig.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+ "moduleResolution": "bundler",
9
+ "allowImportingTsExtensions": true,
10
+ "isolatedModules": true,
11
+ "moduleDetection": "force",
12
+ "noEmit": true,
13
+ "jsx": "react-jsx",
14
+ "strict": true,
15
+ "noUnusedLocals": true,
16
+ "noUnusedParameters": true,
17
+ "noFallthroughCasesInSwitch": true
18
+ },
19
+ "include": ["src"]
20
+ }
frontend/vite.config.ts ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import react from "@vitejs/plugin-react";
2
+ import { defineConfig } from "vite";
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ server: {
7
+ port: 5173,
8
+ },
9
+ });
main.py ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import time
3
+ from pathlib import Path
4
+
5
+ from datasets import load_dataset
6
+ from dotenv import load_dotenv
7
+ from langchain_text_splitters import RecursiveCharacterTextSplitter
8
+ from langchain_chroma import Chroma
9
+ from langchain_core.documents import Document
10
+ from langchain_core.output_parsers import StrOutputParser
11
+ from langchain_core.prompts import ChatPromptTemplate
12
+ from langchain_core.runnables import RunnablePassthrough
13
+ from langchain_openai import AzureChatOpenAI, AzureOpenAIEmbeddings
14
+
15
+ CHROMA_DIR = Path(__file__).parent / "chroma_db"
16
+ DATASET_NAME = "undertheseanlp/UTS_VLC"
17
+ DATASET_SPLIT = "2026"
18
+ MAX_CHUNKS = 1000
19
+
20
+ SYSTEM_PROMPT = """\
21
+ Bạn là trợ lý pháp luật Việt Nam. Hãy trả lời câu hỏi dựa trên các văn bản luật được cung cấp bên dưới.
22
+
23
+ Quy tắc:
24
+ - Chỉ trả lời dựa trên nội dung trong context được cung cấp.
25
+ - Trích dẫn tên văn bản luật, điều khoản cụ thể khi có thể.
26
+ - Nếu context không đủ thông tin, hãy nói rõ rằng không tìm thấy thông tin liên quan.
27
+ - Trả lời bằng tiếng Việt.
28
+
29
+ Context:
30
+ {context}"""
31
+
32
+
33
+ def load_env():
34
+ load_dotenv(Path(__file__).parent / ".env")
35
+
36
+
37
+ def load_documents():
38
+ print("Đang tải dữ liệu từ HuggingFace...")
39
+ ds = load_dataset(DATASET_NAME, split=DATASET_SPLIT)
40
+ documents = []
41
+ for row in ds:
42
+ content = row.get("content", "")
43
+ if not content:
44
+ continue
45
+ metadata = {k: v for k, v in row.items() if k != "content" and v is not None}
46
+ documents.append(Document(page_content=content, metadata=metadata))
47
+ print(f"Đã tải {len(documents)} văn bản luật.")
48
+ return documents
49
+
50
+
51
+ def chunk_documents(documents):
52
+ print("Đang chia nhỏ văn bản...")
53
+ splitter = RecursiveCharacterTextSplitter(
54
+ chunk_size=1000,
55
+ chunk_overlap=200,
56
+ )
57
+ chunks = splitter.split_documents(documents)
58
+ print(f"Đã tạo {len(chunks)} chunks.")
59
+ return chunks
60
+
61
+
62
+ def get_embeddings():
63
+ return AzureOpenAIEmbeddings(
64
+ azure_deployment=os.environ["AZURE_OPENAI_EMBEDDING_MODEL"],
65
+ azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
66
+ api_key=os.environ["AZURE_OPENAI_API_KEY"],
67
+ api_version=os.environ["AZURE_OPENAI_API_VERSION"],
68
+ )
69
+
70
+
71
+ def build_vectorstore():
72
+ embeddings = get_embeddings()
73
+
74
+ if CHROMA_DIR.exists() and any(CHROMA_DIR.iterdir()):
75
+ print("Đang tải vector store từ ổ đĩa...")
76
+ vectorstore = Chroma(
77
+ persist_directory=str(CHROMA_DIR),
78
+ embedding_function=embeddings,
79
+ )
80
+ count = vectorstore._collection.count()
81
+ print(f"Đã tải vector store với {count} chunks.")
82
+ return vectorstore
83
+
84
+ documents = load_documents()
85
+ chunks = chunk_documents(documents)
86
+ chunks = chunks[:MAX_CHUNKS]
87
+ print(f"Sử dụng {len(chunks)} chunks (sample).")
88
+
89
+ print("Đang tạo vector store...")
90
+ batch_size = 100
91
+ vectorstore = Chroma(
92
+ persist_directory=str(CHROMA_DIR),
93
+ embedding_function=embeddings,
94
+ )
95
+ for i in range(0, len(chunks), batch_size):
96
+ batch = chunks[i : i + batch_size]
97
+ for attempt in range(5):
98
+ try:
99
+ vectorstore.add_documents(batch)
100
+ break
101
+ except Exception as e:
102
+ if "429" in str(e) or "RateLimit" in str(e):
103
+ wait = 60 * (attempt + 1)
104
+ print(f" Rate limit, đợi {wait}s...")
105
+ time.sleep(wait)
106
+ else:
107
+ raise
108
+ print(f" Đã index {min(i + batch_size, len(chunks))}/{len(chunks)} chunks")
109
+ print("Đã tạo vector store thành công.")
110
+ return vectorstore
111
+
112
+
113
+ def build_rag_chain(vectorstore):
114
+ retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
115
+
116
+ llm = AzureChatOpenAI(
117
+ azure_deployment=os.environ["AZURE_OPENAI_DEPLOYMENT"],
118
+ azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
119
+ api_key=os.environ["AZURE_OPENAI_API_KEY"],
120
+ api_version=os.environ["AZURE_OPENAI_API_VERSION"],
121
+ )
122
+
123
+ prompt = ChatPromptTemplate.from_messages([
124
+ ("system", SYSTEM_PROMPT),
125
+ ("human", "{question}"),
126
+ ])
127
+
128
+ def format_docs(docs):
129
+ return "\n\n---\n\n".join(
130
+ f"[{doc.metadata.get('title', 'Không rõ')}]\n{doc.page_content}"
131
+ for doc in docs
132
+ )
133
+
134
+ chain = (
135
+ {"context": retriever | format_docs, "question": RunnablePassthrough()}
136
+ | prompt
137
+ | llm
138
+ | StrOutputParser()
139
+ )
140
+ return chain
141
+
142
+
143
+ def main():
144
+ load_env()
145
+
146
+ print("=" * 60)
147
+ print(" RAG Agent - Hỏi đáp Pháp luật Việt Nam")
148
+ print("=" * 60)
149
+
150
+ vectorstore = build_vectorstore()
151
+ chain = build_rag_chain(vectorstore)
152
+
153
+ print("\nSẵn sàng! Nhập câu hỏi về pháp luật Việt Nam (gõ 'quit' để thoát).\n")
154
+
155
+ while True:
156
+ question = input("Câu hỏi: ").strip()
157
+ if not question:
158
+ continue
159
+ if question.lower() in ("quit", "exit", "q"):
160
+ print("Tạm biệt!")
161
+ break
162
+
163
+ print("\nĐang tìm kiếm và trả lời...\n")
164
+ answer = chain.invoke(question)
165
+ print(answer)
166
+ print()
167
+
168
+
169
+ if __name__ == "__main__":
170
+ main()
pyproject.toml ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "agents"
3
+ version = "0.1.0"
4
+ description = "Add your description here"
5
+ readme = "README.md"
6
+ requires-python = ">=3.12"
7
+ dependencies = [
8
+ "langchain>=0.3",
9
+ "langchain-openai>=0.3",
10
+ "langchain-chroma>=0.2",
11
+ "langchain-text-splitters>=0.3",
12
+ "chromadb>=0.6",
13
+ "datasets>=3.0",
14
+ "python-dotenv>=1.0",
15
+ "fastapi>=0.115",
16
+ "python-socketio>=5.11",
17
+ "uvicorn[standard]>=0.32",
18
+ ]
server.py ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import socketio
2
+ import uvicorn
3
+ from fastapi import FastAPI
4
+
5
+ from main import build_rag_chain, build_vectorstore, load_env
6
+
7
+ load_env()
8
+
9
+ app = FastAPI()
10
+ sio = socketio.AsyncServer(async_mode="asgi", cors_allowed_origins="*")
11
+ socket_app = socketio.ASGIApp(sio, other_asgi_app=app)
12
+
13
+ rag_chain = None
14
+
15
+
16
+ @app.on_event("startup")
17
+ async def startup():
18
+ global rag_chain
19
+ print("Loading vectorstore...")
20
+ vectorstore = build_vectorstore()
21
+ print("Building RAG chain...")
22
+ rag_chain = build_rag_chain(vectorstore)
23
+ print("Server ready!")
24
+
25
+
26
+ @sio.event
27
+ async def connect(sid, environ):
28
+ print(f"Client connected: {sid}")
29
+
30
+
31
+ @sio.event
32
+ async def disconnect(sid):
33
+ print(f"Client disconnected: {sid}")
34
+
35
+
36
+ @sio.event
37
+ async def ask(sid, data):
38
+ question = data.get("question", "").strip()
39
+ if not question:
40
+ await sio.emit("answer", {"error": "Câu hỏi trống"}, to=sid)
41
+ return
42
+
43
+ try:
44
+ answer = await rag_chain.ainvoke(question)
45
+ await sio.emit("answer", {"answer": answer}, to=sid)
46
+ except Exception as e:
47
+ print(f"Error: {e}")
48
+ await sio.emit("answer", {"error": str(e)}, to=sid)
49
+
50
+
51
+ if __name__ == "__main__":
52
+ uvicorn.run(socket_app, host="0.0.0.0", port=8000)
uv.lock ADDED
The diff for this file is too large to render. See raw diff