Ahmad Shallouf commited on
Commit
88bf46c
β€’
1 Parent(s): 4bb8324

added control pael

Browse files
.DS_Store CHANGED
Binary files a/.DS_Store and b/.DS_Store differ
 
README.md CHANGED
@@ -1,11 +1,27 @@
1
- ---
2
- title: CompUGE Bench
3
- emoji: πŸ“Š
4
- colorFrom: gray
5
- colorTo: yellow
6
- sdk: docker
7
- pinned: false
8
- license: mit
9
- ---
10
-
11
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # CompugeFrontend
2
+
3
+ This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.3.4.
4
+
5
+ ## Development server
6
+
7
+ Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
8
+
9
+ ## Code scaffolding
10
+
11
+ Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
12
+
13
+ ## Build
14
+
15
+ Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
16
+
17
+ ## Running unit tests
18
+
19
+ Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
20
+
21
+ ## Running end-to-end tests
22
+
23
+ Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
24
+
25
+ ## Further help
26
+
27
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
docker-compose.yaml DELETED
@@ -1,9 +0,0 @@
1
- version: '3.7'
2
- services:
3
- frontend:
4
- build:
5
- context: .
6
- args:
7
- PROFILE: production
8
- ports:
9
- - '4200:4200' # Port mapping
 
 
 
 
 
 
 
 
 
 
package-lock.json CHANGED
@@ -266,9 +266,9 @@
266
  }
267
  },
268
  "node_modules/@angular/animations": {
269
- "version": "17.3.11",
270
- "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.11.tgz",
271
- "integrity": "sha512-1y1Egag5jbdUSUWVK+KA39N9VFDrzq9ObjbAhrXFlXKa0npBRw5bprEEeLFQMETMP9Mpjbmj2PoASfl4vqj/Iw==",
272
  "dependencies": {
273
  "tslib": "^2.3.0"
274
  },
@@ -276,7 +276,7 @@
276
  "node": "^18.13.0 || >=20.9.0"
277
  },
278
  "peerDependencies": {
279
- "@angular/core": "17.3.11"
280
  }
281
  },
282
  "node_modules/@angular/cdk": {
@@ -330,9 +330,9 @@
330
  }
331
  },
332
  "node_modules/@angular/common": {
333
- "version": "17.3.11",
334
- "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.11.tgz",
335
- "integrity": "sha512-WG+HQjUaQziYLGdbcv2aW+G73uroN5VF9yk4qWYcolW+VB8SV/DOAol8uFVgCF21cIOl5+wfJZvA4r5oG3dYaw==",
336
  "dependencies": {
337
  "tslib": "^2.3.0"
338
  },
@@ -340,14 +340,14 @@
340
  "node": "^18.13.0 || >=20.9.0"
341
  },
342
  "peerDependencies": {
343
- "@angular/core": "17.3.11",
344
  "rxjs": "^6.5.3 || ^7.4.0"
345
  }
346
  },
347
  "node_modules/@angular/compiler": {
348
- "version": "17.3.11",
349
- "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.11.tgz",
350
- "integrity": "sha512-ingRoREDPkeZGSa13DlztSjZgGArNcmsAWjj+f+vQgQekTjkfQD/N+Bix/LSt5ZdbSjHMtrkDMyRPwbNyk5Keg==",
351
  "dependencies": {
352
  "tslib": "^2.3.0"
353
  },
@@ -355,7 +355,7 @@
355
  "node": "^18.13.0 || >=20.9.0"
356
  },
357
  "peerDependencies": {
358
- "@angular/core": "17.3.11"
359
  },
360
  "peerDependenciesMeta": {
361
  "@angular/core": {
@@ -364,9 +364,9 @@
364
  }
365
  },
366
  "node_modules/@angular/compiler-cli": {
367
- "version": "17.3.11",
368
- "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.11.tgz",
369
- "integrity": "sha512-O44H/BKGw0TYq0aNTOKYZfQiTrfjbmcTl8y4UX6C9Xey8hXvijzZOAsjA0TGvvDJxeLR+sxaRF4i9Ihoatnd8g==",
370
  "dev": true,
371
  "dependencies": {
372
  "@babel/core": "7.23.9",
@@ -387,7 +387,7 @@
387
  "node": "^18.13.0 || >=20.9.0"
388
  },
389
  "peerDependencies": {
390
- "@angular/compiler": "17.3.11",
391
  "typescript": ">=5.2 <5.5"
392
  }
393
  },
@@ -437,9 +437,9 @@
437
  }
438
  },
439
  "node_modules/@angular/core": {
440
- "version": "17.3.11",
441
- "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.11.tgz",
442
- "integrity": "sha512-2wPZwXFei3kVxK2ylIH6CdGebrC4kvooFx7qoX+250OITAEFMODJGdh/e3x0DpFUjlRvQtIFQ+YpQlfC5JnL4g==",
443
  "dependencies": {
444
  "tslib": "^2.3.0"
445
  },
@@ -468,9 +468,9 @@
468
  }
469
  },
470
  "node_modules/@angular/forms": {
471
- "version": "17.3.11",
472
- "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.11.tgz",
473
- "integrity": "sha512-719flo/1L64YOAxL3pzszTK+7bczVVOQDXT1khnjb48GVZdBUBwW2D+cFbqSW1VMuWWr2Amwy1lL4YM5S7qPJQ==",
474
  "dependencies": {
475
  "tslib": "^2.3.0"
476
  },
@@ -478,9 +478,9 @@
478
  "node": "^18.13.0 || >=20.9.0"
479
  },
480
  "peerDependencies": {
481
- "@angular/common": "17.3.11",
482
- "@angular/core": "17.3.11",
483
- "@angular/platform-browser": "17.3.11",
484
  "rxjs": "^6.5.3 || ^7.4.0"
485
  }
486
  },
@@ -549,9 +549,9 @@
549
  }
550
  },
551
  "node_modules/@angular/platform-browser": {
552
- "version": "17.3.11",
553
- "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.11.tgz",
554
- "integrity": "sha512-sWjMy8qKH6AOt5YV4OMoPhExCbGdRIPjNSwUrxCm8a8Zz5DamoX3Sib9yRk1etjBuRj+oJySSxISJim2OYXJQQ==",
555
  "dependencies": {
556
  "tslib": "^2.3.0"
557
  },
@@ -559,9 +559,9 @@
559
  "node": "^18.13.0 || >=20.9.0"
560
  },
561
  "peerDependencies": {
562
- "@angular/animations": "17.3.11",
563
- "@angular/common": "17.3.11",
564
- "@angular/core": "17.3.11"
565
  },
566
  "peerDependenciesMeta": {
567
  "@angular/animations": {
@@ -570,9 +570,9 @@
570
  }
571
  },
572
  "node_modules/@angular/platform-browser-dynamic": {
573
- "version": "17.3.11",
574
- "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.11.tgz",
575
- "integrity": "sha512-JPA0enJyJQ5H340WQ2wfXbCCHzjBiAljEDMr/Siw/CzSe0XI8aQYDqKMLUMtRyCdYhNCEYjnBWgXBi9Za9blZg==",
576
  "dependencies": {
577
  "tslib": "^2.3.0"
578
  },
@@ -580,16 +580,16 @@
580
  "node": "^18.13.0 || >=20.9.0"
581
  },
582
  "peerDependencies": {
583
- "@angular/common": "17.3.11",
584
- "@angular/compiler": "17.3.11",
585
- "@angular/core": "17.3.11",
586
- "@angular/platform-browser": "17.3.11"
587
  }
588
  },
589
  "node_modules/@angular/router": {
590
- "version": "17.3.11",
591
- "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.11.tgz",
592
- "integrity": "sha512-A3aU6uHAeJfsfCw1dgNXHn2Kjw/UieRMnFwENkzz96YFCvFPCEZjy/mODuE3zHludMuqVsJhM/uUxWu8ATRTcA==",
593
  "dependencies": {
594
  "tslib": "^2.3.0"
595
  },
@@ -597,9 +597,9 @@
597
  "node": "^18.13.0 || >=20.9.0"
598
  },
599
  "peerDependencies": {
600
- "@angular/common": "17.3.11",
601
- "@angular/core": "17.3.11",
602
- "@angular/platform-browser": "17.3.11",
603
  "rxjs": "^6.5.3 || ^7.4.0"
604
  }
605
  },
@@ -617,9 +617,9 @@
617
  }
618
  },
619
  "node_modules/@babel/compat-data": {
620
- "version": "7.24.9",
621
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz",
622
- "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==",
623
  "dev": true,
624
  "engines": {
625
  "node": ">=6.9.0"
@@ -711,12 +711,12 @@
711
  }
712
  },
713
  "node_modules/@babel/helper-compilation-targets": {
714
- "version": "7.24.8",
715
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz",
716
- "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==",
717
  "dev": true,
718
  "dependencies": {
719
- "@babel/compat-data": "^7.24.8",
720
  "@babel/helper-validator-option": "^7.24.8",
721
  "browserslist": "^4.23.1",
722
  "lru-cache": "^5.1.1",
@@ -736,19 +736,17 @@
736
  }
737
  },
738
  "node_modules/@babel/helper-create-class-features-plugin": {
739
- "version": "7.24.8",
740
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz",
741
- "integrity": "sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==",
742
  "dev": true,
743
  "dependencies": {
744
  "@babel/helper-annotate-as-pure": "^7.24.7",
745
- "@babel/helper-environment-visitor": "^7.24.7",
746
- "@babel/helper-function-name": "^7.24.7",
747
  "@babel/helper-member-expression-to-functions": "^7.24.8",
748
  "@babel/helper-optimise-call-expression": "^7.24.7",
749
- "@babel/helper-replace-supers": "^7.24.7",
750
  "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
751
- "@babel/helper-split-export-declaration": "^7.24.7",
752
  "semver": "^6.3.1"
753
  },
754
  "engines": {
@@ -770,18 +768,6 @@
770
  "node": ">=6.9.0"
771
  }
772
  },
773
- "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": {
774
- "version": "7.24.7",
775
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
776
- "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
777
- "dev": true,
778
- "dependencies": {
779
- "@babel/types": "^7.24.7"
780
- },
781
- "engines": {
782
- "node": ">=6.9.0"
783
- }
784
- },
785
  "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
786
  "version": "6.3.1",
787
  "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
@@ -792,9 +778,9 @@
792
  }
793
  },
794
  "node_modules/@babel/helper-create-regexp-features-plugin": {
795
- "version": "7.24.7",
796
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz",
797
- "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==",
798
  "dev": true,
799
  "dependencies": {
800
  "@babel/helper-annotate-as-pure": "^7.24.7",
@@ -857,31 +843,6 @@
857
  "node": ">=6.9.0"
858
  }
859
  },
860
- "node_modules/@babel/helper-function-name": {
861
- "version": "7.24.7",
862
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz",
863
- "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==",
864
- "dev": true,
865
- "dependencies": {
866
- "@babel/template": "^7.24.7",
867
- "@babel/types": "^7.24.7"
868
- },
869
- "engines": {
870
- "node": ">=6.9.0"
871
- }
872
- },
873
- "node_modules/@babel/helper-hoist-variables": {
874
- "version": "7.24.7",
875
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz",
876
- "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==",
877
- "dev": true,
878
- "dependencies": {
879
- "@babel/types": "^7.24.7"
880
- },
881
- "engines": {
882
- "node": ">=6.9.0"
883
- }
884
- },
885
  "node_modules/@babel/helper-member-expression-to-functions": {
886
  "version": "7.24.8",
887
  "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
@@ -909,16 +870,15 @@
909
  }
910
  },
911
  "node_modules/@babel/helper-module-transforms": {
912
- "version": "7.24.9",
913
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz",
914
- "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==",
915
  "dev": true,
916
  "dependencies": {
917
- "@babel/helper-environment-visitor": "^7.24.7",
918
  "@babel/helper-module-imports": "^7.24.7",
919
  "@babel/helper-simple-access": "^7.24.7",
920
- "@babel/helper-split-export-declaration": "^7.24.7",
921
- "@babel/helper-validator-identifier": "^7.24.7"
922
  },
923
  "engines": {
924
  "node": ">=6.9.0"
@@ -927,18 +887,6 @@
927
  "@babel/core": "^7.0.0"
928
  }
929
  },
930
- "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": {
931
- "version": "7.24.7",
932
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
933
- "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
934
- "dev": true,
935
- "dependencies": {
936
- "@babel/types": "^7.24.7"
937
- },
938
- "engines": {
939
- "node": ">=6.9.0"
940
- }
941
- },
942
  "node_modules/@babel/helper-optimise-call-expression": {
943
  "version": "7.24.7",
944
  "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
@@ -961,14 +909,14 @@
961
  }
962
  },
963
  "node_modules/@babel/helper-remap-async-to-generator": {
964
- "version": "7.24.7",
965
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz",
966
- "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==",
967
  "dev": true,
968
  "dependencies": {
969
  "@babel/helper-annotate-as-pure": "^7.24.7",
970
- "@babel/helper-environment-visitor": "^7.24.7",
971
- "@babel/helper-wrap-function": "^7.24.7"
972
  },
973
  "engines": {
974
  "node": ">=6.9.0"
@@ -990,14 +938,14 @@
990
  }
991
  },
992
  "node_modules/@babel/helper-replace-supers": {
993
- "version": "7.24.7",
994
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz",
995
- "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==",
996
  "dev": true,
997
  "dependencies": {
998
- "@babel/helper-environment-visitor": "^7.24.7",
999
- "@babel/helper-member-expression-to-functions": "^7.24.7",
1000
- "@babel/helper-optimise-call-expression": "^7.24.7"
1001
  },
1002
  "engines": {
1003
  "node": ">=6.9.0"
@@ -1072,28 +1020,27 @@
1072
  }
1073
  },
1074
  "node_modules/@babel/helper-wrap-function": {
1075
- "version": "7.24.7",
1076
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz",
1077
- "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==",
1078
  "dev": true,
1079
  "dependencies": {
1080
- "@babel/helper-function-name": "^7.24.7",
1081
- "@babel/template": "^7.24.7",
1082
- "@babel/traverse": "^7.24.7",
1083
- "@babel/types": "^7.24.7"
1084
  },
1085
  "engines": {
1086
  "node": ">=6.9.0"
1087
  }
1088
  },
1089
  "node_modules/@babel/helpers": {
1090
- "version": "7.24.8",
1091
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz",
1092
- "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==",
1093
  "dev": true,
1094
  "dependencies": {
1095
- "@babel/template": "^7.24.7",
1096
- "@babel/types": "^7.24.8"
1097
  },
1098
  "engines": {
1099
  "node": ">=6.9.0"
@@ -1115,10 +1062,13 @@
1115
  }
1116
  },
1117
  "node_modules/@babel/parser": {
1118
- "version": "7.24.8",
1119
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz",
1120
- "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==",
1121
  "dev": true,
 
 
 
1122
  "bin": {
1123
  "parser": "bin/babel-parser.js"
1124
  },
@@ -1127,12 +1077,12 @@
1127
  }
1128
  },
1129
  "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
1130
- "version": "7.24.7",
1131
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz",
1132
- "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==",
1133
  "dev": true,
1134
  "dependencies": {
1135
- "@babel/helper-plugin-utils": "^7.24.7"
1136
  },
1137
  "engines": {
1138
  "node": ">=6.9.0"
@@ -1159,13 +1109,13 @@
1159
  }
1160
  },
1161
  "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
1162
- "version": "7.24.7",
1163
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz",
1164
- "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==",
1165
  "dev": true,
1166
  "dependencies": {
1167
- "@babel/helper-environment-visitor": "^7.24.7",
1168
- "@babel/helper-plugin-utils": "^7.24.7"
1169
  },
1170
  "engines": {
1171
  "node": ">=6.9.0"
@@ -1487,12 +1437,12 @@
1487
  }
1488
  },
1489
  "node_modules/@babel/plugin-transform-block-scoping": {
1490
- "version": "7.24.7",
1491
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz",
1492
- "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==",
1493
  "dev": true,
1494
  "dependencies": {
1495
- "@babel/helper-plugin-utils": "^7.24.7"
1496
  },
1497
  "engines": {
1498
  "node": ">=6.9.0"
@@ -1535,18 +1485,16 @@
1535
  }
1536
  },
1537
  "node_modules/@babel/plugin-transform-classes": {
1538
- "version": "7.24.8",
1539
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz",
1540
- "integrity": "sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==",
1541
  "dev": true,
1542
  "dependencies": {
1543
  "@babel/helper-annotate-as-pure": "^7.24.7",
1544
  "@babel/helper-compilation-targets": "^7.24.8",
1545
- "@babel/helper-environment-visitor": "^7.24.7",
1546
- "@babel/helper-function-name": "^7.24.7",
1547
  "@babel/helper-plugin-utils": "^7.24.8",
1548
- "@babel/helper-replace-supers": "^7.24.7",
1549
- "@babel/helper-split-export-declaration": "^7.24.7",
1550
  "globals": "^11.1.0"
1551
  },
1552
  "engines": {
@@ -1568,18 +1516,6 @@
1568
  "node": ">=6.9.0"
1569
  }
1570
  },
1571
- "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": {
1572
- "version": "7.24.7",
1573
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
1574
- "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
1575
- "dev": true,
1576
- "dependencies": {
1577
- "@babel/types": "^7.24.7"
1578
- },
1579
- "engines": {
1580
- "node": ">=6.9.0"
1581
- }
1582
- },
1583
  "node_modules/@babel/plugin-transform-computed-properties": {
1584
  "version": "7.24.7",
1585
  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
@@ -1707,14 +1643,14 @@
1707
  }
1708
  },
1709
  "node_modules/@babel/plugin-transform-function-name": {
1710
- "version": "7.24.7",
1711
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz",
1712
- "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==",
1713
  "dev": true,
1714
  "dependencies": {
1715
- "@babel/helper-compilation-targets": "^7.24.7",
1716
- "@babel/helper-function-name": "^7.24.7",
1717
- "@babel/helper-plugin-utils": "^7.24.7"
1718
  },
1719
  "engines": {
1720
  "node": ">=6.9.0"
@@ -1740,12 +1676,12 @@
1740
  }
1741
  },
1742
  "node_modules/@babel/plugin-transform-literals": {
1743
- "version": "7.24.7",
1744
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz",
1745
- "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==",
1746
  "dev": true,
1747
  "dependencies": {
1748
- "@babel/helper-plugin-utils": "^7.24.7"
1749
  },
1750
  "engines": {
1751
  "node": ">=6.9.0"
@@ -1819,15 +1755,15 @@
1819
  }
1820
  },
1821
  "node_modules/@babel/plugin-transform-modules-systemjs": {
1822
- "version": "7.24.7",
1823
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz",
1824
- "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==",
1825
  "dev": true,
1826
  "dependencies": {
1827
- "@babel/helper-hoist-variables": "^7.24.7",
1828
- "@babel/helper-module-transforms": "^7.24.7",
1829
- "@babel/helper-plugin-utils": "^7.24.7",
1830
- "@babel/helper-validator-identifier": "^7.24.7"
1831
  },
1832
  "engines": {
1833
  "node": ">=6.9.0"
@@ -2393,33 +2329,30 @@
2393
  }
2394
  },
2395
  "node_modules/@babel/template": {
2396
- "version": "7.24.7",
2397
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
2398
- "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==",
2399
  "dev": true,
2400
  "dependencies": {
2401
  "@babel/code-frame": "^7.24.7",
2402
- "@babel/parser": "^7.24.7",
2403
- "@babel/types": "^7.24.7"
2404
  },
2405
  "engines": {
2406
  "node": ">=6.9.0"
2407
  }
2408
  },
2409
  "node_modules/@babel/traverse": {
2410
- "version": "7.24.8",
2411
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz",
2412
- "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==",
2413
  "dev": true,
2414
  "dependencies": {
2415
  "@babel/code-frame": "^7.24.7",
2416
- "@babel/generator": "^7.24.8",
2417
- "@babel/helper-environment-visitor": "^7.24.7",
2418
- "@babel/helper-function-name": "^7.24.7",
2419
- "@babel/helper-hoist-variables": "^7.24.7",
2420
- "@babel/helper-split-export-declaration": "^7.24.7",
2421
- "@babel/parser": "^7.24.8",
2422
- "@babel/types": "^7.24.8",
2423
  "debug": "^4.3.1",
2424
  "globals": "^11.1.0"
2425
  },
@@ -2428,12 +2361,12 @@
2428
  }
2429
  },
2430
  "node_modules/@babel/traverse/node_modules/@babel/generator": {
2431
- "version": "7.24.9",
2432
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.9.tgz",
2433
- "integrity": "sha512-G8v3jRg+z8IwY1jHFxvCNhOPYPterE4XljNgdGTYfSTtzzwjIswIzIaSPSLs3R7yFuqnqNeay5rjICfqVr+/6A==",
2434
  "dev": true,
2435
  "dependencies": {
2436
- "@babel/types": "^7.24.9",
2437
  "@jridgewell/gen-mapping": "^0.3.5",
2438
  "@jridgewell/trace-mapping": "^0.3.25",
2439
  "jsesc": "^2.5.1"
@@ -2442,22 +2375,10 @@
2442
  "node": ">=6.9.0"
2443
  }
2444
  },
2445
- "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": {
2446
- "version": "7.24.7",
2447
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
2448
- "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
2449
- "dev": true,
2450
- "dependencies": {
2451
- "@babel/types": "^7.24.7"
2452
- },
2453
- "engines": {
2454
- "node": ">=6.9.0"
2455
- }
2456
- },
2457
  "node_modules/@babel/types": {
2458
- "version": "7.24.9",
2459
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz",
2460
- "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==",
2461
  "dev": true,
2462
  "dependencies": {
2463
  "@babel/helper-string-parser": "^7.24.8",
@@ -4148,9 +4069,9 @@
4148
  }
4149
  },
4150
  "node_modules/@rollup/rollup-android-arm-eabi": {
4151
- "version": "4.18.1",
4152
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz",
4153
- "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==",
4154
  "cpu": [
4155
  "arm"
4156
  ],
@@ -4161,9 +4082,9 @@
4161
  ]
4162
  },
4163
  "node_modules/@rollup/rollup-android-arm64": {
4164
- "version": "4.18.1",
4165
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz",
4166
- "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==",
4167
  "cpu": [
4168
  "arm64"
4169
  ],
@@ -4174,9 +4095,9 @@
4174
  ]
4175
  },
4176
  "node_modules/@rollup/rollup-darwin-arm64": {
4177
- "version": "4.18.1",
4178
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz",
4179
- "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==",
4180
  "cpu": [
4181
  "arm64"
4182
  ],
@@ -4187,9 +4108,9 @@
4187
  ]
4188
  },
4189
  "node_modules/@rollup/rollup-darwin-x64": {
4190
- "version": "4.18.1",
4191
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz",
4192
- "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==",
4193
  "cpu": [
4194
  "x64"
4195
  ],
@@ -4200,9 +4121,9 @@
4200
  ]
4201
  },
4202
  "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
4203
- "version": "4.18.1",
4204
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz",
4205
- "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==",
4206
  "cpu": [
4207
  "arm"
4208
  ],
@@ -4213,9 +4134,9 @@
4213
  ]
4214
  },
4215
  "node_modules/@rollup/rollup-linux-arm-musleabihf": {
4216
- "version": "4.18.1",
4217
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz",
4218
- "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==",
4219
  "cpu": [
4220
  "arm"
4221
  ],
@@ -4226,9 +4147,9 @@
4226
  ]
4227
  },
4228
  "node_modules/@rollup/rollup-linux-arm64-gnu": {
4229
- "version": "4.18.1",
4230
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz",
4231
- "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==",
4232
  "cpu": [
4233
  "arm64"
4234
  ],
@@ -4239,9 +4160,9 @@
4239
  ]
4240
  },
4241
  "node_modules/@rollup/rollup-linux-arm64-musl": {
4242
- "version": "4.18.1",
4243
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz",
4244
- "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==",
4245
  "cpu": [
4246
  "arm64"
4247
  ],
@@ -4252,9 +4173,9 @@
4252
  ]
4253
  },
4254
  "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
4255
- "version": "4.18.1",
4256
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz",
4257
- "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==",
4258
  "cpu": [
4259
  "ppc64"
4260
  ],
@@ -4265,9 +4186,9 @@
4265
  ]
4266
  },
4267
  "node_modules/@rollup/rollup-linux-riscv64-gnu": {
4268
- "version": "4.18.1",
4269
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz",
4270
- "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==",
4271
  "cpu": [
4272
  "riscv64"
4273
  ],
@@ -4278,9 +4199,9 @@
4278
  ]
4279
  },
4280
  "node_modules/@rollup/rollup-linux-s390x-gnu": {
4281
- "version": "4.18.1",
4282
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz",
4283
- "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==",
4284
  "cpu": [
4285
  "s390x"
4286
  ],
@@ -4291,9 +4212,9 @@
4291
  ]
4292
  },
4293
  "node_modules/@rollup/rollup-linux-x64-gnu": {
4294
- "version": "4.18.1",
4295
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz",
4296
- "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==",
4297
  "cpu": [
4298
  "x64"
4299
  ],
@@ -4304,9 +4225,9 @@
4304
  ]
4305
  },
4306
  "node_modules/@rollup/rollup-linux-x64-musl": {
4307
- "version": "4.18.1",
4308
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz",
4309
- "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==",
4310
  "cpu": [
4311
  "x64"
4312
  ],
@@ -4317,9 +4238,9 @@
4317
  ]
4318
  },
4319
  "node_modules/@rollup/rollup-win32-arm64-msvc": {
4320
- "version": "4.18.1",
4321
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz",
4322
- "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==",
4323
  "cpu": [
4324
  "arm64"
4325
  ],
@@ -4330,9 +4251,9 @@
4330
  ]
4331
  },
4332
  "node_modules/@rollup/rollup-win32-ia32-msvc": {
4333
- "version": "4.18.1",
4334
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz",
4335
- "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==",
4336
  "cpu": [
4337
  "ia32"
4338
  ],
@@ -4343,9 +4264,9 @@
4343
  ]
4344
  },
4345
  "node_modules/@rollup/rollup-win32-x64-msvc": {
4346
- "version": "4.18.1",
4347
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz",
4348
- "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==",
4349
  "cpu": [
4350
  "x64"
4351
  ],
@@ -4560,9 +4481,9 @@
4560
  }
4561
  },
4562
  "node_modules/@types/eslint": {
4563
- "version": "8.56.10",
4564
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
4565
- "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
4566
  "dev": true,
4567
  "dependencies": {
4568
  "@types/estree": "*",
@@ -4616,9 +4537,9 @@
4616
  "dev": true
4617
  },
4618
  "node_modules/@types/http-proxy": {
4619
- "version": "1.17.14",
4620
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz",
4621
- "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==",
4622
  "dev": true,
4623
  "dependencies": {
4624
  "@types/node": "*"
@@ -4643,12 +4564,12 @@
4643
  "dev": true
4644
  },
4645
  "node_modules/@types/node": {
4646
- "version": "20.14.10",
4647
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz",
4648
- "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==",
4649
  "dev": true,
4650
  "dependencies": {
4651
- "undici-types": "~5.26.4"
4652
  }
4653
  },
4654
  "node_modules/@types/node-forge": {
@@ -4718,9 +4639,9 @@
4718
  }
4719
  },
4720
  "node_modules/@types/ws": {
4721
- "version": "8.5.11",
4722
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.11.tgz",
4723
- "integrity": "sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w==",
4724
  "dev": true,
4725
  "dependencies": {
4726
  "@types/node": "*"
@@ -5440,9 +5361,9 @@
5440
  }
5441
  },
5442
  "node_modules/browserslist": {
5443
- "version": "4.23.2",
5444
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz",
5445
- "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==",
5446
  "dev": true,
5447
  "funding": [
5448
  {
@@ -5459,9 +5380,9 @@
5459
  }
5460
  ],
5461
  "dependencies": {
5462
- "caniuse-lite": "^1.0.30001640",
5463
- "electron-to-chromium": "^1.4.820",
5464
- "node-releases": "^2.0.14",
5465
  "update-browserslist-db": "^1.1.0"
5466
  },
5467
  "bin": {
@@ -5621,9 +5542,9 @@
5621
  }
5622
  },
5623
  "node_modules/caniuse-lite": {
5624
- "version": "1.0.30001642",
5625
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz",
5626
- "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==",
5627
  "dev": true,
5628
  "funding": [
5629
  {
@@ -6060,12 +5981,12 @@
6060
  }
6061
  },
6062
  "node_modules/core-js-compat": {
6063
- "version": "3.37.1",
6064
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
6065
- "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
6066
  "dev": true,
6067
  "dependencies": {
6068
- "browserslist": "^4.23.0"
6069
  },
6070
  "funding": {
6071
  "type": "opencollective",
@@ -6340,9 +6261,9 @@
6340
  }
6341
  },
6342
  "node_modules/debug": {
6343
- "version": "4.3.5",
6344
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
6345
- "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
6346
  "dev": true,
6347
  "dependencies": {
6348
  "ms": "2.1.2"
@@ -6541,9 +6462,9 @@
6541
  "dev": true
6542
  },
6543
  "node_modules/electron-to-chromium": {
6544
- "version": "1.4.827",
6545
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.827.tgz",
6546
- "integrity": "sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==",
6547
  "dev": true
6548
  },
6549
  "node_modules/emoji-regex": {
@@ -6624,9 +6545,9 @@
6624
  }
6625
  },
6626
  "node_modules/enhanced-resolve": {
6627
- "version": "5.17.0",
6628
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz",
6629
- "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==",
6630
  "dev": true,
6631
  "dependencies": {
6632
  "graceful-fs": "^4.2.4",
@@ -7216,9 +7137,9 @@
7216
  }
7217
  },
7218
  "node_modules/foreground-child": {
7219
- "version": "3.2.1",
7220
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
7221
- "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
7222
  "dev": true,
7223
  "dependencies": {
7224
  "cross-spawn": "^7.0.0",
@@ -7861,9 +7782,9 @@
7861
  }
7862
  },
7863
  "node_modules/immutable": {
7864
- "version": "4.3.6",
7865
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz",
7866
- "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==",
7867
  "dev": true
7868
  },
7869
  "node_modules/import-fresh": {
@@ -8020,9 +7941,9 @@
8020
  }
8021
  },
8022
  "node_modules/is-core-module": {
8023
- "version": "2.14.0",
8024
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz",
8025
- "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==",
8026
  "dev": true,
8027
  "dependencies": {
8028
  "hasown": "^2.0.2"
@@ -8464,9 +8385,9 @@
8464
  ]
8465
  },
8466
  "node_modules/karma": {
8467
- "version": "6.4.3",
8468
- "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz",
8469
- "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==",
8470
  "dev": true,
8471
  "dependencies": {
8472
  "@colors/colors": "1.5.0",
@@ -8693,9 +8614,9 @@
8693
  }
8694
  },
8695
  "node_modules/launch-editor": {
8696
- "version": "2.8.0",
8697
- "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz",
8698
- "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==",
8699
  "dev": true,
8700
  "dependencies": {
8701
  "picocolors": "^1.0.0",
@@ -9264,9 +9185,9 @@
9264
  "dev": true
9265
  },
9266
  "node_modules/minipass-json-stream": {
9267
- "version": "1.0.1",
9268
- "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz",
9269
- "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==",
9270
  "dev": true,
9271
  "dependencies": {
9272
  "jsonparse": "^1.3.1",
@@ -9639,9 +9560,9 @@
9639
  }
9640
  },
9641
  "node_modules/node-releases": {
9642
- "version": "2.0.14",
9643
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
9644
- "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
9645
  "dev": true
9646
  },
9647
  "node_modules/nopt": {
@@ -11031,9 +10952,9 @@
11031
  }
11032
  },
11033
  "node_modules/rollup": {
11034
- "version": "4.18.1",
11035
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz",
11036
- "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==",
11037
  "dev": true,
11038
  "dependencies": {
11039
  "@types/estree": "1.0.5"
@@ -11046,22 +10967,22 @@
11046
  "npm": ">=8.0.0"
11047
  },
11048
  "optionalDependencies": {
11049
- "@rollup/rollup-android-arm-eabi": "4.18.1",
11050
- "@rollup/rollup-android-arm64": "4.18.1",
11051
- "@rollup/rollup-darwin-arm64": "4.18.1",
11052
- "@rollup/rollup-darwin-x64": "4.18.1",
11053
- "@rollup/rollup-linux-arm-gnueabihf": "4.18.1",
11054
- "@rollup/rollup-linux-arm-musleabihf": "4.18.1",
11055
- "@rollup/rollup-linux-arm64-gnu": "4.18.1",
11056
- "@rollup/rollup-linux-arm64-musl": "4.18.1",
11057
- "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1",
11058
- "@rollup/rollup-linux-riscv64-gnu": "4.18.1",
11059
- "@rollup/rollup-linux-s390x-gnu": "4.18.1",
11060
- "@rollup/rollup-linux-x64-gnu": "4.18.1",
11061
- "@rollup/rollup-linux-x64-musl": "4.18.1",
11062
- "@rollup/rollup-win32-arm64-msvc": "4.18.1",
11063
- "@rollup/rollup-win32-ia32-msvc": "4.18.1",
11064
- "@rollup/rollup-win32-x64-msvc": "4.18.1",
11065
  "fsevents": "~2.3.2"
11066
  }
11067
  },
@@ -12265,9 +12186,9 @@
12265
  }
12266
  },
12267
  "node_modules/undici-types": {
12268
- "version": "5.26.5",
12269
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
12270
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
12271
  "dev": true
12272
  },
12273
  "node_modules/unicode-canonical-property-names-ecmascript": {
@@ -13430,9 +13351,9 @@
13430
  }
13431
  },
13432
  "node_modules/zone.js": {
13433
- "version": "0.14.7",
13434
- "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.7.tgz",
13435
- "integrity": "sha512-0w6DGkX2BPuiK/NLf+4A8FLE43QwBfuqz2dVgi/40Rj1WmqUskCqj329O/pwrqFJLG5X8wkeG2RhIAro441xtg=="
13436
  }
13437
  }
13438
  }
 
266
  }
267
  },
268
  "node_modules/@angular/animations": {
269
+ "version": "17.3.12",
270
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.12.tgz",
271
+ "integrity": "sha512-9hsdWF4gRRcVJtPcCcYLaX1CIyM9wUu6r+xRl6zU5hq8qhl35hig6ounz7CXFAzLf0WDBdM16bPHouVGaG76lg==",
272
  "dependencies": {
273
  "tslib": "^2.3.0"
274
  },
 
276
  "node": "^18.13.0 || >=20.9.0"
277
  },
278
  "peerDependencies": {
279
+ "@angular/core": "17.3.12"
280
  }
281
  },
282
  "node_modules/@angular/cdk": {
 
330
  }
331
  },
332
  "node_modules/@angular/common": {
333
+ "version": "17.3.12",
334
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.12.tgz",
335
+ "integrity": "sha512-vabJzvrx76XXFrm1RJZ6o/CyG32piTB/1sfFfKHdlH1QrmArb8It4gyk9oEjZ1IkAD0HvBWlfWmn+T6Vx3pdUw==",
336
  "dependencies": {
337
  "tslib": "^2.3.0"
338
  },
 
340
  "node": "^18.13.0 || >=20.9.0"
341
  },
342
  "peerDependencies": {
343
+ "@angular/core": "17.3.12",
344
  "rxjs": "^6.5.3 || ^7.4.0"
345
  }
346
  },
347
  "node_modules/@angular/compiler": {
348
+ "version": "17.3.12",
349
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.12.tgz",
350
+ "integrity": "sha512-vwI8oOL/gM+wPnptOVeBbMfZYwzRxQsovojZf+Zol9szl0k3SZ3FycWlxxXZGFu3VIEfrP6pXplTmyODS/Lt1w==",
351
  "dependencies": {
352
  "tslib": "^2.3.0"
353
  },
 
355
  "node": "^18.13.0 || >=20.9.0"
356
  },
357
  "peerDependencies": {
358
+ "@angular/core": "17.3.12"
359
  },
360
  "peerDependenciesMeta": {
361
  "@angular/core": {
 
364
  }
365
  },
366
  "node_modules/@angular/compiler-cli": {
367
+ "version": "17.3.12",
368
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.12.tgz",
369
+ "integrity": "sha512-1F8M7nWfChzurb7obbvuE7mJXlHtY1UG58pcwcomVtpPb+kPavgAO8OEvJHYBMV+bzSxkXt5UIwL9lt9jHUxZA==",
370
  "dev": true,
371
  "dependencies": {
372
  "@babel/core": "7.23.9",
 
387
  "node": "^18.13.0 || >=20.9.0"
388
  },
389
  "peerDependencies": {
390
+ "@angular/compiler": "17.3.12",
391
  "typescript": ">=5.2 <5.5"
392
  }
393
  },
 
437
  }
438
  },
439
  "node_modules/@angular/core": {
440
+ "version": "17.3.12",
441
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.12.tgz",
442
+ "integrity": "sha512-MuFt5yKi161JmauUta4Dh0m8ofwoq6Ino+KoOtkYMBGsSx+A7dSm+DUxxNwdj7+DNyg3LjVGCFgBFnq4g8z06A==",
443
  "dependencies": {
444
  "tslib": "^2.3.0"
445
  },
 
468
  }
469
  },
470
  "node_modules/@angular/forms": {
471
+ "version": "17.3.12",
472
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.12.tgz",
473
+ "integrity": "sha512-tV6r12Q3yEUlXwpVko4E+XscunTIpPkLbaiDn/MTL3Vxi2LZnsLgHyd/i38HaHN+e/H3B0a1ToSOhV5wf3ay4Q==",
474
  "dependencies": {
475
  "tslib": "^2.3.0"
476
  },
 
478
  "node": "^18.13.0 || >=20.9.0"
479
  },
480
  "peerDependencies": {
481
+ "@angular/common": "17.3.12",
482
+ "@angular/core": "17.3.12",
483
+ "@angular/platform-browser": "17.3.12",
484
  "rxjs": "^6.5.3 || ^7.4.0"
485
  }
486
  },
 
549
  }
550
  },
551
  "node_modules/@angular/platform-browser": {
552
+ "version": "17.3.12",
553
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.12.tgz",
554
+ "integrity": "sha512-DYY04ptWh/ulMHzd+y52WCE8QnEYGeIiW3hEIFjCN8z0kbIdFdUtEB0IK5vjNL3ejyhUmphcpeT5PYf3YXtqWQ==",
555
  "dependencies": {
556
  "tslib": "^2.3.0"
557
  },
 
559
  "node": "^18.13.0 || >=20.9.0"
560
  },
561
  "peerDependencies": {
562
+ "@angular/animations": "17.3.12",
563
+ "@angular/common": "17.3.12",
564
+ "@angular/core": "17.3.12"
565
  },
566
  "peerDependenciesMeta": {
567
  "@angular/animations": {
 
570
  }
571
  },
572
  "node_modules/@angular/platform-browser-dynamic": {
573
+ "version": "17.3.12",
574
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.12.tgz",
575
+ "integrity": "sha512-DQwV7B2x/DRLRDSisngZRdLqHdYbbrqZv2Hmu4ZbnNYaWPC8qvzgE/0CvY+UkDat3nCcsfwsMnlDeB6TL7/IaA==",
576
  "dependencies": {
577
  "tslib": "^2.3.0"
578
  },
 
580
  "node": "^18.13.0 || >=20.9.0"
581
  },
582
  "peerDependencies": {
583
+ "@angular/common": "17.3.12",
584
+ "@angular/compiler": "17.3.12",
585
+ "@angular/core": "17.3.12",
586
+ "@angular/platform-browser": "17.3.12"
587
  }
588
  },
589
  "node_modules/@angular/router": {
590
+ "version": "17.3.12",
591
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.12.tgz",
592
+ "integrity": "sha512-dg7PHBSW9fmPKTVzwvHEeHZPZdpnUqW/U7kj8D29HTP9ur8zZnx9QcnbplwPeYb8yYa62JMnZSEel2X4PxdYBg==",
593
  "dependencies": {
594
  "tslib": "^2.3.0"
595
  },
 
597
  "node": "^18.13.0 || >=20.9.0"
598
  },
599
  "peerDependencies": {
600
+ "@angular/common": "17.3.12",
601
+ "@angular/core": "17.3.12",
602
+ "@angular/platform-browser": "17.3.12",
603
  "rxjs": "^6.5.3 || ^7.4.0"
604
  }
605
  },
 
617
  }
618
  },
619
  "node_modules/@babel/compat-data": {
620
+ "version": "7.25.2",
621
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz",
622
+ "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==",
623
  "dev": true,
624
  "engines": {
625
  "node": ">=6.9.0"
 
711
  }
712
  },
713
  "node_modules/@babel/helper-compilation-targets": {
714
+ "version": "7.25.2",
715
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
716
+ "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
717
  "dev": true,
718
  "dependencies": {
719
+ "@babel/compat-data": "^7.25.2",
720
  "@babel/helper-validator-option": "^7.24.8",
721
  "browserslist": "^4.23.1",
722
  "lru-cache": "^5.1.1",
 
736
  }
737
  },
738
  "node_modules/@babel/helper-create-class-features-plugin": {
739
+ "version": "7.25.0",
740
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz",
741
+ "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==",
742
  "dev": true,
743
  "dependencies": {
744
  "@babel/helper-annotate-as-pure": "^7.24.7",
 
 
745
  "@babel/helper-member-expression-to-functions": "^7.24.8",
746
  "@babel/helper-optimise-call-expression": "^7.24.7",
747
+ "@babel/helper-replace-supers": "^7.25.0",
748
  "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
749
+ "@babel/traverse": "^7.25.0",
750
  "semver": "^6.3.1"
751
  },
752
  "engines": {
 
768
  "node": ">=6.9.0"
769
  }
770
  },
 
 
 
 
 
 
 
 
 
 
 
 
771
  "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
772
  "version": "6.3.1",
773
  "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
 
778
  }
779
  },
780
  "node_modules/@babel/helper-create-regexp-features-plugin": {
781
+ "version": "7.25.2",
782
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz",
783
+ "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==",
784
  "dev": true,
785
  "dependencies": {
786
  "@babel/helper-annotate-as-pure": "^7.24.7",
 
843
  "node": ">=6.9.0"
844
  }
845
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
846
  "node_modules/@babel/helper-member-expression-to-functions": {
847
  "version": "7.24.8",
848
  "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
 
870
  }
871
  },
872
  "node_modules/@babel/helper-module-transforms": {
873
+ "version": "7.25.2",
874
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
875
+ "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
876
  "dev": true,
877
  "dependencies": {
 
878
  "@babel/helper-module-imports": "^7.24.7",
879
  "@babel/helper-simple-access": "^7.24.7",
880
+ "@babel/helper-validator-identifier": "^7.24.7",
881
+ "@babel/traverse": "^7.25.2"
882
  },
883
  "engines": {
884
  "node": ">=6.9.0"
 
887
  "@babel/core": "^7.0.0"
888
  }
889
  },
 
 
 
 
 
 
 
 
 
 
 
 
890
  "node_modules/@babel/helper-optimise-call-expression": {
891
  "version": "7.24.7",
892
  "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
 
909
  }
910
  },
911
  "node_modules/@babel/helper-remap-async-to-generator": {
912
+ "version": "7.25.0",
913
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz",
914
+ "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==",
915
  "dev": true,
916
  "dependencies": {
917
  "@babel/helper-annotate-as-pure": "^7.24.7",
918
+ "@babel/helper-wrap-function": "^7.25.0",
919
+ "@babel/traverse": "^7.25.0"
920
  },
921
  "engines": {
922
  "node": ">=6.9.0"
 
938
  }
939
  },
940
  "node_modules/@babel/helper-replace-supers": {
941
+ "version": "7.25.0",
942
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz",
943
+ "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==",
944
  "dev": true,
945
  "dependencies": {
946
+ "@babel/helper-member-expression-to-functions": "^7.24.8",
947
+ "@babel/helper-optimise-call-expression": "^7.24.7",
948
+ "@babel/traverse": "^7.25.0"
949
  },
950
  "engines": {
951
  "node": ">=6.9.0"
 
1020
  }
1021
  },
1022
  "node_modules/@babel/helper-wrap-function": {
1023
+ "version": "7.25.0",
1024
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz",
1025
+ "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==",
1026
  "dev": true,
1027
  "dependencies": {
1028
+ "@babel/template": "^7.25.0",
1029
+ "@babel/traverse": "^7.25.0",
1030
+ "@babel/types": "^7.25.0"
 
1031
  },
1032
  "engines": {
1033
  "node": ">=6.9.0"
1034
  }
1035
  },
1036
  "node_modules/@babel/helpers": {
1037
+ "version": "7.25.0",
1038
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz",
1039
+ "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==",
1040
  "dev": true,
1041
  "dependencies": {
1042
+ "@babel/template": "^7.25.0",
1043
+ "@babel/types": "^7.25.0"
1044
  },
1045
  "engines": {
1046
  "node": ">=6.9.0"
 
1062
  }
1063
  },
1064
  "node_modules/@babel/parser": {
1065
+ "version": "7.25.3",
1066
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz",
1067
+ "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
1068
  "dev": true,
1069
+ "dependencies": {
1070
+ "@babel/types": "^7.25.2"
1071
+ },
1072
  "bin": {
1073
  "parser": "bin/babel-parser.js"
1074
  },
 
1077
  }
1078
  },
1079
  "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
1080
+ "version": "7.25.0",
1081
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz",
1082
+ "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==",
1083
  "dev": true,
1084
  "dependencies": {
1085
+ "@babel/helper-plugin-utils": "^7.24.8"
1086
  },
1087
  "engines": {
1088
  "node": ">=6.9.0"
 
1109
  }
1110
  },
1111
  "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
1112
+ "version": "7.25.0",
1113
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz",
1114
+ "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==",
1115
  "dev": true,
1116
  "dependencies": {
1117
+ "@babel/helper-plugin-utils": "^7.24.8",
1118
+ "@babel/traverse": "^7.25.0"
1119
  },
1120
  "engines": {
1121
  "node": ">=6.9.0"
 
1437
  }
1438
  },
1439
  "node_modules/@babel/plugin-transform-block-scoping": {
1440
+ "version": "7.25.0",
1441
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz",
1442
+ "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==",
1443
  "dev": true,
1444
  "dependencies": {
1445
+ "@babel/helper-plugin-utils": "^7.24.8"
1446
  },
1447
  "engines": {
1448
  "node": ">=6.9.0"
 
1485
  }
1486
  },
1487
  "node_modules/@babel/plugin-transform-classes": {
1488
+ "version": "7.25.0",
1489
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz",
1490
+ "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==",
1491
  "dev": true,
1492
  "dependencies": {
1493
  "@babel/helper-annotate-as-pure": "^7.24.7",
1494
  "@babel/helper-compilation-targets": "^7.24.8",
 
 
1495
  "@babel/helper-plugin-utils": "^7.24.8",
1496
+ "@babel/helper-replace-supers": "^7.25.0",
1497
+ "@babel/traverse": "^7.25.0",
1498
  "globals": "^11.1.0"
1499
  },
1500
  "engines": {
 
1516
  "node": ">=6.9.0"
1517
  }
1518
  },
 
 
 
 
 
 
 
 
 
 
 
 
1519
  "node_modules/@babel/plugin-transform-computed-properties": {
1520
  "version": "7.24.7",
1521
  "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
 
1643
  }
1644
  },
1645
  "node_modules/@babel/plugin-transform-function-name": {
1646
+ "version": "7.25.1",
1647
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz",
1648
+ "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==",
1649
  "dev": true,
1650
  "dependencies": {
1651
+ "@babel/helper-compilation-targets": "^7.24.8",
1652
+ "@babel/helper-plugin-utils": "^7.24.8",
1653
+ "@babel/traverse": "^7.25.1"
1654
  },
1655
  "engines": {
1656
  "node": ">=6.9.0"
 
1676
  }
1677
  },
1678
  "node_modules/@babel/plugin-transform-literals": {
1679
+ "version": "7.25.2",
1680
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz",
1681
+ "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==",
1682
  "dev": true,
1683
  "dependencies": {
1684
+ "@babel/helper-plugin-utils": "^7.24.8"
1685
  },
1686
  "engines": {
1687
  "node": ">=6.9.0"
 
1755
  }
1756
  },
1757
  "node_modules/@babel/plugin-transform-modules-systemjs": {
1758
+ "version": "7.25.0",
1759
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz",
1760
+ "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==",
1761
  "dev": true,
1762
  "dependencies": {
1763
+ "@babel/helper-module-transforms": "^7.25.0",
1764
+ "@babel/helper-plugin-utils": "^7.24.8",
1765
+ "@babel/helper-validator-identifier": "^7.24.7",
1766
+ "@babel/traverse": "^7.25.0"
1767
  },
1768
  "engines": {
1769
  "node": ">=6.9.0"
 
2329
  }
2330
  },
2331
  "node_modules/@babel/template": {
2332
+ "version": "7.25.0",
2333
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
2334
+ "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
2335
  "dev": true,
2336
  "dependencies": {
2337
  "@babel/code-frame": "^7.24.7",
2338
+ "@babel/parser": "^7.25.0",
2339
+ "@babel/types": "^7.25.0"
2340
  },
2341
  "engines": {
2342
  "node": ">=6.9.0"
2343
  }
2344
  },
2345
  "node_modules/@babel/traverse": {
2346
+ "version": "7.25.3",
2347
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz",
2348
+ "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==",
2349
  "dev": true,
2350
  "dependencies": {
2351
  "@babel/code-frame": "^7.24.7",
2352
+ "@babel/generator": "^7.25.0",
2353
+ "@babel/parser": "^7.25.3",
2354
+ "@babel/template": "^7.25.0",
2355
+ "@babel/types": "^7.25.2",
 
 
 
2356
  "debug": "^4.3.1",
2357
  "globals": "^11.1.0"
2358
  },
 
2361
  }
2362
  },
2363
  "node_modules/@babel/traverse/node_modules/@babel/generator": {
2364
+ "version": "7.25.0",
2365
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz",
2366
+ "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==",
2367
  "dev": true,
2368
  "dependencies": {
2369
+ "@babel/types": "^7.25.0",
2370
  "@jridgewell/gen-mapping": "^0.3.5",
2371
  "@jridgewell/trace-mapping": "^0.3.25",
2372
  "jsesc": "^2.5.1"
 
2375
  "node": ">=6.9.0"
2376
  }
2377
  },
 
 
 
 
 
 
 
 
 
 
 
 
2378
  "node_modules/@babel/types": {
2379
+ "version": "7.25.2",
2380
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz",
2381
+ "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
2382
  "dev": true,
2383
  "dependencies": {
2384
  "@babel/helper-string-parser": "^7.24.8",
 
4069
  }
4070
  },
4071
  "node_modules/@rollup/rollup-android-arm-eabi": {
4072
+ "version": "4.20.0",
4073
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz",
4074
+ "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==",
4075
  "cpu": [
4076
  "arm"
4077
  ],
 
4082
  ]
4083
  },
4084
  "node_modules/@rollup/rollup-android-arm64": {
4085
+ "version": "4.20.0",
4086
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz",
4087
+ "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==",
4088
  "cpu": [
4089
  "arm64"
4090
  ],
 
4095
  ]
4096
  },
4097
  "node_modules/@rollup/rollup-darwin-arm64": {
4098
+ "version": "4.20.0",
4099
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz",
4100
+ "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==",
4101
  "cpu": [
4102
  "arm64"
4103
  ],
 
4108
  ]
4109
  },
4110
  "node_modules/@rollup/rollup-darwin-x64": {
4111
+ "version": "4.20.0",
4112
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz",
4113
+ "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==",
4114
  "cpu": [
4115
  "x64"
4116
  ],
 
4121
  ]
4122
  },
4123
  "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
4124
+ "version": "4.20.0",
4125
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz",
4126
+ "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==",
4127
  "cpu": [
4128
  "arm"
4129
  ],
 
4134
  ]
4135
  },
4136
  "node_modules/@rollup/rollup-linux-arm-musleabihf": {
4137
+ "version": "4.20.0",
4138
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz",
4139
+ "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==",
4140
  "cpu": [
4141
  "arm"
4142
  ],
 
4147
  ]
4148
  },
4149
  "node_modules/@rollup/rollup-linux-arm64-gnu": {
4150
+ "version": "4.20.0",
4151
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz",
4152
+ "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==",
4153
  "cpu": [
4154
  "arm64"
4155
  ],
 
4160
  ]
4161
  },
4162
  "node_modules/@rollup/rollup-linux-arm64-musl": {
4163
+ "version": "4.20.0",
4164
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz",
4165
+ "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==",
4166
  "cpu": [
4167
  "arm64"
4168
  ],
 
4173
  ]
4174
  },
4175
  "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
4176
+ "version": "4.20.0",
4177
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz",
4178
+ "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==",
4179
  "cpu": [
4180
  "ppc64"
4181
  ],
 
4186
  ]
4187
  },
4188
  "node_modules/@rollup/rollup-linux-riscv64-gnu": {
4189
+ "version": "4.20.0",
4190
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz",
4191
+ "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==",
4192
  "cpu": [
4193
  "riscv64"
4194
  ],
 
4199
  ]
4200
  },
4201
  "node_modules/@rollup/rollup-linux-s390x-gnu": {
4202
+ "version": "4.20.0",
4203
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz",
4204
+ "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==",
4205
  "cpu": [
4206
  "s390x"
4207
  ],
 
4212
  ]
4213
  },
4214
  "node_modules/@rollup/rollup-linux-x64-gnu": {
4215
+ "version": "4.20.0",
4216
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz",
4217
+ "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==",
4218
  "cpu": [
4219
  "x64"
4220
  ],
 
4225
  ]
4226
  },
4227
  "node_modules/@rollup/rollup-linux-x64-musl": {
4228
+ "version": "4.20.0",
4229
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz",
4230
+ "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==",
4231
  "cpu": [
4232
  "x64"
4233
  ],
 
4238
  ]
4239
  },
4240
  "node_modules/@rollup/rollup-win32-arm64-msvc": {
4241
+ "version": "4.20.0",
4242
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz",
4243
+ "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==",
4244
  "cpu": [
4245
  "arm64"
4246
  ],
 
4251
  ]
4252
  },
4253
  "node_modules/@rollup/rollup-win32-ia32-msvc": {
4254
+ "version": "4.20.0",
4255
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz",
4256
+ "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==",
4257
  "cpu": [
4258
  "ia32"
4259
  ],
 
4264
  ]
4265
  },
4266
  "node_modules/@rollup/rollup-win32-x64-msvc": {
4267
+ "version": "4.20.0",
4268
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz",
4269
+ "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==",
4270
  "cpu": [
4271
  "x64"
4272
  ],
 
4481
  }
4482
  },
4483
  "node_modules/@types/eslint": {
4484
+ "version": "9.6.0",
4485
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz",
4486
+ "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==",
4487
  "dev": true,
4488
  "dependencies": {
4489
  "@types/estree": "*",
 
4537
  "dev": true
4538
  },
4539
  "node_modules/@types/http-proxy": {
4540
+ "version": "1.17.15",
4541
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
4542
+ "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
4543
  "dev": true,
4544
  "dependencies": {
4545
  "@types/node": "*"
 
4564
  "dev": true
4565
  },
4566
  "node_modules/@types/node": {
4567
+ "version": "22.2.0",
4568
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.2.0.tgz",
4569
+ "integrity": "sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==",
4570
  "dev": true,
4571
  "dependencies": {
4572
+ "undici-types": "~6.13.0"
4573
  }
4574
  },
4575
  "node_modules/@types/node-forge": {
 
4639
  }
4640
  },
4641
  "node_modules/@types/ws": {
4642
+ "version": "8.5.12",
4643
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz",
4644
+ "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==",
4645
  "dev": true,
4646
  "dependencies": {
4647
  "@types/node": "*"
 
5361
  }
5362
  },
5363
  "node_modules/browserslist": {
5364
+ "version": "4.23.3",
5365
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz",
5366
+ "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",
5367
  "dev": true,
5368
  "funding": [
5369
  {
 
5380
  }
5381
  ],
5382
  "dependencies": {
5383
+ "caniuse-lite": "^1.0.30001646",
5384
+ "electron-to-chromium": "^1.5.4",
5385
+ "node-releases": "^2.0.18",
5386
  "update-browserslist-db": "^1.1.0"
5387
  },
5388
  "bin": {
 
5542
  }
5543
  },
5544
  "node_modules/caniuse-lite": {
5545
+ "version": "1.0.30001651",
5546
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz",
5547
+ "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==",
5548
  "dev": true,
5549
  "funding": [
5550
  {
 
5981
  }
5982
  },
5983
  "node_modules/core-js-compat": {
5984
+ "version": "3.38.0",
5985
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz",
5986
+ "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==",
5987
  "dev": true,
5988
  "dependencies": {
5989
+ "browserslist": "^4.23.3"
5990
  },
5991
  "funding": {
5992
  "type": "opencollective",
 
6261
  }
6262
  },
6263
  "node_modules/debug": {
6264
+ "version": "4.3.6",
6265
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
6266
+ "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
6267
  "dev": true,
6268
  "dependencies": {
6269
  "ms": "2.1.2"
 
6462
  "dev": true
6463
  },
6464
  "node_modules/electron-to-chromium": {
6465
+ "version": "1.5.6",
6466
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.6.tgz",
6467
+ "integrity": "sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==",
6468
  "dev": true
6469
  },
6470
  "node_modules/emoji-regex": {
 
6545
  }
6546
  },
6547
  "node_modules/enhanced-resolve": {
6548
+ "version": "5.17.1",
6549
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
6550
+ "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
6551
  "dev": true,
6552
  "dependencies": {
6553
  "graceful-fs": "^4.2.4",
 
7137
  }
7138
  },
7139
  "node_modules/foreground-child": {
7140
+ "version": "3.3.0",
7141
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
7142
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
7143
  "dev": true,
7144
  "dependencies": {
7145
  "cross-spawn": "^7.0.0",
 
7782
  }
7783
  },
7784
  "node_modules/immutable": {
7785
+ "version": "4.3.7",
7786
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz",
7787
+ "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==",
7788
  "dev": true
7789
  },
7790
  "node_modules/import-fresh": {
 
7941
  }
7942
  },
7943
  "node_modules/is-core-module": {
7944
+ "version": "2.15.0",
7945
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz",
7946
+ "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==",
7947
  "dev": true,
7948
  "dependencies": {
7949
  "hasown": "^2.0.2"
 
8385
  ]
8386
  },
8387
  "node_modules/karma": {
8388
+ "version": "6.4.4",
8389
+ "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz",
8390
+ "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==",
8391
  "dev": true,
8392
  "dependencies": {
8393
  "@colors/colors": "1.5.0",
 
8614
  }
8615
  },
8616
  "node_modules/launch-editor": {
8617
+ "version": "2.8.1",
8618
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.1.tgz",
8619
+ "integrity": "sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==",
8620
  "dev": true,
8621
  "dependencies": {
8622
  "picocolors": "^1.0.0",
 
9185
  "dev": true
9186
  },
9187
  "node_modules/minipass-json-stream": {
9188
+ "version": "1.0.2",
9189
+ "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz",
9190
+ "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==",
9191
  "dev": true,
9192
  "dependencies": {
9193
  "jsonparse": "^1.3.1",
 
9560
  }
9561
  },
9562
  "node_modules/node-releases": {
9563
+ "version": "2.0.18",
9564
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
9565
+ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
9566
  "dev": true
9567
  },
9568
  "node_modules/nopt": {
 
10952
  }
10953
  },
10954
  "node_modules/rollup": {
10955
+ "version": "4.20.0",
10956
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz",
10957
+ "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==",
10958
  "dev": true,
10959
  "dependencies": {
10960
  "@types/estree": "1.0.5"
 
10967
  "npm": ">=8.0.0"
10968
  },
10969
  "optionalDependencies": {
10970
+ "@rollup/rollup-android-arm-eabi": "4.20.0",
10971
+ "@rollup/rollup-android-arm64": "4.20.0",
10972
+ "@rollup/rollup-darwin-arm64": "4.20.0",
10973
+ "@rollup/rollup-darwin-x64": "4.20.0",
10974
+ "@rollup/rollup-linux-arm-gnueabihf": "4.20.0",
10975
+ "@rollup/rollup-linux-arm-musleabihf": "4.20.0",
10976
+ "@rollup/rollup-linux-arm64-gnu": "4.20.0",
10977
+ "@rollup/rollup-linux-arm64-musl": "4.20.0",
10978
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0",
10979
+ "@rollup/rollup-linux-riscv64-gnu": "4.20.0",
10980
+ "@rollup/rollup-linux-s390x-gnu": "4.20.0",
10981
+ "@rollup/rollup-linux-x64-gnu": "4.20.0",
10982
+ "@rollup/rollup-linux-x64-musl": "4.20.0",
10983
+ "@rollup/rollup-win32-arm64-msvc": "4.20.0",
10984
+ "@rollup/rollup-win32-ia32-msvc": "4.20.0",
10985
+ "@rollup/rollup-win32-x64-msvc": "4.20.0",
10986
  "fsevents": "~2.3.2"
10987
  }
10988
  },
 
12186
  }
12187
  },
12188
  "node_modules/undici-types": {
12189
+ "version": "6.13.0",
12190
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz",
12191
+ "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==",
12192
  "dev": true
12193
  },
12194
  "node_modules/unicode-canonical-property-names-ecmascript": {
 
13351
  }
13352
  },
13353
  "node_modules/zone.js": {
13354
+ "version": "0.14.10",
13355
+ "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz",
13356
+ "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ=="
13357
  }
13358
  }
13359
  }
src/.DS_Store CHANGED
Binary files a/src/.DS_Store and b/src/.DS_Store differ
 
src/app/.DS_Store ADDED
Binary file (6.15 kB). View file
 
src/app/app.routes.ts CHANGED
@@ -7,6 +7,8 @@ import {DatasetsComponent} from "./components/body/datasets/datasets.component";
7
  import {AboutComponent} from "./components/body/about/about.component";
8
  import {TaskComponent} from "./components/body/tasks/task/task.component";
9
  import {SubmittingComponent} from "./components/body/submitting/submitting.component";
 
 
10
 
11
  export const routes: Routes = [
12
  {path: '', component : BodyComponent},
@@ -18,4 +20,5 @@ export const routes: Routes = [
18
  {path: 'about', component: AboutComponent},
19
  {path: 'leaderboards', component: LeaderboardsComponent},
20
  {path: 'leaderboards/:task', component: LeaderboardsComponent},
 
21
  ];
 
7
  import {AboutComponent} from "./components/body/about/about.component";
8
  import {TaskComponent} from "./components/body/tasks/task/task.component";
9
  import {SubmittingComponent} from "./components/body/submitting/submitting.component";
10
+ import {ControlPanelComponent} from "./components/body/control-panel/control-panel.component";
11
+ import {AdminLoginComponent} from "./components/body/control-panel/admin-login/admin-login.component";
12
 
13
  export const routes: Routes = [
14
  {path: '', component : BodyComponent},
 
20
  {path: 'about', component: AboutComponent},
21
  {path: 'leaderboards', component: LeaderboardsComponent},
22
  {path: 'leaderboards/:task', component: LeaderboardsComponent},
23
+ {path: 'control', component: ControlPanelComponent},
24
  ];
src/{assets β†’ app/components}/.DS_Store RENAMED
Binary files a/src/assets/.DS_Store and b/src/app/components/.DS_Store differ
 
src/app/components/body/control-panel/admin-login/admin-login.component.css ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* CSS for the Angular component */
2
+
3
+ .login-container {
4
+ display: flex;
5
+ justify-content: center;
6
+ align-items: center;
7
+ height: 100vh;
8
+ width: 100%;
9
+ padding: 16px;
10
+ box-sizing: border-box;
11
+ }
12
+
13
+ mat-card {
14
+ width: 100%;
15
+ max-width: 400px; /* Optional: Limit the maximum width of the card */
16
+ padding: 24px;
17
+ box-sizing: border-box;
18
+ display: flex;
19
+ justify-content: center;
20
+ align-items: center;
21
+ }
22
+
23
+ .login-content {
24
+ display: flex;
25
+ flex-direction: column;
26
+ align-items: center;
27
+ width: 100%;
28
+ }
29
+
30
+ mat-form-field {
31
+ width: 100%;
32
+ margin-bottom: 16px;
33
+ }
34
+
35
+ button {
36
+ width: 100%;
37
+ margin-top: 8px;
38
+ }
39
+
40
+ mat-label {
41
+ margin-top: 16px;
42
+ text-align: center;
43
+ }
src/app/components/body/control-panel/admin-login/admin-login.component.html ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="login-container">
2
+ <mat-card>
3
+ <div class="login-content">
4
+ <h2>Login</h2>
5
+ <form (ngSubmit)="onSubmit()">
6
+ <mat-form-field appearance="fill">
7
+ <mat-label>Password</mat-label>
8
+ <input
9
+ matInput
10
+ type="password"
11
+ [(ngModel)]="password"
12
+ name="password"
13
+ required
14
+ />
15
+ </mat-form-field>
16
+ <button mat-raised-button color="primary" type="submit">Login</button>
17
+ </form>
18
+ <mat-label *ngIf="(authenticationState | async)">
19
+ {{ (authenticationState | async) }}
20
+ </mat-label>
21
+ </div>
22
+ </mat-card>
23
+ </div>
src/app/components/body/control-panel/admin-login/admin-login.component.spec.ts ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { AdminLoginComponent } from './admin-login.component';
4
+
5
+ describe('AdminLoginComponent', () => {
6
+ let component: AdminLoginComponent;
7
+ let fixture: ComponentFixture<AdminLoginComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ imports: [AdminLoginComponent]
12
+ })
13
+ .compileComponents();
14
+
15
+ fixture = TestBed.createComponent(AdminLoginComponent);
16
+ component = fixture.componentInstance;
17
+ fixture.detectChanges();
18
+ });
19
+
20
+ it('should create', () => {
21
+ expect(component).toBeTruthy();
22
+ });
23
+ });
src/app/components/body/control-panel/admin-login/admin-login.component.ts ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Component } from '@angular/core';
2
+ import {MatCard} from "@angular/material/card";
3
+ import {FormsModule} from "@angular/forms";
4
+ import {MatFormField, MatLabel} from "@angular/material/form-field";
5
+ import {MatButton} from "@angular/material/button";
6
+ import {MatInput} from "@angular/material/input";
7
+ import {AppStateService} from "../../../../state_management/services/app-state.service";
8
+ import {map} from "rxjs";
9
+ import {AsyncPipe, NgIf} from "@angular/common";
10
+
11
+ @Component({
12
+ selector: 'app-admin-login',
13
+ standalone: true,
14
+ imports: [
15
+ MatCard,
16
+ FormsModule,
17
+ MatFormField,
18
+ MatButton,
19
+ MatInput,
20
+ MatLabel,
21
+ NgIf,
22
+ AsyncPipe
23
+ ],
24
+ templateUrl: './admin-login.component.html',
25
+ styleUrl: './admin-login.component.css'
26
+ })
27
+ export class AdminLoginComponent {
28
+ password: string = '';
29
+
30
+ constructor(private stateService: AppStateService) {}
31
+
32
+ authenticationState = this.stateService.state$.pipe(
33
+ map(state => state.adminSessionStatus)
34
+ );
35
+
36
+ onSubmit() {
37
+ this.stateService.authenticate(this.password);
38
+ }
39
+ }
src/app/components/body/control-panel/control-panel.component.css ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .full-width {
2
+ width: 100%;
3
+ }
4
+
5
+ .table-container {
6
+ width: 100%;
7
+ overflow-x: auto;
8
+ margin-top: 16px;
9
+ }
10
+
11
+ .responsive-table {
12
+ min-width: 800px; /* Adjust based on your needs */
13
+ width: 100%;
14
+ table-layout: auto;
15
+ }
16
+
17
+ .mat-header-cell, .mat-cell {
18
+ padding: 8px;
19
+ text-align: left;
20
+ white-space: nowrap;
21
+ }
22
+
23
+ .actions-cell {
24
+ min-width: 220px; /* Adjust this value as necessary */
25
+ }
26
+
27
+ .mat-header-row, .mat-row {
28
+ display: table-row;
29
+ }
30
+
31
+ .mat-header-row.sticky {
32
+ background-color: white; /* Ensure the header has a background */
33
+ position: sticky;
34
+ top: 0;
35
+ z-index: 1;
36
+ }
src/app/components/body/control-panel/control-panel.component.html ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <app-admin-login *ngIf="(authenticationState | async) != 'authenticated'"></app-admin-login>
2
+
3
+ <div *ngIf="(authenticationState | async) == 'authenticated'">
4
+ <!-- Admin Control Panel -->
5
+ <mat-card>
6
+ <button mat-raised-button color="primary" class="full-width" (click)="refresh()">Refresh List</button>
7
+
8
+ <div class="table-container">
9
+ <table mat-table [dataSource]="dataSource" class="mat-elevation-z8 responsive-table">
10
+
11
+ <!-- Team Column -->
12
+ <ng-container matColumnDef="team">
13
+ <mat-header-cell *matHeaderCellDef> Team </mat-header-cell>
14
+ <mat-cell *matCellDef="let entry">
15
+ <span *ngIf="!isEditing(entry)">{{ entry.team }}</span>
16
+ <input *ngIf="isEditing(entry)" [(ngModel)]="entry.team" (keyup.enter)="saveEdit(entry)">
17
+ </mat-cell>
18
+ </ng-container>
19
+
20
+ <!-- Task Column -->
21
+ <ng-container matColumnDef="task">
22
+ <mat-header-cell *matHeaderCellDef> Task </mat-header-cell>
23
+ <mat-cell *matCellDef="let entry">
24
+ <span *ngIf="!isEditing(entry)">{{ entry.task }}</span>
25
+ <input *ngIf="isEditing(entry)" [(ngModel)]="entry.task" (keyup.enter)="saveEdit(entry)">
26
+ </mat-cell>
27
+ </ng-container>
28
+
29
+ <!-- Dataset Column -->
30
+ <ng-container matColumnDef="dataset">
31
+ <mat-header-cell *matHeaderCellDef> Dataset </mat-header-cell>
32
+ <mat-cell *matCellDef="let entry">
33
+ <span *ngIf="!isEditing(entry)">{{ entry.dataset }}</span>
34
+ <input *ngIf="isEditing(entry)" [(ngModel)]="entry.dataset" (keyup.enter)="saveEdit(entry)">
35
+ </mat-cell>
36
+ </ng-container>
37
+
38
+ <!-- Model Column -->
39
+ <ng-container matColumnDef="model">
40
+ <mat-header-cell *matHeaderCellDef> Model </mat-header-cell>
41
+ <mat-cell *matCellDef="let entry">
42
+ <span *ngIf="!isEditing(entry)">{{ entry.model }}</span>
43
+ <input *ngIf="isEditing(entry)" [(ngModel)]="entry.model" (keyup.enter)="saveEdit(entry)">
44
+ </mat-cell>
45
+ </ng-container>
46
+
47
+ <!-- Link Column -->
48
+ <ng-container matColumnDef="link">
49
+ <mat-header-cell *matHeaderCellDef> Link </mat-header-cell>
50
+ <mat-cell *matCellDef="let entry">
51
+ <a *ngIf="!isEditing(entry)" [href]="entry.link" target="_blank">{{ entry.link }}</a>
52
+ <input *ngIf="isEditing(entry)" [(ngModel)]="entry.link" (keyup.enter)="saveEdit(entry)">
53
+ </mat-cell>
54
+ </ng-container>
55
+
56
+ <!-- Email Column -->
57
+ <ng-container matColumnDef="email">
58
+ <mat-header-cell *matHeaderCellDef> Email </mat-header-cell>
59
+ <mat-cell *matCellDef="let entry">
60
+ <span *ngIf="!isEditing(entry)">{{ entry.email }}</span>
61
+ <input *ngIf="isEditing(entry)" [(ngModel)]="entry.email" (keyup.enter)="saveEdit(entry)">
62
+ </mat-cell>
63
+ </ng-container>
64
+
65
+ <!-- Status Column -->
66
+ <ng-container matColumnDef="status">
67
+ <mat-header-cell *matHeaderCellDef> Status </mat-header-cell>
68
+ <mat-cell *matCellDef="let entry">
69
+ <span *ngIf="!isEditing(entry)">{{ entry.status }}</span>
70
+ <input *ngIf="isEditing(entry)" [(ngModel)]="entry.status" (keyup.enter)="saveEdit(entry)">
71
+ </mat-cell>
72
+ </ng-container>
73
+
74
+ <!-- Time Column -->
75
+ <ng-container matColumnDef="time">
76
+ <mat-header-cell *matHeaderCellDef> Time </mat-header-cell>
77
+ <mat-cell *matCellDef="let entry">
78
+ <span *ngIf="!isEditing(entry)">{{ entry.time }}</span>
79
+ <input *ngIf="isEditing(entry)" [(ngModel)]="entry.time" (keyup.enter)="saveEdit(entry)">
80
+ </mat-cell>
81
+ </ng-container>
82
+
83
+ <!-- Is Public Column -->
84
+ <ng-container matColumnDef="is_public">
85
+ <mat-header-cell *matHeaderCellDef> Is Public </mat-header-cell>
86
+ <mat-cell *matCellDef="let entry">
87
+ <span *ngIf="!isEditing(entry)">{{ entry.is_public }}</span>
88
+ <input *ngIf="isEditing(entry)" type="checkbox" [(ngModel)]="entry.is_public" (keyup.enter)="saveEdit(entry)">
89
+ </mat-cell>
90
+ </ng-container>
91
+
92
+ <!-- Accuracy Column -->
93
+ <ng-container matColumnDef="accuracy">
94
+ <mat-header-cell *matHeaderCellDef> Accuracy </mat-header-cell>
95
+ <mat-cell *matCellDef="let entry">
96
+ <span *ngIf="!isEditing(entry)">{{ entry.accuracy | number: '1.2-2' }}</span>
97
+ <input *ngIf="isEditing(entry)" [(ngModel)]="entry.accuracy" (keyup.enter)="saveEdit(entry)">
98
+ </mat-cell>
99
+ </ng-container>
100
+
101
+ <!-- Precision Column -->
102
+ <ng-container matColumnDef="precision">
103
+ <mat-header-cell *matHeaderCellDef> Precision </mat-header-cell>
104
+ <mat-cell *matCellDef="let entry">
105
+ <span *ngIf="!isEditing(entry)">{{ entry.precision | number: '1.2-2' }}</span>
106
+ <input *ngIf="isEditing(entry)" [(ngModel)]="entry.precision" (keyup.enter)="saveEdit(entry)">
107
+ </mat-cell>
108
+ </ng-container>
109
+
110
+ <!-- Recall Column -->
111
+ <ng-container matColumnDef="recall">
112
+ <mat-header-cell *matHeaderCellDef> Recall </mat-header-cell>
113
+ <mat-cell *matCellDef="let entry">
114
+ <span *ngIf="!isEditing(entry)">{{ entry.recall | number: '1.2-2'}}</span>
115
+ <input *ngIf="isEditing(entry)" [(ngModel)]="entry.recall" (keyup.enter)="saveEdit(entry)">
116
+ </mat-cell>
117
+ </ng-container>
118
+
119
+ <!-- F1 Score Column -->
120
+ <ng-container matColumnDef="f1_score">
121
+ <mat-header-cell *matHeaderCellDef> F1 Score </mat-header-cell>
122
+ <mat-cell *matCellDef="let entry">
123
+ <span *ngIf="!isEditing(entry)">{{ entry.f1_score | number: '1.2-2' }}</span>
124
+ <input *ngIf="isEditing(entry)" [(ngModel)]="entry.f1_score" (keyup.enter)="saveEdit(entry)">
125
+ </mat-cell>
126
+ </ng-container>
127
+
128
+ <ng-container matColumnDef="actions">
129
+ <mat-header-cell *matHeaderCellDef class="actions-cell"> Actions </mat-header-cell>
130
+ <mat-cell *matCellDef="let entry" class="actions-cell">
131
+ <button *ngIf="!isEditing(entry)" mat-button (click)="editRow(entry)">Edit</button>
132
+ <button *ngIf="isEditing(entry)" mat-button (click)="saveEdit(entry)">Save</button>
133
+ <button *ngIf="isEditing(entry)" mat-button (click)="cancelEdit(entry)">Cancel</button>
134
+ <button mat-button color="warn" (click)="deleteRow(entry.id)">Delete</button>
135
+ </mat-cell>
136
+ </ng-container>
137
+
138
+ <mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></mat-header-row>
139
+ <mat-row *matRowDef="let row; columns: displayedColumns"></mat-row>
140
+
141
+ </table>
142
+ </div>
143
+ </mat-card>
144
+ </div>
src/app/components/body/control-panel/control-panel.component.spec.ts ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { ControlPanelComponent } from './control-panel.component';
4
+
5
+ describe('ControlPanelComponent', () => {
6
+ let component: ControlPanelComponent;
7
+ let fixture: ComponentFixture<ControlPanelComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ imports: [ControlPanelComponent]
12
+ })
13
+ .compileComponents();
14
+
15
+ fixture = TestBed.createComponent(ControlPanelComponent);
16
+ component = fixture.componentInstance;
17
+ fixture.detectChanges();
18
+ });
19
+
20
+ it('should create', () => {
21
+ expect(component).toBeTruthy();
22
+ });
23
+ });
src/app/components/body/control-panel/control-panel.component.ts ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import {Component, OnInit} from '@angular/core';
2
+ import {AppStateService} from "../../../state_management/services/app-state.service";
3
+ import {map} from "rxjs";
4
+ import {AdminLoginComponent} from "./admin-login/admin-login.component";
5
+ import {AsyncPipe, DecimalPipe, NgIf} from "@angular/common";
6
+ import {MatButton} from "@angular/material/button";
7
+ import {MatCard, MatCardContent} from "@angular/material/card";
8
+ import {ControlPanelEntry} from "../../../state_management/models/control-panel-entry.model";
9
+ import {
10
+ MatCell,
11
+ MatCellDef,
12
+ MatColumnDef,
13
+ MatHeaderCell, MatHeaderCellDef,
14
+ MatHeaderRow,
15
+ MatHeaderRowDef,
16
+ MatRow, MatRowDef, MatTable, MatTableDataSource
17
+ } from "@angular/material/table";
18
+ import {FormsModule} from "@angular/forms";
19
+
20
+ @Component({
21
+ selector: 'app-control-panel',
22
+ standalone: true,
23
+ imports: [
24
+ AdminLoginComponent,
25
+ NgIf,
26
+ AsyncPipe,
27
+ MatButton,
28
+ MatCard,
29
+ MatCardContent,
30
+ MatCell,
31
+ MatCellDef,
32
+ MatColumnDef,
33
+ MatHeaderCell,
34
+ MatHeaderRow,
35
+ MatHeaderRowDef,
36
+ MatRow,
37
+ MatRowDef,
38
+ MatTable,
39
+ FormsModule,
40
+ MatHeaderCellDef,
41
+ DecimalPipe
42
+ ],
43
+ templateUrl: './control-panel.component.html',
44
+ styleUrl: './control-panel.component.css'
45
+ })
46
+ export class ControlPanelComponent implements OnInit {
47
+
48
+ authenticationState = this.stateService.state$.pipe(
49
+ map(state => state.adminSessionStatus)
50
+ );
51
+
52
+ submissions = this.stateService.state$.pipe(
53
+ map(
54
+ state => state.controlPanelSubmissions
55
+ )
56
+ );
57
+
58
+ dataSource = new MatTableDataSource<ControlPanelEntry>();
59
+
60
+ displayedColumns: string[] = [
61
+ 'team', 'task', 'dataset', 'model', 'link', 'email',
62
+ 'status', 'time', 'is_public', 'accuracy', 'precision',
63
+ 'recall', 'f1_score', 'actions' // Including 'actions' for edit/delete/save buttons
64
+ ];
65
+
66
+ editingState: { [key: number]: boolean } = {};
67
+
68
+ constructor(private stateService: AppStateService) {
69
+ }
70
+
71
+ ngOnInit() {
72
+ this.submissions.subscribe(
73
+ data => {
74
+ this.dataSource.data = data;
75
+ }
76
+ )
77
+ this.refresh();
78
+ }
79
+
80
+ refresh() {
81
+ this.stateService.updateControlPanel();
82
+ }
83
+
84
+ editRow(entry: ControlPanelEntry) {
85
+ this.editingState[entry.id] = true;
86
+ }
87
+
88
+ saveEdit(entry: ControlPanelEntry) {
89
+ this.editingState[entry.id] = false;
90
+ // Modify the entry in the local data source
91
+ const index = this.dataSource.data.findIndex(e => e.id === entry.id);
92
+ this.dataSource.data[index] = entry;
93
+ this.stateService.forceUpdateSubmission(entry);
94
+ }
95
+
96
+ deleteRow(id: number) {
97
+ // remove the entry from the local data source
98
+ this.dataSource.data = this.dataSource.data.filter(entry => entry.id !== id);
99
+ this.stateService.deleteSubmission(id);
100
+ }
101
+
102
+ isEditing(entry: ControlPanelEntry): boolean {
103
+ return this.editingState[entry.id] || false;
104
+ }
105
+
106
+ cancelEdit(entry: ControlPanelEntry) {
107
+ this.editingState[entry.id] = false;
108
+ }
109
+
110
+ }
src/app/state_management/models/control-panel-entry.model.ts ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export interface ControlPanelEntry {
2
+ id: number;
3
+ task: string;
4
+ dataset: string;
5
+ model: string;
6
+ link: string;
7
+ team: string;
8
+ email: string;
9
+ status: string;
10
+ time: string;
11
+ is_public: boolean;
12
+ accuracy: number;
13
+ precision: number;
14
+ recall: number;
15
+ f1_score: number;
16
+ }
src/app/state_management/models/leaderboard-entry.model.ts CHANGED
@@ -2,10 +2,8 @@ export interface LeaderboardEntry {
2
  task: string;
3
  dataset: string;
4
  model: string;
5
- size: number;
6
  accuracy: number;
7
  precision: number;
8
  recall: number;
9
  f1_score: number;
10
- overall_score: number;
11
  }
 
2
  task: string;
3
  dataset: string;
4
  model: string;
 
5
  accuracy: number;
6
  precision: number;
7
  recall: number;
8
  f1_score: number;
 
9
  }
src/app/state_management/models/state.model.ts CHANGED
@@ -2,10 +2,14 @@ import {TaskModel} from "./task.mode";
2
  import {DatasetModel} from "./dataset.model";
3
  import {SubmissionEntry} from "./submission-entry.model";
4
  import {LeaderboardEntry} from "./leaderboard-entry.model";
 
 
5
 
6
  export interface StateModel{
7
  leaderboards: LeaderboardEntry[];
8
  submissions: SubmissionEntry[];
9
  datasets: DatasetModel[];
10
  tasks: TaskModel[];
 
 
11
  }
 
2
  import {DatasetModel} from "./dataset.model";
3
  import {SubmissionEntry} from "./submission-entry.model";
4
  import {LeaderboardEntry} from "./leaderboard-entry.model";
5
+ import {ControlPanelEntry} from "./control-panel-entry.model";
6
+ import {Observable} from "rxjs";
7
 
8
  export interface StateModel{
9
  leaderboards: LeaderboardEntry[];
10
  submissions: SubmissionEntry[];
11
  datasets: DatasetModel[];
12
  tasks: TaskModel[];
13
+ controlPanelSubmissions: ControlPanelEntry[];
14
+ adminSessionStatus: string;
15
  }
src/app/state_management/services/app-state.service.ts CHANGED
@@ -1,8 +1,9 @@
1
  import { Injectable } from '@angular/core';
2
  import {environment} from "../../../environments/environment";
3
- import {BehaviorSubject, Observable} from "rxjs";
4
  import {HttpClient} from "@angular/common/http";
5
  import {StateModel} from "../models/state.model";
 
6
 
7
  @Injectable({
8
  providedIn: 'root'
@@ -15,19 +16,30 @@ export class AppStateService {
15
  leaderboards: [],
16
  submissions: [],
17
  datasets: [],
18
- tasks: []
 
 
19
  }
20
  );
21
 
22
  public readonly state$ = this._state.asObservable();
23
 
24
- constructor(public http: HttpClient) {
 
25
  console.log('AppStateService created');
26
  console.log(this._apiUrl)
27
  this.updateTasks();
28
  this.updateDatasets();
29
  this.updateLeaderboards();
30
  this.updateSubmissions();
 
 
 
 
 
 
 
 
31
  }
32
 
33
  private _setState(state: StateModel): void {
@@ -102,4 +114,50 @@ export class AppStateService {
102
  }
103
  );
104
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  }
 
1
  import { Injectable } from '@angular/core';
2
  import {environment} from "../../../environments/environment";
3
+ import {BehaviorSubject, catchError, Observable} from "rxjs";
4
  import {HttpClient} from "@angular/common/http";
5
  import {StateModel} from "../models/state.model";
6
+ import {AuthenticationService} from "./authentication.service";
7
 
8
  @Injectable({
9
  providedIn: 'root'
 
16
  leaderboards: [],
17
  submissions: [],
18
  datasets: [],
19
+ tasks: [],
20
+ controlPanelSubmissions: [],
21
+ adminSessionStatus: ''
22
  }
23
  );
24
 
25
  public readonly state$ = this._state.asObservable();
26
 
27
+ constructor(public http: HttpClient,
28
+ public authService: AuthenticationService) {
29
  console.log('AppStateService created');
30
  console.log(this._apiUrl)
31
  this.updateTasks();
32
  this.updateDatasets();
33
  this.updateLeaderboards();
34
  this.updateSubmissions();
35
+ authService.$authStatus.subscribe(
36
+ (status: string) => {
37
+ this._setState({
38
+ ...this.getState(),
39
+ adminSessionStatus: status
40
+ });
41
+ }
42
+ );
43
  }
44
 
45
  private _setState(state: StateModel): void {
 
114
  }
115
  );
116
  }
117
+
118
+ public authenticate(password : string) {
119
+ this.authService.login(password).subscribe(
120
+ () => {
121
+ this.updateControlPanel();
122
+ }
123
+ );
124
+ }
125
+
126
+ public updateControlPanel() {
127
+ const headers = this.authService.getAuthHeaders();
128
+ this.http.get(`${this._apiUrl}/controlPanelSubmissions`, { headers }).subscribe(
129
+ (data: any) => {
130
+ this._setState({
131
+ ...this.getState(),
132
+ controlPanelSubmissions: data
133
+ });
134
+ }
135
+ );
136
+ }
137
+
138
+ public forceUpdateSubmission(entry: any){
139
+ const headers = this.authService.getAuthHeaders();
140
+ this.http.put(`${this._apiUrl}/controlPanelSubmission/${entry.id}`, entry, { headers }).subscribe(
141
+ () => {
142
+ this.updateControlPanel();
143
+ }
144
+ );
145
+ }
146
+
147
+ public deleteSubmission(id: number){
148
+ const headers = this.authService.getAuthHeaders();
149
+ console.log('Deleting submission with id: ' + id);
150
+ this.http.delete(`${this._apiUrl}/controlPanelSubmission/` + id, { headers })
151
+ .pipe(
152
+ catchError(error => {
153
+ console.log(error);
154
+ return error;
155
+ }
156
+ ))
157
+ .subscribe(
158
+ () => {
159
+ this.updateControlPanel();
160
+ }
161
+ );
162
+ }
163
  }
src/app/state_management/services/authentication.service.spec.ts ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { TestBed } from '@angular/core/testing';
2
+
3
+ import { AuthenticationService } from './authentication.service';
4
+
5
+ describe('AuthenticationService', () => {
6
+ let service: AuthenticationService;
7
+
8
+ beforeEach(() => {
9
+ TestBed.configureTestingModule({});
10
+ service = TestBed.inject(AuthenticationService);
11
+ });
12
+
13
+ it('should be created', () => {
14
+ expect(service).toBeTruthy();
15
+ });
16
+ });
src/app/state_management/services/authentication.service.ts ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import {Injectable} from '@angular/core';
2
+ import {HttpClient, HttpHeaders} from "@angular/common/http";
3
+ import {BehaviorSubject, catchError, Observable, tap, throwError} from "rxjs";
4
+ import {environment} from "../../../environments/environment";
5
+
6
+ @Injectable({
7
+ providedIn: 'root'
8
+ })
9
+ export class AuthenticationService {
10
+
11
+ private readonly apiUrl = environment.apiUrl;
12
+ private token: string | null = this.getTokenFromLocalStorage();
13
+ public $authStatus = new BehaviorSubject<string>(
14
+ this.token !== null ? 'authenticated' : ''
15
+ );
16
+
17
+
18
+ constructor(
19
+ private http: HttpClient
20
+ ) {
21
+
22
+ }
23
+
24
+ private getTokenFromLocalStorage(): string | null {
25
+ try {
26
+ return localStorage.getItem('auth_token');
27
+ } catch (e) {
28
+ return null;
29
+ }
30
+ }
31
+
32
+ public getAuthHeaders(): HttpHeaders {
33
+ return new HttpHeaders({
34
+ 'Content-Type': 'application/json',
35
+ Authorization: `Bearer ${this.token}`,
36
+ });
37
+ }
38
+
39
+ public login(password: string): Observable<{ access_token: string; token_type: string }> {
40
+ // Create the request payload
41
+ const payload = new URLSearchParams();
42
+ payload.set('username', 'admin'); // Username is not used in this case
43
+ payload.set('password', password);
44
+
45
+ // Send POST request to the backend
46
+ return this.http.post<{ access_token: string; token_type: string }>
47
+ (
48
+ this.apiUrl + '/token', payload.toString(),
49
+ {
50
+ headers: {
51
+ 'Content-Type': 'application/x-www-form-urlencoded', // Set content type for form data
52
+ },
53
+ }).pipe(
54
+ tap(response => {
55
+ this.token = response.access_token;
56
+ localStorage.setItem('auth_token', this.token);
57
+ this.$authStatus.next('authenticated');
58
+ }),
59
+ catchError(error => {
60
+ if (error.status === 401) {
61
+ this.$authStatus.next('wrong password');
62
+ } else {
63
+ this.$authStatus.next('server error');
64
+ }
65
+ // Return an observable to continue the stream
66
+ return throwError(() => error);
67
+ })
68
+ );
69
+ }
70
+
71
+ public isAuthenticated(): boolean {
72
+ return this.token !== null;
73
+ }
74
+ }
src/styles.css CHANGED
@@ -2,9 +2,7 @@
2
 
3
  html, body { height: 100%; }
4
  body {
5
- margin-left: 3%;
6
- margin-right: 3%;
7
- margin-top: 0;
8
  font-family: Roboto, "Helvetica Neue", sans-serif;
9
  font-size: 15px;
10
  }
 
2
 
3
  html, body { height: 100%; }
4
  body {
5
+ margin: 1%;
 
 
6
  font-family: Roboto, "Helvetica Neue", sans-serif;
7
  font-size: 15px;
8
  }