moelove commited on
Commit
e1fb264
·
1 Parent(s): 028b48d

Signed-off-by: Jintao Zhang <zhangjintao9020@gmail.com>

package-lock.json CHANGED
@@ -16,12 +16,16 @@
16
  "react-markdown": "^10.0.0"
17
  },
18
  "devDependencies": {
 
19
  "@types/react": "^18.2.15",
20
  "@types/react-dom": "^18.2.7",
21
  "@vitejs/plugin-react": "^4.0.3",
22
  "autoprefixer": "^10.4.21",
23
  "concurrently": "^8.2.0",
 
 
24
  "postcss": "^8.5.3",
 
25
  "tailwindcss": "^3.3.5",
26
  "vite": "^4.4.5"
27
  }
@@ -317,6 +321,79 @@
317
  "node": ">=6.9.0"
318
  }
319
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
320
  "node_modules/@esbuild/android-arm": {
321
  "version": "0.18.20",
322
  "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
@@ -669,6 +746,21 @@
669
  "node": ">=12"
670
  }
671
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
672
  "node_modules/@isaacs/cliui": {
673
  "version": "8.0.2",
674
  "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -858,6 +950,69 @@
858
  "node": ">=14"
859
  }
860
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
861
  "node_modules/@types/babel__core": {
862
  "version": "7.20.5",
863
  "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@@ -941,6 +1096,16 @@
941
  "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
942
  "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="
943
  },
 
 
 
 
 
 
 
 
 
 
944
  "node_modules/@types/prop-types": {
945
  "version": "15.7.14",
946
  "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
@@ -964,11 +1129,33 @@
964
  "@types/react": "^18.0.0"
965
  }
966
  },
 
 
 
 
 
 
 
 
 
 
 
 
967
  "node_modules/@types/unist": {
968
  "version": "3.0.3",
969
  "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
970
  "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="
971
  },
 
 
 
 
 
 
 
 
 
 
972
  "node_modules/@ungap/structured-clone": {
973
  "version": "1.3.0",
974
  "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
@@ -1005,6 +1192,43 @@
1005
  "node": ">= 0.6"
1006
  }
1007
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1008
  "node_modules/ansi-regex": {
1009
  "version": "5.0.1",
1010
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -1048,17 +1272,94 @@
1048
  "node": ">= 8"
1049
  }
1050
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1051
  "node_modules/arg": {
1052
  "version": "5.0.2",
1053
  "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
1054
  "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
1055
  "dev": true
1056
  },
 
 
 
 
 
 
 
 
 
1057
  "node_modules/array-flatten": {
1058
  "version": "1.1.1",
1059
  "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
1060
  "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
1061
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1062
  "node_modules/autoprefixer": {
1063
  "version": "10.4.21",
1064
  "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
@@ -1096,6 +1397,38 @@
1096
  "postcss": "^8.1.0"
1097
  }
1098
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1099
  "node_modules/bail": {
1100
  "version": "2.0.2",
1101
  "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
@@ -1111,6 +1444,53 @@
1111
  "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1112
  "dev": true
1113
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1114
  "node_modules/binary-extensions": {
1115
  "version": "2.3.0",
1116
  "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -1123,6 +1503,18 @@
1123
  "url": "https://github.com/sponsors/sindresorhus"
1124
  }
1125
  },
 
 
 
 
 
 
 
 
 
 
 
 
1126
  "node_modules/body-parser": {
1127
  "version": "1.20.3",
1128
  "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
@@ -1212,6 +1604,39 @@
1212
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1213
  }
1214
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1215
  "node_modules/bytes": {
1216
  "version": "3.1.2",
1217
  "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -1220,6 +1645,15 @@
1220
  "node": ">= 0.8"
1221
  }
1222
  },
 
 
 
 
 
 
 
 
 
1223
  "node_modules/call-bind-apply-helpers": {
1224
  "version": "1.0.1",
1225
  "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
@@ -1276,6 +1710,12 @@
1276
  }
1277
  ]
1278
  },
 
 
 
 
 
 
1279
  "node_modules/ccount": {
1280
  "version": "2.0.1",
1281
  "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
@@ -1349,6 +1789,15 @@
1349
  "url": "https://github.com/sponsors/wooorm"
1350
  }
1351
  },
 
 
 
 
 
 
 
 
 
1352
  "node_modules/chokidar": {
1353
  "version": "3.6.0",
1354
  "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -1385,24 +1834,91 @@
1385
  "node": ">= 6"
1386
  }
1387
  },
1388
- "node_modules/cliui": {
1389
- "version": "8.0.1",
1390
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
1391
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
1392
  "dev": true,
1393
- "dependencies": {
1394
- "string-width": "^4.2.0",
1395
- "strip-ansi": "^6.0.1",
1396
- "wrap-ansi": "^7.0.0"
1397
- },
 
1398
  "engines": {
1399
- "node": ">=12"
1400
  }
1401
  },
1402
- "node_modules/color-convert": {
1403
- "version": "2.0.1",
1404
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1405
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1406
  "dev": true,
1407
  "dependencies": {
1408
  "color-name": "~1.1.4"
@@ -1417,6 +1933,24 @@
1417
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1418
  "dev": true
1419
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1420
  "node_modules/comma-separated-tokens": {
1421
  "version": "2.0.3",
1422
  "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
@@ -1435,6 +1969,15 @@
1435
  "node": ">= 6"
1436
  }
1437
  },
 
 
 
 
 
 
 
 
 
1438
  "node_modules/concurrently": {
1439
  "version": "8.2.2",
1440
  "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz",
@@ -1500,6 +2043,12 @@
1500
  "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
1501
  "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
1502
  },
 
 
 
 
 
 
1503
  "node_modules/cors": {
1504
  "version": "2.8.5",
1505
  "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
@@ -1512,6 +2061,15 @@
1512
  "node": ">= 0.10"
1513
  }
1514
  },
 
 
 
 
 
 
 
 
 
1515
  "node_modules/cross-spawn": {
1516
  "version": "7.0.6",
1517
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -1543,6 +2101,97 @@
1543
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1544
  "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
1545
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1546
  "node_modules/data-uri-to-buffer": {
1547
  "version": "4.0.1",
1548
  "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
@@ -1567,6 +2216,12 @@
1567
  "url": "https://opencollective.com/date-fns"
1568
  }
1569
  },
 
 
 
 
 
 
1570
  "node_modules/debug": {
1571
  "version": "4.4.0",
1572
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
@@ -1595,6 +2250,15 @@
1595
  "url": "https://github.com/sponsors/wooorm"
1596
  }
1597
  },
 
 
 
 
 
 
 
 
 
1598
  "node_modules/depd": {
1599
  "version": "2.0.0",
1600
  "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -1655,6 +2319,12 @@
1655
  "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
1656
  "dev": true
1657
  },
 
 
 
 
 
 
1658
  "node_modules/dunder-proto": {
1659
  "version": "1.0.1",
1660
  "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -1668,12 +2338,28 @@
1668
  "node": ">= 0.4"
1669
  }
1670
  },
 
 
 
 
 
 
1671
  "node_modules/eastasianwidth": {
1672
  "version": "0.2.0",
1673
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
1674
  "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
1675
  "dev": true
1676
  },
 
 
 
 
 
 
 
 
 
 
1677
  "node_modules/ee-first": {
1678
  "version": "1.1.1",
1679
  "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -1699,6 +2385,28 @@
1699
  "node": ">= 0.8"
1700
  }
1701
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1702
  "node_modules/es-define-property": {
1703
  "version": "1.0.1",
1704
  "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
@@ -1726,6 +2434,21 @@
1726
  "node": ">= 0.4"
1727
  }
1728
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1729
  "node_modules/esbuild": {
1730
  "version": "0.18.20",
1731
  "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
@@ -1777,6 +2500,15 @@
1777
  "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1778
  "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
1779
  },
 
 
 
 
 
 
 
 
 
1780
  "node_modules/estree-util-is-identifier-name": {
1781
  "version": "3.0.0",
1782
  "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
@@ -1794,6 +2526,74 @@
1794
  "node": ">= 0.6"
1795
  }
1796
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1797
  "node_modules/express": {
1798
  "version": "4.21.2",
1799
  "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
@@ -1857,6 +2657,35 @@
1857
  "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
1858
  "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
1859
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1860
  "node_modules/fast-glob": {
1861
  "version": "3.3.3",
1862
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
@@ -1894,6 +2723,15 @@
1894
  "reusify": "^1.0.4"
1895
  }
1896
  },
 
 
 
 
 
 
 
 
 
1897
  "node_modules/fetch-blob": {
1898
  "version": "3.2.0",
1899
  "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
@@ -1916,6 +2754,21 @@
1916
  "node": "^12.20 || >= 14.13"
1917
  }
1918
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1919
  "node_modules/fill-range": {
1920
  "version": "7.1.1",
1921
  "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@@ -1958,6 +2811,26 @@
1958
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1959
  "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1960
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1961
  "node_modules/foreground-child": {
1962
  "version": "3.3.1",
1963
  "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
@@ -1974,6 +2847,30 @@
1974
  "url": "https://github.com/sponsors/isaacs"
1975
  }
1976
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1977
  "node_modules/formdata-polyfill": {
1978
  "version": "4.0.10",
1979
  "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
@@ -2014,6 +2911,27 @@
2014
  "node": ">= 0.6"
2015
  }
2016
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2017
  "node_modules/fsevents": {
2018
  "version": "2.3.3",
2019
  "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -2089,6 +3007,39 @@
2089
  "node": ">= 0.4"
2090
  }
2091
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2092
  "node_modules/glob": {
2093
  "version": "10.4.5",
2094
  "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@@ -2121,6 +3072,21 @@
2121
  "node": ">=10.13.0"
2122
  }
2123
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2124
  "node_modules/globals": {
2125
  "version": "11.12.0",
2126
  "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -2141,6 +3107,12 @@
2141
  "url": "https://github.com/sponsors/ljharb"
2142
  }
2143
  },
 
 
 
 
 
 
2144
  "node_modules/has-flag": {
2145
  "version": "4.0.0",
2146
  "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -2161,6 +3133,21 @@
2161
  "url": "https://github.com/sponsors/ljharb"
2162
  }
2163
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2164
  "node_modules/hasown": {
2165
  "version": "2.0.2",
2166
  "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -2210,6 +3197,27 @@
2210
  "url": "https://opencollective.com/unified"
2211
  }
2212
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2213
  "node_modules/html-url-attributes": {
2214
  "version": "3.0.1",
2215
  "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
@@ -2219,19 +3227,83 @@
2219
  "url": "https://opencollective.com/unified"
2220
  }
2221
  },
2222
- "node_modules/http-errors": {
2223
- "version": "2.0.0",
2224
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
2225
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2226
  "dependencies": {
2227
- "depd": "2.0.0",
2228
- "inherits": "2.0.4",
2229
- "setprototypeof": "1.2.0",
2230
- "statuses": "2.0.1",
2231
- "toidentifier": "1.0.1"
2232
  },
2233
  "engines": {
2234
- "node": ">= 0.8"
 
 
 
 
 
 
 
 
 
2235
  }
2236
  },
2237
  "node_modules/iconv-lite": {
@@ -2245,11 +3317,49 @@
2245
  "node": ">=0.10.0"
2246
  }
2247
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2248
  "node_modules/inherits": {
2249
  "version": "2.0.4",
2250
  "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
2251
  "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
2252
  },
 
 
 
 
 
 
 
 
 
2253
  "node_modules/inline-style-parser": {
2254
  "version": "0.2.4",
2255
  "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz",
@@ -2360,6 +3470,22 @@
2360
  "url": "https://github.com/sponsors/wooorm"
2361
  }
2362
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2363
  "node_modules/is-number": {
2364
  "version": "7.0.0",
2365
  "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -2369,6 +3495,15 @@
2369
  "node": ">=0.12.0"
2370
  }
2371
  },
 
 
 
 
 
 
 
 
 
2372
  "node_modules/is-plain-obj": {
2373
  "version": "4.1.0",
2374
  "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
@@ -2380,12 +3515,48 @@
2380
  "url": "https://github.com/sponsors/sindresorhus"
2381
  }
2382
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2383
  "node_modules/isexe": {
2384
  "version": "2.0.0",
2385
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2386
  "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
2387
  "dev": true
2388
  },
 
 
 
 
 
 
2389
  "node_modules/jackspeak": {
2390
  "version": "3.4.3",
2391
  "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
@@ -2410,11 +3581,30 @@
2410
  "jiti": "bin/jiti.js"
2411
  }
2412
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
2413
  "node_modules/js-tokens": {
2414
  "version": "4.0.0",
2415
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
2416
  "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
2417
  },
 
 
 
 
 
 
2418
  "node_modules/jsesc": {
2419
  "version": "3.1.0",
2420
  "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
@@ -2427,6 +3617,18 @@
2427
  "node": ">=6"
2428
  }
2429
  },
 
 
 
 
 
 
 
 
 
 
 
 
2430
  "node_modules/json5": {
2431
  "version": "2.2.3",
2432
  "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -2439,6 +3641,42 @@
2439
  "node": ">=6"
2440
  }
2441
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2442
  "node_modules/lightningcss": {
2443
  "version": "1.29.2",
2444
  "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz",
@@ -2694,12 +3932,110 @@
2694
  "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
2695
  "dev": true
2696
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2697
  "node_modules/lodash": {
2698
  "version": "4.17.21",
2699
  "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
2700
  "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
2701
  "dev": true
2702
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2703
  "node_modules/longest-streak": {
2704
  "version": "3.1.0",
2705
  "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
@@ -2729,6 +4065,21 @@
2729
  "yallist": "^3.0.2"
2730
  }
2731
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2732
  "node_modules/math-intrinsics": {
2733
  "version": "1.1.0",
2734
  "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -2898,6 +4249,12 @@
2898
  "url": "https://github.com/sponsors/sindresorhus"
2899
  }
2900
  },
 
 
 
 
 
 
2901
  "node_modules/merge2": {
2902
  "version": "1.4.1",
2903
  "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -3379,6 +4736,15 @@
3379
  "node": ">= 0.6"
3380
  }
3381
  },
 
 
 
 
 
 
 
 
 
3382
  "node_modules/minimatch": {
3383
  "version": "9.0.5",
3384
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
@@ -3394,6 +4760,15 @@
3394
  "url": "https://github.com/sponsors/isaacs"
3395
  }
3396
  },
 
 
 
 
 
 
 
 
 
3397
  "node_modules/minipass": {
3398
  "version": "7.1.2",
3399
  "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
@@ -3504,6 +4879,18 @@
3504
  "node": ">=0.10.0"
3505
  }
3506
  },
 
 
 
 
 
 
 
 
 
 
 
 
3507
  "node_modules/object-assign": {
3508
  "version": "4.1.1",
3509
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -3543,6 +4930,60 @@
3543
  "node": ">= 0.8"
3544
  }
3545
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3546
  "node_modules/package-json-from-dist": {
3547
  "version": "1.0.1",
3548
  "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
@@ -3622,6 +5063,27 @@
3622
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
3623
  "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="
3624
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3625
  "node_modules/picocolors": {
3626
  "version": "1.1.1",
3627
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -3658,6 +5120,19 @@
3658
  "node": ">= 6"
3659
  }
3660
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
3661
  "node_modules/postcss": {
3662
  "version": "8.5.3",
3663
  "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
@@ -3813,6 +5288,53 @@
3813
  "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
3814
  "dev": true
3815
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3816
  "node_modules/property-information": {
3817
  "version": "7.0.0",
3818
  "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz",
@@ -3834,6 +5356,37 @@
3834
  "node": ">= 0.10"
3835
  }
3836
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3837
  "node_modules/qs": {
3838
  "version": "6.13.0",
3839
  "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
@@ -3913,6 +5466,12 @@
3913
  "react": "^18.3.1"
3914
  }
3915
  },
 
 
 
 
 
 
3916
  "node_modules/react-markdown": {
3917
  "version": "10.0.0",
3918
  "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.0.0.tgz",
@@ -4006,6 +5565,15 @@
4006
  "url": "https://opencollective.com/unified"
4007
  }
4008
  },
 
 
 
 
 
 
 
 
 
4009
  "node_modules/require-directory": {
4010
  "version": "2.1.1",
4011
  "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -4015,6 +5583,12 @@
4015
  "node": ">=0.10.0"
4016
  }
4017
  },
 
 
 
 
 
 
4018
  "node_modules/resolve": {
4019
  "version": "1.22.10",
4020
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@@ -4035,6 +5609,25 @@
4035
  "url": "https://github.com/sponsors/ljharb"
4036
  }
4037
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4038
  "node_modules/reusify": {
4039
  "version": "1.1.0",
4040
  "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
@@ -4045,6 +5638,12 @@
4045
  "node": ">=0.10.0"
4046
  }
4047
  },
 
 
 
 
 
 
4048
  "node_modules/rollup": {
4049
  "version": "3.29.5",
4050
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz",
@@ -4085,9 +5684,9 @@
4085
  }
4086
  },
4087
  "node_modules/rxjs": {
4088
- "version": "7.8.1",
4089
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
4090
- "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
4091
  "dev": true,
4092
  "dependencies": {
4093
  "tslib": "^2.1.0"
@@ -4125,6 +5724,12 @@
4125
  "loose-envify": "^1.1.0"
4126
  }
4127
  },
 
 
 
 
 
 
4128
  "node_modules/semver": {
4129
  "version": "6.3.1",
4130
  "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
@@ -4310,6 +5915,20 @@
4310
  "url": "https://github.com/sponsors/isaacs"
4311
  }
4312
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4313
  "node_modules/source-map-js": {
4314
  "version": "1.2.1",
4315
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -4334,6 +5953,117 @@
4334
  "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==",
4335
  "dev": true
4336
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4337
  "node_modules/statuses": {
4338
  "version": "2.0.1",
4339
  "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
@@ -4342,6 +6072,15 @@
4342
  "node": ">= 0.8"
4343
  }
4344
  },
 
 
 
 
 
 
 
 
 
4345
  "node_modules/string-width": {
4346
  "version": "4.2.3",
4347
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -4409,6 +6148,15 @@
4409
  "node": ">=8"
4410
  }
4411
  },
 
 
 
 
 
 
 
 
 
4412
  "node_modules/style-to-object": {
4413
  "version": "1.0.8",
4414
  "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz",
@@ -4524,6 +6272,48 @@
4524
  "node": ">=0.8"
4525
  }
4526
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4527
  "node_modules/to-regex-range": {
4528
  "version": "5.0.1",
4529
  "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -4544,6 +6334,18 @@
4544
  "node": ">=0.6"
4545
  }
4546
  },
 
 
 
 
 
 
 
 
 
 
 
 
4547
  "node_modules/tree-kill": {
4548
  "version": "1.2.2",
4549
  "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
@@ -4583,6 +6385,36 @@
4583
  "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
4584
  "dev": true
4585
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4586
  "node_modules/type-is": {
4587
  "version": "1.6.18",
4588
  "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@@ -4595,6 +6427,13 @@
4595
  "node": ">= 0.6"
4596
  }
4597
  },
 
 
 
 
 
 
 
4598
  "node_modules/unified": {
4599
  "version": "11.0.5",
4600
  "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
@@ -4613,6 +6452,18 @@
4613
  "url": "https://opencollective.com/unified"
4614
  }
4615
  },
 
 
 
 
 
 
 
 
 
 
 
 
4616
  "node_modules/unist-util-is": {
4617
  "version": "6.0.0",
4618
  "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
@@ -4676,6 +6527,15 @@
4676
  "url": "https://opencollective.com/unified"
4677
  }
4678
  },
 
 
 
 
 
 
 
 
 
4679
  "node_modules/unpipe": {
4680
  "version": "1.0.0",
4681
  "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -4684,6 +6544,15 @@
4684
  "node": ">= 0.8"
4685
  }
4686
  },
 
 
 
 
 
 
 
 
 
4687
  "node_modules/update-browserslist-db": {
4688
  "version": "1.1.2",
4689
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
@@ -4714,6 +6583,12 @@
4714
  "browserslist": ">= 4.21.0"
4715
  }
4716
  },
 
 
 
 
 
 
4717
  "node_modules/util-deprecate": {
4718
  "version": "1.0.2",
4719
  "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -4728,6 +6603,15 @@
4728
  "node": ">= 0.4.0"
4729
  }
4730
  },
 
 
 
 
 
 
 
 
 
4731
  "node_modules/vary": {
4732
  "version": "1.1.2",
4733
  "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -4736,6 +6620,20 @@
4736
  "node": ">= 0.8"
4737
  }
4738
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4739
  "node_modules/vfile": {
4740
  "version": "6.0.3",
4741
  "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
@@ -4817,6 +6715,25 @@
4817
  }
4818
  }
4819
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4820
  "node_modules/web-streams-polyfill": {
4821
  "version": "3.3.3",
4822
  "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
@@ -4825,6 +6742,30 @@
4825
  "node": ">= 8"
4826
  }
4827
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4828
  "node_modules/which": {
4829
  "version": "2.0.2",
4830
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -4875,6 +6816,12 @@
4875
  "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
4876
  }
4877
  },
 
 
 
 
 
 
4878
  "node_modules/y18n": {
4879
  "version": "5.0.8",
4880
  "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
@@ -4929,6 +6876,16 @@
4929
  "node": ">=12"
4930
  }
4931
  },
 
 
 
 
 
 
 
 
 
 
4932
  "node_modules/zwitch": {
4933
  "version": "2.0.4",
4934
  "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
 
16
  "react-markdown": "^10.0.0"
17
  },
18
  "devDependencies": {
19
+ "@testing-library/cypress": "^10.0.3",
20
  "@types/react": "^18.2.15",
21
  "@types/react-dom": "^18.2.7",
22
  "@vitejs/plugin-react": "^4.0.3",
23
  "autoprefixer": "^10.4.21",
24
  "concurrently": "^8.2.0",
25
+ "cypress": "^14.2.1",
26
+ "http-server": "^14.1.1",
27
  "postcss": "^8.5.3",
28
+ "start-server-and-test": "^2.0.11",
29
  "tailwindcss": "^3.3.5",
30
  "vite": "^4.4.5"
31
  }
 
321
  "node": ">=6.9.0"
322
  }
323
  },
324
+ "node_modules/@colors/colors": {
325
+ "version": "1.5.0",
326
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
327
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
328
+ "dev": true,
329
+ "optional": true,
330
+ "engines": {
331
+ "node": ">=0.1.90"
332
+ }
333
+ },
334
+ "node_modules/@cypress/request": {
335
+ "version": "3.0.8",
336
+ "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.8.tgz",
337
+ "integrity": "sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ==",
338
+ "dev": true,
339
+ "dependencies": {
340
+ "aws-sign2": "~0.7.0",
341
+ "aws4": "^1.8.0",
342
+ "caseless": "~0.12.0",
343
+ "combined-stream": "~1.0.6",
344
+ "extend": "~3.0.2",
345
+ "forever-agent": "~0.6.1",
346
+ "form-data": "~4.0.0",
347
+ "http-signature": "~1.4.0",
348
+ "is-typedarray": "~1.0.0",
349
+ "isstream": "~0.1.2",
350
+ "json-stringify-safe": "~5.0.1",
351
+ "mime-types": "~2.1.19",
352
+ "performance-now": "^2.1.0",
353
+ "qs": "6.14.0",
354
+ "safe-buffer": "^5.1.2",
355
+ "tough-cookie": "^5.0.0",
356
+ "tunnel-agent": "^0.6.0",
357
+ "uuid": "^8.3.2"
358
+ },
359
+ "engines": {
360
+ "node": ">= 6"
361
+ }
362
+ },
363
+ "node_modules/@cypress/request/node_modules/qs": {
364
+ "version": "6.14.0",
365
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
366
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
367
+ "dev": true,
368
+ "dependencies": {
369
+ "side-channel": "^1.1.0"
370
+ },
371
+ "engines": {
372
+ "node": ">=0.6"
373
+ },
374
+ "funding": {
375
+ "url": "https://github.com/sponsors/ljharb"
376
+ }
377
+ },
378
+ "node_modules/@cypress/xvfb": {
379
+ "version": "1.2.4",
380
+ "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
381
+ "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
382
+ "dev": true,
383
+ "dependencies": {
384
+ "debug": "^3.1.0",
385
+ "lodash.once": "^4.1.1"
386
+ }
387
+ },
388
+ "node_modules/@cypress/xvfb/node_modules/debug": {
389
+ "version": "3.2.7",
390
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
391
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
392
+ "dev": true,
393
+ "dependencies": {
394
+ "ms": "^2.1.1"
395
+ }
396
+ },
397
  "node_modules/@esbuild/android-arm": {
398
  "version": "0.18.20",
399
  "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
 
746
  "node": ">=12"
747
  }
748
  },
749
+ "node_modules/@hapi/hoek": {
750
+ "version": "9.3.0",
751
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
752
+ "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
753
+ "dev": true
754
+ },
755
+ "node_modules/@hapi/topo": {
756
+ "version": "5.1.0",
757
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
758
+ "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
759
+ "dev": true,
760
+ "dependencies": {
761
+ "@hapi/hoek": "^9.0.0"
762
+ }
763
+ },
764
  "node_modules/@isaacs/cliui": {
765
  "version": "8.0.2",
766
  "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
 
950
  "node": ">=14"
951
  }
952
  },
953
+ "node_modules/@sideway/address": {
954
+ "version": "4.1.5",
955
+ "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
956
+ "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
957
+ "dev": true,
958
+ "dependencies": {
959
+ "@hapi/hoek": "^9.0.0"
960
+ }
961
+ },
962
+ "node_modules/@sideway/formula": {
963
+ "version": "3.0.1",
964
+ "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
965
+ "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
966
+ "dev": true
967
+ },
968
+ "node_modules/@sideway/pinpoint": {
969
+ "version": "2.0.0",
970
+ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
971
+ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
972
+ "dev": true
973
+ },
974
+ "node_modules/@testing-library/cypress": {
975
+ "version": "10.0.3",
976
+ "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-10.0.3.tgz",
977
+ "integrity": "sha512-TeZJMCNtiS59cPWalra7LgADuufO5FtbqQBYxuAgdX6ZFAR2D9CtQwAG8VbgvFcchW3K414va/+7P4OkQ80UVg==",
978
+ "dev": true,
979
+ "dependencies": {
980
+ "@babel/runtime": "^7.14.6",
981
+ "@testing-library/dom": "^10.1.0"
982
+ },
983
+ "engines": {
984
+ "node": ">=12",
985
+ "npm": ">=6"
986
+ },
987
+ "peerDependencies": {
988
+ "cypress": "^12.0.0 || ^13.0.0 || ^14.0.0"
989
+ }
990
+ },
991
+ "node_modules/@testing-library/dom": {
992
+ "version": "10.4.0",
993
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
994
+ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
995
+ "dev": true,
996
+ "dependencies": {
997
+ "@babel/code-frame": "^7.10.4",
998
+ "@babel/runtime": "^7.12.5",
999
+ "@types/aria-query": "^5.0.1",
1000
+ "aria-query": "5.3.0",
1001
+ "chalk": "^4.1.0",
1002
+ "dom-accessibility-api": "^0.5.9",
1003
+ "lz-string": "^1.5.0",
1004
+ "pretty-format": "^27.0.2"
1005
+ },
1006
+ "engines": {
1007
+ "node": ">=18"
1008
+ }
1009
+ },
1010
+ "node_modules/@types/aria-query": {
1011
+ "version": "5.0.4",
1012
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
1013
+ "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
1014
+ "dev": true
1015
+ },
1016
  "node_modules/@types/babel__core": {
1017
  "version": "7.20.5",
1018
  "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
 
1096
  "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
1097
  "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="
1098
  },
1099
+ "node_modules/@types/node": {
1100
+ "version": "22.14.0",
1101
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz",
1102
+ "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==",
1103
+ "dev": true,
1104
+ "optional": true,
1105
+ "dependencies": {
1106
+ "undici-types": "~6.21.0"
1107
+ }
1108
+ },
1109
  "node_modules/@types/prop-types": {
1110
  "version": "15.7.14",
1111
  "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
 
1129
  "@types/react": "^18.0.0"
1130
  }
1131
  },
1132
+ "node_modules/@types/sinonjs__fake-timers": {
1133
+ "version": "8.1.1",
1134
+ "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
1135
+ "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
1136
+ "dev": true
1137
+ },
1138
+ "node_modules/@types/sizzle": {
1139
+ "version": "2.3.9",
1140
+ "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz",
1141
+ "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==",
1142
+ "dev": true
1143
+ },
1144
  "node_modules/@types/unist": {
1145
  "version": "3.0.3",
1146
  "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
1147
  "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="
1148
  },
1149
+ "node_modules/@types/yauzl": {
1150
+ "version": "2.10.3",
1151
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
1152
+ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
1153
+ "dev": true,
1154
+ "optional": true,
1155
+ "dependencies": {
1156
+ "@types/node": "*"
1157
+ }
1158
+ },
1159
  "node_modules/@ungap/structured-clone": {
1160
  "version": "1.3.0",
1161
  "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
 
1192
  "node": ">= 0.6"
1193
  }
1194
  },
1195
+ "node_modules/aggregate-error": {
1196
+ "version": "3.1.0",
1197
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
1198
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
1199
+ "dev": true,
1200
+ "dependencies": {
1201
+ "clean-stack": "^2.0.0",
1202
+ "indent-string": "^4.0.0"
1203
+ },
1204
+ "engines": {
1205
+ "node": ">=8"
1206
+ }
1207
+ },
1208
+ "node_modules/ansi-colors": {
1209
+ "version": "4.1.3",
1210
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
1211
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
1212
+ "dev": true,
1213
+ "engines": {
1214
+ "node": ">=6"
1215
+ }
1216
+ },
1217
+ "node_modules/ansi-escapes": {
1218
+ "version": "4.3.2",
1219
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
1220
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
1221
+ "dev": true,
1222
+ "dependencies": {
1223
+ "type-fest": "^0.21.3"
1224
+ },
1225
+ "engines": {
1226
+ "node": ">=8"
1227
+ },
1228
+ "funding": {
1229
+ "url": "https://github.com/sponsors/sindresorhus"
1230
+ }
1231
+ },
1232
  "node_modules/ansi-regex": {
1233
  "version": "5.0.1",
1234
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
 
1272
  "node": ">= 8"
1273
  }
1274
  },
1275
+ "node_modules/arch": {
1276
+ "version": "2.2.0",
1277
+ "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
1278
+ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
1279
+ "dev": true,
1280
+ "funding": [
1281
+ {
1282
+ "type": "github",
1283
+ "url": "https://github.com/sponsors/feross"
1284
+ },
1285
+ {
1286
+ "type": "patreon",
1287
+ "url": "https://www.patreon.com/feross"
1288
+ },
1289
+ {
1290
+ "type": "consulting",
1291
+ "url": "https://feross.org/support"
1292
+ }
1293
+ ]
1294
+ },
1295
  "node_modules/arg": {
1296
  "version": "5.0.2",
1297
  "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
1298
  "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
1299
  "dev": true
1300
  },
1301
+ "node_modules/aria-query": {
1302
+ "version": "5.3.0",
1303
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
1304
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
1305
+ "dev": true,
1306
+ "dependencies": {
1307
+ "dequal": "^2.0.3"
1308
+ }
1309
+ },
1310
  "node_modules/array-flatten": {
1311
  "version": "1.1.1",
1312
  "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
1313
  "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
1314
  },
1315
+ "node_modules/asn1": {
1316
+ "version": "0.2.6",
1317
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
1318
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
1319
+ "dev": true,
1320
+ "dependencies": {
1321
+ "safer-buffer": "~2.1.0"
1322
+ }
1323
+ },
1324
+ "node_modules/assert-plus": {
1325
+ "version": "1.0.0",
1326
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
1327
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
1328
+ "dev": true,
1329
+ "engines": {
1330
+ "node": ">=0.8"
1331
+ }
1332
+ },
1333
+ "node_modules/astral-regex": {
1334
+ "version": "2.0.0",
1335
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
1336
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
1337
+ "dev": true,
1338
+ "engines": {
1339
+ "node": ">=8"
1340
+ }
1341
+ },
1342
+ "node_modules/async": {
1343
+ "version": "3.2.6",
1344
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
1345
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
1346
+ "dev": true
1347
+ },
1348
+ "node_modules/asynckit": {
1349
+ "version": "0.4.0",
1350
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
1351
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
1352
+ "dev": true
1353
+ },
1354
+ "node_modules/at-least-node": {
1355
+ "version": "1.0.0",
1356
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
1357
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
1358
+ "dev": true,
1359
+ "engines": {
1360
+ "node": ">= 4.0.0"
1361
+ }
1362
+ },
1363
  "node_modules/autoprefixer": {
1364
  "version": "10.4.21",
1365
  "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
 
1397
  "postcss": "^8.1.0"
1398
  }
1399
  },
1400
+ "node_modules/aws-sign2": {
1401
+ "version": "0.7.0",
1402
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
1403
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
1404
+ "dev": true,
1405
+ "engines": {
1406
+ "node": "*"
1407
+ }
1408
+ },
1409
+ "node_modules/aws4": {
1410
+ "version": "1.13.2",
1411
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
1412
+ "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
1413
+ "dev": true
1414
+ },
1415
+ "node_modules/axios": {
1416
+ "version": "1.8.4",
1417
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
1418
+ "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
1419
+ "dev": true,
1420
+ "dependencies": {
1421
+ "follow-redirects": "^1.15.6",
1422
+ "form-data": "^4.0.0",
1423
+ "proxy-from-env": "^1.1.0"
1424
+ }
1425
+ },
1426
+ "node_modules/axios/node_modules/proxy-from-env": {
1427
+ "version": "1.1.0",
1428
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
1429
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
1430
+ "dev": true
1431
+ },
1432
  "node_modules/bail": {
1433
  "version": "2.0.2",
1434
  "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
 
1444
  "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1445
  "dev": true
1446
  },
1447
+ "node_modules/base64-js": {
1448
+ "version": "1.5.1",
1449
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
1450
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
1451
+ "dev": true,
1452
+ "funding": [
1453
+ {
1454
+ "type": "github",
1455
+ "url": "https://github.com/sponsors/feross"
1456
+ },
1457
+ {
1458
+ "type": "patreon",
1459
+ "url": "https://www.patreon.com/feross"
1460
+ },
1461
+ {
1462
+ "type": "consulting",
1463
+ "url": "https://feross.org/support"
1464
+ }
1465
+ ]
1466
+ },
1467
+ "node_modules/basic-auth": {
1468
+ "version": "2.0.1",
1469
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
1470
+ "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
1471
+ "dev": true,
1472
+ "dependencies": {
1473
+ "safe-buffer": "5.1.2"
1474
+ },
1475
+ "engines": {
1476
+ "node": ">= 0.8"
1477
+ }
1478
+ },
1479
+ "node_modules/basic-auth/node_modules/safe-buffer": {
1480
+ "version": "5.1.2",
1481
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1482
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1483
+ "dev": true
1484
+ },
1485
+ "node_modules/bcrypt-pbkdf": {
1486
+ "version": "1.0.2",
1487
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
1488
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
1489
+ "dev": true,
1490
+ "dependencies": {
1491
+ "tweetnacl": "^0.14.3"
1492
+ }
1493
+ },
1494
  "node_modules/binary-extensions": {
1495
  "version": "2.3.0",
1496
  "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
 
1503
  "url": "https://github.com/sponsors/sindresorhus"
1504
  }
1505
  },
1506
+ "node_modules/blob-util": {
1507
+ "version": "2.0.2",
1508
+ "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
1509
+ "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
1510
+ "dev": true
1511
+ },
1512
+ "node_modules/bluebird": {
1513
+ "version": "3.7.2",
1514
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
1515
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
1516
+ "dev": true
1517
+ },
1518
  "node_modules/body-parser": {
1519
  "version": "1.20.3",
1520
  "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
 
1604
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1605
  }
1606
  },
1607
+ "node_modules/buffer": {
1608
+ "version": "5.7.1",
1609
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
1610
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
1611
+ "dev": true,
1612
+ "funding": [
1613
+ {
1614
+ "type": "github",
1615
+ "url": "https://github.com/sponsors/feross"
1616
+ },
1617
+ {
1618
+ "type": "patreon",
1619
+ "url": "https://www.patreon.com/feross"
1620
+ },
1621
+ {
1622
+ "type": "consulting",
1623
+ "url": "https://feross.org/support"
1624
+ }
1625
+ ],
1626
+ "dependencies": {
1627
+ "base64-js": "^1.3.1",
1628
+ "ieee754": "^1.1.13"
1629
+ }
1630
+ },
1631
+ "node_modules/buffer-crc32": {
1632
+ "version": "0.2.13",
1633
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
1634
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
1635
+ "dev": true,
1636
+ "engines": {
1637
+ "node": "*"
1638
+ }
1639
+ },
1640
  "node_modules/bytes": {
1641
  "version": "3.1.2",
1642
  "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
 
1645
  "node": ">= 0.8"
1646
  }
1647
  },
1648
+ "node_modules/cachedir": {
1649
+ "version": "2.4.0",
1650
+ "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
1651
+ "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
1652
+ "dev": true,
1653
+ "engines": {
1654
+ "node": ">=6"
1655
+ }
1656
+ },
1657
  "node_modules/call-bind-apply-helpers": {
1658
  "version": "1.0.1",
1659
  "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
 
1710
  }
1711
  ]
1712
  },
1713
+ "node_modules/caseless": {
1714
+ "version": "0.12.0",
1715
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
1716
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
1717
+ "dev": true
1718
+ },
1719
  "node_modules/ccount": {
1720
  "version": "2.0.1",
1721
  "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
 
1789
  "url": "https://github.com/sponsors/wooorm"
1790
  }
1791
  },
1792
+ "node_modules/check-more-types": {
1793
+ "version": "2.24.0",
1794
+ "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
1795
+ "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
1796
+ "dev": true,
1797
+ "engines": {
1798
+ "node": ">= 0.8.0"
1799
+ }
1800
+ },
1801
  "node_modules/chokidar": {
1802
  "version": "3.6.0",
1803
  "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
 
1834
  "node": ">= 6"
1835
  }
1836
  },
1837
+ "node_modules/ci-info": {
1838
+ "version": "4.2.0",
1839
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz",
1840
+ "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==",
1841
  "dev": true,
1842
+ "funding": [
1843
+ {
1844
+ "type": "github",
1845
+ "url": "https://github.com/sponsors/sibiraj-s"
1846
+ }
1847
+ ],
1848
  "engines": {
1849
+ "node": ">=8"
1850
  }
1851
  },
1852
+ "node_modules/clean-stack": {
1853
+ "version": "2.2.0",
1854
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
1855
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
1856
+ "dev": true,
1857
+ "engines": {
1858
+ "node": ">=6"
1859
+ }
1860
+ },
1861
+ "node_modules/cli-cursor": {
1862
+ "version": "3.1.0",
1863
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
1864
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
1865
+ "dev": true,
1866
+ "dependencies": {
1867
+ "restore-cursor": "^3.1.0"
1868
+ },
1869
+ "engines": {
1870
+ "node": ">=8"
1871
+ }
1872
+ },
1873
+ "node_modules/cli-table3": {
1874
+ "version": "0.6.5",
1875
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
1876
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
1877
+ "dev": true,
1878
+ "dependencies": {
1879
+ "string-width": "^4.2.0"
1880
+ },
1881
+ "engines": {
1882
+ "node": "10.* || >= 12.*"
1883
+ },
1884
+ "optionalDependencies": {
1885
+ "@colors/colors": "1.5.0"
1886
+ }
1887
+ },
1888
+ "node_modules/cli-truncate": {
1889
+ "version": "2.1.0",
1890
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
1891
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
1892
+ "dev": true,
1893
+ "dependencies": {
1894
+ "slice-ansi": "^3.0.0",
1895
+ "string-width": "^4.2.0"
1896
+ },
1897
+ "engines": {
1898
+ "node": ">=8"
1899
+ },
1900
+ "funding": {
1901
+ "url": "https://github.com/sponsors/sindresorhus"
1902
+ }
1903
+ },
1904
+ "node_modules/cliui": {
1905
+ "version": "8.0.1",
1906
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
1907
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
1908
+ "dev": true,
1909
+ "dependencies": {
1910
+ "string-width": "^4.2.0",
1911
+ "strip-ansi": "^6.0.1",
1912
+ "wrap-ansi": "^7.0.0"
1913
+ },
1914
+ "engines": {
1915
+ "node": ">=12"
1916
+ }
1917
+ },
1918
+ "node_modules/color-convert": {
1919
+ "version": "2.0.1",
1920
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1921
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1922
  "dev": true,
1923
  "dependencies": {
1924
  "color-name": "~1.1.4"
 
1933
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1934
  "dev": true
1935
  },
1936
+ "node_modules/colorette": {
1937
+ "version": "2.0.20",
1938
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
1939
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
1940
+ "dev": true
1941
+ },
1942
+ "node_modules/combined-stream": {
1943
+ "version": "1.0.8",
1944
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1945
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1946
+ "dev": true,
1947
+ "dependencies": {
1948
+ "delayed-stream": "~1.0.0"
1949
+ },
1950
+ "engines": {
1951
+ "node": ">= 0.8"
1952
+ }
1953
+ },
1954
  "node_modules/comma-separated-tokens": {
1955
  "version": "2.0.3",
1956
  "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
 
1969
  "node": ">= 6"
1970
  }
1971
  },
1972
+ "node_modules/common-tags": {
1973
+ "version": "1.8.2",
1974
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
1975
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
1976
+ "dev": true,
1977
+ "engines": {
1978
+ "node": ">=4.0.0"
1979
+ }
1980
+ },
1981
  "node_modules/concurrently": {
1982
  "version": "8.2.2",
1983
  "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz",
 
2043
  "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
2044
  "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
2045
  },
2046
+ "node_modules/core-util-is": {
2047
+ "version": "1.0.2",
2048
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
2049
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
2050
+ "dev": true
2051
+ },
2052
  "node_modules/cors": {
2053
  "version": "2.8.5",
2054
  "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
 
2061
  "node": ">= 0.10"
2062
  }
2063
  },
2064
+ "node_modules/corser": {
2065
+ "version": "2.0.1",
2066
+ "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz",
2067
+ "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==",
2068
+ "dev": true,
2069
+ "engines": {
2070
+ "node": ">= 0.4.0"
2071
+ }
2072
+ },
2073
  "node_modules/cross-spawn": {
2074
  "version": "7.0.6",
2075
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
 
2101
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
2102
  "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
2103
  },
2104
+ "node_modules/cypress": {
2105
+ "version": "14.2.1",
2106
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-14.2.1.tgz",
2107
+ "integrity": "sha512-5xd0E7fUp0pjjib1D7ljkmCwFDgMkWuW06jWiz8dKrI7MNRrDo0C65i4Sh+oZ9YHjMHZRJBR0XZk1DfekOhOUw==",
2108
+ "dev": true,
2109
+ "hasInstallScript": true,
2110
+ "dependencies": {
2111
+ "@cypress/request": "^3.0.8",
2112
+ "@cypress/xvfb": "^1.2.4",
2113
+ "@types/sinonjs__fake-timers": "8.1.1",
2114
+ "@types/sizzle": "^2.3.2",
2115
+ "arch": "^2.2.0",
2116
+ "blob-util": "^2.0.2",
2117
+ "bluebird": "^3.7.2",
2118
+ "buffer": "^5.7.1",
2119
+ "cachedir": "^2.3.0",
2120
+ "chalk": "^4.1.0",
2121
+ "check-more-types": "^2.24.0",
2122
+ "ci-info": "^4.1.0",
2123
+ "cli-cursor": "^3.1.0",
2124
+ "cli-table3": "~0.6.5",
2125
+ "commander": "^6.2.1",
2126
+ "common-tags": "^1.8.0",
2127
+ "dayjs": "^1.10.4",
2128
+ "debug": "^4.3.4",
2129
+ "enquirer": "^2.3.6",
2130
+ "eventemitter2": "6.4.7",
2131
+ "execa": "4.1.0",
2132
+ "executable": "^4.1.1",
2133
+ "extract-zip": "2.0.1",
2134
+ "figures": "^3.2.0",
2135
+ "fs-extra": "^9.1.0",
2136
+ "getos": "^3.2.1",
2137
+ "is-installed-globally": "~0.4.0",
2138
+ "lazy-ass": "^1.6.0",
2139
+ "listr2": "^3.8.3",
2140
+ "lodash": "^4.17.21",
2141
+ "log-symbols": "^4.0.0",
2142
+ "minimist": "^1.2.8",
2143
+ "ospath": "^1.2.2",
2144
+ "pretty-bytes": "^5.6.0",
2145
+ "process": "^0.11.10",
2146
+ "proxy-from-env": "1.0.0",
2147
+ "request-progress": "^3.0.0",
2148
+ "semver": "^7.7.1",
2149
+ "supports-color": "^8.1.1",
2150
+ "tmp": "~0.2.3",
2151
+ "tree-kill": "1.2.2",
2152
+ "untildify": "^4.0.0",
2153
+ "yauzl": "^2.10.0"
2154
+ },
2155
+ "bin": {
2156
+ "cypress": "bin/cypress"
2157
+ },
2158
+ "engines": {
2159
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
2160
+ }
2161
+ },
2162
+ "node_modules/cypress/node_modules/commander": {
2163
+ "version": "6.2.1",
2164
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
2165
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
2166
+ "dev": true,
2167
+ "engines": {
2168
+ "node": ">= 6"
2169
+ }
2170
+ },
2171
+ "node_modules/cypress/node_modules/semver": {
2172
+ "version": "7.7.1",
2173
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
2174
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
2175
+ "dev": true,
2176
+ "bin": {
2177
+ "semver": "bin/semver.js"
2178
+ },
2179
+ "engines": {
2180
+ "node": ">=10"
2181
+ }
2182
+ },
2183
+ "node_modules/dashdash": {
2184
+ "version": "1.14.1",
2185
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
2186
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
2187
+ "dev": true,
2188
+ "dependencies": {
2189
+ "assert-plus": "^1.0.0"
2190
+ },
2191
+ "engines": {
2192
+ "node": ">=0.10"
2193
+ }
2194
+ },
2195
  "node_modules/data-uri-to-buffer": {
2196
  "version": "4.0.1",
2197
  "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
 
2216
  "url": "https://opencollective.com/date-fns"
2217
  }
2218
  },
2219
+ "node_modules/dayjs": {
2220
+ "version": "1.11.13",
2221
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
2222
+ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
2223
+ "dev": true
2224
+ },
2225
  "node_modules/debug": {
2226
  "version": "4.4.0",
2227
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
 
2250
  "url": "https://github.com/sponsors/wooorm"
2251
  }
2252
  },
2253
+ "node_modules/delayed-stream": {
2254
+ "version": "1.0.0",
2255
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
2256
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
2257
+ "dev": true,
2258
+ "engines": {
2259
+ "node": ">=0.4.0"
2260
+ }
2261
+ },
2262
  "node_modules/depd": {
2263
  "version": "2.0.0",
2264
  "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
 
2319
  "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
2320
  "dev": true
2321
  },
2322
+ "node_modules/dom-accessibility-api": {
2323
+ "version": "0.5.16",
2324
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
2325
+ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
2326
+ "dev": true
2327
+ },
2328
  "node_modules/dunder-proto": {
2329
  "version": "1.0.1",
2330
  "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
 
2338
  "node": ">= 0.4"
2339
  }
2340
  },
2341
+ "node_modules/duplexer": {
2342
+ "version": "0.1.2",
2343
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
2344
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
2345
+ "dev": true
2346
+ },
2347
  "node_modules/eastasianwidth": {
2348
  "version": "0.2.0",
2349
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
2350
  "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
2351
  "dev": true
2352
  },
2353
+ "node_modules/ecc-jsbn": {
2354
+ "version": "0.1.2",
2355
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
2356
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
2357
+ "dev": true,
2358
+ "dependencies": {
2359
+ "jsbn": "~0.1.0",
2360
+ "safer-buffer": "^2.1.0"
2361
+ }
2362
+ },
2363
  "node_modules/ee-first": {
2364
  "version": "1.1.1",
2365
  "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
 
2385
  "node": ">= 0.8"
2386
  }
2387
  },
2388
+ "node_modules/end-of-stream": {
2389
+ "version": "1.4.4",
2390
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
2391
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
2392
+ "dev": true,
2393
+ "dependencies": {
2394
+ "once": "^1.4.0"
2395
+ }
2396
+ },
2397
+ "node_modules/enquirer": {
2398
+ "version": "2.4.1",
2399
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
2400
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
2401
+ "dev": true,
2402
+ "dependencies": {
2403
+ "ansi-colors": "^4.1.1",
2404
+ "strip-ansi": "^6.0.1"
2405
+ },
2406
+ "engines": {
2407
+ "node": ">=8.6"
2408
+ }
2409
+ },
2410
  "node_modules/es-define-property": {
2411
  "version": "1.0.1",
2412
  "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
 
2434
  "node": ">= 0.4"
2435
  }
2436
  },
2437
+ "node_modules/es-set-tostringtag": {
2438
+ "version": "2.1.0",
2439
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
2440
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
2441
+ "dev": true,
2442
+ "dependencies": {
2443
+ "es-errors": "^1.3.0",
2444
+ "get-intrinsic": "^1.2.6",
2445
+ "has-tostringtag": "^1.0.2",
2446
+ "hasown": "^2.0.2"
2447
+ },
2448
+ "engines": {
2449
+ "node": ">= 0.4"
2450
+ }
2451
+ },
2452
  "node_modules/esbuild": {
2453
  "version": "0.18.20",
2454
  "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
 
2500
  "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
2501
  "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
2502
  },
2503
+ "node_modules/escape-string-regexp": {
2504
+ "version": "1.0.5",
2505
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
2506
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
2507
+ "dev": true,
2508
+ "engines": {
2509
+ "node": ">=0.8.0"
2510
+ }
2511
+ },
2512
  "node_modules/estree-util-is-identifier-name": {
2513
  "version": "3.0.0",
2514
  "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
 
2526
  "node": ">= 0.6"
2527
  }
2528
  },
2529
+ "node_modules/event-stream": {
2530
+ "version": "3.3.4",
2531
+ "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
2532
+ "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==",
2533
+ "dev": true,
2534
+ "dependencies": {
2535
+ "duplexer": "~0.1.1",
2536
+ "from": "~0",
2537
+ "map-stream": "~0.1.0",
2538
+ "pause-stream": "0.0.11",
2539
+ "split": "0.3",
2540
+ "stream-combiner": "~0.0.4",
2541
+ "through": "~2.3.1"
2542
+ }
2543
+ },
2544
+ "node_modules/eventemitter2": {
2545
+ "version": "6.4.7",
2546
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
2547
+ "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
2548
+ "dev": true
2549
+ },
2550
+ "node_modules/eventemitter3": {
2551
+ "version": "4.0.7",
2552
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
2553
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
2554
+ "dev": true
2555
+ },
2556
+ "node_modules/execa": {
2557
+ "version": "4.1.0",
2558
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
2559
+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
2560
+ "dev": true,
2561
+ "dependencies": {
2562
+ "cross-spawn": "^7.0.0",
2563
+ "get-stream": "^5.0.0",
2564
+ "human-signals": "^1.1.1",
2565
+ "is-stream": "^2.0.0",
2566
+ "merge-stream": "^2.0.0",
2567
+ "npm-run-path": "^4.0.0",
2568
+ "onetime": "^5.1.0",
2569
+ "signal-exit": "^3.0.2",
2570
+ "strip-final-newline": "^2.0.0"
2571
+ },
2572
+ "engines": {
2573
+ "node": ">=10"
2574
+ },
2575
+ "funding": {
2576
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
2577
+ }
2578
+ },
2579
+ "node_modules/execa/node_modules/signal-exit": {
2580
+ "version": "3.0.7",
2581
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
2582
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
2583
+ "dev": true
2584
+ },
2585
+ "node_modules/executable": {
2586
+ "version": "4.1.1",
2587
+ "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
2588
+ "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
2589
+ "dev": true,
2590
+ "dependencies": {
2591
+ "pify": "^2.2.0"
2592
+ },
2593
+ "engines": {
2594
+ "node": ">=4"
2595
+ }
2596
+ },
2597
  "node_modules/express": {
2598
  "version": "4.21.2",
2599
  "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
 
2657
  "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
2658
  "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
2659
  },
2660
+ "node_modules/extract-zip": {
2661
+ "version": "2.0.1",
2662
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
2663
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
2664
+ "dev": true,
2665
+ "dependencies": {
2666
+ "debug": "^4.1.1",
2667
+ "get-stream": "^5.1.0",
2668
+ "yauzl": "^2.10.0"
2669
+ },
2670
+ "bin": {
2671
+ "extract-zip": "cli.js"
2672
+ },
2673
+ "engines": {
2674
+ "node": ">= 10.17.0"
2675
+ },
2676
+ "optionalDependencies": {
2677
+ "@types/yauzl": "^2.9.1"
2678
+ }
2679
+ },
2680
+ "node_modules/extsprintf": {
2681
+ "version": "1.3.0",
2682
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
2683
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
2684
+ "dev": true,
2685
+ "engines": [
2686
+ "node >=0.6.0"
2687
+ ]
2688
+ },
2689
  "node_modules/fast-glob": {
2690
  "version": "3.3.3",
2691
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
 
2723
  "reusify": "^1.0.4"
2724
  }
2725
  },
2726
+ "node_modules/fd-slicer": {
2727
+ "version": "1.1.0",
2728
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
2729
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
2730
+ "dev": true,
2731
+ "dependencies": {
2732
+ "pend": "~1.2.0"
2733
+ }
2734
+ },
2735
  "node_modules/fetch-blob": {
2736
  "version": "3.2.0",
2737
  "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
 
2754
  "node": "^12.20 || >= 14.13"
2755
  }
2756
  },
2757
+ "node_modules/figures": {
2758
+ "version": "3.2.0",
2759
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
2760
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
2761
+ "dev": true,
2762
+ "dependencies": {
2763
+ "escape-string-regexp": "^1.0.5"
2764
+ },
2765
+ "engines": {
2766
+ "node": ">=8"
2767
+ },
2768
+ "funding": {
2769
+ "url": "https://github.com/sponsors/sindresorhus"
2770
+ }
2771
+ },
2772
  "node_modules/fill-range": {
2773
  "version": "7.1.1",
2774
  "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
 
2811
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
2812
  "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
2813
  },
2814
+ "node_modules/follow-redirects": {
2815
+ "version": "1.15.9",
2816
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
2817
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
2818
+ "dev": true,
2819
+ "funding": [
2820
+ {
2821
+ "type": "individual",
2822
+ "url": "https://github.com/sponsors/RubenVerborgh"
2823
+ }
2824
+ ],
2825
+ "engines": {
2826
+ "node": ">=4.0"
2827
+ },
2828
+ "peerDependenciesMeta": {
2829
+ "debug": {
2830
+ "optional": true
2831
+ }
2832
+ }
2833
+ },
2834
  "node_modules/foreground-child": {
2835
  "version": "3.3.1",
2836
  "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
 
2847
  "url": "https://github.com/sponsors/isaacs"
2848
  }
2849
  },
2850
+ "node_modules/forever-agent": {
2851
+ "version": "0.6.1",
2852
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
2853
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
2854
+ "dev": true,
2855
+ "engines": {
2856
+ "node": "*"
2857
+ }
2858
+ },
2859
+ "node_modules/form-data": {
2860
+ "version": "4.0.2",
2861
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
2862
+ "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
2863
+ "dev": true,
2864
+ "dependencies": {
2865
+ "asynckit": "^0.4.0",
2866
+ "combined-stream": "^1.0.8",
2867
+ "es-set-tostringtag": "^2.1.0",
2868
+ "mime-types": "^2.1.12"
2869
+ },
2870
+ "engines": {
2871
+ "node": ">= 6"
2872
+ }
2873
+ },
2874
  "node_modules/formdata-polyfill": {
2875
  "version": "4.0.10",
2876
  "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
 
2911
  "node": ">= 0.6"
2912
  }
2913
  },
2914
+ "node_modules/from": {
2915
+ "version": "0.1.7",
2916
+ "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
2917
+ "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==",
2918
+ "dev": true
2919
+ },
2920
+ "node_modules/fs-extra": {
2921
+ "version": "9.1.0",
2922
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
2923
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
2924
+ "dev": true,
2925
+ "dependencies": {
2926
+ "at-least-node": "^1.0.0",
2927
+ "graceful-fs": "^4.2.0",
2928
+ "jsonfile": "^6.0.1",
2929
+ "universalify": "^2.0.0"
2930
+ },
2931
+ "engines": {
2932
+ "node": ">=10"
2933
+ }
2934
+ },
2935
  "node_modules/fsevents": {
2936
  "version": "2.3.3",
2937
  "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
 
3007
  "node": ">= 0.4"
3008
  }
3009
  },
3010
+ "node_modules/get-stream": {
3011
+ "version": "5.2.0",
3012
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
3013
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
3014
+ "dev": true,
3015
+ "dependencies": {
3016
+ "pump": "^3.0.0"
3017
+ },
3018
+ "engines": {
3019
+ "node": ">=8"
3020
+ },
3021
+ "funding": {
3022
+ "url": "https://github.com/sponsors/sindresorhus"
3023
+ }
3024
+ },
3025
+ "node_modules/getos": {
3026
+ "version": "3.2.1",
3027
+ "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
3028
+ "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
3029
+ "dev": true,
3030
+ "dependencies": {
3031
+ "async": "^3.2.0"
3032
+ }
3033
+ },
3034
+ "node_modules/getpass": {
3035
+ "version": "0.1.7",
3036
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
3037
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
3038
+ "dev": true,
3039
+ "dependencies": {
3040
+ "assert-plus": "^1.0.0"
3041
+ }
3042
+ },
3043
  "node_modules/glob": {
3044
  "version": "10.4.5",
3045
  "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
 
3072
  "node": ">=10.13.0"
3073
  }
3074
  },
3075
+ "node_modules/global-dirs": {
3076
+ "version": "3.0.1",
3077
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
3078
+ "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
3079
+ "dev": true,
3080
+ "dependencies": {
3081
+ "ini": "2.0.0"
3082
+ },
3083
+ "engines": {
3084
+ "node": ">=10"
3085
+ },
3086
+ "funding": {
3087
+ "url": "https://github.com/sponsors/sindresorhus"
3088
+ }
3089
+ },
3090
  "node_modules/globals": {
3091
  "version": "11.12.0",
3092
  "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
 
3107
  "url": "https://github.com/sponsors/ljharb"
3108
  }
3109
  },
3110
+ "node_modules/graceful-fs": {
3111
+ "version": "4.2.11",
3112
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
3113
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
3114
+ "dev": true
3115
+ },
3116
  "node_modules/has-flag": {
3117
  "version": "4.0.0",
3118
  "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
 
3133
  "url": "https://github.com/sponsors/ljharb"
3134
  }
3135
  },
3136
+ "node_modules/has-tostringtag": {
3137
+ "version": "1.0.2",
3138
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
3139
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
3140
+ "dev": true,
3141
+ "dependencies": {
3142
+ "has-symbols": "^1.0.3"
3143
+ },
3144
+ "engines": {
3145
+ "node": ">= 0.4"
3146
+ },
3147
+ "funding": {
3148
+ "url": "https://github.com/sponsors/ljharb"
3149
+ }
3150
+ },
3151
  "node_modules/hasown": {
3152
  "version": "2.0.2",
3153
  "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
 
3197
  "url": "https://opencollective.com/unified"
3198
  }
3199
  },
3200
+ "node_modules/he": {
3201
+ "version": "1.2.0",
3202
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
3203
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
3204
+ "dev": true,
3205
+ "bin": {
3206
+ "he": "bin/he"
3207
+ }
3208
+ },
3209
+ "node_modules/html-encoding-sniffer": {
3210
+ "version": "3.0.0",
3211
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
3212
+ "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
3213
+ "dev": true,
3214
+ "dependencies": {
3215
+ "whatwg-encoding": "^2.0.0"
3216
+ },
3217
+ "engines": {
3218
+ "node": ">=12"
3219
+ }
3220
+ },
3221
  "node_modules/html-url-attributes": {
3222
  "version": "3.0.1",
3223
  "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
 
3227
  "url": "https://opencollective.com/unified"
3228
  }
3229
  },
3230
+ "node_modules/http-errors": {
3231
+ "version": "2.0.0",
3232
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
3233
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
3234
+ "dependencies": {
3235
+ "depd": "2.0.0",
3236
+ "inherits": "2.0.4",
3237
+ "setprototypeof": "1.2.0",
3238
+ "statuses": "2.0.1",
3239
+ "toidentifier": "1.0.1"
3240
+ },
3241
+ "engines": {
3242
+ "node": ">= 0.8"
3243
+ }
3244
+ },
3245
+ "node_modules/http-proxy": {
3246
+ "version": "1.18.1",
3247
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
3248
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
3249
+ "dev": true,
3250
+ "dependencies": {
3251
+ "eventemitter3": "^4.0.0",
3252
+ "follow-redirects": "^1.0.0",
3253
+ "requires-port": "^1.0.0"
3254
+ },
3255
+ "engines": {
3256
+ "node": ">=8.0.0"
3257
+ }
3258
+ },
3259
+ "node_modules/http-server": {
3260
+ "version": "14.1.1",
3261
+ "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz",
3262
+ "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==",
3263
+ "dev": true,
3264
+ "dependencies": {
3265
+ "basic-auth": "^2.0.1",
3266
+ "chalk": "^4.1.2",
3267
+ "corser": "^2.0.1",
3268
+ "he": "^1.2.0",
3269
+ "html-encoding-sniffer": "^3.0.0",
3270
+ "http-proxy": "^1.18.1",
3271
+ "mime": "^1.6.0",
3272
+ "minimist": "^1.2.6",
3273
+ "opener": "^1.5.1",
3274
+ "portfinder": "^1.0.28",
3275
+ "secure-compare": "3.0.1",
3276
+ "union": "~0.5.0",
3277
+ "url-join": "^4.0.1"
3278
+ },
3279
+ "bin": {
3280
+ "http-server": "bin/http-server"
3281
+ },
3282
+ "engines": {
3283
+ "node": ">=12"
3284
+ }
3285
+ },
3286
+ "node_modules/http-signature": {
3287
+ "version": "1.4.0",
3288
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz",
3289
+ "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==",
3290
+ "dev": true,
3291
  "dependencies": {
3292
+ "assert-plus": "^1.0.0",
3293
+ "jsprim": "^2.0.2",
3294
+ "sshpk": "^1.18.0"
 
 
3295
  },
3296
  "engines": {
3297
+ "node": ">=0.10"
3298
+ }
3299
+ },
3300
+ "node_modules/human-signals": {
3301
+ "version": "1.1.1",
3302
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
3303
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
3304
+ "dev": true,
3305
+ "engines": {
3306
+ "node": ">=8.12.0"
3307
  }
3308
  },
3309
  "node_modules/iconv-lite": {
 
3317
  "node": ">=0.10.0"
3318
  }
3319
  },
3320
+ "node_modules/ieee754": {
3321
+ "version": "1.2.1",
3322
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
3323
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
3324
+ "dev": true,
3325
+ "funding": [
3326
+ {
3327
+ "type": "github",
3328
+ "url": "https://github.com/sponsors/feross"
3329
+ },
3330
+ {
3331
+ "type": "patreon",
3332
+ "url": "https://www.patreon.com/feross"
3333
+ },
3334
+ {
3335
+ "type": "consulting",
3336
+ "url": "https://feross.org/support"
3337
+ }
3338
+ ]
3339
+ },
3340
+ "node_modules/indent-string": {
3341
+ "version": "4.0.0",
3342
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
3343
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
3344
+ "dev": true,
3345
+ "engines": {
3346
+ "node": ">=8"
3347
+ }
3348
+ },
3349
  "node_modules/inherits": {
3350
  "version": "2.0.4",
3351
  "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
3352
  "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
3353
  },
3354
+ "node_modules/ini": {
3355
+ "version": "2.0.0",
3356
+ "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
3357
+ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
3358
+ "dev": true,
3359
+ "engines": {
3360
+ "node": ">=10"
3361
+ }
3362
+ },
3363
  "node_modules/inline-style-parser": {
3364
  "version": "0.2.4",
3365
  "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz",
 
3470
  "url": "https://github.com/sponsors/wooorm"
3471
  }
3472
  },
3473
+ "node_modules/is-installed-globally": {
3474
+ "version": "0.4.0",
3475
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
3476
+ "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
3477
+ "dev": true,
3478
+ "dependencies": {
3479
+ "global-dirs": "^3.0.0",
3480
+ "is-path-inside": "^3.0.2"
3481
+ },
3482
+ "engines": {
3483
+ "node": ">=10"
3484
+ },
3485
+ "funding": {
3486
+ "url": "https://github.com/sponsors/sindresorhus"
3487
+ }
3488
+ },
3489
  "node_modules/is-number": {
3490
  "version": "7.0.0",
3491
  "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
 
3495
  "node": ">=0.12.0"
3496
  }
3497
  },
3498
+ "node_modules/is-path-inside": {
3499
+ "version": "3.0.3",
3500
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
3501
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
3502
+ "dev": true,
3503
+ "engines": {
3504
+ "node": ">=8"
3505
+ }
3506
+ },
3507
  "node_modules/is-plain-obj": {
3508
  "version": "4.1.0",
3509
  "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
 
3515
  "url": "https://github.com/sponsors/sindresorhus"
3516
  }
3517
  },
3518
+ "node_modules/is-stream": {
3519
+ "version": "2.0.1",
3520
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
3521
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
3522
+ "dev": true,
3523
+ "engines": {
3524
+ "node": ">=8"
3525
+ },
3526
+ "funding": {
3527
+ "url": "https://github.com/sponsors/sindresorhus"
3528
+ }
3529
+ },
3530
+ "node_modules/is-typedarray": {
3531
+ "version": "1.0.0",
3532
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
3533
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
3534
+ "dev": true
3535
+ },
3536
+ "node_modules/is-unicode-supported": {
3537
+ "version": "0.1.0",
3538
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
3539
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
3540
+ "dev": true,
3541
+ "engines": {
3542
+ "node": ">=10"
3543
+ },
3544
+ "funding": {
3545
+ "url": "https://github.com/sponsors/sindresorhus"
3546
+ }
3547
+ },
3548
  "node_modules/isexe": {
3549
  "version": "2.0.0",
3550
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
3551
  "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
3552
  "dev": true
3553
  },
3554
+ "node_modules/isstream": {
3555
+ "version": "0.1.2",
3556
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
3557
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
3558
+ "dev": true
3559
+ },
3560
  "node_modules/jackspeak": {
3561
  "version": "3.4.3",
3562
  "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
 
3581
  "jiti": "bin/jiti.js"
3582
  }
3583
  },
3584
+ "node_modules/joi": {
3585
+ "version": "17.13.3",
3586
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
3587
+ "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
3588
+ "dev": true,
3589
+ "dependencies": {
3590
+ "@hapi/hoek": "^9.3.0",
3591
+ "@hapi/topo": "^5.1.0",
3592
+ "@sideway/address": "^4.1.5",
3593
+ "@sideway/formula": "^3.0.1",
3594
+ "@sideway/pinpoint": "^2.0.0"
3595
+ }
3596
+ },
3597
  "node_modules/js-tokens": {
3598
  "version": "4.0.0",
3599
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
3600
  "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
3601
  },
3602
+ "node_modules/jsbn": {
3603
+ "version": "0.1.1",
3604
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
3605
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
3606
+ "dev": true
3607
+ },
3608
  "node_modules/jsesc": {
3609
  "version": "3.1.0",
3610
  "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
 
3617
  "node": ">=6"
3618
  }
3619
  },
3620
+ "node_modules/json-schema": {
3621
+ "version": "0.4.0",
3622
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
3623
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
3624
+ "dev": true
3625
+ },
3626
+ "node_modules/json-stringify-safe": {
3627
+ "version": "5.0.1",
3628
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
3629
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
3630
+ "dev": true
3631
+ },
3632
  "node_modules/json5": {
3633
  "version": "2.2.3",
3634
  "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
 
3641
  "node": ">=6"
3642
  }
3643
  },
3644
+ "node_modules/jsonfile": {
3645
+ "version": "6.1.0",
3646
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
3647
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
3648
+ "dev": true,
3649
+ "dependencies": {
3650
+ "universalify": "^2.0.0"
3651
+ },
3652
+ "optionalDependencies": {
3653
+ "graceful-fs": "^4.1.6"
3654
+ }
3655
+ },
3656
+ "node_modules/jsprim": {
3657
+ "version": "2.0.2",
3658
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
3659
+ "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
3660
+ "dev": true,
3661
+ "engines": [
3662
+ "node >=0.6.0"
3663
+ ],
3664
+ "dependencies": {
3665
+ "assert-plus": "1.0.0",
3666
+ "extsprintf": "1.3.0",
3667
+ "json-schema": "0.4.0",
3668
+ "verror": "1.10.0"
3669
+ }
3670
+ },
3671
+ "node_modules/lazy-ass": {
3672
+ "version": "1.6.0",
3673
+ "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
3674
+ "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
3675
+ "dev": true,
3676
+ "engines": {
3677
+ "node": "> 0.8"
3678
+ }
3679
+ },
3680
  "node_modules/lightningcss": {
3681
  "version": "1.29.2",
3682
  "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz",
 
3932
  "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
3933
  "dev": true
3934
  },
3935
+ "node_modules/listr2": {
3936
+ "version": "3.14.0",
3937
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
3938
+ "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
3939
+ "dev": true,
3940
+ "dependencies": {
3941
+ "cli-truncate": "^2.1.0",
3942
+ "colorette": "^2.0.16",
3943
+ "log-update": "^4.0.0",
3944
+ "p-map": "^4.0.0",
3945
+ "rfdc": "^1.3.0",
3946
+ "rxjs": "^7.5.1",
3947
+ "through": "^2.3.8",
3948
+ "wrap-ansi": "^7.0.0"
3949
+ },
3950
+ "engines": {
3951
+ "node": ">=10.0.0"
3952
+ },
3953
+ "peerDependencies": {
3954
+ "enquirer": ">= 2.3.0 < 3"
3955
+ },
3956
+ "peerDependenciesMeta": {
3957
+ "enquirer": {
3958
+ "optional": true
3959
+ }
3960
+ }
3961
+ },
3962
  "node_modules/lodash": {
3963
  "version": "4.17.21",
3964
  "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
3965
  "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
3966
  "dev": true
3967
  },
3968
+ "node_modules/lodash.once": {
3969
+ "version": "4.1.1",
3970
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
3971
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
3972
+ "dev": true
3973
+ },
3974
+ "node_modules/log-symbols": {
3975
+ "version": "4.1.0",
3976
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
3977
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
3978
+ "dev": true,
3979
+ "dependencies": {
3980
+ "chalk": "^4.1.0",
3981
+ "is-unicode-supported": "^0.1.0"
3982
+ },
3983
+ "engines": {
3984
+ "node": ">=10"
3985
+ },
3986
+ "funding": {
3987
+ "url": "https://github.com/sponsors/sindresorhus"
3988
+ }
3989
+ },
3990
+ "node_modules/log-update": {
3991
+ "version": "4.0.0",
3992
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
3993
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
3994
+ "dev": true,
3995
+ "dependencies": {
3996
+ "ansi-escapes": "^4.3.0",
3997
+ "cli-cursor": "^3.1.0",
3998
+ "slice-ansi": "^4.0.0",
3999
+ "wrap-ansi": "^6.2.0"
4000
+ },
4001
+ "engines": {
4002
+ "node": ">=10"
4003
+ },
4004
+ "funding": {
4005
+ "url": "https://github.com/sponsors/sindresorhus"
4006
+ }
4007
+ },
4008
+ "node_modules/log-update/node_modules/slice-ansi": {
4009
+ "version": "4.0.0",
4010
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
4011
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
4012
+ "dev": true,
4013
+ "dependencies": {
4014
+ "ansi-styles": "^4.0.0",
4015
+ "astral-regex": "^2.0.0",
4016
+ "is-fullwidth-code-point": "^3.0.0"
4017
+ },
4018
+ "engines": {
4019
+ "node": ">=10"
4020
+ },
4021
+ "funding": {
4022
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
4023
+ }
4024
+ },
4025
+ "node_modules/log-update/node_modules/wrap-ansi": {
4026
+ "version": "6.2.0",
4027
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
4028
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
4029
+ "dev": true,
4030
+ "dependencies": {
4031
+ "ansi-styles": "^4.0.0",
4032
+ "string-width": "^4.1.0",
4033
+ "strip-ansi": "^6.0.0"
4034
+ },
4035
+ "engines": {
4036
+ "node": ">=8"
4037
+ }
4038
+ },
4039
  "node_modules/longest-streak": {
4040
  "version": "3.1.0",
4041
  "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
 
4065
  "yallist": "^3.0.2"
4066
  }
4067
  },
4068
+ "node_modules/lz-string": {
4069
+ "version": "1.5.0",
4070
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
4071
+ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
4072
+ "dev": true,
4073
+ "bin": {
4074
+ "lz-string": "bin/bin.js"
4075
+ }
4076
+ },
4077
+ "node_modules/map-stream": {
4078
+ "version": "0.1.0",
4079
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
4080
+ "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==",
4081
+ "dev": true
4082
+ },
4083
  "node_modules/math-intrinsics": {
4084
  "version": "1.1.0",
4085
  "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
 
4249
  "url": "https://github.com/sponsors/sindresorhus"
4250
  }
4251
  },
4252
+ "node_modules/merge-stream": {
4253
+ "version": "2.0.0",
4254
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
4255
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
4256
+ "dev": true
4257
+ },
4258
  "node_modules/merge2": {
4259
  "version": "1.4.1",
4260
  "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
 
4736
  "node": ">= 0.6"
4737
  }
4738
  },
4739
+ "node_modules/mimic-fn": {
4740
+ "version": "2.1.0",
4741
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
4742
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
4743
+ "dev": true,
4744
+ "engines": {
4745
+ "node": ">=6"
4746
+ }
4747
+ },
4748
  "node_modules/minimatch": {
4749
  "version": "9.0.5",
4750
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
 
4760
  "url": "https://github.com/sponsors/isaacs"
4761
  }
4762
  },
4763
+ "node_modules/minimist": {
4764
+ "version": "1.2.8",
4765
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
4766
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
4767
+ "dev": true,
4768
+ "funding": {
4769
+ "url": "https://github.com/sponsors/ljharb"
4770
+ }
4771
+ },
4772
  "node_modules/minipass": {
4773
  "version": "7.1.2",
4774
  "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
 
4879
  "node": ">=0.10.0"
4880
  }
4881
  },
4882
+ "node_modules/npm-run-path": {
4883
+ "version": "4.0.1",
4884
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
4885
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
4886
+ "dev": true,
4887
+ "dependencies": {
4888
+ "path-key": "^3.0.0"
4889
+ },
4890
+ "engines": {
4891
+ "node": ">=8"
4892
+ }
4893
+ },
4894
  "node_modules/object-assign": {
4895
  "version": "4.1.1",
4896
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
 
4930
  "node": ">= 0.8"
4931
  }
4932
  },
4933
+ "node_modules/once": {
4934
+ "version": "1.4.0",
4935
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
4936
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
4937
+ "dev": true,
4938
+ "dependencies": {
4939
+ "wrappy": "1"
4940
+ }
4941
+ },
4942
+ "node_modules/onetime": {
4943
+ "version": "5.1.2",
4944
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
4945
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
4946
+ "dev": true,
4947
+ "dependencies": {
4948
+ "mimic-fn": "^2.1.0"
4949
+ },
4950
+ "engines": {
4951
+ "node": ">=6"
4952
+ },
4953
+ "funding": {
4954
+ "url": "https://github.com/sponsors/sindresorhus"
4955
+ }
4956
+ },
4957
+ "node_modules/opener": {
4958
+ "version": "1.5.2",
4959
+ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
4960
+ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
4961
+ "dev": true,
4962
+ "bin": {
4963
+ "opener": "bin/opener-bin.js"
4964
+ }
4965
+ },
4966
+ "node_modules/ospath": {
4967
+ "version": "1.2.2",
4968
+ "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
4969
+ "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
4970
+ "dev": true
4971
+ },
4972
+ "node_modules/p-map": {
4973
+ "version": "4.0.0",
4974
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
4975
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
4976
+ "dev": true,
4977
+ "dependencies": {
4978
+ "aggregate-error": "^3.0.0"
4979
+ },
4980
+ "engines": {
4981
+ "node": ">=10"
4982
+ },
4983
+ "funding": {
4984
+ "url": "https://github.com/sponsors/sindresorhus"
4985
+ }
4986
+ },
4987
  "node_modules/package-json-from-dist": {
4988
  "version": "1.0.1",
4989
  "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
 
5063
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
5064
  "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="
5065
  },
5066
+ "node_modules/pause-stream": {
5067
+ "version": "0.0.11",
5068
+ "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
5069
+ "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==",
5070
+ "dev": true,
5071
+ "dependencies": {
5072
+ "through": "~2.3"
5073
+ }
5074
+ },
5075
+ "node_modules/pend": {
5076
+ "version": "1.2.0",
5077
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
5078
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
5079
+ "dev": true
5080
+ },
5081
+ "node_modules/performance-now": {
5082
+ "version": "2.1.0",
5083
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
5084
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
5085
+ "dev": true
5086
+ },
5087
  "node_modules/picocolors": {
5088
  "version": "1.1.1",
5089
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
 
5120
  "node": ">= 6"
5121
  }
5122
  },
5123
+ "node_modules/portfinder": {
5124
+ "version": "1.0.35",
5125
+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.35.tgz",
5126
+ "integrity": "sha512-73JaFg4NwYNAufDtS5FsFu/PdM49ahJrO1i44aCRsDWju1z5wuGDaqyFUQWR6aJoK2JPDWlaYYAGFNIGTSUHSw==",
5127
+ "dev": true,
5128
+ "dependencies": {
5129
+ "async": "^3.2.6",
5130
+ "debug": "^4.3.6"
5131
+ },
5132
+ "engines": {
5133
+ "node": ">= 10.12"
5134
+ }
5135
+ },
5136
  "node_modules/postcss": {
5137
  "version": "8.5.3",
5138
  "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
 
5288
  "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
5289
  "dev": true
5290
  },
5291
+ "node_modules/pretty-bytes": {
5292
+ "version": "5.6.0",
5293
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
5294
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
5295
+ "dev": true,
5296
+ "engines": {
5297
+ "node": ">=6"
5298
+ },
5299
+ "funding": {
5300
+ "url": "https://github.com/sponsors/sindresorhus"
5301
+ }
5302
+ },
5303
+ "node_modules/pretty-format": {
5304
+ "version": "27.5.1",
5305
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
5306
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
5307
+ "dev": true,
5308
+ "dependencies": {
5309
+ "ansi-regex": "^5.0.1",
5310
+ "ansi-styles": "^5.0.0",
5311
+ "react-is": "^17.0.1"
5312
+ },
5313
+ "engines": {
5314
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
5315
+ }
5316
+ },
5317
+ "node_modules/pretty-format/node_modules/ansi-styles": {
5318
+ "version": "5.2.0",
5319
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
5320
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
5321
+ "dev": true,
5322
+ "engines": {
5323
+ "node": ">=10"
5324
+ },
5325
+ "funding": {
5326
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
5327
+ }
5328
+ },
5329
+ "node_modules/process": {
5330
+ "version": "0.11.10",
5331
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
5332
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
5333
+ "dev": true,
5334
+ "engines": {
5335
+ "node": ">= 0.6.0"
5336
+ }
5337
+ },
5338
  "node_modules/property-information": {
5339
  "version": "7.0.0",
5340
  "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz",
 
5356
  "node": ">= 0.10"
5357
  }
5358
  },
5359
+ "node_modules/proxy-from-env": {
5360
+ "version": "1.0.0",
5361
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
5362
+ "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
5363
+ "dev": true
5364
+ },
5365
+ "node_modules/ps-tree": {
5366
+ "version": "1.2.0",
5367
+ "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz",
5368
+ "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==",
5369
+ "dev": true,
5370
+ "dependencies": {
5371
+ "event-stream": "=3.3.4"
5372
+ },
5373
+ "bin": {
5374
+ "ps-tree": "bin/ps-tree.js"
5375
+ },
5376
+ "engines": {
5377
+ "node": ">= 0.10"
5378
+ }
5379
+ },
5380
+ "node_modules/pump": {
5381
+ "version": "3.0.2",
5382
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
5383
+ "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
5384
+ "dev": true,
5385
+ "dependencies": {
5386
+ "end-of-stream": "^1.1.0",
5387
+ "once": "^1.3.1"
5388
+ }
5389
+ },
5390
  "node_modules/qs": {
5391
  "version": "6.13.0",
5392
  "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
 
5466
  "react": "^18.3.1"
5467
  }
5468
  },
5469
+ "node_modules/react-is": {
5470
+ "version": "17.0.2",
5471
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
5472
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
5473
+ "dev": true
5474
+ },
5475
  "node_modules/react-markdown": {
5476
  "version": "10.0.0",
5477
  "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.0.0.tgz",
 
5565
  "url": "https://opencollective.com/unified"
5566
  }
5567
  },
5568
+ "node_modules/request-progress": {
5569
+ "version": "3.0.0",
5570
+ "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
5571
+ "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
5572
+ "dev": true,
5573
+ "dependencies": {
5574
+ "throttleit": "^1.0.0"
5575
+ }
5576
+ },
5577
  "node_modules/require-directory": {
5578
  "version": "2.1.1",
5579
  "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
 
5583
  "node": ">=0.10.0"
5584
  }
5585
  },
5586
+ "node_modules/requires-port": {
5587
+ "version": "1.0.0",
5588
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
5589
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
5590
+ "dev": true
5591
+ },
5592
  "node_modules/resolve": {
5593
  "version": "1.22.10",
5594
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
 
5609
  "url": "https://github.com/sponsors/ljharb"
5610
  }
5611
  },
5612
+ "node_modules/restore-cursor": {
5613
+ "version": "3.1.0",
5614
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
5615
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
5616
+ "dev": true,
5617
+ "dependencies": {
5618
+ "onetime": "^5.1.0",
5619
+ "signal-exit": "^3.0.2"
5620
+ },
5621
+ "engines": {
5622
+ "node": ">=8"
5623
+ }
5624
+ },
5625
+ "node_modules/restore-cursor/node_modules/signal-exit": {
5626
+ "version": "3.0.7",
5627
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
5628
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
5629
+ "dev": true
5630
+ },
5631
  "node_modules/reusify": {
5632
  "version": "1.1.0",
5633
  "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
 
5638
  "node": ">=0.10.0"
5639
  }
5640
  },
5641
+ "node_modules/rfdc": {
5642
+ "version": "1.4.1",
5643
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
5644
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
5645
+ "dev": true
5646
+ },
5647
  "node_modules/rollup": {
5648
  "version": "3.29.5",
5649
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz",
 
5684
  }
5685
  },
5686
  "node_modules/rxjs": {
5687
+ "version": "7.8.2",
5688
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
5689
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
5690
  "dev": true,
5691
  "dependencies": {
5692
  "tslib": "^2.1.0"
 
5724
  "loose-envify": "^1.1.0"
5725
  }
5726
  },
5727
+ "node_modules/secure-compare": {
5728
+ "version": "3.0.1",
5729
+ "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz",
5730
+ "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==",
5731
+ "dev": true
5732
+ },
5733
  "node_modules/semver": {
5734
  "version": "6.3.1",
5735
  "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
 
5915
  "url": "https://github.com/sponsors/isaacs"
5916
  }
5917
  },
5918
+ "node_modules/slice-ansi": {
5919
+ "version": "3.0.0",
5920
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
5921
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
5922
+ "dev": true,
5923
+ "dependencies": {
5924
+ "ansi-styles": "^4.0.0",
5925
+ "astral-regex": "^2.0.0",
5926
+ "is-fullwidth-code-point": "^3.0.0"
5927
+ },
5928
+ "engines": {
5929
+ "node": ">=8"
5930
+ }
5931
+ },
5932
  "node_modules/source-map-js": {
5933
  "version": "1.2.1",
5934
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
 
5953
  "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==",
5954
  "dev": true
5955
  },
5956
+ "node_modules/split": {
5957
+ "version": "0.3.3",
5958
+ "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
5959
+ "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==",
5960
+ "dev": true,
5961
+ "dependencies": {
5962
+ "through": "2"
5963
+ },
5964
+ "engines": {
5965
+ "node": "*"
5966
+ }
5967
+ },
5968
+ "node_modules/sshpk": {
5969
+ "version": "1.18.0",
5970
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
5971
+ "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
5972
+ "dev": true,
5973
+ "dependencies": {
5974
+ "asn1": "~0.2.3",
5975
+ "assert-plus": "^1.0.0",
5976
+ "bcrypt-pbkdf": "^1.0.0",
5977
+ "dashdash": "^1.12.0",
5978
+ "ecc-jsbn": "~0.1.1",
5979
+ "getpass": "^0.1.1",
5980
+ "jsbn": "~0.1.0",
5981
+ "safer-buffer": "^2.0.2",
5982
+ "tweetnacl": "~0.14.0"
5983
+ },
5984
+ "bin": {
5985
+ "sshpk-conv": "bin/sshpk-conv",
5986
+ "sshpk-sign": "bin/sshpk-sign",
5987
+ "sshpk-verify": "bin/sshpk-verify"
5988
+ },
5989
+ "engines": {
5990
+ "node": ">=0.10.0"
5991
+ }
5992
+ },
5993
+ "node_modules/start-server-and-test": {
5994
+ "version": "2.0.11",
5995
+ "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.0.11.tgz",
5996
+ "integrity": "sha512-TN39gLzPhHAflxyOkE/oMfQGj+pj3JgF6qVicFH/JrXt7xXktidKXwqfRga+ve7lVA8+RgPZVc25VrEPRScaDw==",
5997
+ "dev": true,
5998
+ "dependencies": {
5999
+ "arg": "^5.0.2",
6000
+ "bluebird": "3.7.2",
6001
+ "check-more-types": "2.24.0",
6002
+ "debug": "4.4.0",
6003
+ "execa": "5.1.1",
6004
+ "lazy-ass": "1.6.0",
6005
+ "ps-tree": "1.2.0",
6006
+ "wait-on": "8.0.3"
6007
+ },
6008
+ "bin": {
6009
+ "server-test": "src/bin/start.js",
6010
+ "start-server-and-test": "src/bin/start.js",
6011
+ "start-test": "src/bin/start.js"
6012
+ },
6013
+ "engines": {
6014
+ "node": ">=16"
6015
+ }
6016
+ },
6017
+ "node_modules/start-server-and-test/node_modules/execa": {
6018
+ "version": "5.1.1",
6019
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
6020
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
6021
+ "dev": true,
6022
+ "dependencies": {
6023
+ "cross-spawn": "^7.0.3",
6024
+ "get-stream": "^6.0.0",
6025
+ "human-signals": "^2.1.0",
6026
+ "is-stream": "^2.0.0",
6027
+ "merge-stream": "^2.0.0",
6028
+ "npm-run-path": "^4.0.1",
6029
+ "onetime": "^5.1.2",
6030
+ "signal-exit": "^3.0.3",
6031
+ "strip-final-newline": "^2.0.0"
6032
+ },
6033
+ "engines": {
6034
+ "node": ">=10"
6035
+ },
6036
+ "funding": {
6037
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
6038
+ }
6039
+ },
6040
+ "node_modules/start-server-and-test/node_modules/get-stream": {
6041
+ "version": "6.0.1",
6042
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
6043
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
6044
+ "dev": true,
6045
+ "engines": {
6046
+ "node": ">=10"
6047
+ },
6048
+ "funding": {
6049
+ "url": "https://github.com/sponsors/sindresorhus"
6050
+ }
6051
+ },
6052
+ "node_modules/start-server-and-test/node_modules/human-signals": {
6053
+ "version": "2.1.0",
6054
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
6055
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
6056
+ "dev": true,
6057
+ "engines": {
6058
+ "node": ">=10.17.0"
6059
+ }
6060
+ },
6061
+ "node_modules/start-server-and-test/node_modules/signal-exit": {
6062
+ "version": "3.0.7",
6063
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
6064
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
6065
+ "dev": true
6066
+ },
6067
  "node_modules/statuses": {
6068
  "version": "2.0.1",
6069
  "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
 
6072
  "node": ">= 0.8"
6073
  }
6074
  },
6075
+ "node_modules/stream-combiner": {
6076
+ "version": "0.0.4",
6077
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
6078
+ "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==",
6079
+ "dev": true,
6080
+ "dependencies": {
6081
+ "duplexer": "~0.1.1"
6082
+ }
6083
+ },
6084
  "node_modules/string-width": {
6085
  "version": "4.2.3",
6086
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
 
6148
  "node": ">=8"
6149
  }
6150
  },
6151
+ "node_modules/strip-final-newline": {
6152
+ "version": "2.0.0",
6153
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
6154
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
6155
+ "dev": true,
6156
+ "engines": {
6157
+ "node": ">=6"
6158
+ }
6159
+ },
6160
  "node_modules/style-to-object": {
6161
  "version": "1.0.8",
6162
  "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz",
 
6272
  "node": ">=0.8"
6273
  }
6274
  },
6275
+ "node_modules/throttleit": {
6276
+ "version": "1.0.1",
6277
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
6278
+ "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
6279
+ "dev": true,
6280
+ "funding": {
6281
+ "url": "https://github.com/sponsors/sindresorhus"
6282
+ }
6283
+ },
6284
+ "node_modules/through": {
6285
+ "version": "2.3.8",
6286
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
6287
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
6288
+ "dev": true
6289
+ },
6290
+ "node_modules/tldts": {
6291
+ "version": "6.1.85",
6292
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.85.tgz",
6293
+ "integrity": "sha512-gBdZ1RjCSevRPFix/hpaUWeak2/RNUZB4/8frF1r5uYMHjFptkiT0JXIebWvgI/0ZHXvxaUDDJshiA0j6GdL3w==",
6294
+ "dev": true,
6295
+ "dependencies": {
6296
+ "tldts-core": "^6.1.85"
6297
+ },
6298
+ "bin": {
6299
+ "tldts": "bin/cli.js"
6300
+ }
6301
+ },
6302
+ "node_modules/tldts-core": {
6303
+ "version": "6.1.85",
6304
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.85.tgz",
6305
+ "integrity": "sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA==",
6306
+ "dev": true
6307
+ },
6308
+ "node_modules/tmp": {
6309
+ "version": "0.2.3",
6310
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
6311
+ "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
6312
+ "dev": true,
6313
+ "engines": {
6314
+ "node": ">=14.14"
6315
+ }
6316
+ },
6317
  "node_modules/to-regex-range": {
6318
  "version": "5.0.1",
6319
  "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
 
6334
  "node": ">=0.6"
6335
  }
6336
  },
6337
+ "node_modules/tough-cookie": {
6338
+ "version": "5.1.2",
6339
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
6340
+ "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
6341
+ "dev": true,
6342
+ "dependencies": {
6343
+ "tldts": "^6.1.32"
6344
+ },
6345
+ "engines": {
6346
+ "node": ">=16"
6347
+ }
6348
+ },
6349
  "node_modules/tree-kill": {
6350
  "version": "1.2.2",
6351
  "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
 
6385
  "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
6386
  "dev": true
6387
  },
6388
+ "node_modules/tunnel-agent": {
6389
+ "version": "0.6.0",
6390
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
6391
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
6392
+ "dev": true,
6393
+ "dependencies": {
6394
+ "safe-buffer": "^5.0.1"
6395
+ },
6396
+ "engines": {
6397
+ "node": "*"
6398
+ }
6399
+ },
6400
+ "node_modules/tweetnacl": {
6401
+ "version": "0.14.5",
6402
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
6403
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
6404
+ "dev": true
6405
+ },
6406
+ "node_modules/type-fest": {
6407
+ "version": "0.21.3",
6408
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
6409
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
6410
+ "dev": true,
6411
+ "engines": {
6412
+ "node": ">=10"
6413
+ },
6414
+ "funding": {
6415
+ "url": "https://github.com/sponsors/sindresorhus"
6416
+ }
6417
+ },
6418
  "node_modules/type-is": {
6419
  "version": "1.6.18",
6420
  "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
 
6427
  "node": ">= 0.6"
6428
  }
6429
  },
6430
+ "node_modules/undici-types": {
6431
+ "version": "6.21.0",
6432
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
6433
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
6434
+ "dev": true,
6435
+ "optional": true
6436
+ },
6437
  "node_modules/unified": {
6438
  "version": "11.0.5",
6439
  "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
 
6452
  "url": "https://opencollective.com/unified"
6453
  }
6454
  },
6455
+ "node_modules/union": {
6456
+ "version": "0.5.0",
6457
+ "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz",
6458
+ "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==",
6459
+ "dev": true,
6460
+ "dependencies": {
6461
+ "qs": "^6.4.0"
6462
+ },
6463
+ "engines": {
6464
+ "node": ">= 0.8.0"
6465
+ }
6466
+ },
6467
  "node_modules/unist-util-is": {
6468
  "version": "6.0.0",
6469
  "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
 
6527
  "url": "https://opencollective.com/unified"
6528
  }
6529
  },
6530
+ "node_modules/universalify": {
6531
+ "version": "2.0.1",
6532
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
6533
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
6534
+ "dev": true,
6535
+ "engines": {
6536
+ "node": ">= 10.0.0"
6537
+ }
6538
+ },
6539
  "node_modules/unpipe": {
6540
  "version": "1.0.0",
6541
  "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
 
6544
  "node": ">= 0.8"
6545
  }
6546
  },
6547
+ "node_modules/untildify": {
6548
+ "version": "4.0.0",
6549
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
6550
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
6551
+ "dev": true,
6552
+ "engines": {
6553
+ "node": ">=8"
6554
+ }
6555
+ },
6556
  "node_modules/update-browserslist-db": {
6557
  "version": "1.1.2",
6558
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
 
6583
  "browserslist": ">= 4.21.0"
6584
  }
6585
  },
6586
+ "node_modules/url-join": {
6587
+ "version": "4.0.1",
6588
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
6589
+ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
6590
+ "dev": true
6591
+ },
6592
  "node_modules/util-deprecate": {
6593
  "version": "1.0.2",
6594
  "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
 
6603
  "node": ">= 0.4.0"
6604
  }
6605
  },
6606
+ "node_modules/uuid": {
6607
+ "version": "8.3.2",
6608
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
6609
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
6610
+ "dev": true,
6611
+ "bin": {
6612
+ "uuid": "dist/bin/uuid"
6613
+ }
6614
+ },
6615
  "node_modules/vary": {
6616
  "version": "1.1.2",
6617
  "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
 
6620
  "node": ">= 0.8"
6621
  }
6622
  },
6623
+ "node_modules/verror": {
6624
+ "version": "1.10.0",
6625
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
6626
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
6627
+ "dev": true,
6628
+ "engines": [
6629
+ "node >=0.6.0"
6630
+ ],
6631
+ "dependencies": {
6632
+ "assert-plus": "^1.0.0",
6633
+ "core-util-is": "1.0.2",
6634
+ "extsprintf": "^1.2.0"
6635
+ }
6636
+ },
6637
  "node_modules/vfile": {
6638
  "version": "6.0.3",
6639
  "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
 
6715
  }
6716
  }
6717
  },
6718
+ "node_modules/wait-on": {
6719
+ "version": "8.0.3",
6720
+ "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.3.tgz",
6721
+ "integrity": "sha512-nQFqAFzZDeRxsu7S3C7LbuxslHhk+gnJZHyethuGKAn2IVleIbTB9I3vJSQiSR+DifUqmdzfPMoMPJfLqMF2vw==",
6722
+ "dev": true,
6723
+ "dependencies": {
6724
+ "axios": "^1.8.2",
6725
+ "joi": "^17.13.3",
6726
+ "lodash": "^4.17.21",
6727
+ "minimist": "^1.2.8",
6728
+ "rxjs": "^7.8.2"
6729
+ },
6730
+ "bin": {
6731
+ "wait-on": "bin/wait-on"
6732
+ },
6733
+ "engines": {
6734
+ "node": ">=12.0.0"
6735
+ }
6736
+ },
6737
  "node_modules/web-streams-polyfill": {
6738
  "version": "3.3.3",
6739
  "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
 
6742
  "node": ">= 8"
6743
  }
6744
  },
6745
+ "node_modules/whatwg-encoding": {
6746
+ "version": "2.0.0",
6747
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
6748
+ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
6749
+ "dev": true,
6750
+ "dependencies": {
6751
+ "iconv-lite": "0.6.3"
6752
+ },
6753
+ "engines": {
6754
+ "node": ">=12"
6755
+ }
6756
+ },
6757
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
6758
+ "version": "0.6.3",
6759
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
6760
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
6761
+ "dev": true,
6762
+ "dependencies": {
6763
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
6764
+ },
6765
+ "engines": {
6766
+ "node": ">=0.10.0"
6767
+ }
6768
+ },
6769
  "node_modules/which": {
6770
  "version": "2.0.2",
6771
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
 
6816
  "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
6817
  }
6818
  },
6819
+ "node_modules/wrappy": {
6820
+ "version": "1.0.2",
6821
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
6822
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
6823
+ "dev": true
6824
+ },
6825
  "node_modules/y18n": {
6826
  "version": "5.0.8",
6827
  "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
 
6876
  "node": ">=12"
6877
  }
6878
  },
6879
+ "node_modules/yauzl": {
6880
+ "version": "2.10.0",
6881
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
6882
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
6883
+ "dev": true,
6884
+ "dependencies": {
6885
+ "buffer-crc32": "~0.2.3",
6886
+ "fd-slicer": "~1.1.0"
6887
+ }
6888
+ },
6889
  "node_modules/zwitch": {
6890
  "version": "2.0.4",
6891
  "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
package.json CHANGED
@@ -9,7 +9,13 @@
9
  "preview": "vite preview",
10
  "server": "node server/index.js",
11
  "start": "concurrently \"npm run dev\" \"npm run server\"",
12
- "prod": "NODE_ENV=production node server/index.js"
 
 
 
 
 
 
13
  },
14
  "dependencies": {
15
  "cors": "^2.8.5",
@@ -20,12 +26,16 @@
20
  "react-markdown": "^10.0.0"
21
  },
22
  "devDependencies": {
 
23
  "@types/react": "^18.2.15",
24
  "@types/react-dom": "^18.2.7",
25
  "@vitejs/plugin-react": "^4.0.3",
26
  "autoprefixer": "^10.4.21",
27
  "concurrently": "^8.2.0",
 
 
28
  "postcss": "^8.5.3",
 
29
  "tailwindcss": "^3.3.5",
30
  "vite": "^4.4.5"
31
  }
 
9
  "preview": "vite preview",
10
  "server": "node server/index.js",
11
  "start": "concurrently \"npm run dev\" \"npm run server\"",
12
+ "prod": "NODE_ENV=production node server/index.js",
13
+ "cy:open": "cypress open",
14
+ "cy:run": "cypress run",
15
+ "test:e2e": "start-server-and-test start http://localhost:5173 cy:run",
16
+ "test:simple": "cypress run --spec 'cypress/e2e/message-routing-simple.cy.js'",
17
+ "serve:build": "npm run build && http-server ./dist -p 5173",
18
+ "test:build": "start-server-and-test serve:build http://localhost:5173 'cypress run --spec cypress/e2e/message-routing-simple.cy.js'"
19
  },
20
  "dependencies": {
21
  "cors": "^2.8.5",
 
26
  "react-markdown": "^10.0.0"
27
  },
28
  "devDependencies": {
29
+ "@testing-library/cypress": "^10.0.3",
30
  "@types/react": "^18.2.15",
31
  "@types/react-dom": "^18.2.7",
32
  "@vitejs/plugin-react": "^4.0.3",
33
  "autoprefixer": "^10.4.21",
34
  "concurrently": "^8.2.0",
35
+ "cypress": "^14.2.1",
36
+ "http-server": "^14.1.1",
37
  "postcss": "^8.5.3",
38
+ "start-server-and-test": "^2.0.11",
39
  "tailwindcss": "^3.3.5",
40
  "vite": "^4.4.5"
41
  }
src/App.jsx CHANGED
@@ -33,22 +33,51 @@ function App() {
33
  const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
34
  const [showProfileDropdown, setShowProfileDropdown] = useState(false);
35
  const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
 
36
 
37
  const activeProfile = profiles.find(p => p.id === activeProfileId) || profiles[0];
38
 
39
  const createNewChat = () => {
 
 
 
 
40
  const newChat = {
41
- id: Date.now(),
42
  title: 'New Conversation',
43
  messages: []
44
  };
45
- setChats([...chats, newChat]);
46
- setCurrentChatId(newChat.id);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  };
48
 
49
  const deleteChat = (chatId) => {
50
- setChats(chats.filter(chat => chat.id !== chatId));
 
 
 
 
 
 
 
 
 
51
  if (currentChatId === chatId) {
 
52
  setCurrentChatId(null);
53
  }
54
  };
@@ -73,6 +102,29 @@ function App() {
73
  }
74
  };
75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  const toggleProfileDropdown = () => {
77
  setShowProfileDropdown(!showProfileDropdown);
78
  };
@@ -145,6 +197,7 @@ function App() {
145
  onDeleteChat={deleteChat}
146
  onCreateNewChat={createNewChat}
147
  collapsed={sidebarCollapsed}
 
148
  />
149
  </div>
150
 
@@ -169,6 +222,12 @@ function App() {
169
  c.id === updatedChat.id ? updatedChat : c
170
  ));
171
  }}
 
 
 
 
 
 
172
  />
173
  ) : (
174
  <div className="flex flex-col items-center justify-center h-full p-5 text-center">
 
33
  const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
34
  const [showProfileDropdown, setShowProfileDropdown] = useState(false);
35
  const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
36
+ const [streamingChats, setStreamingChats] = useState(new Set());
37
 
38
  const activeProfile = profiles.find(p => p.id === activeProfileId) || profiles[0];
39
 
40
  const createNewChat = () => {
41
+ // 生成一个新的聊天ID,确保它是唯一的
42
+ const newChatId = Date.now();
43
+ console.log(`Creating new chat with ID: ${newChatId}`);
44
+
45
  const newChat = {
46
+ id: newChatId,
47
  title: 'New Conversation',
48
  messages: []
49
  };
50
+
51
+ // 使用函数式更新来确保我们使用最新的聊天列表
52
+ setChats(prevChats => {
53
+ // 检查是否已经存在相同 ID 的聊天,避免重复
54
+ const chatExists = prevChats.some(chat => chat.id === newChatId);
55
+ if (chatExists) {
56
+ console.log(`Chat with ID ${newChatId} already exists, not creating duplicate`);
57
+ return prevChats;
58
+ }
59
+
60
+ console.log(`Adding new chat to chats array, current count: ${prevChats.length}, new count: ${prevChats.length + 1}`);
61
+ return [...prevChats, newChat];
62
+ });
63
+
64
+ // 设置当前聊天ID
65
+ setCurrentChatId(newChatId);
66
  };
67
 
68
  const deleteChat = (chatId) => {
69
+ console.log(`Deleting chat with ID: ${chatId}`);
70
+
71
+ // 使用函数式更新来确保我们使用最新的聊天列表
72
+ setChats(prevChats => {
73
+ const filteredChats = prevChats.filter(chat => chat.id !== chatId);
74
+ console.log(`Removed chat, previous count: ${prevChats.length}, new count: ${filteredChats.length}`);
75
+ return filteredChats;
76
+ });
77
+
78
+ // 如果删除的是当前活动的聊天,则将当前聊天ID设置为空
79
  if (currentChatId === chatId) {
80
+ console.log(`Deleted chat was the current active chat, setting currentChatId to null`);
81
  setCurrentChatId(null);
82
  }
83
  };
 
102
  }
103
  };
104
 
105
+ // 添加聊天到正在流式传输的列表
106
+ const addStreamingChat = (chatId) => {
107
+ setStreamingChats(prev => {
108
+ const newSet = new Set(prev);
109
+ newSet.add(chatId);
110
+ return newSet;
111
+ });
112
+ };
113
+
114
+ // 从正在流式传输的列表中移除聊天
115
+ const removeStreamingChat = (chatId) => {
116
+ setStreamingChats(prev => {
117
+ const newSet = new Set(prev);
118
+ newSet.delete(chatId);
119
+ return newSet;
120
+ });
121
+ };
122
+
123
+ // 检查聊天是否正在流式传输
124
+ const isStreamingChat = (chatId) => {
125
+ return streamingChats.has(chatId);
126
+ };
127
+
128
  const toggleProfileDropdown = () => {
129
  setShowProfileDropdown(!showProfileDropdown);
130
  };
 
197
  onDeleteChat={deleteChat}
198
  onCreateNewChat={createNewChat}
199
  collapsed={sidebarCollapsed}
200
+ isStreamingChat={isStreamingChat}
201
  />
202
  </div>
203
 
 
222
  c.id === updatedChat.id ? updatedChat : c
223
  ));
224
  }}
225
+ onCreateNewChat={createNewChat}
226
+ addStreamingChat={addStreamingChat}
227
+ removeStreamingChat={removeStreamingChat}
228
+ isStreamingChat={isStreamingChat}
229
+ allChats={chats}
230
+ currentChatId={currentChatId}
231
  />
232
  ) : (
233
  <div className="flex flex-col items-center justify-center h-full p-5 text-center">
src/components/ChatList.jsx CHANGED
@@ -1,6 +1,6 @@
1
  import React from 'react';
2
 
3
- function ChatList({ chats, currentChat, onSelectChat, onDeleteChat, onCreateNewChat, collapsed }) {
4
  return (
5
  <div className="chat-list">
6
  <button className="new-chat" onClick={onCreateNewChat}>
@@ -12,10 +12,15 @@ function ChatList({ chats, currentChat, onSelectChat, onDeleteChat, onCreateNewC
12
  chats.map(chat => (
13
  <div
14
  key={chat.id}
15
- className={`chat-item ${chat.id === currentChat?.id ? 'active' : ''}`}
16
  onClick={() => onSelectChat(chat.id)}
17
  >
18
- <span>{chat.title}</span>
 
 
 
 
 
19
  <button
20
  className="delete-btn"
21
  onClick={(e) => {
 
1
  import React from 'react';
2
 
3
+ function ChatList({ chats, currentChat, onSelectChat, onDeleteChat, onCreateNewChat, collapsed, isStreamingChat }) {
4
  return (
5
  <div className="chat-list">
6
  <button className="new-chat" onClick={onCreateNewChat}>
 
12
  chats.map(chat => (
13
  <div
14
  key={chat.id}
15
+ className={`chat-item ${chat.id === currentChat?.id ? 'active' : ''} ${isStreamingChat && typeof isStreamingChat === 'function' && isStreamingChat(chat.id) ? 'streaming' : ''}`}
16
  onClick={() => onSelectChat(chat.id)}
17
  >
18
+ <div className="flex items-center gap-1">
19
+ {isStreamingChat && typeof isStreamingChat === 'function' && isStreamingChat(chat.id) && (
20
+ <span className="streaming-dot"></span>
21
+ )}
22
+ <span>{chat.title}</span>
23
+ </div>
24
  <button
25
  className="delete-btn"
26
  onClick={(e) => {
src/components/ChatWindow.jsx CHANGED
@@ -1,7 +1,18 @@
1
  import React, { useState, useRef, useEffect } from 'react';
2
  import ReactMarkdown from 'react-markdown';
3
 
4
- function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
 
 
 
 
 
 
 
 
 
 
 
5
  const [input, setInput] = useState('');
6
  const [isLoading, setIsLoading] = useState(false);
7
  const [collapsedThinks, setCollapsedThinks] = useState(new Set());
@@ -12,8 +23,10 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
12
 
13
  // Scroll to bottom when messages change
14
  useEffect(() => {
15
- scrollToBottom();
16
- }, [chat.messages, partialResponse]);
 
 
17
 
18
  const scrollToBottom = () => {
19
  messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
@@ -42,8 +55,14 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
42
 
43
  const handleSendMessage = async () => {
44
  if (!input.trim()) return;
 
 
 
 
 
 
45
 
46
- // Cancel any ongoing stream
47
  if (streamController) {
48
  streamController.abort();
49
  }
@@ -54,9 +73,19 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
54
  timestamp: Date.now()
55
  };
56
 
 
 
 
 
 
 
 
 
 
 
57
  const updatedChat = {
58
- ...chat,
59
- messages: [...chat.messages, newMessage]
60
  };
61
  onUpdateChat(updatedChat);
62
  setInput('');
@@ -66,7 +95,13 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
66
  const controller = new AbortController();
67
  setStreamController(controller);
68
 
 
 
 
 
 
69
  setIsLoading(true);
 
70
  try {
71
  const response = await fetch('/api/chat', {
72
  method: 'POST',
@@ -104,62 +139,164 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
104
 
105
  const chunk = decoder.decode(value);
106
  const lines = chunk.split('\n').filter(line => line.trim() !== '');
107
-
108
  for (const line of lines) {
 
 
 
 
109
  const message = line.replace(/^data: /, '');
 
 
110
  if (message === '[DONE]') break;
111
 
112
  try {
113
- const parsed = JSON.parse(message);
114
- const content = parsed.choices[0].delta.content || '';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  aiMessage.content += content;
116
- setPartialResponse(aiMessage.content);
 
 
 
 
 
 
 
 
117
  } catch (error) {
118
- console.error('Error parsing chunk:', error);
119
  }
120
  }
121
  }
122
 
123
- const finalChat = {
124
- ...updatedChat,
125
- messages: [...updatedChat.messages, aiMessage]
126
- };
127
- onUpdateChat(finalChat);
128
-
129
- // Generate summary title after first message exchange
130
- if (finalChat.messages.length === 2) {
131
- try {
132
- const summaryResponse = await fetch('/api/summarize', {
133
- method: 'POST',
134
- headers: {
135
- 'Content-Type': 'application/json',
136
- },
137
- body: JSON.stringify({
138
- content: finalChat.messages.map(msg => msg.content).join('\n'),
139
- apiKey: summarizationProfile?.apiKey || profile.apiKey || '',
140
- model: summarizationProfile?.model || profile.model || 'gpt-3.5-turbo',
141
- apiEndpoint: summarizationProfile?.apiEndpoint || profile.apiEndpoint || 'https://api.openai.com/v1'
142
- })
143
- });
144
-
145
- if (!summaryResponse.ok) {
146
- throw new Error(`Summary API error: ${summaryResponse.status}`);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
  }
148
 
149
- const { summary } = await summaryResponse.json();
150
- const updatedChatWithTitle = {
151
- ...finalChat,
152
- title: summary
153
  };
154
- onUpdateChat(updatedChatWithTitle);
155
- } catch (error) {
156
- console.error('Failed to generate summary:', error);
157
- // Fallback to default title if summarization fails
158
- const updatedChatWithTitle = {
159
- ...finalChat,
160
- title: 'New Conversation'
161
- };
162
- onUpdateChat(updatedChatWithTitle);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  }
164
  }
165
  } catch (error) {
@@ -168,8 +305,24 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
168
  alert(`Failed to send message: ${error.message}`);
169
  }
170
  } finally {
171
- setIsLoading(false);
172
- setPartialResponse('');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
  setStreamController(null);
174
  }
175
  };
@@ -189,10 +342,28 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
189
  };
190
 
191
  return (
192
- <div className="chat-window">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
193
  <div className="chat-messages">
194
- {chat.messages.map((message, index) => {
195
- const parsedMessage = message.role === 'assistant'
196
  ? parseMessage(message.content)
197
  : { content: message.content, think: null };
198
 
@@ -202,7 +373,7 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
202
  <>
203
  {parsedMessage.think && (
204
  <div className="reasoning-container">
205
- <div
206
  className="reasoning-header"
207
  onClick={() => toggleThink(message.timestamp)}
208
  >
@@ -218,7 +389,7 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
218
  )}
219
  <div className="message-content">
220
  <ReactMarkdown>{parsedMessage.content}</ReactMarkdown>
221
- <button
222
  className={`copy-button ${copiedMessageId === message.content ? 'copied' : ''}`}
223
  onClick={() => handleCopyMessage(message.content)}
224
  >
@@ -227,11 +398,11 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
227
  </div>
228
  </>
229
  )}
230
-
231
  {message.role === 'user' && (
232
  <div className="message-content">
233
  <ReactMarkdown>{parsedMessage.content}</ReactMarkdown>
234
- <button
235
  className={`copy-button ${copiedMessageId === message.content ? 'copied' : ''}`}
236
  onClick={() => handleCopyMessage(message.content)}
237
  >
@@ -239,7 +410,7 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
239
  </button>
240
  </div>
241
  )}
242
-
243
  {message.timestamp && (
244
  <div className="message-time">
245
  {formatTime(message.timestamp)}
@@ -248,8 +419,8 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
248
  </div>
249
  );
250
  })}
251
-
252
- {isLoading && (
253
  <div className="message assistant">
254
  <div className="message-content">
255
  <ReactMarkdown>{partialResponse}</ReactMarkdown>
@@ -257,29 +428,41 @@ function ChatWindow({ chat, profile, summarizationProfile, onUpdateChat }) {
257
  </div>
258
  </div>
259
  )}
 
 
 
 
 
 
 
260
  <div ref={messagesEndRef} />
261
  </div>
262
-
263
  <div className="chat-input">
264
- <textarea
265
- className="message-input"
266
- value={input}
267
- onChange={(e) => setInput(e.target.value)}
268
- placeholder="Send a message..."
269
- onKeyDown={(e) => {
270
- if (e.key === 'Enter' && !e.shiftKey) {
271
- e.preventDefault();
272
- handleSendMessage();
273
- }
274
- }}
275
- />
276
- <button
277
- onClick={handleSendMessage}
278
- disabled={!input.trim() || isLoading}
279
- className="send-button"
280
- >
281
- Send
282
- </button>
 
 
 
 
 
283
  </div>
284
  </div>
285
  );
 
1
  import React, { useState, useRef, useEffect } from 'react';
2
  import ReactMarkdown from 'react-markdown';
3
 
4
+ function ChatWindow({
5
+ chat,
6
+ profile,
7
+ summarizationProfile,
8
+ onUpdateChat,
9
+ onCreateNewChat,
10
+ addStreamingChat,
11
+ removeStreamingChat,
12
+ isStreamingChat,
13
+ allChats,
14
+ currentChatId
15
+ }) {
16
  const [input, setInput] = useState('');
17
  const [isLoading, setIsLoading] = useState(false);
18
  const [collapsedThinks, setCollapsedThinks] = useState(new Set());
 
23
 
24
  // Scroll to bottom when messages change
25
  useEffect(() => {
26
+ if (chat && chat.messages) {
27
+ scrollToBottom();
28
+ }
29
+ }, [chat, partialResponse]);
30
 
31
  const scrollToBottom = () => {
32
  messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
 
55
 
56
  const handleSendMessage = async () => {
57
  if (!input.trim()) return;
58
+ if (!chat || !chat.messages) return; // Add safety check
59
+
60
+ // 保存当前聊天的ID和用户输入,以便在异步操作中使用
61
+ const currentChatID = chat.id;
62
+ const userInput = input; // 保存用户输入,以便在流结束后仍能访问
63
+ console.log(`Starting message send for chat ${currentChatID}`);
64
 
65
+ // Cancel any ongoing stream for this chat
66
  if (streamController) {
67
  streamController.abort();
68
  }
 
73
  timestamp: Date.now()
74
  };
75
 
76
+ // 确保我们使用最新的聊天对象
77
+ // 这是为了防止在创建新对话后立即发送消息时,使用了旧的聊天对象
78
+ let targetChat = chat;
79
+ if (allChats && Array.isArray(allChats)) {
80
+ const foundChat = allChats.find(c => c && c.id === currentChatID);
81
+ if (foundChat) {
82
+ targetChat = foundChat;
83
+ }
84
+ }
85
+
86
  const updatedChat = {
87
+ ...targetChat,
88
+ messages: [...targetChat.messages, newMessage]
89
  };
90
  onUpdateChat(updatedChat);
91
  setInput('');
 
95
  const controller = new AbortController();
96
  setStreamController(controller);
97
 
98
+ // 标记当前聊天为正在流式传输
99
+ if (typeof addStreamingChat === 'function') {
100
+ console.log(`Adding chat ${currentChatID} to streaming chats`);
101
+ addStreamingChat(currentChatID);
102
+ }
103
  setIsLoading(true);
104
+
105
  try {
106
  const response = await fetch('/api/chat', {
107
  method: 'POST',
 
139
 
140
  const chunk = decoder.decode(value);
141
  const lines = chunk.split('\n').filter(line => line.trim() !== '');
142
+
143
  for (const line of lines) {
144
+ // Skip empty lines
145
+ if (!line.trim()) continue;
146
+
147
+ // Handle SSE format - remove 'data: ' prefix if present
148
  const message = line.replace(/^data: /, '');
149
+
150
+ // Check for end of stream marker
151
  if (message === '[DONE]') break;
152
 
153
  try {
154
+ // Try to parse the message as JSON
155
+ let parsed;
156
+ try {
157
+ parsed = JSON.parse(message);
158
+ } catch (parseError) {
159
+ console.warn('Could not parse as JSON, trying to extract content:', message);
160
+ // If it's not valid JSON but contains content, try to extract it
161
+ const contentMatch = message.match(/"content":"([^"]*)"/);
162
+ if (contentMatch && contentMatch[1]) {
163
+ aiMessage.content += contentMatch[1];
164
+ if (currentChatId === currentChatID) {
165
+ setPartialResponse(aiMessage.content);
166
+ }
167
+ console.log(`Extracted content from malformed JSON for chat ${currentChatID}`);
168
+ continue;
169
+ } else {
170
+ // Log the error but don't throw - we want to continue processing other chunks
171
+ console.error('Error parsing chunk:', parseError, 'Raw message:', message);
172
+ continue;
173
+ }
174
+ }
175
+
176
+ // Extract content from the parsed JSON - handle different response formats
177
+ let content = '';
178
+ if (parsed.choices && parsed.choices[0]) {
179
+ if (parsed.choices[0].delta && parsed.choices[0].delta.content !== undefined) {
180
+ // OpenAI streaming format
181
+ content = parsed.choices[0].delta.content || '';
182
+ } else if (parsed.choices[0].message && parsed.choices[0].message.content) {
183
+ // Standard completion format
184
+ content = parsed.choices[0].message.content;
185
+ } else if (parsed.content) {
186
+ // Simple content field
187
+ content = parsed.content;
188
+ }
189
+ } else if (parsed.content) {
190
+ // Direct content field
191
+ content = parsed.content;
192
+ }
193
+
194
+ // Add the content to our message
195
  aiMessage.content += content;
196
+
197
+ // 只有当前显示的聊天是正在接收消息的聊天时,才更新部分响应
198
+ if (currentChatId === currentChatID) {
199
+ setPartialResponse(aiMessage.content);
200
+ }
201
+
202
+ // 无论当前显示的是哪个聊天,都确保我们能找到正确的聊天对象
203
+ // 这确保了即使用户切换到另一个聊天,消息仍然会被添加到正确的聊天中
204
+ console.log(`Processing streaming response for chat ${currentChatID}`);
205
  } catch (error) {
206
+ console.error('Error processing chunk:', error, 'Raw message:', message);
207
  }
208
  }
209
  }
210
 
211
+ // 流结束后,找到目标聊天并更新它
212
+ console.log(`Stream completed for chat ${currentChatID}, updating chat`);
213
+ if (allChats && Array.isArray(allChats)) {
214
+ // 重新获取最新的聊天列表,确保我们使用最新的数据
215
+ const targetChat = allChats.find(c => c && c.id === currentChatID);
216
+
217
+ // 检查目标聊天是否存在,并且有消息数组
218
+ if (targetChat && targetChat.messages && Array.isArray(targetChat.messages) && aiMessage) {
219
+ console.log(`Found target chat ${currentChatID}, adding AI message`);
220
+
221
+ // 确保保留用户消息
222
+ // 首先检查最后一条消息是否是用户消息
223
+ const lastMessage = targetChat.messages[targetChat.messages.length - 1];
224
+ let updatedMessages;
225
+
226
+ if (lastMessage && lastMessage.role === 'user' && lastMessage.content === userInput) {
227
+ // 如果最后一条是用户消息,且内容与当前用户输入匹配,保留它并添加AI回复
228
+ updatedMessages = [...targetChat.messages, aiMessage];
229
+ } else {
230
+ // 如果最后一条不是用户消息或内容不匹配,先添加用户消息再添加AI回复
231
+ // 创建与之前相同的用户消息
232
+ const userMessage = {
233
+ role: 'user',
234
+ content: userInput,
235
+ timestamp: Date.now() - 1000 // 稍早于AI消息
236
+ };
237
+
238
+ // 检查是否已经有相同内容的用户消息,避免重复
239
+ const hasSameUserMessage = targetChat.messages.some(msg =>
240
+ msg.role === 'user' && msg.content === userInput
241
+ );
242
+
243
+ if (hasSameUserMessage) {
244
+ // 如果已经有相同的用户消息,只添加AI回复
245
+ updatedMessages = [...targetChat.messages, aiMessage];
246
+ } else {
247
+ // 如果没有相同的用户消息,添加用户消息和AI回复
248
+ updatedMessages = [...targetChat.messages, userMessage, aiMessage];
249
+ }
250
  }
251
 
252
+ const finalChat = {
253
+ ...targetChat,
254
+ messages: updatedMessages
 
255
  };
256
+
257
+ if (typeof onUpdateChat === 'function') {
258
+ onUpdateChat(finalChat);
259
+ }
260
+
261
+ // Generate summary title after first message exchange
262
+ // 检查是否有一对用户和AI消息
263
+ const hasUserMessage = finalChat.messages.some(msg => msg.role === 'user');
264
+ const hasAssistantMessage = finalChat.messages.some(msg => msg.role === 'assistant');
265
+ if (hasUserMessage && hasAssistantMessage && finalChat.title === 'New Conversation') {
266
+ try {
267
+ const summaryResponse = await fetch('/api/summarize', {
268
+ method: 'POST',
269
+ headers: {
270
+ 'Content-Type': 'application/json',
271
+ },
272
+ body: JSON.stringify({
273
+ content: finalChat.messages.map(msg => msg.content).join('\n'),
274
+ apiKey: summarizationProfile?.apiKey || profile.apiKey || '',
275
+ model: summarizationProfile?.model || profile.model || 'gpt-3.5-turbo',
276
+ apiEndpoint: summarizationProfile?.apiEndpoint || profile.apiEndpoint || 'https://api.openai.com/v1'
277
+ })
278
+ });
279
+
280
+ if (!summaryResponse.ok) {
281
+ throw new Error(`Summary API error: ${summaryResponse.status}`);
282
+ }
283
+
284
+ const { summary } = await summaryResponse.json();
285
+ const updatedChatWithTitle = {
286
+ ...finalChat,
287
+ title: summary
288
+ };
289
+ onUpdateChat(updatedChatWithTitle);
290
+ } catch (error) {
291
+ console.error('Failed to generate summary:', error);
292
+ // Fallback to default title if summarization fails
293
+ const updatedChatWithTitle = {
294
+ ...finalChat,
295
+ title: 'New Conversation'
296
+ };
297
+ onUpdateChat(updatedChatWithTitle);
298
+ }
299
+ }
300
  }
301
  }
302
  } catch (error) {
 
305
  alert(`Failed to send message: ${error.message}`);
306
  }
307
  } finally {
308
+ // 无论成功还是失败,都从流式传输列表中移除聊天
309
+ if (typeof removeStreamingChat === 'function') {
310
+ console.log(`Removing chat ${currentChatID} from streaming chats`);
311
+ removeStreamingChat(currentChatID);
312
+ }
313
+
314
+ // 只有当前显示的聊天是刚刚完成流式传输的聊天时,才重置加载状态和部分响应
315
+ if (currentChatId === currentChatID) {
316
+ console.log(`Resetting loading state for chat ${currentChatID}`);
317
+ setIsLoading(false);
318
+ setPartialResponse('');
319
+ } else {
320
+ // 如果当前显示的聊天不是刚刚完成流式传输的聊天
321
+ // 这意味着用户已经切换到了另一个聊天
322
+ // 我们不需要重置当前聊天的加载状态,因为它可能正在加载其他内容
323
+ console.log(`User switched to another chat. Not resetting UI state for ${currentChatID}`);
324
+ }
325
+
326
  setStreamController(null);
327
  }
328
  };
 
342
  };
343
 
344
  return (
345
+ <div className="chat-window relative">
346
+ {/* Floating New Chat button */}
347
+ <button
348
+ onClick={() => {
349
+ console.log('Floating new chat button clicked');
350
+ // 在创建新聊天前添加一些日志
351
+ if (typeof onCreateNewChat === 'function') {
352
+ console.log('Calling onCreateNewChat function');
353
+ onCreateNewChat();
354
+ console.log('onCreateNewChat function called');
355
+ } else {
356
+ console.error('onCreateNewChat is not a function');
357
+ }
358
+ }}
359
+ className="floating-new-chat"
360
+ title="Create a new conversation"
361
+ >
362
+ <span className="text-xl">+</span>
363
+ </button>
364
  <div className="chat-messages">
365
+ {chat && chat.messages && chat.messages.map((message, index) => {
366
+ const parsedMessage = message.role === 'assistant'
367
  ? parseMessage(message.content)
368
  : { content: message.content, think: null };
369
 
 
373
  <>
374
  {parsedMessage.think && (
375
  <div className="reasoning-container">
376
+ <div
377
  className="reasoning-header"
378
  onClick={() => toggleThink(message.timestamp)}
379
  >
 
389
  )}
390
  <div className="message-content">
391
  <ReactMarkdown>{parsedMessage.content}</ReactMarkdown>
392
+ <button
393
  className={`copy-button ${copiedMessageId === message.content ? 'copied' : ''}`}
394
  onClick={() => handleCopyMessage(message.content)}
395
  >
 
398
  </div>
399
  </>
400
  )}
401
+
402
  {message.role === 'user' && (
403
  <div className="message-content">
404
  <ReactMarkdown>{parsedMessage.content}</ReactMarkdown>
405
+ <button
406
  className={`copy-button ${copiedMessageId === message.content ? 'copied' : ''}`}
407
  onClick={() => handleCopyMessage(message.content)}
408
  >
 
410
  </button>
411
  </div>
412
  )}
413
+
414
  {message.timestamp && (
415
  <div className="message-time">
416
  {formatTime(message.timestamp)}
 
419
  </div>
420
  );
421
  })}
422
+
423
+ {isLoading && chat && currentChatId === chat.id && (
424
  <div className="message assistant">
425
  <div className="message-content">
426
  <ReactMarkdown>{partialResponse}</ReactMarkdown>
 
428
  </div>
429
  </div>
430
  )}
431
+
432
+ {chat && isStreamingChat && isStreamingChat(chat.id) && !isLoading && (
433
+ <div className="streaming-indicator">
434
+ <span className="pulse-dot"></span>
435
+ <span className="text-sm text-light-text ml-2">接收消息中...</span>
436
+ </div>
437
+ )}
438
  <div ref={messagesEndRef} />
439
  </div>
440
+
441
  <div className="chat-input">
442
+ <div className="flex items-center gap-2 w-full">
443
+ <textarea
444
+ className="message-input"
445
+ value={input}
446
+ onChange={(e) => setInput(e.target.value)}
447
+ placeholder="Send a message..."
448
+ onKeyDown={(e) => {
449
+ if (e.key === 'Enter' && !e.shiftKey) {
450
+ e.preventDefault();
451
+ handleSendMessage();
452
+ }
453
+ }}
454
+ />
455
+ <div className="flex flex-col gap-2">
456
+ <button
457
+ onClick={handleSendMessage}
458
+ disabled={!input.trim() || isLoading}
459
+ className="send-button"
460
+ >
461
+ Send
462
+ </button>
463
+
464
+ </div>
465
+ </div>
466
  </div>
467
  </div>
468
  );
src/index.css CHANGED
@@ -192,6 +192,15 @@ body {
192
  @apply bg-active text-primary;
193
  }
194
 
 
 
 
 
 
 
 
 
 
195
  .delete-btn {
196
  @apply opacity-0 bg-transparent border-none text-lightest-text cursor-pointer text-xs transition-all duration-200 py-0.5 px-[5px];
197
  }
@@ -402,6 +411,51 @@ body {
402
  @apply bg-slate-400 cursor-not-allowed opacity-70;
403
  }
404
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
405
  /* Loading cursor */
406
  .loading-cursor {
407
  @apply inline-block w-0.5 h-[1.2em] bg-current ml-0.5 animate-blink align-text-bottom;
 
192
  @apply bg-active text-primary;
193
  }
194
 
195
+ .chat-item.streaming {
196
+ @apply border-l-2 border-blue-500;
197
+ }
198
+
199
+ .streaming-dot {
200
+ @apply w-2 h-2 bg-blue-500 rounded-full;
201
+ animation: pulse 1.5s infinite;
202
+ }
203
+
204
  .delete-btn {
205
  @apply opacity-0 bg-transparent border-none text-lightest-text cursor-pointer text-xs transition-all duration-200 py-0.5 px-[5px];
206
  }
 
411
  @apply bg-slate-400 cursor-not-allowed opacity-70;
412
  }
413
 
414
+ /* New chat button in chat window */
415
+ .new-chat-button {
416
+ @apply flex items-center justify-center;
417
+ }
418
+
419
+ .new-chat-button:hover {
420
+ @apply bg-green-600;
421
+ }
422
+
423
+ /* Floating new chat button */
424
+ .floating-new-chat {
425
+ @apply fixed bottom-20 right-6 bg-green-500 hover:bg-green-600 text-white rounded-full w-12 h-12 flex items-center justify-center shadow-lg z-10;
426
+ }
427
+
428
+ @media (max-width: 768px) {
429
+ .floating-new-chat {
430
+ @apply bottom-24 right-4 w-10 h-10;
431
+ }
432
+ }
433
+
434
+ /* Streaming indicator */
435
+ .streaming-indicator {
436
+ @apply flex items-center justify-center py-2 px-4 my-4 bg-blue-50 rounded-md text-blue-600 w-max mx-auto;
437
+ }
438
+
439
+ .pulse-dot {
440
+ @apply w-2 h-2 bg-blue-500 rounded-full;
441
+ animation: pulse 1.5s infinite;
442
+ }
443
+
444
+ @keyframes pulse {
445
+ 0% {
446
+ transform: scale(0.95);
447
+ box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7);
448
+ }
449
+ 70% {
450
+ transform: scale(1);
451
+ box-shadow: 0 0 0 6px rgba(59, 130, 246, 0);
452
+ }
453
+ 100% {
454
+ transform: scale(0.95);
455
+ box-shadow: 0 0 0 0 rgba(59, 130, 246, 0);
456
+ }
457
+ }
458
+
459
  /* Loading cursor */
460
  .loading-cursor {
461
  @apply inline-block w-0.5 h-[1.2em] bg-current ml-0.5 animate-blink align-text-bottom;