admin interface (incomplete)
Massimo Melina committed
Feb 2, 2022 at 00:01 UTC
1a781ec3b0d4932b38b3d1442c7b6cfbdcb130c4
47 files changed
+30467
-54
admin/.gitignore
new
+23
@@ -0,0 +1,23 @@
1
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2
+
3
+# dependencies
4
+/node_modules
5
+/.pnp
6
+.pnp.js
7
+
8
+# testing
9
+/coverage
10
+
11
+# production
12
+/build
13
+
14
+# misc
15
+.DS_Store
16
+.env.local
17
+.env.development.local
18
+.env.test.local
19
+.env.production.local
20
+
21
+npm-debug.log*
22
+yarn-debug.log*
23
+yarn-error.log*
admin/package-lock.json
new
+28653
@@ -0,0 +1,28653 @@
1
+{
2
+ "name": "admin",
3
+ "version": "0.8.0",
4
+ "lockfileVersion": 2,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "admin",
9
+ "version": "0.8.0",
10
+ "dependencies": {
11
+ "@emotion/react": "^11.7.1",
12
+ "@emotion/styled": "^11.6.0",
13
+ "@mui/icons-material": "^5.3.0",
14
+ "@mui/lab": "^5.0.0-alpha.66",
15
+ "@mui/material": "^5.3.0",
16
+ "@mui/styles": "^5.3.0",
17
+ "@mui/x-data-grid": "^5.3.0",
18
+ "@testing-library/jest-dom": "^5.16.1",
19
+ "@testing-library/react": "^12.1.2",
20
+ "@testing-library/user-event": "^13.5.0",
21
+ "@types/jest": "^27.4.0",
22
+ "@types/node": "^16.11.21",
23
+ "@types/react": "^17.0.38",
24
+ "@types/react-dom": "^17.0.11",
25
+ "react": "^17.0.2",
26
+ "react-dom": "^17.0.2",
27
+ "react-router-dom": "^6.2.1",
28
+ "react-scripts": "5.0.0",
29
+ "typescript": "^4.5.5",
30
+ "valtio": "^1.2.9",
31
+ "web-vitals": "^2.1.4"
32
+ }
33
+ },
34
+ "node_modules/@babel/code-frame": {
35
+ "version": "7.16.7",
36
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
37
+ "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
38
+ "dependencies": {
39
+ "@babel/highlight": "^7.16.7"
40
+ },
41
+ "engines": {
42
+ "node": ">=6.9.0"
43
+ }
44
+ },
45
+ "node_modules/@babel/compat-data": {
46
+ "version": "7.16.8",
47
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz",
48
+ "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==",
49
+ "engines": {
50
+ "node": ">=6.9.0"
51
+ }
52
+ },
53
+ "node_modules/@babel/core": {
54
+ "version": "7.16.12",
55
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz",
56
+ "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==",
57
+ "dependencies": {
58
+ "@babel/code-frame": "^7.16.7",
59
+ "@babel/generator": "^7.16.8",
60
+ "@babel/helper-compilation-targets": "^7.16.7",
61
+ "@babel/helper-module-transforms": "^7.16.7",
62
+ "@babel/helpers": "^7.16.7",
63
+ "@babel/parser": "^7.16.12",
64
+ "@babel/template": "^7.16.7",
65
+ "@babel/traverse": "^7.16.10",
66
+ "@babel/types": "^7.16.8",
67
+ "convert-source-map": "^1.7.0",
68
+ "debug": "^4.1.0",
69
+ "gensync": "^1.0.0-beta.2",
70
+ "json5": "^2.1.2",
71
+ "semver": "^6.3.0",
72
+ "source-map": "^0.5.0"
73
+ },
74
+ "engines": {
75
+ "node": ">=6.9.0"
76
+ },
77
+ "funding": {
78
+ "type": "opencollective",
79
+ "url": "https://opencollective.com/babel"
80
+ }
81
+ },
82
+ "node_modules/@babel/core/node_modules/semver": {
83
+ "version": "6.3.0",
84
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
85
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
86
+ "bin": {
87
+ "semver": "bin/semver.js"
88
+ }
89
+ },
90
+ "node_modules/@babel/eslint-parser": {
91
+ "version": "7.16.5",
92
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz",
93
+ "integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==",
94
+ "dependencies": {
95
+ "eslint-scope": "^5.1.1",
96
+ "eslint-visitor-keys": "^2.1.0",
97
+ "semver": "^6.3.0"
98
+ },
99
+ "engines": {
100
+ "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
101
+ },
102
+ "peerDependencies": {
103
+ "@babel/core": ">=7.11.0",
104
+ "eslint": "^7.5.0 || ^8.0.0"
105
+ }
106
+ },
107
+ "node_modules/@babel/eslint-parser/node_modules/eslint-scope": {
108
+ "version": "5.1.1",
109
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
110
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
111
+ "dependencies": {
112
+ "esrecurse": "^4.3.0",
113
+ "estraverse": "^4.1.1"
114
+ },
115
+ "engines": {
116
+ "node": ">=8.0.0"
117
+ }
118
+ },
119
+ "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": {
120
+ "version": "2.1.0",
121
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
122
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
123
+ "engines": {
124
+ "node": ">=10"
125
+ }
126
+ },
127
+ "node_modules/@babel/eslint-parser/node_modules/estraverse": {
128
+ "version": "4.3.0",
129
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
130
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
131
+ "engines": {
132
+ "node": ">=4.0"
133
+ }
134
+ },
135
+ "node_modules/@babel/eslint-parser/node_modules/semver": {
136
+ "version": "6.3.0",
137
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
138
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
139
+ "bin": {
140
+ "semver": "bin/semver.js"
141
+ }
142
+ },
143
+ "node_modules/@babel/generator": {
144
+ "version": "7.16.8",
145
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz",
146
+ "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==",
147
+ "dependencies": {
148
+ "@babel/types": "^7.16.8",
149
+ "jsesc": "^2.5.1",
150
+ "source-map": "^0.5.0"
151
+ },
152
+ "engines": {
153
+ "node": ">=6.9.0"
154
+ }
155
+ },
156
+ "node_modules/@babel/helper-annotate-as-pure": {
157
+ "version": "7.16.7",
158
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
159
+ "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
160
+ "dependencies": {
161
+ "@babel/types": "^7.16.7"
162
+ },
163
+ "engines": {
164
+ "node": ">=6.9.0"
165
+ }
166
+ },
167
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
168
+ "version": "7.16.7",
169
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
170
+ "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==",
171
+ "dependencies": {
172
+ "@babel/helper-explode-assignable-expression": "^7.16.7",
173
+ "@babel/types": "^7.16.7"
174
+ },
175
+ "engines": {
176
+ "node": ">=6.9.0"
177
+ }
178
+ },
179
+ "node_modules/@babel/helper-compilation-targets": {
180
+ "version": "7.16.7",
181
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
182
+ "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==",
183
+ "dependencies": {
184
+ "@babel/compat-data": "^7.16.4",
185
+ "@babel/helper-validator-option": "^7.16.7",
186
+ "browserslist": "^4.17.5",
187
+ "semver": "^6.3.0"
188
+ },
189
+ "engines": {
190
+ "node": ">=6.9.0"
191
+ },
192
+ "peerDependencies": {
193
+ "@babel/core": "^7.0.0"
194
+ }
195
+ },
196
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
197
+ "version": "6.3.0",
198
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
199
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
200
+ "bin": {
201
+ "semver": "bin/semver.js"
202
+ }
203
+ },
204
+ "node_modules/@babel/helper-create-class-features-plugin": {
205
+ "version": "7.16.10",
206
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz",
207
+ "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==",
208
+ "dependencies": {
209
+ "@babel/helper-annotate-as-pure": "^7.16.7",
210
+ "@babel/helper-environment-visitor": "^7.16.7",
211
+ "@babel/helper-function-name": "^7.16.7",
212
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
213
+ "@babel/helper-optimise-call-expression": "^7.16.7",
214
+ "@babel/helper-replace-supers": "^7.16.7",
215
+ "@babel/helper-split-export-declaration": "^7.16.7"
216
+ },
217
+ "engines": {
218
+ "node": ">=6.9.0"
219
+ },
220
+ "peerDependencies": {
221
+ "@babel/core": "^7.0.0"
222
+ }
223
+ },
224
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
225
+ "version": "7.16.7",
226
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz",
227
+ "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==",
228
+ "dependencies": {
229
+ "@babel/helper-annotate-as-pure": "^7.16.7",
230
+ "regexpu-core": "^4.7.1"
231
+ },
232
+ "engines": {
233
+ "node": ">=6.9.0"
234
+ },
235
+ "peerDependencies": {
236
+ "@babel/core": "^7.0.0"
237
+ }
238
+ },
239
+ "node_modules/@babel/helper-define-polyfill-provider": {
240
+ "version": "0.3.1",
241
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
242
+ "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
243
+ "dependencies": {
244
+ "@babel/helper-compilation-targets": "^7.13.0",
245
+ "@babel/helper-module-imports": "^7.12.13",
246
+ "@babel/helper-plugin-utils": "^7.13.0",
247
+ "@babel/traverse": "^7.13.0",
248
+ "debug": "^4.1.1",
249
+ "lodash.debounce": "^4.0.8",
250
+ "resolve": "^1.14.2",
251
+ "semver": "^6.1.2"
252
+ },
253
+ "peerDependencies": {
254
+ "@babel/core": "^7.4.0-0"
255
+ }
256
+ },
257
+ "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": {
258
+ "version": "6.3.0",
259
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
260
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
261
+ "bin": {
262
+ "semver": "bin/semver.js"
263
+ }
264
+ },
265
+ "node_modules/@babel/helper-environment-visitor": {
266
+ "version": "7.16.7",
267
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
268
+ "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
269
+ "dependencies": {
270
+ "@babel/types": "^7.16.7"
271
+ },
272
+ "engines": {
273
+ "node": ">=6.9.0"
274
+ }
275
+ },
276
+ "node_modules/@babel/helper-explode-assignable-expression": {
277
+ "version": "7.16.7",
278
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
279
+ "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==",
280
+ "dependencies": {
281
+ "@babel/types": "^7.16.7"
282
+ },
283
+ "engines": {
284
+ "node": ">=6.9.0"
285
+ }
286
+ },
287
+ "node_modules/@babel/helper-function-name": {
288
+ "version": "7.16.7",
289
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
290
+ "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
291
+ "dependencies": {
292
+ "@babel/helper-get-function-arity": "^7.16.7",
293
+ "@babel/template": "^7.16.7",
294
+ "@babel/types": "^7.16.7"
295
+ },
296
+ "engines": {
297
+ "node": ">=6.9.0"
298
+ }
299
+ },
300
+ "node_modules/@babel/helper-get-function-arity": {
301
+ "version": "7.16.7",
302
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
303
+ "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
304
+ "dependencies": {
305
+ "@babel/types": "^7.16.7"
306
+ },
307
+ "engines": {
308
+ "node": ">=6.9.0"
309
+ }
310
+ },
311
+ "node_modules/@babel/helper-hoist-variables": {
312
+ "version": "7.16.7",
313
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
314
+ "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
315
+ "dependencies": {
316
+ "@babel/types": "^7.16.7"
317
+ },
318
+ "engines": {
319
+ "node": ">=6.9.0"
320
+ }
321
+ },
322
+ "node_modules/@babel/helper-member-expression-to-functions": {
323
+ "version": "7.16.7",
324
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz",
325
+ "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==",
326
+ "dependencies": {
327
+ "@babel/types": "^7.16.7"
328
+ },
329
+ "engines": {
330
+ "node": ">=6.9.0"
331
+ }
332
+ },
333
+ "node_modules/@babel/helper-module-imports": {
334
+ "version": "7.16.7",
335
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
336
+ "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
337
+ "dependencies": {
338
+ "@babel/types": "^7.16.7"
339
+ },
340
+ "engines": {
341
+ "node": ">=6.9.0"
342
+ }
343
+ },
344
+ "node_modules/@babel/helper-module-transforms": {
345
+ "version": "7.16.7",
346
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
347
+ "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==",
348
+ "dependencies": {
349
+ "@babel/helper-environment-visitor": "^7.16.7",
350
+ "@babel/helper-module-imports": "^7.16.7",
351
+ "@babel/helper-simple-access": "^7.16.7",
352
+ "@babel/helper-split-export-declaration": "^7.16.7",
353
+ "@babel/helper-validator-identifier": "^7.16.7",
354
+ "@babel/template": "^7.16.7",
355
+ "@babel/traverse": "^7.16.7",
356
+ "@babel/types": "^7.16.7"
357
+ },
358
+ "engines": {
359
+ "node": ">=6.9.0"
360
+ }
361
+ },
362
+ "node_modules/@babel/helper-optimise-call-expression": {
363
+ "version": "7.16.7",
364
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
365
+ "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
366
+ "dependencies": {
367
+ "@babel/types": "^7.16.7"
368
+ },
369
+ "engines": {
370
+ "node": ">=6.9.0"
371
+ }
372
+ },
373
+ "node_modules/@babel/helper-plugin-utils": {
374
+ "version": "7.16.7",
375
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
376
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
377
+ "engines": {
378
+ "node": ">=6.9.0"
379
+ }
380
+ },
381
+ "node_modules/@babel/helper-remap-async-to-generator": {
382
+ "version": "7.16.8",
383
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz",
384
+ "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==",
385
+ "dependencies": {
386
+ "@babel/helper-annotate-as-pure": "^7.16.7",
387
+ "@babel/helper-wrap-function": "^7.16.8",
388
+ "@babel/types": "^7.16.8"
389
+ },
390
+ "engines": {
391
+ "node": ">=6.9.0"
392
+ }
393
+ },
394
+ "node_modules/@babel/helper-replace-supers": {
395
+ "version": "7.16.7",
396
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
397
+ "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
398
+ "dependencies": {
399
+ "@babel/helper-environment-visitor": "^7.16.7",
400
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
401
+ "@babel/helper-optimise-call-expression": "^7.16.7",
402
+ "@babel/traverse": "^7.16.7",
403
+ "@babel/types": "^7.16.7"
404
+ },
405
+ "engines": {
406
+ "node": ">=6.9.0"
407
+ }
408
+ },
409
+ "node_modules/@babel/helper-simple-access": {
410
+ "version": "7.16.7",
411
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
412
+ "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==",
413
+ "dependencies": {
414
+ "@babel/types": "^7.16.7"
415
+ },
416
+ "engines": {
417
+ "node": ">=6.9.0"
418
+ }
419
+ },
420
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
421
+ "version": "7.16.0",
422
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
423
+ "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
424
+ "dependencies": {
425
+ "@babel/types": "^7.16.0"
426
+ },
427
+ "engines": {
428
+ "node": ">=6.9.0"
429
+ }
430
+ },
431
+ "node_modules/@babel/helper-split-export-declaration": {
432
+ "version": "7.16.7",
433
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
434
+ "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
435
+ "dependencies": {
436
+ "@babel/types": "^7.16.7"
437
+ },
438
+ "engines": {
439
+ "node": ">=6.9.0"
440
+ }
441
+ },
442
+ "node_modules/@babel/helper-validator-identifier": {
443
+ "version": "7.16.7",
444
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
445
+ "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
446
+ "engines": {
447
+ "node": ">=6.9.0"
448
+ }
449
+ },
450
+ "node_modules/@babel/helper-validator-option": {
451
+ "version": "7.16.7",
452
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
453
+ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
454
+ "engines": {
455
+ "node": ">=6.9.0"
456
+ }
457
+ },
458
+ "node_modules/@babel/helper-wrap-function": {
459
+ "version": "7.16.8",
460
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz",
461
+ "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==",
462
+ "dependencies": {
463
+ "@babel/helper-function-name": "^7.16.7",
464
+ "@babel/template": "^7.16.7",
465
+ "@babel/traverse": "^7.16.8",
466
+ "@babel/types": "^7.16.8"
467
+ },
468
+ "engines": {
469
+ "node": ">=6.9.0"
470
+ }
471
+ },
472
+ "node_modules/@babel/helpers": {
473
+ "version": "7.16.7",
474
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz",
475
+ "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==",
476
+ "dependencies": {
477
+ "@babel/template": "^7.16.7",
478
+ "@babel/traverse": "^7.16.7",
479
+ "@babel/types": "^7.16.7"
480
+ },
481
+ "engines": {
482
+ "node": ">=6.9.0"
483
+ }
484
+ },
485
+ "node_modules/@babel/highlight": {
486
+ "version": "7.16.10",
487
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
488
+ "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
489
+ "dependencies": {
490
+ "@babel/helper-validator-identifier": "^7.16.7",
491
+ "chalk": "^2.0.0",
492
+ "js-tokens": "^4.0.0"
493
+ },
494
+ "engines": {
495
+ "node": ">=6.9.0"
496
+ }
497
+ },
498
+ "node_modules/@babel/parser": {
499
+ "version": "7.16.12",
500
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz",
501
+ "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==",
502
+ "bin": {
503
+ "parser": "bin/babel-parser.js"
504
+ },
505
+ "engines": {
506
+ "node": ">=6.0.0"
507
+ }
508
+ },
509
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
510
+ "version": "7.16.7",
511
+ "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.16.7.tgz",
512
+ "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==",
513
+ "dependencies": {
514
+ "@babel/helper-plugin-utils": "^7.16.7"
515
+ },
516
+ "engines": {
517
+ "node": ">=6.9.0"
518
+ },
519
+ "peerDependencies": {
520
+ "@babel/core": "^7.0.0"
521
+ }
522
+ },
523
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
524
+ "version": "7.16.7",
525
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz",
526
+ "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==",
527
+ "dependencies": {
528
+ "@babel/helper-plugin-utils": "^7.16.7",
529
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
530
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7"
531
+ },
532
+ "engines": {
533
+ "node": ">=6.9.0"
534
+ },
535
+ "peerDependencies": {
536
+ "@babel/core": "^7.13.0"
537
+ }
538
+ },
539
+ "node_modules/@babel/plugin-proposal-async-generator-functions": {
540
+ "version": "7.16.8",
541
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz",
542
+ "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==",
543
+ "dependencies": {
544
+ "@babel/helper-plugin-utils": "^7.16.7",
545
+ "@babel/helper-remap-async-to-generator": "^7.16.8",
546
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
547
+ },
548
+ "engines": {
549
+ "node": ">=6.9.0"
550
+ },
551
+ "peerDependencies": {
552
+ "@babel/core": "^7.0.0-0"
553
+ }
554
+ },
555
+ "node_modules/@babel/plugin-proposal-class-properties": {
556
+ "version": "7.16.7",
557
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
558
+ "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==",
559
+ "dependencies": {
560
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
561
+ "@babel/helper-plugin-utils": "^7.16.7"
562
+ },
563
+ "engines": {
564
+ "node": ">=6.9.0"
565
+ },
566
+ "peerDependencies": {
567
+ "@babel/core": "^7.0.0-0"
568
+ }
569
+ },
570
+ "node_modules/@babel/plugin-proposal-class-static-block": {
571
+ "version": "7.16.7",
572
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz",
573
+ "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==",
574
+ "dependencies": {
575
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
576
+ "@babel/helper-plugin-utils": "^7.16.7",
577
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
578
+ },
579
+ "engines": {
580
+ "node": ">=6.9.0"
581
+ },
582
+ "peerDependencies": {
583
+ "@babel/core": "^7.12.0"
584
+ }
585
+ },
586
+ "node_modules/@babel/plugin-proposal-decorators": {
587
+ "version": "7.16.7",
588
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz",
589
+ "integrity": "sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ==",
590
+ "dependencies": {
591
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
592
+ "@babel/helper-plugin-utils": "^7.16.7",
593
+ "@babel/plugin-syntax-decorators": "^7.16.7"
594
+ },
595
+ "engines": {
596
+ "node": ">=6.9.0"
597
+ },
598
+ "peerDependencies": {
599
+ "@babel/core": "^7.0.0-0"
600
+ }
601
+ },
602
+ "node_modules/@babel/plugin-proposal-dynamic-import": {
603
+ "version": "7.16.7",
604
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz",
605
+ "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==",
606
+ "dependencies": {
607
+ "@babel/helper-plugin-utils": "^7.16.7",
608
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
609
+ },
610
+ "engines": {
611
+ "node": ">=6.9.0"
612
+ },
613
+ "peerDependencies": {
614
+ "@babel/core": "^7.0.0-0"
615
+ }
616
+ },
617
+ "node_modules/@babel/plugin-proposal-export-namespace-from": {
618
+ "version": "7.16.7",
619
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz",
620
+ "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==",
621
+ "dependencies": {
622
+ "@babel/helper-plugin-utils": "^7.16.7",
623
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
624
+ },
625
+ "engines": {
626
+ "node": ">=6.9.0"
627
+ },
628
+ "peerDependencies": {
629
+ "@babel/core": "^7.0.0-0"
630
+ }
631
+ },
632
+ "node_modules/@babel/plugin-proposal-json-strings": {
633
+ "version": "7.16.7",
634
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz",
635
+ "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==",
636
+ "dependencies": {
637
+ "@babel/helper-plugin-utils": "^7.16.7",
638
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
639
+ },
640
+ "engines": {
641
+ "node": ">=6.9.0"
642
+ },
643
+ "peerDependencies": {
644
+ "@babel/core": "^7.0.0-0"
645
+ }
646
+ },
647
+ "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
648
+ "version": "7.16.7",
649
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz",
650
+ "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==",
651
+ "dependencies": {
652
+ "@babel/helper-plugin-utils": "^7.16.7",
653
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
654
+ },
655
+ "engines": {
656
+ "node": ">=6.9.0"
657
+ },
658
+ "peerDependencies": {
659
+ "@babel/core": "^7.0.0-0"
660
+ }
661
+ },
662
+ "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
663
+ "version": "7.16.7",
664
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz",
665
+ "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==",
666
+ "dependencies": {
667
+ "@babel/helper-plugin-utils": "^7.16.7",
668
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
669
+ },
670
+ "engines": {
671
+ "node": ">=6.9.0"
672
+ },
673
+ "peerDependencies": {
674
+ "@babel/core": "^7.0.0-0"
675
+ }
676
+ },
677
+ "node_modules/@babel/plugin-proposal-numeric-separator": {
678
+ "version": "7.16.7",
679
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz",
680
+ "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==",
681
+ "dependencies": {
682
+ "@babel/helper-plugin-utils": "^7.16.7",
683
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
684
+ },
685
+ "engines": {
686
+ "node": ">=6.9.0"
687
+ },
688
+ "peerDependencies": {
689
+ "@babel/core": "^7.0.0-0"
690
+ }
691
+ },
692
+ "node_modules/@babel/plugin-proposal-object-rest-spread": {
693
+ "version": "7.16.7",
694
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz",
695
+ "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==",
696
+ "dependencies": {
697
+ "@babel/compat-data": "^7.16.4",
698
+ "@babel/helper-compilation-targets": "^7.16.7",
699
+ "@babel/helper-plugin-utils": "^7.16.7",
700
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
701
+ "@babel/plugin-transform-parameters": "^7.16.7"
702
+ },
703
+ "engines": {
704
+ "node": ">=6.9.0"
705
+ },
706
+ "peerDependencies": {
707
+ "@babel/core": "^7.0.0-0"
708
+ }
709
+ },
710
+ "node_modules/@babel/plugin-proposal-optional-catch-binding": {
711
+ "version": "7.16.7",
712
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
713
+ "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==",
714
+ "dependencies": {
715
+ "@babel/helper-plugin-utils": "^7.16.7",
716
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
717
+ },
718
+ "engines": {
719
+ "node": ">=6.9.0"
720
+ },
721
+ "peerDependencies": {
722
+ "@babel/core": "^7.0.0-0"
723
+ }
724
+ },
725
+ "node_modules/@babel/plugin-proposal-optional-chaining": {
726
+ "version": "7.16.7",
727
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz",
728
+ "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==",
729
+ "dependencies": {
730
+ "@babel/helper-plugin-utils": "^7.16.7",
731
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
732
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
733
+ },
734
+ "engines": {
735
+ "node": ">=6.9.0"
736
+ },
737
+ "peerDependencies": {
738
+ "@babel/core": "^7.0.0-0"
739
+ }
740
+ },
741
+ "node_modules/@babel/plugin-proposal-private-methods": {
742
+ "version": "7.16.11",
743
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz",
744
+ "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==",
745
+ "dependencies": {
746
+ "@babel/helper-create-class-features-plugin": "^7.16.10",
747
+ "@babel/helper-plugin-utils": "^7.16.7"
748
+ },
749
+ "engines": {
750
+ "node": ">=6.9.0"
751
+ },
752
+ "peerDependencies": {
753
+ "@babel/core": "^7.0.0-0"
754
+ }
755
+ },
756
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
757
+ "version": "7.16.7",
758
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz",
759
+ "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==",
760
+ "dependencies": {
761
+ "@babel/helper-annotate-as-pure": "^7.16.7",
762
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
763
+ "@babel/helper-plugin-utils": "^7.16.7",
764
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
765
+ },
766
+ "engines": {
767
+ "node": ">=6.9.0"
768
+ },
769
+ "peerDependencies": {
770
+ "@babel/core": "^7.0.0-0"
771
+ }
772
+ },
773
+ "node_modules/@babel/plugin-proposal-unicode-property-regex": {
774
+ "version": "7.16.7",
775
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz",
776
+ "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==",
777
+ "dependencies": {
778
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
779
+ "@babel/helper-plugin-utils": "^7.16.7"
780
+ },
781
+ "engines": {
782
+ "node": ">=4"
783
+ },
784
+ "peerDependencies": {
785
+ "@babel/core": "^7.0.0-0"
786
+ }
787
+ },
788
+ "node_modules/@babel/plugin-syntax-async-generators": {
789
+ "version": "7.8.4",
790
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
791
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
792
+ "dependencies": {
793
+ "@babel/helper-plugin-utils": "^7.8.0"
794
+ },
795
+ "peerDependencies": {
796
+ "@babel/core": "^7.0.0-0"
797
+ }
798
+ },
799
+ "node_modules/@babel/plugin-syntax-bigint": {
800
+ "version": "7.8.3",
801
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
802
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
803
+ "dependencies": {
804
+ "@babel/helper-plugin-utils": "^7.8.0"
805
+ },
806
+ "peerDependencies": {
807
+ "@babel/core": "^7.0.0-0"
808
+ }
809
+ },
810
+ "node_modules/@babel/plugin-syntax-class-properties": {
811
+ "version": "7.12.13",
812
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
813
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
814
+ "dependencies": {
815
+ "@babel/helper-plugin-utils": "^7.12.13"
816
+ },
817
+ "peerDependencies": {
818
+ "@babel/core": "^7.0.0-0"
819
+ }
820
+ },
821
+ "node_modules/@babel/plugin-syntax-class-static-block": {
822
+ "version": "7.14.5",
823
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
824
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
825
+ "dependencies": {
826
+ "@babel/helper-plugin-utils": "^7.14.5"
827
+ },
828
+ "engines": {
829
+ "node": ">=6.9.0"
830
+ },
831
+ "peerDependencies": {
832
+ "@babel/core": "^7.0.0-0"
833
+ }
834
+ },
835
+ "node_modules/@babel/plugin-syntax-decorators": {
836
+ "version": "7.16.7",
837
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz",
838
+ "integrity": "sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw==",
839
+ "dependencies": {
840
+ "@babel/helper-plugin-utils": "^7.16.7"
841
+ },
842
+ "engines": {
843
+ "node": ">=6.9.0"
844
+ },
845
+ "peerDependencies": {
846
+ "@babel/core": "^7.0.0-0"
847
+ }
848
+ },
849
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
850
+ "version": "7.8.3",
851
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
852
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
853
+ "dependencies": {
854
+ "@babel/helper-plugin-utils": "^7.8.0"
855
+ },
856
+ "peerDependencies": {
857
+ "@babel/core": "^7.0.0-0"
858
+ }
859
+ },
860
+ "node_modules/@babel/plugin-syntax-export-namespace-from": {
861
+ "version": "7.8.3",
862
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
863
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
864
+ "dependencies": {
865
+ "@babel/helper-plugin-utils": "^7.8.3"
866
+ },
867
+ "peerDependencies": {
868
+ "@babel/core": "^7.0.0-0"
869
+ }
870
+ },
871
+ "node_modules/@babel/plugin-syntax-flow": {
872
+ "version": "7.16.7",
873
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz",
874
+ "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==",
875
+ "dependencies": {
876
+ "@babel/helper-plugin-utils": "^7.16.7"
877
+ },
878
+ "engines": {
879
+ "node": ">=6.9.0"
880
+ },
881
+ "peerDependencies": {
882
+ "@babel/core": "^7.0.0-0"
883
+ }
884
+ },
885
+ "node_modules/@babel/plugin-syntax-import-meta": {
886
+ "version": "7.10.4",
887
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
888
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
889
+ "dependencies": {
890
+ "@babel/helper-plugin-utils": "^7.10.4"
891
+ },
892
+ "peerDependencies": {
893
+ "@babel/core": "^7.0.0-0"
894
+ }
895
+ },
896
+ "node_modules/@babel/plugin-syntax-json-strings": {
897
+ "version": "7.8.3",
898
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
899
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
900
+ "dependencies": {
901
+ "@babel/helper-plugin-utils": "^7.8.0"
902
+ },
903
+ "peerDependencies": {
904
+ "@babel/core": "^7.0.0-0"
905
+ }
906
+ },
907
+ "node_modules/@babel/plugin-syntax-jsx": {
908
+ "version": "7.16.7",
909
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz",
910
+ "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==",
911
+ "dependencies": {
912
+ "@babel/helper-plugin-utils": "^7.16.7"
913
+ },
914
+ "engines": {
915
+ "node": ">=6.9.0"
916
+ },
917
+ "peerDependencies": {
918
+ "@babel/core": "^7.0.0-0"
919
+ }
920
+ },
921
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
922
+ "version": "7.10.4",
923
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
924
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
925
+ "dependencies": {
926
+ "@babel/helper-plugin-utils": "^7.10.4"
927
+ },
928
+ "peerDependencies": {
929
+ "@babel/core": "^7.0.0-0"
930
+ }
931
+ },
932
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
933
+ "version": "7.8.3",
934
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
935
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
936
+ "dependencies": {
937
+ "@babel/helper-plugin-utils": "^7.8.0"
938
+ },
939
+ "peerDependencies": {
940
+ "@babel/core": "^7.0.0-0"
941
+ }
942
+ },
943
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
944
+ "version": "7.10.4",
945
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
946
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
947
+ "dependencies": {
948
+ "@babel/helper-plugin-utils": "^7.10.4"
949
+ },
950
+ "peerDependencies": {
951
+ "@babel/core": "^7.0.0-0"
952
+ }
953
+ },
954
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
955
+ "version": "7.8.3",
956
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
957
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
958
+ "dependencies": {
959
+ "@babel/helper-plugin-utils": "^7.8.0"
960
+ },
961
+ "peerDependencies": {
962
+ "@babel/core": "^7.0.0-0"
963
+ }
964
+ },
965
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
966
+ "version": "7.8.3",
967
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
968
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
969
+ "dependencies": {
970
+ "@babel/helper-plugin-utils": "^7.8.0"
971
+ },
972
+ "peerDependencies": {
973
+ "@babel/core": "^7.0.0-0"
974
+ }
975
+ },
976
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
977
+ "version": "7.8.3",
978
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
979
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
980
+ "dependencies": {
981
+ "@babel/helper-plugin-utils": "^7.8.0"
982
+ },
983
+ "peerDependencies": {
984
+ "@babel/core": "^7.0.0-0"
985
+ }
986
+ },
987
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
988
+ "version": "7.14.5",
989
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
990
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
991
+ "dependencies": {
992
+ "@babel/helper-plugin-utils": "^7.14.5"
993
+ },
994
+ "engines": {
995
+ "node": ">=6.9.0"
996
+ },
997
+ "peerDependencies": {
998
+ "@babel/core": "^7.0.0-0"
999
+ }
1000
+ },
1001
+ "node_modules/@babel/plugin-syntax-top-level-await": {
1002
+ "version": "7.14.5",
1003
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
1004
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
1005
+ "dependencies": {
1006
+ "@babel/helper-plugin-utils": "^7.14.5"
1007
+ },
1008
+ "engines": {
1009
+ "node": ">=6.9.0"
1010
+ },
1011
+ "peerDependencies": {
1012
+ "@babel/core": "^7.0.0-0"
1013
+ }
1014
+ },
1015
+ "node_modules/@babel/plugin-syntax-typescript": {
1016
+ "version": "7.16.7",
1017
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz",
1018
+ "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==",
1019
+ "dependencies": {
1020
+ "@babel/helper-plugin-utils": "^7.16.7"
1021
+ },
1022
+ "engines": {
1023
+ "node": ">=6.9.0"
1024
+ },
1025
+ "peerDependencies": {
1026
+ "@babel/core": "^7.0.0-0"
1027
+ }
1028
+ },
1029
+ "node_modules/@babel/plugin-transform-arrow-functions": {
1030
+ "version": "7.16.7",
1031
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz",
1032
+ "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==",
1033
+ "dependencies": {
1034
+ "@babel/helper-plugin-utils": "^7.16.7"
1035
+ },
1036
+ "engines": {
1037
+ "node": ">=6.9.0"
1038
+ },
1039
+ "peerDependencies": {
1040
+ "@babel/core": "^7.0.0-0"
1041
+ }
1042
+ },
1043
+ "node_modules/@babel/plugin-transform-async-to-generator": {
1044
+ "version": "7.16.8",
1045
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz",
1046
+ "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==",
1047
+ "dependencies": {
1048
+ "@babel/helper-module-imports": "^7.16.7",
1049
+ "@babel/helper-plugin-utils": "^7.16.7",
1050
+ "@babel/helper-remap-async-to-generator": "^7.16.8"
1051
+ },
1052
+ "engines": {
1053
+ "node": ">=6.9.0"
1054
+ },
1055
+ "peerDependencies": {
1056
+ "@babel/core": "^7.0.0-0"
1057
+ }
1058
+ },
1059
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
1060
+ "version": "7.16.7",
1061
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
1062
+ "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==",
1063
+ "dependencies": {
1064
+ "@babel/helper-plugin-utils": "^7.16.7"
1065
+ },
1066
+ "engines": {
1067
+ "node": ">=6.9.0"
1068
+ },
1069
+ "peerDependencies": {
1070
+ "@babel/core": "^7.0.0-0"
1071
+ }
1072
+ },
1073
+ "node_modules/@babel/plugin-transform-block-scoping": {
1074
+ "version": "7.16.7",
1075
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz",
1076
+ "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==",
1077
+ "dependencies": {
1078
+ "@babel/helper-plugin-utils": "^7.16.7"
1079
+ },
1080
+ "engines": {
1081
+ "node": ">=6.9.0"
1082
+ },
1083
+ "peerDependencies": {
1084
+ "@babel/core": "^7.0.0-0"
1085
+ }
1086
+ },
1087
+ "node_modules/@babel/plugin-transform-classes": {
1088
+ "version": "7.16.7",
1089
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz",
1090
+ "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==",
1091
+ "dependencies": {
1092
+ "@babel/helper-annotate-as-pure": "^7.16.7",
1093
+ "@babel/helper-environment-visitor": "^7.16.7",
1094
+ "@babel/helper-function-name": "^7.16.7",
1095
+ "@babel/helper-optimise-call-expression": "^7.16.7",
1096
+ "@babel/helper-plugin-utils": "^7.16.7",
1097
+ "@babel/helper-replace-supers": "^7.16.7",
1098
+ "@babel/helper-split-export-declaration": "^7.16.7",
1099
+ "globals": "^11.1.0"
1100
+ },
1101
+ "engines": {
1102
+ "node": ">=6.9.0"
1103
+ },
1104
+ "peerDependencies": {
1105
+ "@babel/core": "^7.0.0-0"
1106
+ }
1107
+ },
1108
+ "node_modules/@babel/plugin-transform-computed-properties": {
1109
+ "version": "7.16.7",
1110
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz",
1111
+ "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==",
1112
+ "dependencies": {
1113
+ "@babel/helper-plugin-utils": "^7.16.7"
1114
+ },
1115
+ "engines": {
1116
+ "node": ">=6.9.0"
1117
+ },
1118
+ "peerDependencies": {
1119
+ "@babel/core": "^7.0.0-0"
1120
+ }
1121
+ },
1122
+ "node_modules/@babel/plugin-transform-destructuring": {
1123
+ "version": "7.16.7",
1124
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz",
1125
+ "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==",
1126
+ "dependencies": {
1127
+ "@babel/helper-plugin-utils": "^7.16.7"
1128
+ },
1129
+ "engines": {
1130
+ "node": ">=6.9.0"
1131
+ },
1132
+ "peerDependencies": {
1133
+ "@babel/core": "^7.0.0-0"
1134
+ }
1135
+ },
1136
+ "node_modules/@babel/plugin-transform-dotall-regex": {
1137
+ "version": "7.16.7",
1138
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz",
1139
+ "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==",
1140
+ "dependencies": {
1141
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
1142
+ "@babel/helper-plugin-utils": "^7.16.7"
1143
+ },
1144
+ "engines": {
1145
+ "node": ">=6.9.0"
1146
+ },
1147
+ "peerDependencies": {
1148
+ "@babel/core": "^7.0.0-0"
1149
+ }
1150
+ },
1151
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
1152
+ "version": "7.16.7",
1153
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz",
1154
+ "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==",
1155
+ "dependencies": {
1156
+ "@babel/helper-plugin-utils": "^7.16.7"
1157
+ },
1158
+ "engines": {
1159
+ "node": ">=6.9.0"
1160
+ },
1161
+ "peerDependencies": {
1162
+ "@babel/core": "^7.0.0-0"
1163
+ }
1164
+ },
1165
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
1166
+ "version": "7.16.7",
1167
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
1168
+ "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==",
1169
+ "dependencies": {
1170
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7",
1171
+ "@babel/helper-plugin-utils": "^7.16.7"
1172
+ },
1173
+ "engines": {
1174
+ "node": ">=6.9.0"
1175
+ },
1176
+ "peerDependencies": {
1177
+ "@babel/core": "^7.0.0-0"
1178
+ }
1179
+ },
1180
+ "node_modules/@babel/plugin-transform-flow-strip-types": {
1181
+ "version": "7.16.7",
1182
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz",
1183
+ "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==",
1184
+ "dependencies": {
1185
+ "@babel/helper-plugin-utils": "^7.16.7",
1186
+ "@babel/plugin-syntax-flow": "^7.16.7"
1187
+ },
1188
+ "engines": {
1189
+ "node": ">=6.9.0"
1190
+ },
1191
+ "peerDependencies": {
1192
+ "@babel/core": "^7.0.0-0"
1193
+ }
1194
+ },
1195
+ "node_modules/@babel/plugin-transform-for-of": {
1196
+ "version": "7.16.7",
1197
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz",
1198
+ "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==",
1199
+ "dependencies": {
1200
+ "@babel/helper-plugin-utils": "^7.16.7"
1201
+ },
1202
+ "engines": {
1203
+ "node": ">=6.9.0"
1204
+ },
1205
+ "peerDependencies": {
1206
+ "@babel/core": "^7.0.0-0"
1207
+ }
1208
+ },
1209
+ "node_modules/@babel/plugin-transform-function-name": {
1210
+ "version": "7.16.7",
1211
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz",
1212
+ "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==",
1213
+ "dependencies": {
1214
+ "@babel/helper-compilation-targets": "^7.16.7",
1215
+ "@babel/helper-function-name": "^7.16.7",
1216
+ "@babel/helper-plugin-utils": "^7.16.7"
1217
+ },
1218
+ "engines": {
1219
+ "node": ">=6.9.0"
1220
+ },
1221
+ "peerDependencies": {
1222
+ "@babel/core": "^7.0.0-0"
1223
+ }
1224
+ },
1225
+ "node_modules/@babel/plugin-transform-literals": {
1226
+ "version": "7.16.7",
1227
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz",
1228
+ "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==",
1229
+ "dependencies": {
1230
+ "@babel/helper-plugin-utils": "^7.16.7"
1231
+ },
1232
+ "engines": {
1233
+ "node": ">=6.9.0"
1234
+ },
1235
+ "peerDependencies": {
1236
+ "@babel/core": "^7.0.0-0"
1237
+ }
1238
+ },
1239
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
1240
+ "version": "7.16.7",
1241
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz",
1242
+ "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==",
1243
+ "dependencies": {
1244
+ "@babel/helper-plugin-utils": "^7.16.7"
1245
+ },
1246
+ "engines": {
1247
+ "node": ">=6.9.0"
1248
+ },
1249
+ "peerDependencies": {
1250
+ "@babel/core": "^7.0.0-0"
1251
+ }
1252
+ },
1253
+ "node_modules/@babel/plugin-transform-modules-amd": {
1254
+ "version": "7.16.7",
1255
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz",
1256
+ "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==",
1257
+ "dependencies": {
1258
+ "@babel/helper-module-transforms": "^7.16.7",
1259
+ "@babel/helper-plugin-utils": "^7.16.7",
1260
+ "babel-plugin-dynamic-import-node": "^2.3.3"
1261
+ },
1262
+ "engines": {
1263
+ "node": ">=6.9.0"
1264
+ },
1265
+ "peerDependencies": {
1266
+ "@babel/core": "^7.0.0-0"
1267
+ }
1268
+ },
1269
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
1270
+ "version": "7.16.8",
1271
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz",
1272
+ "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==",
1273
+ "dependencies": {
1274
+ "@babel/helper-module-transforms": "^7.16.7",
1275
+ "@babel/helper-plugin-utils": "^7.16.7",
1276
+ "@babel/helper-simple-access": "^7.16.7",
1277
+ "babel-plugin-dynamic-import-node": "^2.3.3"
1278
+ },
1279
+ "engines": {
1280
+ "node": ">=6.9.0"
1281
+ },
1282
+ "peerDependencies": {
1283
+ "@babel/core": "^7.0.0-0"
1284
+ }
1285
+ },
1286
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
1287
+ "version": "7.16.7",
1288
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz",
1289
+ "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==",
1290
+ "dependencies": {
1291
+ "@babel/helper-hoist-variables": "^7.16.7",
1292
+ "@babel/helper-module-transforms": "^7.16.7",
1293
+ "@babel/helper-plugin-utils": "^7.16.7",
1294
+ "@babel/helper-validator-identifier": "^7.16.7",
1295
+ "babel-plugin-dynamic-import-node": "^2.3.3"
1296
+ },
1297
+ "engines": {
1298
+ "node": ">=6.9.0"
1299
+ },
1300
+ "peerDependencies": {
1301
+ "@babel/core": "^7.0.0-0"
1302
+ }
1303
+ },
1304
+ "node_modules/@babel/plugin-transform-modules-umd": {
1305
+ "version": "7.16.7",
1306
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz",
1307
+ "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==",
1308
+ "dependencies": {
1309
+ "@babel/helper-module-transforms": "^7.16.7",
1310
+ "@babel/helper-plugin-utils": "^7.16.7"
1311
+ },
1312
+ "engines": {
1313
+ "node": ">=6.9.0"
1314
+ },
1315
+ "peerDependencies": {
1316
+ "@babel/core": "^7.0.0-0"
1317
+ }
1318
+ },
1319
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
1320
+ "version": "7.16.8",
1321
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz",
1322
+ "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==",
1323
+ "dependencies": {
1324
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7"
1325
+ },
1326
+ "engines": {
1327
+ "node": ">=6.9.0"
1328
+ },
1329
+ "peerDependencies": {
1330
+ "@babel/core": "^7.0.0"
1331
+ }
1332
+ },
1333
+ "node_modules/@babel/plugin-transform-new-target": {
1334
+ "version": "7.16.7",
1335
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz",
1336
+ "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==",
1337
+ "dependencies": {
1338
+ "@babel/helper-plugin-utils": "^7.16.7"
1339
+ },
1340
+ "engines": {
1341
+ "node": ">=6.9.0"
1342
+ },
1343
+ "peerDependencies": {
1344
+ "@babel/core": "^7.0.0-0"
1345
+ }
1346
+ },
1347
+ "node_modules/@babel/plugin-transform-object-super": {
1348
+ "version": "7.16.7",
1349
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
1350
+ "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==",
1351
+ "dependencies": {
1352
+ "@babel/helper-plugin-utils": "^7.16.7",
1353
+ "@babel/helper-replace-supers": "^7.16.7"
1354
+ },
1355
+ "engines": {
1356
+ "node": ">=6.9.0"
1357
+ },
1358
+ "peerDependencies": {
1359
+ "@babel/core": "^7.0.0-0"
1360
+ }
1361
+ },
1362
+ "node_modules/@babel/plugin-transform-parameters": {
1363
+ "version": "7.16.7",
1364
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz",
1365
+ "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==",
1366
+ "dependencies": {
1367
+ "@babel/helper-plugin-utils": "^7.16.7"
1368
+ },
1369
+ "engines": {
1370
+ "node": ">=6.9.0"
1371
+ },
1372
+ "peerDependencies": {
1373
+ "@babel/core": "^7.0.0-0"
1374
+ }
1375
+ },
1376
+ "node_modules/@babel/plugin-transform-property-literals": {
1377
+ "version": "7.16.7",
1378
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
1379
+ "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==",
1380
+ "dependencies": {
1381
+ "@babel/helper-plugin-utils": "^7.16.7"
1382
+ },
1383
+ "engines": {
1384
+ "node": ">=6.9.0"
1385
+ },
1386
+ "peerDependencies": {
1387
+ "@babel/core": "^7.0.0-0"
1388
+ }
1389
+ },
1390
+ "node_modules/@babel/plugin-transform-react-constant-elements": {
1391
+ "version": "7.16.7",
1392
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.7.tgz",
1393
+ "integrity": "sha512-lF+cfsyTgwWkcw715J88JhMYJ5GpysYNLhLP1PkvkhTRN7B3e74R/1KsDxFxhRpSn0UUD3IWM4GvdBR2PEbbQQ==",
1394
+ "dependencies": {
1395
+ "@babel/helper-plugin-utils": "^7.16.7"
1396
+ },
1397
+ "engines": {
1398
+ "node": ">=6.9.0"
1399
+ },
1400
+ "peerDependencies": {
1401
+ "@babel/core": "^7.0.0-0"
1402
+ }
1403
+ },
1404
+ "node_modules/@babel/plugin-transform-react-display-name": {
1405
+ "version": "7.16.7",
1406
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz",
1407
+ "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==",
1408
+ "dependencies": {
1409
+ "@babel/helper-plugin-utils": "^7.16.7"
1410
+ },
1411
+ "engines": {
1412
+ "node": ">=6.9.0"
1413
+ },
1414
+ "peerDependencies": {
1415
+ "@babel/core": "^7.0.0-0"
1416
+ }
1417
+ },
1418
+ "node_modules/@babel/plugin-transform-react-jsx": {
1419
+ "version": "7.16.7",
1420
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz",
1421
+ "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==",
1422
+ "dependencies": {
1423
+ "@babel/helper-annotate-as-pure": "^7.16.7",
1424
+ "@babel/helper-module-imports": "^7.16.7",
1425
+ "@babel/helper-plugin-utils": "^7.16.7",
1426
+ "@babel/plugin-syntax-jsx": "^7.16.7",
1427
+ "@babel/types": "^7.16.7"
1428
+ },
1429
+ "engines": {
1430
+ "node": ">=6.9.0"
1431
+ },
1432
+ "peerDependencies": {
1433
+ "@babel/core": "^7.0.0-0"
1434
+ }
1435
+ },
1436
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
1437
+ "version": "7.16.7",
1438
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz",
1439
+ "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==",
1440
+ "dependencies": {
1441
+ "@babel/plugin-transform-react-jsx": "^7.16.7"
1442
+ },
1443
+ "engines": {
1444
+ "node": ">=6.9.0"
1445
+ },
1446
+ "peerDependencies": {
1447
+ "@babel/core": "^7.0.0-0"
1448
+ }
1449
+ },
1450
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
1451
+ "version": "7.16.7",
1452
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz",
1453
+ "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==",
1454
+ "dependencies": {
1455
+ "@babel/helper-annotate-as-pure": "^7.16.7",
1456
+ "@babel/helper-plugin-utils": "^7.16.7"
1457
+ },
1458
+ "engines": {
1459
+ "node": ">=6.9.0"
1460
+ },
1461
+ "peerDependencies": {
1462
+ "@babel/core": "^7.0.0-0"
1463
+ }
1464
+ },
1465
+ "node_modules/@babel/plugin-transform-regenerator": {
1466
+ "version": "7.16.7",
1467
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz",
1468
+ "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==",
1469
+ "dependencies": {
1470
+ "regenerator-transform": "^0.14.2"
1471
+ },
1472
+ "engines": {
1473
+ "node": ">=6.9.0"
1474
+ },
1475
+ "peerDependencies": {
1476
+ "@babel/core": "^7.0.0-0"
1477
+ }
1478
+ },
1479
+ "node_modules/@babel/plugin-transform-reserved-words": {
1480
+ "version": "7.16.7",
1481
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz",
1482
+ "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==",
1483
+ "dependencies": {
1484
+ "@babel/helper-plugin-utils": "^7.16.7"
1485
+ },
1486
+ "engines": {
1487
+ "node": ">=6.9.0"
1488
+ },
1489
+ "peerDependencies": {
1490
+ "@babel/core": "^7.0.0-0"
1491
+ }
1492
+ },
1493
+ "node_modules/@babel/plugin-transform-runtime": {
1494
+ "version": "7.16.10",
1495
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz",
1496
+ "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==",
1497
+ "dependencies": {
1498
+ "@babel/helper-module-imports": "^7.16.7",
1499
+ "@babel/helper-plugin-utils": "^7.16.7",
1500
+ "babel-plugin-polyfill-corejs2": "^0.3.0",
1501
+ "babel-plugin-polyfill-corejs3": "^0.5.0",
1502
+ "babel-plugin-polyfill-regenerator": "^0.3.0",
1503
+ "semver": "^6.3.0"
1504
+ },
1505
+ "engines": {
1506
+ "node": ">=6.9.0"
1507
+ },
1508
+ "peerDependencies": {
1509
+ "@babel/core": "^7.0.0-0"
1510
+ }
1511
+ },
1512
+ "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
1513
+ "version": "6.3.0",
1514
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1515
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1516
+ "bin": {
1517
+ "semver": "bin/semver.js"
1518
+ }
1519
+ },
1520
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
1521
+ "version": "7.16.7",
1522
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
1523
+ "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==",
1524
+ "dependencies": {
1525
+ "@babel/helper-plugin-utils": "^7.16.7"
1526
+ },
1527
+ "engines": {
1528
+ "node": ">=6.9.0"
1529
+ },
1530
+ "peerDependencies": {
1531
+ "@babel/core": "^7.0.0-0"
1532
+ }
1533
+ },
1534
+ "node_modules/@babel/plugin-transform-spread": {
1535
+ "version": "7.16.7",
1536
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz",
1537
+ "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==",
1538
+ "dependencies": {
1539
+ "@babel/helper-plugin-utils": "^7.16.7",
1540
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
1541
+ },
1542
+ "engines": {
1543
+ "node": ">=6.9.0"
1544
+ },
1545
+ "peerDependencies": {
1546
+ "@babel/core": "^7.0.0-0"
1547
+ }
1548
+ },
1549
+ "node_modules/@babel/plugin-transform-sticky-regex": {
1550
+ "version": "7.16.7",
1551
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
1552
+ "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==",
1553
+ "dependencies": {
1554
+ "@babel/helper-plugin-utils": "^7.16.7"
1555
+ },
1556
+ "engines": {
1557
+ "node": ">=6.9.0"
1558
+ },
1559
+ "peerDependencies": {
1560
+ "@babel/core": "^7.0.0-0"
1561
+ }
1562
+ },
1563
+ "node_modules/@babel/plugin-transform-template-literals": {
1564
+ "version": "7.16.7",
1565
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz",
1566
+ "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==",
1567
+ "dependencies": {
1568
+ "@babel/helper-plugin-utils": "^7.16.7"
1569
+ },
1570
+ "engines": {
1571
+ "node": ">=6.9.0"
1572
+ },
1573
+ "peerDependencies": {
1574
+ "@babel/core": "^7.0.0-0"
1575
+ }
1576
+ },
1577
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
1578
+ "version": "7.16.7",
1579
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz",
1580
+ "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==",
1581
+ "dependencies": {
1582
+ "@babel/helper-plugin-utils": "^7.16.7"
1583
+ },
1584
+ "engines": {
1585
+ "node": ">=6.9.0"
1586
+ },
1587
+ "peerDependencies": {
1588
+ "@babel/core": "^7.0.0-0"
1589
+ }
1590
+ },
1591
+ "node_modules/@babel/plugin-transform-typescript": {
1592
+ "version": "7.16.8",
1593
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz",
1594
+ "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==",
1595
+ "dependencies": {
1596
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
1597
+ "@babel/helper-plugin-utils": "^7.16.7",
1598
+ "@babel/plugin-syntax-typescript": "^7.16.7"
1599
+ },
1600
+ "engines": {
1601
+ "node": ">=6.9.0"
1602
+ },
1603
+ "peerDependencies": {
1604
+ "@babel/core": "^7.0.0-0"
1605
+ }
1606
+ },
1607
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
1608
+ "version": "7.16.7",
1609
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz",
1610
+ "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==",
1611
+ "dependencies": {
1612
+ "@babel/helper-plugin-utils": "^7.16.7"
1613
+ },
1614
+ "engines": {
1615
+ "node": ">=6.9.0"
1616
+ },
1617
+ "peerDependencies": {
1618
+ "@babel/core": "^7.0.0-0"
1619
+ }
1620
+ },
1621
+ "node_modules/@babel/plugin-transform-unicode-regex": {
1622
+ "version": "7.16.7",
1623
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
1624
+ "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==",
1625
+ "dependencies": {
1626
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
1627
+ "@babel/helper-plugin-utils": "^7.16.7"
1628
+ },
1629
+ "engines": {
1630
+ "node": ">=6.9.0"
1631
+ },
1632
+ "peerDependencies": {
1633
+ "@babel/core": "^7.0.0-0"
1634
+ }
1635
+ },
1636
+ "node_modules/@babel/preset-env": {
1637
+ "version": "7.16.11",
1638
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz",
1639
+ "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==",
1640
+ "dependencies": {
1641
+ "@babel/compat-data": "^7.16.8",
1642
+ "@babel/helper-compilation-targets": "^7.16.7",
1643
+ "@babel/helper-plugin-utils": "^7.16.7",
1644
+ "@babel/helper-validator-option": "^7.16.7",
1645
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
1646
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
1647
+ "@babel/plugin-proposal-async-generator-functions": "^7.16.8",
1648
+ "@babel/plugin-proposal-class-properties": "^7.16.7",
1649
+ "@babel/plugin-proposal-class-static-block": "^7.16.7",
1650
+ "@babel/plugin-proposal-dynamic-import": "^7.16.7",
1651
+ "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
1652
+ "@babel/plugin-proposal-json-strings": "^7.16.7",
1653
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
1654
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
1655
+ "@babel/plugin-proposal-numeric-separator": "^7.16.7",
1656
+ "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
1657
+ "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
1658
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7",
1659
+ "@babel/plugin-proposal-private-methods": "^7.16.11",
1660
+ "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
1661
+ "@babel/plugin-proposal-unicode-property-regex": "^7.16.7",
1662
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
1663
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
1664
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
1665
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
1666
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
1667
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
1668
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
1669
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
1670
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
1671
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
1672
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
1673
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
1674
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
1675
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
1676
+ "@babel/plugin-transform-arrow-functions": "^7.16.7",
1677
+ "@babel/plugin-transform-async-to-generator": "^7.16.8",
1678
+ "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
1679
+ "@babel/plugin-transform-block-scoping": "^7.16.7",
1680
+ "@babel/plugin-transform-classes": "^7.16.7",
1681
+ "@babel/plugin-transform-computed-properties": "^7.16.7",
1682
+ "@babel/plugin-transform-destructuring": "^7.16.7",
1683
+ "@babel/plugin-transform-dotall-regex": "^7.16.7",
1684
+ "@babel/plugin-transform-duplicate-keys": "^7.16.7",
1685
+ "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
1686
+ "@babel/plugin-transform-for-of": "^7.16.7",
1687
+ "@babel/plugin-transform-function-name": "^7.16.7",
1688
+ "@babel/plugin-transform-literals": "^7.16.7",
1689
+ "@babel/plugin-transform-member-expression-literals": "^7.16.7",
1690
+ "@babel/plugin-transform-modules-amd": "^7.16.7",
1691
+ "@babel/plugin-transform-modules-commonjs": "^7.16.8",
1692
+ "@babel/plugin-transform-modules-systemjs": "^7.16.7",
1693
+ "@babel/plugin-transform-modules-umd": "^7.16.7",
1694
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8",
1695
+ "@babel/plugin-transform-new-target": "^7.16.7",
1696
+ "@babel/plugin-transform-object-super": "^7.16.7",
1697
+ "@babel/plugin-transform-parameters": "^7.16.7",
1698
+ "@babel/plugin-transform-property-literals": "^7.16.7",
1699
+ "@babel/plugin-transform-regenerator": "^7.16.7",
1700
+ "@babel/plugin-transform-reserved-words": "^7.16.7",
1701
+ "@babel/plugin-transform-shorthand-properties": "^7.16.7",
1702
+ "@babel/plugin-transform-spread": "^7.16.7",
1703
+ "@babel/plugin-transform-sticky-regex": "^7.16.7",
1704
+ "@babel/plugin-transform-template-literals": "^7.16.7",
1705
+ "@babel/plugin-transform-typeof-symbol": "^7.16.7",
1706
+ "@babel/plugin-transform-unicode-escapes": "^7.16.7",
1707
+ "@babel/plugin-transform-unicode-regex": "^7.16.7",
1708
+ "@babel/preset-modules": "^0.1.5",
1709
+ "@babel/types": "^7.16.8",
1710
+ "babel-plugin-polyfill-corejs2": "^0.3.0",
1711
+ "babel-plugin-polyfill-corejs3": "^0.5.0",
1712
+ "babel-plugin-polyfill-regenerator": "^0.3.0",
1713
+ "core-js-compat": "^3.20.2",
1714
+ "semver": "^6.3.0"
1715
+ },
1716
+ "engines": {
1717
+ "node": ">=6.9.0"
1718
+ },
1719
+ "peerDependencies": {
1720
+ "@babel/core": "^7.0.0-0"
1721
+ }
1722
+ },
1723
+ "node_modules/@babel/preset-env/node_modules/semver": {
1724
+ "version": "6.3.0",
1725
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1726
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1727
+ "bin": {
1728
+ "semver": "bin/semver.js"
1729
+ }
1730
+ },
1731
+ "node_modules/@babel/preset-modules": {
1732
+ "version": "0.1.5",
1733
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
1734
+ "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
1735
+ "dependencies": {
1736
+ "@babel/helper-plugin-utils": "^7.0.0",
1737
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
1738
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
1739
+ "@babel/types": "^7.4.4",
1740
+ "esutils": "^2.0.2"
1741
+ },
1742
+ "peerDependencies": {
1743
+ "@babel/core": "^7.0.0-0"
1744
+ }
1745
+ },
1746
+ "node_modules/@babel/preset-react": {
1747
+ "version": "7.16.7",
1748
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz",
1749
+ "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==",
1750
+ "dependencies": {
1751
+ "@babel/helper-plugin-utils": "^7.16.7",
1752
+ "@babel/helper-validator-option": "^7.16.7",
1753
+ "@babel/plugin-transform-react-display-name": "^7.16.7",
1754
+ "@babel/plugin-transform-react-jsx": "^7.16.7",
1755
+ "@babel/plugin-transform-react-jsx-development": "^7.16.7",
1756
+ "@babel/plugin-transform-react-pure-annotations": "^7.16.7"
1757
+ },
1758
+ "engines": {
1759
+ "node": ">=6.9.0"
1760
+ },
1761
+ "peerDependencies": {
1762
+ "@babel/core": "^7.0.0-0"
1763
+ }
1764
+ },
1765
+ "node_modules/@babel/preset-typescript": {
1766
+ "version": "7.16.7",
1767
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz",
1768
+ "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==",
1769
+ "dependencies": {
1770
+ "@babel/helper-plugin-utils": "^7.16.7",
1771
+ "@babel/helper-validator-option": "^7.16.7",
1772
+ "@babel/plugin-transform-typescript": "^7.16.7"
1773
+ },
1774
+ "engines": {
1775
+ "node": ">=6.9.0"
1776
+ },
1777
+ "peerDependencies": {
1778
+ "@babel/core": "^7.0.0-0"
1779
+ }
1780
+ },
1781
+ "node_modules/@babel/runtime": {
1782
+ "version": "7.16.7",
1783
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz",
1784
+ "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==",
1785
+ "dependencies": {
1786
+ "regenerator-runtime": "^0.13.4"
1787
+ },
1788
+ "engines": {
1789
+ "node": ">=6.9.0"
1790
+ }
1791
+ },
1792
+ "node_modules/@babel/runtime-corejs3": {
1793
+ "version": "7.16.8",
1794
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz",
1795
+ "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==",
1796
+ "dependencies": {
1797
+ "core-js-pure": "^3.20.2",
1798
+ "regenerator-runtime": "^0.13.4"
1799
+ },
1800
+ "engines": {
1801
+ "node": ">=6.9.0"
1802
+ }
1803
+ },
1804
+ "node_modules/@babel/template": {
1805
+ "version": "7.16.7",
1806
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
1807
+ "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
1808
+ "dependencies": {
1809
+ "@babel/code-frame": "^7.16.7",
1810
+ "@babel/parser": "^7.16.7",
1811
+ "@babel/types": "^7.16.7"
1812
+ },
1813
+ "engines": {
1814
+ "node": ">=6.9.0"
1815
+ }
1816
+ },
1817
+ "node_modules/@babel/traverse": {
1818
+ "version": "7.16.10",
1819
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz",
1820
+ "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==",
1821
+ "dependencies": {
1822
+ "@babel/code-frame": "^7.16.7",
1823
+ "@babel/generator": "^7.16.8",
1824
+ "@babel/helper-environment-visitor": "^7.16.7",
1825
+ "@babel/helper-function-name": "^7.16.7",
1826
+ "@babel/helper-hoist-variables": "^7.16.7",
1827
+ "@babel/helper-split-export-declaration": "^7.16.7",
1828
+ "@babel/parser": "^7.16.10",
1829
+ "@babel/types": "^7.16.8",
1830
+ "debug": "^4.1.0",
1831
+ "globals": "^11.1.0"
1832
+ },
1833
+ "engines": {
1834
+ "node": ">=6.9.0"
1835
+ }
1836
+ },
1837
+ "node_modules/@babel/types": {
1838
+ "version": "7.16.8",
1839
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz",
1840
+ "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==",
1841
+ "dependencies": {
1842
+ "@babel/helper-validator-identifier": "^7.16.7",
1843
+ "to-fast-properties": "^2.0.0"
1844
+ },
1845
+ "engines": {
1846
+ "node": ">=6.9.0"
1847
+ }
1848
+ },
1849
+ "node_modules/@bcoe/v8-coverage": {
1850
+ "version": "0.2.3",
1851
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
1852
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
1853
+ },
1854
+ "node_modules/@csstools/normalize.css": {
1855
+ "version": "12.0.0",
1856
+ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz",
1857
+ "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg=="
1858
+ },
1859
+ "node_modules/@date-io/core": {
1860
+ "version": "2.13.1",
1861
+ "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.13.1.tgz",
1862
+ "integrity": "sha512-pVI9nfkf2qClb2Cxdq0Q4zJhdawMG4ybWZUVGifT78FDwzRMX2SwXBb55s5NRJk0HcIicDuxktmCtemZqMH1Zg=="
1863
+ },
1864
+ "node_modules/@date-io/date-fns": {
1865
+ "version": "2.13.1",
1866
+ "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.13.1.tgz",
1867
+ "integrity": "sha512-8fmfwjiLMpFLD+t4NBwDx0eblWnNcgt4NgfT/uiiQTGI81fnPu9tpBMYdAcuWxaV7LLpXgzLBx1SYWAMDVUDQQ==",
1868
+ "dependencies": {
1869
+ "@date-io/core": "^2.13.1"
1870
+ },
1871
+ "peerDependencies": {
1872
+ "date-fns": "^2.0.0"
1873
+ },
1874
+ "peerDependenciesMeta": {
1875
+ "date-fns": {
1876
+ "optional": true
1877
+ }
1878
+ }
1879
+ },
1880
+ "node_modules/@date-io/dayjs": {
1881
+ "version": "2.13.1",
1882
+ "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.13.1.tgz",
1883
+ "integrity": "sha512-5bL4WWWmlI4uGZVScANhHJV7Mjp93ec2gNeUHDqqLaMZhp51S0NgD25oqj/k0LqBn1cdU2MvzNpk/ObMmVv5cQ==",
1884
+ "dependencies": {
1885
+ "@date-io/core": "^2.13.1"
1886
+ },
1887
+ "peerDependencies": {
1888
+ "dayjs": "^1.8.17"
1889
+ },
1890
+ "peerDependenciesMeta": {
1891
+ "dayjs": {
1892
+ "optional": true
1893
+ }
1894
+ }
1895
+ },
1896
+ "node_modules/@date-io/luxon": {
1897
+ "version": "2.13.1",
1898
+ "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.13.1.tgz",
1899
+ "integrity": "sha512-yG+uM7lXfwLyKKEwjvP8oZ7qblpmfl9gxQYae55ifbwiTs0CoCTkYkxEaQHGkYtTqGTzLqcb0O9Pzx6vgWg+yg==",
1900
+ "dependencies": {
1901
+ "@date-io/core": "^2.13.1"
1902
+ },
1903
+ "peerDependencies": {
1904
+ "luxon": "^1.21.3 || ^2.x"
1905
+ },
1906
+ "peerDependenciesMeta": {
1907
+ "luxon": {
1908
+ "optional": true
1909
+ }
1910
+ }
1911
+ },
1912
+ "node_modules/@date-io/moment": {
1913
+ "version": "2.13.1",
1914
+ "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.13.1.tgz",
1915
+ "integrity": "sha512-XX1X/Tlvl3TdqQy2j0ZUtEJV6Rl8tOyc5WOS3ki52He28Uzme4Ro/JuPWTMBDH63weSWIZDlbR7zBgp3ZA2y1A==",
1916
+ "dependencies": {
1917
+ "@date-io/core": "^2.13.1"
1918
+ },
1919
+ "peerDependencies": {
1920
+ "moment": "^2.24.0"
1921
+ },
1922
+ "peerDependenciesMeta": {
1923
+ "moment": {
1924
+ "optional": true
1925
+ }
1926
+ }
1927
+ },
1928
+ "node_modules/@emotion/babel-plugin": {
1929
+ "version": "11.7.2",
1930
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz",
1931
+ "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==",
1932
+ "dependencies": {
1933
+ "@babel/helper-module-imports": "^7.12.13",
1934
+ "@babel/plugin-syntax-jsx": "^7.12.13",
1935
+ "@babel/runtime": "^7.13.10",
1936
+ "@emotion/hash": "^0.8.0",
1937
+ "@emotion/memoize": "^0.7.5",
1938
+ "@emotion/serialize": "^1.0.2",
1939
+ "babel-plugin-macros": "^2.6.1",
1940
+ "convert-source-map": "^1.5.0",
1941
+ "escape-string-regexp": "^4.0.0",
1942
+ "find-root": "^1.1.0",
1943
+ "source-map": "^0.5.7",
1944
+ "stylis": "4.0.13"
1945
+ },
1946
+ "peerDependencies": {
1947
+ "@babel/core": "^7.0.0"
1948
+ }
1949
+ },
1950
+ "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": {
1951
+ "version": "2.8.0",
1952
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz",
1953
+ "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
1954
+ "dependencies": {
1955
+ "@babel/runtime": "^7.7.2",
1956
+ "cosmiconfig": "^6.0.0",
1957
+ "resolve": "^1.12.0"
1958
+ }
1959
+ },
1960
+ "node_modules/@emotion/babel-plugin/node_modules/cosmiconfig": {
1961
+ "version": "6.0.0",
1962
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
1963
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
1964
+ "dependencies": {
1965
+ "@types/parse-json": "^4.0.0",
1966
+ "import-fresh": "^3.1.0",
1967
+ "parse-json": "^5.0.0",
1968
+ "path-type": "^4.0.0",
1969
+ "yaml": "^1.7.2"
1970
+ },
1971
+ "engines": {
1972
+ "node": ">=8"
1973
+ }
1974
+ },
1975
+ "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": {
1976
+ "version": "4.0.0",
1977
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1978
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1979
+ "engines": {
1980
+ "node": ">=10"
1981
+ },
1982
+ "funding": {
1983
+ "url": "https://github.com/sponsors/sindresorhus"
1984
+ }
1985
+ },
1986
+ "node_modules/@emotion/cache": {
1987
+ "version": "11.7.1",
1988
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz",
1989
+ "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==",
1990
+ "dependencies": {
1991
+ "@emotion/memoize": "^0.7.4",
1992
+ "@emotion/sheet": "^1.1.0",
1993
+ "@emotion/utils": "^1.0.0",
1994
+ "@emotion/weak-memoize": "^0.2.5",
1995
+ "stylis": "4.0.13"
1996
+ }
1997
+ },
1998
+ "node_modules/@emotion/hash": {
1999
+ "version": "0.8.0",
2000
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
2001
+ "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
2002
+ },
2003
+ "node_modules/@emotion/is-prop-valid": {
2004
+ "version": "1.1.1",
2005
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz",
2006
+ "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==",
2007
+ "dependencies": {
2008
+ "@emotion/memoize": "^0.7.4"
2009
+ }
2010
+ },
2011
+ "node_modules/@emotion/memoize": {
2012
+ "version": "0.7.5",
2013
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz",
2014
+ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ=="
2015
+ },
2016
+ "node_modules/@emotion/react": {
2017
+ "version": "11.7.1",
2018
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz",
2019
+ "integrity": "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==",
2020
+ "dependencies": {
2021
+ "@babel/runtime": "^7.13.10",
2022
+ "@emotion/cache": "^11.7.1",
2023
+ "@emotion/serialize": "^1.0.2",
2024
+ "@emotion/sheet": "^1.1.0",
2025
+ "@emotion/utils": "^1.0.0",
2026
+ "@emotion/weak-memoize": "^0.2.5",
2027
+ "hoist-non-react-statics": "^3.3.1"
2028
+ },
2029
+ "peerDependencies": {
2030
+ "@babel/core": "^7.0.0",
2031
+ "react": ">=16.8.0"
2032
+ },
2033
+ "peerDependenciesMeta": {
2034
+ "@babel/core": {
2035
+ "optional": true
2036
+ },
2037
+ "@types/react": {
2038
+ "optional": true
2039
+ }
2040
+ }
2041
+ },
2042
+ "node_modules/@emotion/serialize": {
2043
+ "version": "1.0.2",
2044
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz",
2045
+ "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==",
2046
+ "dependencies": {
2047
+ "@emotion/hash": "^0.8.0",
2048
+ "@emotion/memoize": "^0.7.4",
2049
+ "@emotion/unitless": "^0.7.5",
2050
+ "@emotion/utils": "^1.0.0",
2051
+ "csstype": "^3.0.2"
2052
+ }
2053
+ },
2054
+ "node_modules/@emotion/sheet": {
2055
+ "version": "1.1.0",
2056
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz",
2057
+ "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g=="
2058
+ },
2059
+ "node_modules/@emotion/styled": {
2060
+ "version": "11.6.0",
2061
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz",
2062
+ "integrity": "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==",
2063
+ "dependencies": {
2064
+ "@babel/runtime": "^7.13.10",
2065
+ "@emotion/babel-plugin": "^11.3.0",
2066
+ "@emotion/is-prop-valid": "^1.1.1",
2067
+ "@emotion/serialize": "^1.0.2",
2068
+ "@emotion/utils": "^1.0.0"
2069
+ },
2070
+ "peerDependencies": {
2071
+ "@babel/core": "^7.0.0",
2072
+ "@emotion/react": "^11.0.0-rc.0",
2073
+ "react": ">=16.8.0"
2074
+ },
2075
+ "peerDependenciesMeta": {
2076
+ "@babel/core": {
2077
+ "optional": true
2078
+ },
2079
+ "@types/react": {
2080
+ "optional": true
2081
+ }
2082
+ }
2083
+ },
2084
+ "node_modules/@emotion/unitless": {
2085
+ "version": "0.7.5",
2086
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
2087
+ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
2088
+ },
2089
+ "node_modules/@emotion/utils": {
2090
+ "version": "1.0.0",
2091
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz",
2092
+ "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA=="
2093
+ },
2094
+ "node_modules/@emotion/weak-memoize": {
2095
+ "version": "0.2.5",
2096
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz",
2097
+ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
2098
+ },
2099
+ "node_modules/@eslint/eslintrc": {
2100
+ "version": "1.0.5",
2101
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
2102
+ "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
2103
+ "dependencies": {
2104
+ "ajv": "^6.12.4",
2105
+ "debug": "^4.3.2",
2106
+ "espree": "^9.2.0",
2107
+ "globals": "^13.9.0",
2108
+ "ignore": "^4.0.6",
2109
+ "import-fresh": "^3.2.1",
2110
+ "js-yaml": "^4.1.0",
2111
+ "minimatch": "^3.0.4",
2112
+ "strip-json-comments": "^3.1.1"
2113
+ },
2114
+ "engines": {
2115
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
2116
+ }
2117
+ },
2118
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
2119
+ "version": "2.0.1",
2120
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
2121
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
2122
+ },
2123
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
2124
+ "version": "13.12.0",
2125
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
2126
+ "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
2127
+ "dependencies": {
2128
+ "type-fest": "^0.20.2"
2129
+ },
2130
+ "engines": {
2131
+ "node": ">=8"
2132
+ },
2133
+ "funding": {
2134
+ "url": "https://github.com/sponsors/sindresorhus"
2135
+ }
2136
+ },
2137
+ "node_modules/@eslint/eslintrc/node_modules/ignore": {
2138
+ "version": "4.0.6",
2139
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
2140
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
2141
+ "engines": {
2142
+ "node": ">= 4"
2143
+ }
2144
+ },
2145
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
2146
+ "version": "4.1.0",
2147
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
2148
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
2149
+ "dependencies": {
2150
+ "argparse": "^2.0.1"
2151
+ },
2152
+ "bin": {
2153
+ "js-yaml": "bin/js-yaml.js"
2154
+ }
2155
+ },
2156
+ "node_modules/@eslint/eslintrc/node_modules/type-fest": {
2157
+ "version": "0.20.2",
2158
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
2159
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
2160
+ "engines": {
2161
+ "node": ">=10"
2162
+ },
2163
+ "funding": {
2164
+ "url": "https://github.com/sponsors/sindresorhus"
2165
+ }
2166
+ },
2167
+ "node_modules/@humanwhocodes/config-array": {
2168
+ "version": "0.9.2",
2169
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
2170
+ "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
2171
+ "dependencies": {
2172
+ "@humanwhocodes/object-schema": "^1.2.1",
2173
+ "debug": "^4.1.1",
2174
+ "minimatch": "^3.0.4"
2175
+ },
2176
+ "engines": {
2177
+ "node": ">=10.10.0"
2178
+ }
2179
+ },
2180
+ "node_modules/@humanwhocodes/object-schema": {
2181
+ "version": "1.2.1",
2182
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
2183
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
2184
+ },
2185
+ "node_modules/@istanbuljs/load-nyc-config": {
2186
+ "version": "1.1.0",
2187
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
2188
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
2189
+ "dependencies": {
2190
+ "camelcase": "^5.3.1",
2191
+ "find-up": "^4.1.0",
2192
+ "get-package-type": "^0.1.0",
2193
+ "js-yaml": "^3.13.1",
2194
+ "resolve-from": "^5.0.0"
2195
+ },
2196
+ "engines": {
2197
+ "node": ">=8"
2198
+ }
2199
+ },
2200
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
2201
+ "version": "5.3.1",
2202
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
2203
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
2204
+ "engines": {
2205
+ "node": ">=6"
2206
+ }
2207
+ },
2208
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
2209
+ "version": "4.1.0",
2210
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
2211
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
2212
+ "dependencies": {
2213
+ "locate-path": "^5.0.0",
2214
+ "path-exists": "^4.0.0"
2215
+ },
2216
+ "engines": {
2217
+ "node": ">=8"
2218
+ }
2219
+ },
2220
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
2221
+ "version": "5.0.0",
2222
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
2223
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
2224
+ "dependencies": {
2225
+ "p-locate": "^4.1.0"
2226
+ },
2227
+ "engines": {
2228
+ "node": ">=8"
2229
+ }
2230
+ },
2231
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
2232
+ "version": "2.3.0",
2233
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
2234
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
2235
+ "dependencies": {
2236
+ "p-try": "^2.0.0"
2237
+ },
2238
+ "engines": {
2239
+ "node": ">=6"
2240
+ },
2241
+ "funding": {
2242
+ "url": "https://github.com/sponsors/sindresorhus"
2243
+ }
2244
+ },
2245
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
2246
+ "version": "4.1.0",
2247
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
2248
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
2249
+ "dependencies": {
2250
+ "p-limit": "^2.2.0"
2251
+ },
2252
+ "engines": {
2253
+ "node": ">=8"
2254
+ }
2255
+ },
2256
+ "node_modules/@istanbuljs/schema": {
2257
+ "version": "0.1.3",
2258
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
2259
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
2260
+ "engines": {
2261
+ "node": ">=8"
2262
+ }
2263
+ },
2264
+ "node_modules/@jest/console": {
2265
+ "version": "27.4.6",
2266
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.6.tgz",
2267
+ "integrity": "sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA==",
2268
+ "dependencies": {
2269
+ "@jest/types": "^27.4.2",
2270
+ "@types/node": "*",
2271
+ "chalk": "^4.0.0",
2272
+ "jest-message-util": "^27.4.6",
2273
+ "jest-util": "^27.4.2",
2274
+ "slash": "^3.0.0"
2275
+ },
2276
+ "engines": {
2277
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2278
+ }
2279
+ },
2280
+ "node_modules/@jest/console/node_modules/ansi-styles": {
2281
+ "version": "4.3.0",
2282
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2283
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2284
+ "dependencies": {
2285
+ "color-convert": "^2.0.1"
2286
+ },
2287
+ "engines": {
2288
+ "node": ">=8"
2289
+ },
2290
+ "funding": {
2291
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2292
+ }
2293
+ },
2294
+ "node_modules/@jest/console/node_modules/chalk": {
2295
+ "version": "4.1.2",
2296
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2297
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2298
+ "dependencies": {
2299
+ "ansi-styles": "^4.1.0",
2300
+ "supports-color": "^7.1.0"
2301
+ },
2302
+ "engines": {
2303
+ "node": ">=10"
2304
+ },
2305
+ "funding": {
2306
+ "url": "https://github.com/chalk/chalk?sponsor=1"
2307
+ }
2308
+ },
2309
+ "node_modules/@jest/console/node_modules/color-convert": {
2310
+ "version": "2.0.1",
2311
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2312
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2313
+ "dependencies": {
2314
+ "color-name": "~1.1.4"
2315
+ },
2316
+ "engines": {
2317
+ "node": ">=7.0.0"
2318
+ }
2319
+ },
2320
+ "node_modules/@jest/console/node_modules/color-name": {
2321
+ "version": "1.1.4",
2322
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2323
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
2324
+ },
2325
+ "node_modules/@jest/console/node_modules/has-flag": {
2326
+ "version": "4.0.0",
2327
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2328
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2329
+ "engines": {
2330
+ "node": ">=8"
2331
+ }
2332
+ },
2333
+ "node_modules/@jest/console/node_modules/supports-color": {
2334
+ "version": "7.2.0",
2335
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2336
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2337
+ "dependencies": {
2338
+ "has-flag": "^4.0.0"
2339
+ },
2340
+ "engines": {
2341
+ "node": ">=8"
2342
+ }
2343
+ },
2344
+ "node_modules/@jest/core": {
2345
+ "version": "27.4.7",
2346
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.7.tgz",
2347
+ "integrity": "sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg==",
2348
+ "dependencies": {
2349
+ "@jest/console": "^27.4.6",
2350
+ "@jest/reporters": "^27.4.6",
2351
+ "@jest/test-result": "^27.4.6",
2352
+ "@jest/transform": "^27.4.6",
2353
+ "@jest/types": "^27.4.2",
2354
+ "@types/node": "*",
2355
+ "ansi-escapes": "^4.2.1",
2356
+ "chalk": "^4.0.0",
2357
+ "emittery": "^0.8.1",
2358
+ "exit": "^0.1.2",
2359
+ "graceful-fs": "^4.2.4",
2360
+ "jest-changed-files": "^27.4.2",
2361
+ "jest-config": "^27.4.7",
2362
+ "jest-haste-map": "^27.4.6",
2363
+ "jest-message-util": "^27.4.6",
2364
+ "jest-regex-util": "^27.4.0",
2365
+ "jest-resolve": "^27.4.6",
2366
+ "jest-resolve-dependencies": "^27.4.6",
2367
+ "jest-runner": "^27.4.6",
2368
+ "jest-runtime": "^27.4.6",
2369
+ "jest-snapshot": "^27.4.6",
2370
+ "jest-util": "^27.4.2",
2371
+ "jest-validate": "^27.4.6",
2372
+ "jest-watcher": "^27.4.6",
2373
+ "micromatch": "^4.0.4",
2374
+ "rimraf": "^3.0.0",
2375
+ "slash": "^3.0.0",
2376
+ "strip-ansi": "^6.0.0"
2377
+ },
2378
+ "engines": {
2379
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2380
+ },
2381
+ "peerDependencies": {
2382
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
2383
+ },
2384
+ "peerDependenciesMeta": {
2385
+ "node-notifier": {
2386
+ "optional": true
2387
+ }
2388
+ }
2389
+ },
2390
+ "node_modules/@jest/core/node_modules/ansi-styles": {
2391
+ "version": "4.3.0",
2392
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2393
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2394
+ "dependencies": {
2395
+ "color-convert": "^2.0.1"
2396
+ },
2397
+ "engines": {
2398
+ "node": ">=8"
2399
+ },
2400
+ "funding": {
2401
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2402
+ }
2403
+ },
2404
+ "node_modules/@jest/core/node_modules/chalk": {
2405
+ "version": "4.1.2",
2406
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2407
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2408
+ "dependencies": {
2409
+ "ansi-styles": "^4.1.0",
2410
+ "supports-color": "^7.1.0"
2411
+ },
2412
+ "engines": {
2413
+ "node": ">=10"
2414
+ },
2415
+ "funding": {
2416
+ "url": "https://github.com/chalk/chalk?sponsor=1"
2417
+ }
2418
+ },
2419
+ "node_modules/@jest/core/node_modules/color-convert": {
2420
+ "version": "2.0.1",
2421
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2422
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2423
+ "dependencies": {
2424
+ "color-name": "~1.1.4"
2425
+ },
2426
+ "engines": {
2427
+ "node": ">=7.0.0"
2428
+ }
2429
+ },
2430
+ "node_modules/@jest/core/node_modules/color-name": {
2431
+ "version": "1.1.4",
2432
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2433
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
2434
+ },
2435
+ "node_modules/@jest/core/node_modules/has-flag": {
2436
+ "version": "4.0.0",
2437
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2438
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2439
+ "engines": {
2440
+ "node": ">=8"
2441
+ }
2442
+ },
2443
+ "node_modules/@jest/core/node_modules/supports-color": {
2444
+ "version": "7.2.0",
2445
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2446
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2447
+ "dependencies": {
2448
+ "has-flag": "^4.0.0"
2449
+ },
2450
+ "engines": {
2451
+ "node": ">=8"
2452
+ }
2453
+ },
2454
+ "node_modules/@jest/environment": {
2455
+ "version": "27.4.6",
2456
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.6.tgz",
2457
+ "integrity": "sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg==",
2458
+ "dependencies": {
2459
+ "@jest/fake-timers": "^27.4.6",
2460
+ "@jest/types": "^27.4.2",
2461
+ "@types/node": "*",
2462
+ "jest-mock": "^27.4.6"
2463
+ },
2464
+ "engines": {
2465
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2466
+ }
2467
+ },
2468
+ "node_modules/@jest/fake-timers": {
2469
+ "version": "27.4.6",
2470
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.6.tgz",
2471
+ "integrity": "sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A==",
2472
+ "dependencies": {
2473
+ "@jest/types": "^27.4.2",
2474
+ "@sinonjs/fake-timers": "^8.0.1",
2475
+ "@types/node": "*",
2476
+ "jest-message-util": "^27.4.6",
2477
+ "jest-mock": "^27.4.6",
2478
+ "jest-util": "^27.4.2"
2479
+ },
2480
+ "engines": {
2481
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2482
+ }
2483
+ },
2484
+ "node_modules/@jest/globals": {
2485
+ "version": "27.4.6",
2486
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.6.tgz",
2487
+ "integrity": "sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw==",
2488
+ "dependencies": {
2489
+ "@jest/environment": "^27.4.6",
2490
+ "@jest/types": "^27.4.2",
2491
+ "expect": "^27.4.6"
2492
+ },
2493
+ "engines": {
2494
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2495
+ }
2496
+ },
2497
+ "node_modules/@jest/reporters": {
2498
+ "version": "27.4.6",
2499
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.6.tgz",
2500
+ "integrity": "sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ==",
2501
+ "dependencies": {
2502
+ "@bcoe/v8-coverage": "^0.2.3",
2503
+ "@jest/console": "^27.4.6",
2504
+ "@jest/test-result": "^27.4.6",
2505
+ "@jest/transform": "^27.4.6",
2506
+ "@jest/types": "^27.4.2",
2507
+ "@types/node": "*",
2508
+ "chalk": "^4.0.0",
2509
+ "collect-v8-coverage": "^1.0.0",
2510
+ "exit": "^0.1.2",
2511
+ "glob": "^7.1.2",
2512
+ "graceful-fs": "^4.2.4",
2513
+ "istanbul-lib-coverage": "^3.0.0",
2514
+ "istanbul-lib-instrument": "^5.1.0",
2515
+ "istanbul-lib-report": "^3.0.0",
2516
+ "istanbul-lib-source-maps": "^4.0.0",
2517
+ "istanbul-reports": "^3.1.3",
2518
+ "jest-haste-map": "^27.4.6",
2519
+ "jest-resolve": "^27.4.6",
2520
+ "jest-util": "^27.4.2",
2521
+ "jest-worker": "^27.4.6",
2522
+ "slash": "^3.0.0",
2523
+ "source-map": "^0.6.0",
2524
+ "string-length": "^4.0.1",
2525
+ "terminal-link": "^2.0.0",
2526
+ "v8-to-istanbul": "^8.1.0"
2527
+ },
2528
+ "engines": {
2529
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2530
+ },
2531
+ "peerDependencies": {
2532
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
2533
+ },
2534
+ "peerDependenciesMeta": {
2535
+ "node-notifier": {
2536
+ "optional": true
2537
+ }
2538
+ }
2539
+ },
2540
+ "node_modules/@jest/reporters/node_modules/ansi-styles": {
2541
+ "version": "4.3.0",
2542
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2543
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2544
+ "dependencies": {
2545
+ "color-convert": "^2.0.1"
2546
+ },
2547
+ "engines": {
2548
+ "node": ">=8"
2549
+ },
2550
+ "funding": {
2551
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2552
+ }
2553
+ },
2554
+ "node_modules/@jest/reporters/node_modules/chalk": {
2555
+ "version": "4.1.2",
2556
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2557
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2558
+ "dependencies": {
2559
+ "ansi-styles": "^4.1.0",
2560
+ "supports-color": "^7.1.0"
2561
+ },
2562
+ "engines": {
2563
+ "node": ">=10"
2564
+ },
2565
+ "funding": {
2566
+ "url": "https://github.com/chalk/chalk?sponsor=1"
2567
+ }
2568
+ },
2569
+ "node_modules/@jest/reporters/node_modules/color-convert": {
2570
+ "version": "2.0.1",
2571
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2572
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2573
+ "dependencies": {
2574
+ "color-name": "~1.1.4"
2575
+ },
2576
+ "engines": {
2577
+ "node": ">=7.0.0"
2578
+ }
2579
+ },
2580
+ "node_modules/@jest/reporters/node_modules/color-name": {
2581
+ "version": "1.1.4",
2582
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2583
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
2584
+ },
2585
+ "node_modules/@jest/reporters/node_modules/has-flag": {
2586
+ "version": "4.0.0",
2587
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2588
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2589
+ "engines": {
2590
+ "node": ">=8"
2591
+ }
2592
+ },
2593
+ "node_modules/@jest/reporters/node_modules/source-map": {
2594
+ "version": "0.6.1",
2595
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2596
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2597
+ "engines": {
2598
+ "node": ">=0.10.0"
2599
+ }
2600
+ },
2601
+ "node_modules/@jest/reporters/node_modules/supports-color": {
2602
+ "version": "7.2.0",
2603
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2604
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2605
+ "dependencies": {
2606
+ "has-flag": "^4.0.0"
2607
+ },
2608
+ "engines": {
2609
+ "node": ">=8"
2610
+ }
2611
+ },
2612
+ "node_modules/@jest/source-map": {
2613
+ "version": "27.4.0",
2614
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz",
2615
+ "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==",
2616
+ "dependencies": {
2617
+ "callsites": "^3.0.0",
2618
+ "graceful-fs": "^4.2.4",
2619
+ "source-map": "^0.6.0"
2620
+ },
2621
+ "engines": {
2622
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2623
+ }
2624
+ },
2625
+ "node_modules/@jest/source-map/node_modules/source-map": {
2626
+ "version": "0.6.1",
2627
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2628
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2629
+ "engines": {
2630
+ "node": ">=0.10.0"
2631
+ }
2632
+ },
2633
+ "node_modules/@jest/test-result": {
2634
+ "version": "27.4.6",
2635
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.6.tgz",
2636
+ "integrity": "sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ==",
2637
+ "dependencies": {
2638
+ "@jest/console": "^27.4.6",
2639
+ "@jest/types": "^27.4.2",
2640
+ "@types/istanbul-lib-coverage": "^2.0.0",
2641
+ "collect-v8-coverage": "^1.0.0"
2642
+ },
2643
+ "engines": {
2644
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2645
+ }
2646
+ },
2647
+ "node_modules/@jest/test-sequencer": {
2648
+ "version": "27.4.6",
2649
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz",
2650
+ "integrity": "sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw==",
2651
+ "dependencies": {
2652
+ "@jest/test-result": "^27.4.6",
2653
+ "graceful-fs": "^4.2.4",
2654
+ "jest-haste-map": "^27.4.6",
2655
+ "jest-runtime": "^27.4.6"
2656
+ },
2657
+ "engines": {
2658
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2659
+ }
2660
+ },
2661
+ "node_modules/@jest/transform": {
2662
+ "version": "27.4.6",
2663
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.6.tgz",
2664
+ "integrity": "sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw==",
2665
+ "dependencies": {
2666
+ "@babel/core": "^7.1.0",
2667
+ "@jest/types": "^27.4.2",
2668
+ "babel-plugin-istanbul": "^6.1.1",
2669
+ "chalk": "^4.0.0",
2670
+ "convert-source-map": "^1.4.0",
2671
+ "fast-json-stable-stringify": "^2.0.0",
2672
+ "graceful-fs": "^4.2.4",
2673
+ "jest-haste-map": "^27.4.6",
2674
+ "jest-regex-util": "^27.4.0",
2675
+ "jest-util": "^27.4.2",
2676
+ "micromatch": "^4.0.4",
2677
+ "pirates": "^4.0.4",
2678
+ "slash": "^3.0.0",
2679
+ "source-map": "^0.6.1",
2680
+ "write-file-atomic": "^3.0.0"
2681
+ },
2682
+ "engines": {
2683
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2684
+ }
2685
+ },
2686
+ "node_modules/@jest/transform/node_modules/ansi-styles": {
2687
+ "version": "4.3.0",
2688
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2689
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2690
+ "dependencies": {
2691
+ "color-convert": "^2.0.1"
2692
+ },
2693
+ "engines": {
2694
+ "node": ">=8"
2695
+ },
2696
+ "funding": {
2697
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2698
+ }
2699
+ },
2700
+ "node_modules/@jest/transform/node_modules/chalk": {
2701
+ "version": "4.1.2",
2702
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2703
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2704
+ "dependencies": {
2705
+ "ansi-styles": "^4.1.0",
2706
+ "supports-color": "^7.1.0"
2707
+ },
2708
+ "engines": {
2709
+ "node": ">=10"
2710
+ },
2711
+ "funding": {
2712
+ "url": "https://github.com/chalk/chalk?sponsor=1"
2713
+ }
2714
+ },
2715
+ "node_modules/@jest/transform/node_modules/color-convert": {
2716
+ "version": "2.0.1",
2717
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2718
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2719
+ "dependencies": {
2720
+ "color-name": "~1.1.4"
2721
+ },
2722
+ "engines": {
2723
+ "node": ">=7.0.0"
2724
+ }
2725
+ },
2726
+ "node_modules/@jest/transform/node_modules/color-name": {
2727
+ "version": "1.1.4",
2728
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2729
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
2730
+ },
2731
+ "node_modules/@jest/transform/node_modules/has-flag": {
2732
+ "version": "4.0.0",
2733
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2734
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2735
+ "engines": {
2736
+ "node": ">=8"
2737
+ }
2738
+ },
2739
+ "node_modules/@jest/transform/node_modules/source-map": {
2740
+ "version": "0.6.1",
2741
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2742
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2743
+ "engines": {
2744
+ "node": ">=0.10.0"
2745
+ }
2746
+ },
2747
+ "node_modules/@jest/transform/node_modules/supports-color": {
2748
+ "version": "7.2.0",
2749
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2750
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2751
+ "dependencies": {
2752
+ "has-flag": "^4.0.0"
2753
+ },
2754
+ "engines": {
2755
+ "node": ">=8"
2756
+ }
2757
+ },
2758
+ "node_modules/@jest/types": {
2759
+ "version": "27.4.2",
2760
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz",
2761
+ "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==",
2762
+ "dependencies": {
2763
+ "@types/istanbul-lib-coverage": "^2.0.0",
2764
+ "@types/istanbul-reports": "^3.0.0",
2765
+ "@types/node": "*",
2766
+ "@types/yargs": "^16.0.0",
2767
+ "chalk": "^4.0.0"
2768
+ },
2769
+ "engines": {
2770
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2771
+ }
2772
+ },
2773
+ "node_modules/@jest/types/node_modules/ansi-styles": {
2774
+ "version": "4.3.0",
2775
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2776
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2777
+ "dependencies": {
2778
+ "color-convert": "^2.0.1"
2779
+ },
2780
+ "engines": {
2781
+ "node": ">=8"
2782
+ },
2783
+ "funding": {
2784
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2785
+ }
2786
+ },
2787
+ "node_modules/@jest/types/node_modules/chalk": {
2788
+ "version": "4.1.2",
2789
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2790
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2791
+ "dependencies": {
2792
+ "ansi-styles": "^4.1.0",
2793
+ "supports-color": "^7.1.0"
2794
+ },
2795
+ "engines": {
2796
+ "node": ">=10"
2797
+ },
2798
+ "funding": {
2799
+ "url": "https://github.com/chalk/chalk?sponsor=1"
2800
+ }
2801
+ },
2802
+ "node_modules/@jest/types/node_modules/color-convert": {
2803
+ "version": "2.0.1",
2804
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2805
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2806
+ "dependencies": {
2807
+ "color-name": "~1.1.4"
2808
+ },
2809
+ "engines": {
2810
+ "node": ">=7.0.0"
2811
+ }
2812
+ },
2813
+ "node_modules/@jest/types/node_modules/color-name": {
2814
+ "version": "1.1.4",
2815
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2816
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
2817
+ },
2818
+ "node_modules/@jest/types/node_modules/has-flag": {
2819
+ "version": "4.0.0",
2820
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2821
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2822
+ "engines": {
2823
+ "node": ">=8"
2824
+ }
2825
+ },
2826
+ "node_modules/@jest/types/node_modules/supports-color": {
2827
+ "version": "7.2.0",
2828
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2829
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2830
+ "dependencies": {
2831
+ "has-flag": "^4.0.0"
2832
+ },
2833
+ "engines": {
2834
+ "node": ">=8"
2835
+ }
2836
+ },
2837
+ "node_modules/@mui/base": {
2838
+ "version": "5.0.0-alpha.65",
2839
+ "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.65.tgz",
2840
+ "integrity": "sha512-6LCTWVoSnEoQuWdxA+Z1qqmlNK4aZj7LvCuLJzq3RVS2PskRuo1O3caVFxAzRu7xrY3zsyL/sUsJI+rdcjhuXw==",
2841
+ "dependencies": {
2842
+ "@babel/runtime": "^7.16.7",
2843
+ "@emotion/is-prop-valid": "^1.1.1",
2844
+ "@mui/utils": "^5.3.0",
2845
+ "@popperjs/core": "^2.4.4",
2846
+ "clsx": "^1.1.1",
2847
+ "prop-types": "^15.7.2",
2848
+ "react-is": "^17.0.2"
2849
+ },
2850
+ "engines": {
2851
+ "node": ">=12.0.0"
2852
+ },
2853
+ "funding": {
2854
+ "type": "opencollective",
2855
+ "url": "https://opencollective.com/mui"
2856
+ },
2857
+ "peerDependencies": {
2858
+ "@types/react": "^16.8.6 || ^17.0.0",
2859
+ "react": "^17.0.0",
2860
+ "react-dom": "^17.0.0"
2861
+ },
2862
+ "peerDependenciesMeta": {
2863
+ "@types/react": {
2864
+ "optional": true
2865
+ }
2866
+ }
2867
+ },
2868
+ "node_modules/@mui/icons-material": {
2869
+ "version": "5.3.0",
2870
+ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.3.0.tgz",
2871
+ "integrity": "sha512-1+dN2N8BgozmdMeHXQLrvSr1G/7Xc0NmAMLSvu8XA9RxhcTos/p66vrvpPASw2qvt14dkfeqyHwvbLRgAU9slw==",
2872
+ "dependencies": {
2873
+ "@babel/runtime": "^7.16.7"
2874
+ },
2875
+ "engines": {
2876
+ "node": ">=12.0.0"
2877
+ },
2878
+ "funding": {
2879
+ "type": "opencollective",
2880
+ "url": "https://opencollective.com/mui"
2881
+ },
2882
+ "peerDependencies": {
2883
+ "@mui/material": "^5.0.0",
2884
+ "@types/react": "^16.8.6 || ^17.0.0",
2885
+ "react": "^17.0.0"
2886
+ },
2887
+ "peerDependenciesMeta": {
2888
+ "@types/react": {
2889
+ "optional": true
2890
+ }
2891
+ }
2892
+ },
2893
+ "node_modules/@mui/lab": {
2894
+ "version": "5.0.0-alpha.66",
2895
+ "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.66.tgz",
2896
+ "integrity": "sha512-C/WB5vo+arkdbx3r1gRRKh4BcZJ763+ePcPHYj3pShDA1vG0jecp1RWO8MJ07SnsdfDHiKWtlUDJh+DpieR0Og==",
2897
+ "dependencies": {
2898
+ "@babel/runtime": "^7.16.7",
2899
+ "@date-io/date-fns": "^2.11.0",
2900
+ "@date-io/dayjs": "^2.11.0",
2901
+ "@date-io/luxon": "^2.11.1",
2902
+ "@date-io/moment": "^2.11.0",
2903
+ "@mui/base": "5.0.0-alpha.66",
2904
+ "@mui/system": "^5.3.0",
2905
+ "@mui/utils": "^5.3.0",
2906
+ "clsx": "^1.1.1",
2907
+ "prop-types": "^15.7.2",
2908
+ "react-is": "^17.0.2",
2909
+ "react-transition-group": "^4.4.2",
2910
+ "rifm": "^0.12.1"
2911
+ },
2912
+ "engines": {
2913
+ "node": ">=12.0.0"
2914
+ },
2915
+ "funding": {
2916
+ "type": "opencollective",
2917
+ "url": "https://opencollective.com/mui"
2918
+ },
2919
+ "peerDependencies": {
2920
+ "@mui/material": "^5.0.0",
2921
+ "@types/react": "^16.8.6 || ^17.0.0",
2922
+ "date-fns": "^2.25.0",
2923
+ "dayjs": "^1.10.7",
2924
+ "luxon": "^1.28.0 || ^2.0.0",
2925
+ "moment": "^2.29.1",
2926
+ "react": "^17.0.0",
2927
+ "react-dom": "^17.0.0"
2928
+ },
2929
+ "peerDependenciesMeta": {
2930
+ "@types/react": {
2931
+ "optional": true
2932
+ },
2933
+ "date-fns": {
2934
+ "optional": true
2935
+ },
2936
+ "dayjs": {
2937
+ "optional": true
2938
+ },
2939
+ "luxon": {
2940
+ "optional": true
2941
+ },
2942
+ "moment": {
2943
+ "optional": true
2944
+ }
2945
+ }
2946
+ },
2947
+ "node_modules/@mui/lab/node_modules/@mui/base": {
2948
+ "version": "5.0.0-alpha.66",
2949
+ "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.66.tgz",
2950
+ "integrity": "sha512-LARfVx0HmGV5YwU2pdIqEApQwz/CtEnYtKkV856hlY0cgi5NQL2htzZ/9ujKz0j3LFUaMYiYuJ2AOwrNtGFGrw==",
2951
+ "dependencies": {
2952
+ "@babel/runtime": "^7.16.7",
2953
+ "@emotion/is-prop-valid": "^1.1.1",
2954
+ "@mui/utils": "^5.3.0",
2955
+ "@popperjs/core": "^2.4.4",
2956
+ "clsx": "^1.1.1",
2957
+ "prop-types": "^15.7.2",
2958
+ "react-is": "^17.0.2"
2959
+ },
2960
+ "engines": {
2961
+ "node": ">=12.0.0"
2962
+ },
2963
+ "funding": {
2964
+ "type": "opencollective",
2965
+ "url": "https://opencollective.com/mui"
2966
+ },
2967
+ "peerDependencies": {
2968
+ "@types/react": "^16.8.6 || ^17.0.0",
2969
+ "react": "^17.0.0",
2970
+ "react-dom": "^17.0.0"
2971
+ },
2972
+ "peerDependenciesMeta": {
2973
+ "@types/react": {
2974
+ "optional": true
2975
+ }
2976
+ }
2977
+ },
2978
+ "node_modules/@mui/material": {
2979
+ "version": "5.3.0",
2980
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.3.0.tgz",
2981
+ "integrity": "sha512-zLdlweBHrKpOwHFoMXA6FFgKQOONuX4sQhODcj9dk5uPeScuMDE26svcsrPam5Y1PKXZX78YEGHB5Jr5PHGpTA==",
2982
+ "dependencies": {
2983
+ "@babel/runtime": "^7.16.7",
2984
+ "@mui/base": "5.0.0-alpha.65",
2985
+ "@mui/system": "^5.3.0",
2986
+ "@mui/types": "^7.1.0",
2987
+ "@mui/utils": "^5.3.0",
2988
+ "@types/react-transition-group": "^4.4.4",
2989
+ "clsx": "^1.1.1",
2990
+ "csstype": "^3.0.10",
2991
+ "hoist-non-react-statics": "^3.3.2",
2992
+ "prop-types": "^15.7.2",
2993
+ "react-is": "^17.0.2",
2994
+ "react-transition-group": "^4.4.2"
2995
+ },
2996
+ "engines": {
2997
+ "node": ">=12.0.0"
2998
+ },
2999
+ "funding": {
3000
+ "type": "opencollective",
3001
+ "url": "https://opencollective.com/mui"
3002
+ },
3003
+ "peerDependencies": {
3004
+ "@emotion/react": "^11.5.0",
3005
+ "@emotion/styled": "^11.3.0",
3006
+ "@types/react": "^16.8.6 || ^17.0.0",
3007
+ "react": "^17.0.0",
3008
+ "react-dom": "^17.0.0"
3009
+ },
3010
+ "peerDependenciesMeta": {
3011
+ "@emotion/react": {
3012
+ "optional": true
3013
+ },
3014
+ "@emotion/styled": {
3015
+ "optional": true
3016
+ },
3017
+ "@types/react": {
3018
+ "optional": true
3019
+ }
3020
+ }
3021
+ },
3022
+ "node_modules/@mui/private-theming": {
3023
+ "version": "5.3.0",
3024
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.3.0.tgz",
3025
+ "integrity": "sha512-EBobUEyM9fMnteKrVPp8pTMUh81xXakyfdpkoh7Y19q9JpD2eh7QGAQVJVj0JBFlcUJD60NIE4K8rdokrRmLwg==",
3026
+ "dependencies": {
3027
+ "@babel/runtime": "^7.16.7",
3028
+ "@mui/utils": "^5.3.0",
3029
+ "prop-types": "^15.7.2"
3030
+ },
3031
+ "engines": {
3032
+ "node": ">=12.0.0"
3033
+ },
3034
+ "funding": {
3035
+ "type": "opencollective",
3036
+ "url": "https://opencollective.com/mui"
3037
+ },
3038
+ "peerDependencies": {
3039
+ "@types/react": "^16.8.6 || ^17.0.0",
3040
+ "react": "^17.0.0"
3041
+ },
3042
+ "peerDependenciesMeta": {
3043
+ "@types/react": {
3044
+ "optional": true
3045
+ }
3046
+ }
3047
+ },
3048
+ "node_modules/@mui/styled-engine": {
3049
+ "version": "5.3.0",
3050
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.3.0.tgz",
3051
+ "integrity": "sha512-I4YemFy9WnCLUdZ5T+6egpzc8e7Jq/uh9AJ3QInZHbyNu/9I2SWvNn7vHjWOT/D8Y8LMzIOhu5WwZbzjez7YRw==",
3052
+ "dependencies": {
3053
+ "@babel/runtime": "^7.16.7",
3054
+ "@emotion/cache": "^11.7.1",
3055
+ "prop-types": "^15.7.2"
3056
+ },
3057
+ "engines": {
3058
+ "node": ">=12.0.0"
3059
+ },
3060
+ "funding": {
3061
+ "type": "opencollective",
3062
+ "url": "https://opencollective.com/mui"
3063
+ },
3064
+ "peerDependencies": {
3065
+ "@emotion/react": "^11.4.1",
3066
+ "@emotion/styled": "^11.3.0",
3067
+ "react": "^17.0.0"
3068
+ },
3069
+ "peerDependenciesMeta": {
3070
+ "@emotion/react": {
3071
+ "optional": true
3072
+ },
3073
+ "@emotion/styled": {
3074
+ "optional": true
3075
+ }
3076
+ }
3077
+ },
3078
+ "node_modules/@mui/styles": {
3079
+ "version": "5.3.0",
3080
+ "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-5.3.0.tgz",
3081
+ "integrity": "sha512-TPfK8c8Zpydpynl4deNv43c0puriXSjf44eadyYle7veVQt5dnT3vgyIqXjP8Ypia653kEVe++GpXTvXnylU7A==",
3082
+ "dependencies": {
3083
+ "@babel/runtime": "^7.16.7",
3084
+ "@emotion/hash": "^0.8.0",
3085
+ "@mui/private-theming": "^5.3.0",
3086
+ "@mui/types": "^7.1.0",
3087
+ "@mui/utils": "^5.3.0",
3088
+ "clsx": "^1.1.1",
3089
+ "csstype": "^3.0.10",
3090
+ "hoist-non-react-statics": "^3.3.2",
3091
+ "jss": "^10.8.2",
3092
+ "jss-plugin-camel-case": "^10.8.2",
3093
+ "jss-plugin-default-unit": "^10.8.2",
3094
+ "jss-plugin-global": "^10.8.2",
3095
+ "jss-plugin-nested": "^10.8.2",
3096
+ "jss-plugin-props-sort": "^10.8.2",
3097
+ "jss-plugin-rule-value-function": "^10.8.2",
3098
+ "jss-plugin-vendor-prefixer": "^10.8.2",
3099
+ "prop-types": "^15.7.2"
3100
+ },
3101
+ "engines": {
3102
+ "node": ">=12.0.0"
3103
+ },
3104
+ "funding": {
3105
+ "type": "opencollective",
3106
+ "url": "https://opencollective.com/mui"
3107
+ },
3108
+ "peerDependencies": {
3109
+ "@types/react": "^16.8.6 || ^17.0.0",
3110
+ "react": "^17.0.0"
3111
+ },
3112
+ "peerDependenciesMeta": {
3113
+ "@types/react": {
3114
+ "optional": true
3115
+ }
3116
+ }
3117
+ },
3118
+ "node_modules/@mui/system": {
3119
+ "version": "5.3.0",
3120
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.3.0.tgz",
3121
+ "integrity": "sha512-mblz3EObrhhIMPwSEe2Az7MbMaXOFgrvItPOzZwcY5O9qERB7Rr8KQgbU8VouWLUqyV2i8BaFpLrkKPA6eX2Aw==",
3122
+ "dependencies": {
3123
+ "@babel/runtime": "^7.16.7",
3124
+ "@mui/private-theming": "^5.3.0",
3125
+ "@mui/styled-engine": "^5.3.0",
3126
+ "@mui/types": "^7.1.0",
3127
+ "@mui/utils": "^5.3.0",
3128
+ "clsx": "^1.1.1",
3129
+ "csstype": "^3.0.10",
3130
+ "prop-types": "^15.7.2"
3131
+ },
3132
+ "engines": {
3133
+ "node": ">=12.0.0"
3134
+ },
3135
+ "funding": {
3136
+ "type": "opencollective",
3137
+ "url": "https://opencollective.com/mui"
3138
+ },
3139
+ "peerDependencies": {
3140
+ "@emotion/react": "^11.5.0",
3141
+ "@emotion/styled": "^11.3.0",
3142
+ "@types/react": "^16.8.6 || ^17.0.0",
3143
+ "react": "^17.0.0"
3144
+ },
3145
+ "peerDependenciesMeta": {
3146
+ "@emotion/react": {
3147
+ "optional": true
3148
+ },
3149
+ "@emotion/styled": {
3150
+ "optional": true
3151
+ },
3152
+ "@types/react": {
3153
+ "optional": true
3154
+ }
3155
+ }
3156
+ },
3157
+ "node_modules/@mui/types": {
3158
+ "version": "7.1.0",
3159
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.0.tgz",
3160
+ "integrity": "sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ==",
3161
+ "peerDependencies": {
3162
+ "@types/react": "*"
3163
+ },
3164
+ "peerDependenciesMeta": {
3165
+ "@types/react": {
3166
+ "optional": true
3167
+ }
3168
+ }
3169
+ },
3170
+ "node_modules/@mui/utils": {
3171
+ "version": "5.3.0",
3172
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.3.0.tgz",
3173
+ "integrity": "sha512-O/E9IQKPMg0OrN7+gkn7Ga5o5WA2iXQGdyqNBFPNrYzxOvwzsEtM5K7MtTCGGYKFe8mhTRM0ZOjh5OM0dglw+Q==",
3174
+ "dependencies": {
3175
+ "@babel/runtime": "^7.16.7",
3176
+ "@types/prop-types": "^15.7.4",
3177
+ "@types/react-is": "^16.7.1 || ^17.0.0",
3178
+ "prop-types": "^15.7.2",
3179
+ "react-is": "^17.0.2"
3180
+ },
3181
+ "engines": {
3182
+ "node": ">=12.0.0"
3183
+ },
3184
+ "funding": {
3185
+ "type": "opencollective",
3186
+ "url": "https://opencollective.com/mui"
3187
+ },
3188
+ "peerDependencies": {
3189
+ "react": "^17.0.0"
3190
+ }
3191
+ },
3192
+ "node_modules/@mui/x-data-grid": {
3193
+ "version": "5.3.0",
3194
+ "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-5.3.0.tgz",
3195
+ "integrity": "sha512-TYo151g4U5BGyzfxcr1CsrY5/r7Tq+qfEQcNwsiz00xUZNhwspv0SmzKDvny33Q/qW8ey7o/CtjTkU/iBwOCGg==",
3196
+ "dependencies": {
3197
+ "@mui/utils": "^5.2.3",
3198
+ "clsx": "^1.1.1",
3199
+ "prop-types": "^15.8.1",
3200
+ "reselect": "^4.1.5"
3201
+ },
3202
+ "engines": {
3203
+ "node": ">=12.0.0"
3204
+ },
3205
+ "funding": {
3206
+ "type": "opencollective",
3207
+ "url": "https://opencollective.com/mui"
3208
+ },
3209
+ "peerDependencies": {
3210
+ "@mui/material": "^5.2.8",
3211
+ "@mui/system": "^5.2.8",
3212
+ "react": "^17.0.2"
3213
+ }
3214
+ },
3215
+ "node_modules/@nodelib/fs.scandir": {
3216
+ "version": "2.1.5",
3217
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
3218
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
3219
+ "dependencies": {
3220
+ "@nodelib/fs.stat": "2.0.5",
3221
+ "run-parallel": "^1.1.9"
3222
+ },
3223
+ "engines": {
3224
+ "node": ">= 8"
3225
+ }
3226
+ },
3227
+ "node_modules/@nodelib/fs.stat": {
3228
+ "version": "2.0.5",
3229
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
3230
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
3231
+ "engines": {
3232
+ "node": ">= 8"
3233
+ }
3234
+ },
3235
+ "node_modules/@nodelib/fs.walk": {
3236
+ "version": "1.2.8",
3237
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
3238
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
3239
+ "dependencies": {
3240
+ "@nodelib/fs.scandir": "2.1.5",
3241
+ "fastq": "^1.6.0"
3242
+ },
3243
+ "engines": {
3244
+ "node": ">= 8"
3245
+ }
3246
+ },
3247
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
3248
+ "version": "0.5.4",
3249
+ "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz",
3250
+ "integrity": "sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw==",
3251
+ "dependencies": {
3252
+ "ansi-html-community": "^0.0.8",
3253
+ "common-path-prefix": "^3.0.0",
3254
+ "core-js-pure": "^3.8.1",
3255
+ "error-stack-parser": "^2.0.6",
3256
+ "find-up": "^5.0.0",
3257
+ "html-entities": "^2.1.0",
3258
+ "loader-utils": "^2.0.0",
3259
+ "schema-utils": "^3.0.0",
3260
+ "source-map": "^0.7.3"
3261
+ },
3262
+ "engines": {
3263
+ "node": ">= 10.13"
3264
+ },
3265
+ "peerDependencies": {
3266
+ "@types/webpack": "4.x || 5.x",
3267
+ "react-refresh": ">=0.10.0 <1.0.0",
3268
+ "sockjs-client": "^1.4.0",
3269
+ "type-fest": ">=0.17.0 <3.0.0",
3270
+ "webpack": ">=4.43.0 <6.0.0",
3271
+ "webpack-dev-server": "3.x || 4.x",
3272
+ "webpack-hot-middleware": "2.x",
3273
+ "webpack-plugin-serve": "0.x || 1.x"
3274
+ },
3275
+ "peerDependenciesMeta": {
3276
+ "@types/webpack": {
3277
+ "optional": true
3278
+ },
3279
+ "sockjs-client": {
3280
+ "optional": true
3281
+ },
3282
+ "type-fest": {
3283
+ "optional": true
3284
+ },
3285
+ "webpack-dev-server": {
3286
+ "optional": true
3287
+ },
3288
+ "webpack-hot-middleware": {
3289
+ "optional": true
3290
+ },
3291
+ "webpack-plugin-serve": {
3292
+ "optional": true
3293
+ }
3294
+ }
3295
+ },
3296
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": {
3297
+ "version": "0.7.3",
3298
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
3299
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
3300
+ "engines": {
3301
+ "node": ">= 8"
3302
+ }
3303
+ },
3304
+ "node_modules/@popperjs/core": {
3305
+ "version": "2.11.2",
3306
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz",
3307
+ "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==",
3308
+ "funding": {
3309
+ "type": "opencollective",
3310
+ "url": "https://opencollective.com/popperjs"
3311
+ }
3312
+ },
3313
+ "node_modules/@rollup/plugin-babel": {
3314
+ "version": "5.3.0",
3315
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz",
3316
+ "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==",
3317
+ "dependencies": {
3318
+ "@babel/helper-module-imports": "^7.10.4",
3319
+ "@rollup/pluginutils": "^3.1.0"
3320
+ },
3321
+ "engines": {
3322
+ "node": ">= 10.0.0"
3323
+ },
3324
+ "peerDependencies": {
3325
+ "@babel/core": "^7.0.0",
3326
+ "@types/babel__core": "^7.1.9",
3327
+ "rollup": "^1.20.0||^2.0.0"
3328
+ },
3329
+ "peerDependenciesMeta": {
3330
+ "@types/babel__core": {
3331
+ "optional": true
3332
+ }
3333
+ }
3334
+ },
3335
+ "node_modules/@rollup/plugin-node-resolve": {
3336
+ "version": "11.2.1",
3337
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
3338
+ "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
3339
+ "dependencies": {
3340
+ "@rollup/pluginutils": "^3.1.0",
3341
+ "@types/resolve": "1.17.1",
3342
+ "builtin-modules": "^3.1.0",
3343
+ "deepmerge": "^4.2.2",
3344
+ "is-module": "^1.0.0",
3345
+ "resolve": "^1.19.0"
3346
+ },
3347
+ "engines": {
3348
+ "node": ">= 10.0.0"
3349
+ },
3350
+ "peerDependencies": {
3351
+ "rollup": "^1.20.0||^2.0.0"
3352
+ }
3353
+ },
3354
+ "node_modules/@rollup/plugin-replace": {
3355
+ "version": "2.4.2",
3356
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
3357
+ "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
3358
+ "dependencies": {
3359
+ "@rollup/pluginutils": "^3.1.0",
3360
+ "magic-string": "^0.25.7"
3361
+ },
3362
+ "peerDependencies": {
3363
+ "rollup": "^1.20.0 || ^2.0.0"
3364
+ }
3365
+ },
3366
+ "node_modules/@rollup/pluginutils": {
3367
+ "version": "3.1.0",
3368
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
3369
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
3370
+ "dependencies": {
3371
+ "@types/estree": "0.0.39",
3372
+ "estree-walker": "^1.0.1",
3373
+ "picomatch": "^2.2.2"
3374
+ },
3375
+ "engines": {
3376
+ "node": ">= 8.0.0"
3377
+ },
3378
+ "peerDependencies": {
3379
+ "rollup": "^1.20.0||^2.0.0"
3380
+ }
3381
+ },
3382
+ "node_modules/@rollup/pluginutils/node_modules/@types/estree": {
3383
+ "version": "0.0.39",
3384
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
3385
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
3386
+ },
3387
+ "node_modules/@rushstack/eslint-patch": {
3388
+ "version": "1.1.0",
3389
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz",
3390
+ "integrity": "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A=="
3391
+ },
3392
+ "node_modules/@sinonjs/commons": {
3393
+ "version": "1.8.3",
3394
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
3395
+ "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
3396
+ "dependencies": {
3397
+ "type-detect": "4.0.8"
3398
+ }
3399
+ },
3400
+ "node_modules/@sinonjs/fake-timers": {
3401
+ "version": "8.1.0",
3402
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
3403
+ "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
3404
+ "dependencies": {
3405
+ "@sinonjs/commons": "^1.7.0"
3406
+ }
3407
+ },
3408
+ "node_modules/@surma/rollup-plugin-off-main-thread": {
3409
+ "version": "2.2.3",
3410
+ "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
3411
+ "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
3412
+ "dependencies": {
3413
+ "ejs": "^3.1.6",
3414
+ "json5": "^2.2.0",
3415
+ "magic-string": "^0.25.0",
3416
+ "string.prototype.matchall": "^4.0.6"
3417
+ }
3418
+ },
3419
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
3420
+ "version": "5.4.0",
3421
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
3422
+ "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==",
3423
+ "engines": {
3424
+ "node": ">=10"
3425
+ },
3426
+ "funding": {
3427
+ "type": "github",
3428
+ "url": "https://github.com/sponsors/gregberge"
3429
+ }
3430
+ },
3431
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
3432
+ "version": "5.4.0",
3433
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
3434
+ "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==",
3435
+ "engines": {
3436
+ "node": ">=10"
3437
+ },
3438
+ "funding": {
3439
+ "type": "github",
3440
+ "url": "https://github.com/sponsors/gregberge"
3441
+ }
3442
+ },
3443
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
3444
+ "version": "5.0.1",
3445
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
3446
+ "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==",
3447
+ "engines": {
3448
+ "node": ">=10"
3449
+ },
3450
+ "funding": {
3451
+ "type": "github",
3452
+ "url": "https://github.com/sponsors/gregberge"
3453
+ }
3454
+ },
3455
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
3456
+ "version": "5.0.1",
3457
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
3458
+ "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==",
3459
+ "engines": {
3460
+ "node": ">=10"
3461
+ },
3462
+ "funding": {
3463
+ "type": "github",
3464
+ "url": "https://github.com/sponsors/gregberge"
3465
+ }
3466
+ },
3467
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
3468
+ "version": "5.4.0",
3469
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
3470
+ "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==",
3471
+ "engines": {
3472
+ "node": ">=10"
3473
+ },
3474
+ "funding": {
3475
+ "type": "github",
3476
+ "url": "https://github.com/sponsors/gregberge"
3477
+ }
3478
+ },
3479
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
3480
+ "version": "5.4.0",
3481
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
3482
+ "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==",
3483
+ "engines": {
3484
+ "node": ">=10"
3485
+ },
3486
+ "funding": {
3487
+ "type": "github",
3488
+ "url": "https://github.com/sponsors/gregberge"
3489
+ }
3490
+ },
3491
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
3492
+ "version": "5.4.0",
3493
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
3494
+ "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==",
3495
+ "engines": {
3496
+ "node": ">=10"
3497
+ },
3498
+ "funding": {
3499
+ "type": "github",
3500
+ "url": "https://github.com/sponsors/gregberge"
3501
+ }
3502
+ },
3503
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
3504
+ "version": "5.5.0",
3505
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
3506
+ "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==",
3507
+ "engines": {
3508
+ "node": ">=10"
3509
+ },
3510
+ "funding": {
3511
+ "type": "github",
3512
+ "url": "https://github.com/sponsors/gregberge"
3513
+ }
3514
+ },
3515
+ "node_modules/@svgr/babel-preset": {
3516
+ "version": "5.5.0",
3517
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
3518
+ "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
3519
+ "dependencies": {
3520
+ "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
3521
+ "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
3522
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
3523
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
3524
+ "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
3525
+ "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
3526
+ "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
3527
+ "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
3528
+ },
3529
+ "engines": {
3530
+ "node": ">=10"
3531
+ },
3532
+ "funding": {
3533
+ "type": "github",
3534
+ "url": "https://github.com/sponsors/gregberge"
3535
+ }
3536
+ },
3537
+ "node_modules/@svgr/core": {
3538
+ "version": "5.5.0",
3539
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz",
3540
+ "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
3541
+ "dependencies": {
3542
+ "@svgr/plugin-jsx": "^5.5.0",
3543
+ "camelcase": "^6.2.0",
3544
+ "cosmiconfig": "^7.0.0"
3545
+ },
3546
+ "engines": {
3547
+ "node": ">=10"
3548
+ },
3549
+ "funding": {
3550
+ "type": "github",
3551
+ "url": "https://github.com/sponsors/gregberge"
3552
+ }
3553
+ },
3554
+ "node_modules/@svgr/hast-util-to-babel-ast": {
3555
+ "version": "5.5.0",
3556
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
3557
+ "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
3558
+ "dependencies": {
3559
+ "@babel/types": "^7.12.6"
3560
+ },
3561
+ "engines": {
3562
+ "node": ">=10"
3563
+ },
3564
+ "funding": {
3565
+ "type": "github",
3566
+ "url": "https://github.com/sponsors/gregberge"
3567
+ }
3568
+ },
3569
+ "node_modules/@svgr/plugin-jsx": {
3570
+ "version": "5.5.0",
3571
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
3572
+ "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
3573
+ "dependencies": {
3574
+ "@babel/core": "^7.12.3",
3575
+ "@svgr/babel-preset": "^5.5.0",
3576
+ "@svgr/hast-util-to-babel-ast": "^5.5.0",
3577
+ "svg-parser": "^2.0.2"
3578
+ },
3579
+ "engines": {
3580
+ "node": ">=10"
3581
+ },
3582
+ "funding": {
3583
+ "type": "github",
3584
+ "url": "https://github.com/sponsors/gregberge"
3585
+ }
3586
+ },
3587
+ "node_modules/@svgr/plugin-svgo": {
3588
+ "version": "5.5.0",
3589
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
3590
+ "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
3591
+ "dependencies": {
3592
+ "cosmiconfig": "^7.0.0",
3593
+ "deepmerge": "^4.2.2",
3594
+ "svgo": "^1.2.2"
3595
+ },
3596
+ "engines": {
3597
+ "node": ">=10"
3598
+ },
3599
+ "funding": {
3600
+ "type": "github",
3601
+ "url": "https://github.com/sponsors/gregberge"
3602
+ }
3603
+ },
3604
+ "node_modules/@svgr/webpack": {
3605
+ "version": "5.5.0",
3606
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz",
3607
+ "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
3608
+ "dependencies": {
3609
+ "@babel/core": "^7.12.3",
3610
+ "@babel/plugin-transform-react-constant-elements": "^7.12.1",
3611
+ "@babel/preset-env": "^7.12.1",
3612
+ "@babel/preset-react": "^7.12.5",
3613
+ "@svgr/core": "^5.5.0",
3614
+ "@svgr/plugin-jsx": "^5.5.0",
3615
+ "@svgr/plugin-svgo": "^5.5.0",
3616
+ "loader-utils": "^2.0.0"
3617
+ },
3618
+ "engines": {
3619
+ "node": ">=10"
3620
+ },
3621
+ "funding": {
3622
+ "type": "github",
3623
+ "url": "https://github.com/sponsors/gregberge"
3624
+ }
3625
+ },
3626
+ "node_modules/@testing-library/dom": {
3627
+ "version": "8.11.2",
3628
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.11.2.tgz",
3629
+ "integrity": "sha512-idsS/cqbYudXcVWngc1PuWNmXs416oBy2g/7Q8QAUREt5Z3MUkAL2XJD7xazLJ6esDfqRDi/ZBxk+OPPXitHRw==",
3630
+ "dependencies": {
3631
+ "@babel/code-frame": "^7.10.4",
3632
+ "@babel/runtime": "^7.12.5",
3633
+ "@types/aria-query": "^4.2.0",
3634
+ "aria-query": "^5.0.0",
3635
+ "chalk": "^4.1.0",
3636
+ "dom-accessibility-api": "^0.5.9",
3637
+ "lz-string": "^1.4.4",
3638
+ "pretty-format": "^27.0.2"
3639
+ },
3640
+ "engines": {
3641
+ "node": ">=12"
3642
+ }
3643
+ },
3644
+ "node_modules/@testing-library/dom/node_modules/ansi-styles": {
3645
+ "version": "4.3.0",
3646
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
3647
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
3648
+ "dependencies": {
3649
+ "color-convert": "^2.0.1"
3650
+ },
3651
+ "engines": {
3652
+ "node": ">=8"
3653
+ },
3654
+ "funding": {
3655
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
3656
+ }
3657
+ },
3658
+ "node_modules/@testing-library/dom/node_modules/aria-query": {
3659
+ "version": "5.0.0",
3660
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz",
3661
+ "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==",
3662
+ "engines": {
3663
+ "node": ">=6.0"
3664
+ }
3665
+ },
3666
+ "node_modules/@testing-library/dom/node_modules/chalk": {
3667
+ "version": "4.1.2",
3668
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
3669
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
3670
+ "dependencies": {
3671
+ "ansi-styles": "^4.1.0",
3672
+ "supports-color": "^7.1.0"
3673
+ },
3674
+ "engines": {
3675
+ "node": ">=10"
3676
+ },
3677
+ "funding": {
3678
+ "url": "https://github.com/chalk/chalk?sponsor=1"
3679
+ }
3680
+ },
3681
+ "node_modules/@testing-library/dom/node_modules/color-convert": {
3682
+ "version": "2.0.1",
3683
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
3684
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
3685
+ "dependencies": {
3686
+ "color-name": "~1.1.4"
3687
+ },
3688
+ "engines": {
3689
+ "node": ">=7.0.0"
3690
+ }
3691
+ },
3692
+ "node_modules/@testing-library/dom/node_modules/color-name": {
3693
+ "version": "1.1.4",
3694
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
3695
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
3696
+ },
3697
+ "node_modules/@testing-library/dom/node_modules/has-flag": {
3698
+ "version": "4.0.0",
3699
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
3700
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
3701
+ "engines": {
3702
+ "node": ">=8"
3703
+ }
3704
+ },
3705
+ "node_modules/@testing-library/dom/node_modules/supports-color": {
3706
+ "version": "7.2.0",
3707
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
3708
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
3709
+ "dependencies": {
3710
+ "has-flag": "^4.0.0"
3711
+ },
3712
+ "engines": {
3713
+ "node": ">=8"
3714
+ }
3715
+ },
3716
+ "node_modules/@testing-library/jest-dom": {
3717
+ "version": "5.16.1",
3718
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.1.tgz",
3719
+ "integrity": "sha512-ajUJdfDIuTCadB79ukO+0l8O+QwN0LiSxDaYUTI4LndbbUsGi6rWU1SCexXzBA2NSjlVB9/vbkasQIL3tmPBjw==",
3720
+ "dependencies": {
3721
+ "@babel/runtime": "^7.9.2",
3722
+ "@types/testing-library__jest-dom": "^5.9.1",
3723
+ "aria-query": "^5.0.0",
3724
+ "chalk": "^3.0.0",
3725
+ "css": "^3.0.0",
3726
+ "css.escape": "^1.5.1",
3727
+ "dom-accessibility-api": "^0.5.6",
3728
+ "lodash": "^4.17.15",
3729
+ "redent": "^3.0.0"
3730
+ },
3731
+ "engines": {
3732
+ "node": ">=8",
3733
+ "npm": ">=6",
3734
+ "yarn": ">=1"
3735
+ }
3736
+ },
3737
+ "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": {
3738
+ "version": "4.3.0",
3739
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
3740
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
3741
+ "dependencies": {
3742
+ "color-convert": "^2.0.1"
3743
+ },
3744
+ "engines": {
3745
+ "node": ">=8"
3746
+ },
3747
+ "funding": {
3748
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
3749
+ }
3750
+ },
3751
+ "node_modules/@testing-library/jest-dom/node_modules/aria-query": {
3752
+ "version": "5.0.0",
3753
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz",
3754
+ "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==",
3755
+ "engines": {
3756
+ "node": ">=6.0"
3757
+ }
3758
+ },
3759
+ "node_modules/@testing-library/jest-dom/node_modules/chalk": {
3760
+ "version": "3.0.0",
3761
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
3762
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
3763
+ "dependencies": {
3764
+ "ansi-styles": "^4.1.0",
3765
+ "supports-color": "^7.1.0"
3766
+ },
3767
+ "engines": {
3768
+ "node": ">=8"
3769
+ }
3770
+ },
3771
+ "node_modules/@testing-library/jest-dom/node_modules/color-convert": {
3772
+ "version": "2.0.1",
3773
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
3774
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
3775
+ "dependencies": {
3776
+ "color-name": "~1.1.4"
3777
+ },
3778
+ "engines": {
3779
+ "node": ">=7.0.0"
3780
+ }
3781
+ },
3782
+ "node_modules/@testing-library/jest-dom/node_modules/color-name": {
3783
+ "version": "1.1.4",
3784
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
3785
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
3786
+ },
3787
+ "node_modules/@testing-library/jest-dom/node_modules/has-flag": {
3788
+ "version": "4.0.0",
3789
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
3790
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
3791
+ "engines": {
3792
+ "node": ">=8"
3793
+ }
3794
+ },
3795
+ "node_modules/@testing-library/jest-dom/node_modules/supports-color": {
3796
+ "version": "7.2.0",
3797
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
3798
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
3799
+ "dependencies": {
3800
+ "has-flag": "^4.0.0"
3801
+ },
3802
+ "engines": {
3803
+ "node": ">=8"
3804
+ }
3805
+ },
3806
+ "node_modules/@testing-library/react": {
3807
+ "version": "12.1.2",
3808
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.2.tgz",
3809
+ "integrity": "sha512-ihQiEOklNyHIpo2Y8FREkyD1QAea054U0MVbwH1m8N9TxeFz+KoJ9LkqoKqJlzx2JDm56DVwaJ1r36JYxZM05g==",
3810
+ "dependencies": {
3811
+ "@babel/runtime": "^7.12.5",
3812
+ "@testing-library/dom": "^8.0.0"
3813
+ },
3814
+ "engines": {
3815
+ "node": ">=12"
3816
+ },
3817
+ "peerDependencies": {
3818
+ "react": "*",
3819
+ "react-dom": "*"
3820
+ }
3821
+ },
3822
+ "node_modules/@testing-library/user-event": {
3823
+ "version": "13.5.0",
3824
+ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz",
3825
+ "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==",
3826
+ "dependencies": {
3827
+ "@babel/runtime": "^7.12.5"
3828
+ },
3829
+ "engines": {
3830
+ "node": ">=10",
3831
+ "npm": ">=6"
3832
+ },
3833
+ "peerDependencies": {
3834
+ "@testing-library/dom": ">=7.21.4"
3835
+ }
3836
+ },
3837
+ "node_modules/@tootallnate/once": {
3838
+ "version": "1.1.2",
3839
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
3840
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
3841
+ "engines": {
3842
+ "node": ">= 6"
3843
+ }
3844
+ },
3845
+ "node_modules/@trysound/sax": {
3846
+ "version": "0.2.0",
3847
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
3848
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
3849
+ "engines": {
3850
+ "node": ">=10.13.0"
3851
+ }
3852
+ },
3853
+ "node_modules/@types/aria-query": {
3854
+ "version": "4.2.2",
3855
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz",
3856
+ "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig=="
3857
+ },
3858
+ "node_modules/@types/babel__core": {
3859
+ "version": "7.1.18",
3860
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz",
3861
+ "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==",
3862
+ "dependencies": {
3863
+ "@babel/parser": "^7.1.0",
3864
+ "@babel/types": "^7.0.0",
3865
+ "@types/babel__generator": "*",
3866
+ "@types/babel__template": "*",
3867
+ "@types/babel__traverse": "*"
3868
+ }
3869
+ },
3870
+ "node_modules/@types/babel__generator": {
3871
+ "version": "7.6.4",
3872
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
3873
+ "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
3874
+ "dependencies": {
3875
+ "@babel/types": "^7.0.0"
3876
+ }
3877
+ },
3878
+ "node_modules/@types/babel__template": {
3879
+ "version": "7.4.1",
3880
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
3881
+ "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
3882
+ "dependencies": {
3883
+ "@babel/parser": "^7.1.0",
3884
+ "@babel/types": "^7.0.0"
3885
+ }
3886
+ },
3887
+ "node_modules/@types/babel__traverse": {
3888
+ "version": "7.14.2",
3889
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz",
3890
+ "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==",
3891
+ "dependencies": {
3892
+ "@babel/types": "^7.3.0"
3893
+ }
3894
+ },
3895
+ "node_modules/@types/body-parser": {
3896
+ "version": "1.19.2",
3897
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
3898
+ "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
3899
+ "dependencies": {
3900
+ "@types/connect": "*",
3901
+ "@types/node": "*"
3902
+ }
3903
+ },
3904
+ "node_modules/@types/bonjour": {
3905
+ "version": "3.5.10",
3906
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
3907
+ "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
3908
+ "dependencies": {
3909
+ "@types/node": "*"
3910
+ }
3911
+ },
3912
+ "node_modules/@types/connect": {
3913
+ "version": "3.4.35",
3914
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
3915
+ "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
3916
+ "dependencies": {
3917
+ "@types/node": "*"
3918
+ }
3919
+ },
3920
+ "node_modules/@types/connect-history-api-fallback": {
3921
+ "version": "1.3.5",
3922
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
3923
+ "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
3924
+ "dependencies": {
3925
+ "@types/express-serve-static-core": "*",
3926
+ "@types/node": "*"
3927
+ }
3928
+ },
3929
+ "node_modules/@types/eslint": {
3930
+ "version": "7.29.0",
3931
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz",
3932
+ "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==",
3933
+ "dependencies": {
3934
+ "@types/estree": "*",
3935
+ "@types/json-schema": "*"
3936
+ }
3937
+ },
3938
+ "node_modules/@types/eslint-scope": {
3939
+ "version": "3.7.3",
3940
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
3941
+ "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
3942
+ "dependencies": {
3943
+ "@types/eslint": "*",
3944
+ "@types/estree": "*"
3945
+ }
3946
+ },
3947
+ "node_modules/@types/estree": {
3948
+ "version": "0.0.50",
3949
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
3950
+ "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw=="
3951
+ },
3952
+ "node_modules/@types/express": {
3953
+ "version": "4.17.13",
3954
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
3955
+ "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
3956
+ "dependencies": {
3957
+ "@types/body-parser": "*",
3958
+ "@types/express-serve-static-core": "^4.17.18",
3959
+ "@types/qs": "*",
3960
+ "@types/serve-static": "*"
3961
+ }
3962
+ },
3963
+ "node_modules/@types/express-serve-static-core": {
3964
+ "version": "4.17.28",
3965
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
3966
+ "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
3967
+ "dependencies": {
3968
+ "@types/node": "*",
3969
+ "@types/qs": "*",
3970
+ "@types/range-parser": "*"
3971
+ }
3972
+ },
3973
+ "node_modules/@types/graceful-fs": {
3974
+ "version": "4.1.5",
3975
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
3976
+ "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
3977
+ "dependencies": {
3978
+ "@types/node": "*"
3979
+ }
3980
+ },
3981
+ "node_modules/@types/html-minifier-terser": {
3982
+ "version": "6.1.0",
3983
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
3984
+ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg=="
3985
+ },
3986
+ "node_modules/@types/http-proxy": {
3987
+ "version": "1.17.8",
3988
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
3989
+ "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
3990
+ "dependencies": {
3991
+ "@types/node": "*"
3992
+ }
3993
+ },
3994
+ "node_modules/@types/istanbul-lib-coverage": {
3995
+ "version": "2.0.4",
3996
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
3997
+ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g=="
3998
+ },
3999
+ "node_modules/@types/istanbul-lib-report": {
4000
+ "version": "3.0.0",
4001
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
4002
+ "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
4003
+ "dependencies": {
4004
+ "@types/istanbul-lib-coverage": "*"
4005
+ }
4006
+ },
4007
+ "node_modules/@types/istanbul-reports": {
4008
+ "version": "3.0.1",
4009
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
4010
+ "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
4011
+ "dependencies": {
4012
+ "@types/istanbul-lib-report": "*"
4013
+ }
4014
+ },
4015
+ "node_modules/@types/jest": {
4016
+ "version": "27.4.0",
4017
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz",
4018
+ "integrity": "sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==",
4019
+ "dependencies": {
4020
+ "jest-diff": "^27.0.0",
4021
+ "pretty-format": "^27.0.0"
4022
+ }
4023
+ },
4024
+ "node_modules/@types/json-schema": {
4025
+ "version": "7.0.9",
4026
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
4027
+ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
4028
+ },
4029
+ "node_modules/@types/json5": {
4030
+ "version": "0.0.29",
4031
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
4032
+ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4="
4033
+ },
4034
+ "node_modules/@types/mime": {
4035
+ "version": "1.3.2",
4036
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
4037
+ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
4038
+ },
4039
+ "node_modules/@types/node": {
4040
+ "version": "16.11.21",
4041
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.21.tgz",
4042
+ "integrity": "sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A=="
4043
+ },
4044
+ "node_modules/@types/parse-json": {
4045
+ "version": "4.0.0",
4046
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
4047
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
4048
+ },
4049
+ "node_modules/@types/prettier": {
4050
+ "version": "2.4.3",
4051
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.3.tgz",
4052
+ "integrity": "sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w=="
4053
+ },
4054
+ "node_modules/@types/prop-types": {
4055
+ "version": "15.7.4",
4056
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
4057
+ "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
4058
+ },
4059
+ "node_modules/@types/q": {
4060
+ "version": "1.5.5",
4061
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
4062
+ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ=="
4063
+ },
4064
+ "node_modules/@types/qs": {
4065
+ "version": "6.9.7",
4066
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
4067
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
4068
+ },
4069
+ "node_modules/@types/range-parser": {
4070
+ "version": "1.2.4",
4071
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
4072
+ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
4073
+ },
4074
+ "node_modules/@types/react": {
4075
+ "version": "17.0.38",
4076
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz",
4077
+ "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==",
4078
+ "dependencies": {
4079
+ "@types/prop-types": "*",
4080
+ "@types/scheduler": "*",
4081
+ "csstype": "^3.0.2"
4082
+ }
4083
+ },
4084
+ "node_modules/@types/react-dom": {
4085
+ "version": "17.0.11",
4086
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz",
4087
+ "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==",
4088
+ "dependencies": {
4089
+ "@types/react": "*"
4090
+ }
4091
+ },
4092
+ "node_modules/@types/react-is": {
4093
+ "version": "17.0.3",
4094
+ "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz",
4095
+ "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==",
4096
+ "dependencies": {
4097
+ "@types/react": "*"
4098
+ }
4099
+ },
4100
+ "node_modules/@types/react-transition-group": {
4101
+ "version": "4.4.4",
4102
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz",
4103
+ "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==",
4104
+ "dependencies": {
4105
+ "@types/react": "*"
4106
+ }
4107
+ },
4108
+ "node_modules/@types/resolve": {
4109
+ "version": "1.17.1",
4110
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
4111
+ "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
4112
+ "dependencies": {
4113
+ "@types/node": "*"
4114
+ }
4115
+ },
4116
+ "node_modules/@types/retry": {
4117
+ "version": "0.12.1",
4118
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz",
4119
+ "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g=="
4120
+ },
4121
+ "node_modules/@types/scheduler": {
4122
+ "version": "0.16.2",
4123
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
4124
+ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
4125
+ },
4126
+ "node_modules/@types/serve-index": {
4127
+ "version": "1.9.1",
4128
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
4129
+ "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
4130
+ "dependencies": {
4131
+ "@types/express": "*"
4132
+ }
4133
+ },
4134
+ "node_modules/@types/serve-static": {
4135
+ "version": "1.13.10",
4136
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
4137
+ "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
4138
+ "dependencies": {
4139
+ "@types/mime": "^1",
4140
+ "@types/node": "*"
4141
+ }
4142
+ },
4143
+ "node_modules/@types/sockjs": {
4144
+ "version": "0.3.33",
4145
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
4146
+ "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
4147
+ "dependencies": {
4148
+ "@types/node": "*"
4149
+ }
4150
+ },
4151
+ "node_modules/@types/stack-utils": {
4152
+ "version": "2.0.1",
4153
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
4154
+ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw=="
4155
+ },
4156
+ "node_modules/@types/testing-library__jest-dom": {
4157
+ "version": "5.14.2",
4158
+ "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.2.tgz",
4159
+ "integrity": "sha512-vehbtyHUShPxIa9SioxDwCvgxukDMH//icJG90sXQBUm5lJOHLT5kNeU9tnivhnA/TkOFMzGIXN2cTc4hY8/kg==",
4160
+ "dependencies": {
4161
+ "@types/jest": "*"
4162
+ }
4163
+ },
4164
+ "node_modules/@types/trusted-types": {
4165
+ "version": "2.0.2",
4166
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
4167
+ "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
4168
+ },
4169
+ "node_modules/@types/ws": {
4170
+ "version": "8.2.2",
4171
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz",
4172
+ "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==",
4173
+ "dependencies": {
4174
+ "@types/node": "*"
4175
+ }
4176
+ },
4177
+ "node_modules/@types/yargs": {
4178
+ "version": "16.0.4",
4179
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
4180
+ "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
4181
+ "dependencies": {
4182
+ "@types/yargs-parser": "*"
4183
+ }
4184
+ },
4185
+ "node_modules/@types/yargs-parser": {
4186
+ "version": "20.2.1",
4187
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz",
4188
+ "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw=="
4189
+ },
4190
+ "node_modules/@typescript-eslint/eslint-plugin": {
4191
+ "version": "5.10.0",
4192
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz",
4193
+ "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==",
4194
+ "dependencies": {
4195
+ "@typescript-eslint/scope-manager": "5.10.0",
4196
+ "@typescript-eslint/type-utils": "5.10.0",
4197
+ "@typescript-eslint/utils": "5.10.0",
4198
+ "debug": "^4.3.2",
4199
+ "functional-red-black-tree": "^1.0.1",
4200
+ "ignore": "^5.1.8",
4201
+ "regexpp": "^3.2.0",
4202
+ "semver": "^7.3.5",
4203
+ "tsutils": "^3.21.0"
4204
+ },
4205
+ "engines": {
4206
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4207
+ },
4208
+ "funding": {
4209
+ "type": "opencollective",
4210
+ "url": "https://opencollective.com/typescript-eslint"
4211
+ },
4212
+ "peerDependencies": {
4213
+ "@typescript-eslint/parser": "^5.0.0",
4214
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
4215
+ },
4216
+ "peerDependenciesMeta": {
4217
+ "typescript": {
4218
+ "optional": true
4219
+ }
4220
+ }
4221
+ },
4222
+ "node_modules/@typescript-eslint/experimental-utils": {
4223
+ "version": "5.10.0",
4224
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.0.tgz",
4225
+ "integrity": "sha512-GeQAPqQMI5DVMGOUwGbSR+NdsirryyKOgUFRTWInhlsKUArns/MVnXmPpzxfrzB1nU36cT5WJAwmfCsjoaVBWg==",
4226
+ "dependencies": {
4227
+ "@typescript-eslint/utils": "5.10.0"
4228
+ },
4229
+ "engines": {
4230
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4231
+ },
4232
+ "funding": {
4233
+ "type": "opencollective",
4234
+ "url": "https://opencollective.com/typescript-eslint"
4235
+ },
4236
+ "peerDependencies": {
4237
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
4238
+ }
4239
+ },
4240
+ "node_modules/@typescript-eslint/parser": {
4241
+ "version": "5.10.0",
4242
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz",
4243
+ "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==",
4244
+ "dependencies": {
4245
+ "@typescript-eslint/scope-manager": "5.10.0",
4246
+ "@typescript-eslint/types": "5.10.0",
4247
+ "@typescript-eslint/typescript-estree": "5.10.0",
4248
+ "debug": "^4.3.2"
4249
+ },
4250
+ "engines": {
4251
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4252
+ },
4253
+ "funding": {
4254
+ "type": "opencollective",
4255
+ "url": "https://opencollective.com/typescript-eslint"
4256
+ },
4257
+ "peerDependencies": {
4258
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
4259
+ },
4260
+ "peerDependenciesMeta": {
4261
+ "typescript": {
4262
+ "optional": true
4263
+ }
4264
+ }
4265
+ },
4266
+ "node_modules/@typescript-eslint/scope-manager": {
4267
+ "version": "5.10.0",
4268
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz",
4269
+ "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==",
4270
+ "dependencies": {
4271
+ "@typescript-eslint/types": "5.10.0",
4272
+ "@typescript-eslint/visitor-keys": "5.10.0"
4273
+ },
4274
+ "engines": {
4275
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4276
+ },
4277
+ "funding": {
4278
+ "type": "opencollective",
4279
+ "url": "https://opencollective.com/typescript-eslint"
4280
+ }
4281
+ },
4282
+ "node_modules/@typescript-eslint/type-utils": {
4283
+ "version": "5.10.0",
4284
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz",
4285
+ "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==",
4286
+ "dependencies": {
4287
+ "@typescript-eslint/utils": "5.10.0",
4288
+ "debug": "^4.3.2",
4289
+ "tsutils": "^3.21.0"
4290
+ },
4291
+ "engines": {
4292
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4293
+ },
4294
+ "funding": {
4295
+ "type": "opencollective",
4296
+ "url": "https://opencollective.com/typescript-eslint"
4297
+ },
4298
+ "peerDependencies": {
4299
+ "eslint": "*"
4300
+ },
4301
+ "peerDependenciesMeta": {
4302
+ "typescript": {
4303
+ "optional": true
4304
+ }
4305
+ }
4306
+ },
4307
+ "node_modules/@typescript-eslint/types": {
4308
+ "version": "5.10.0",
4309
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz",
4310
+ "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==",
4311
+ "engines": {
4312
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4313
+ },
4314
+ "funding": {
4315
+ "type": "opencollective",
4316
+ "url": "https://opencollective.com/typescript-eslint"
4317
+ }
4318
+ },
4319
+ "node_modules/@typescript-eslint/typescript-estree": {
4320
+ "version": "5.10.0",
4321
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz",
4322
+ "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==",
4323
+ "dependencies": {
4324
+ "@typescript-eslint/types": "5.10.0",
4325
+ "@typescript-eslint/visitor-keys": "5.10.0",
4326
+ "debug": "^4.3.2",
4327
+ "globby": "^11.0.4",
4328
+ "is-glob": "^4.0.3",
4329
+ "semver": "^7.3.5",
4330
+ "tsutils": "^3.21.0"
4331
+ },
4332
+ "engines": {
4333
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4334
+ },
4335
+ "funding": {
4336
+ "type": "opencollective",
4337
+ "url": "https://opencollective.com/typescript-eslint"
4338
+ },
4339
+ "peerDependenciesMeta": {
4340
+ "typescript": {
4341
+ "optional": true
4342
+ }
4343
+ }
4344
+ },
4345
+ "node_modules/@typescript-eslint/utils": {
4346
+ "version": "5.10.0",
4347
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz",
4348
+ "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==",
4349
+ "dependencies": {
4350
+ "@types/json-schema": "^7.0.9",
4351
+ "@typescript-eslint/scope-manager": "5.10.0",
4352
+ "@typescript-eslint/types": "5.10.0",
4353
+ "@typescript-eslint/typescript-estree": "5.10.0",
4354
+ "eslint-scope": "^5.1.1",
4355
+ "eslint-utils": "^3.0.0"
4356
+ },
4357
+ "engines": {
4358
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4359
+ },
4360
+ "funding": {
4361
+ "type": "opencollective",
4362
+ "url": "https://opencollective.com/typescript-eslint"
4363
+ },
4364
+ "peerDependencies": {
4365
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
4366
+ }
4367
+ },
4368
+ "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": {
4369
+ "version": "5.1.1",
4370
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
4371
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
4372
+ "dependencies": {
4373
+ "esrecurse": "^4.3.0",
4374
+ "estraverse": "^4.1.1"
4375
+ },
4376
+ "engines": {
4377
+ "node": ">=8.0.0"
4378
+ }
4379
+ },
4380
+ "node_modules/@typescript-eslint/utils/node_modules/estraverse": {
4381
+ "version": "4.3.0",
4382
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
4383
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
4384
+ "engines": {
4385
+ "node": ">=4.0"
4386
+ }
4387
+ },
4388
+ "node_modules/@typescript-eslint/visitor-keys": {
4389
+ "version": "5.10.0",
4390
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz",
4391
+ "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==",
4392
+ "dependencies": {
4393
+ "@typescript-eslint/types": "5.10.0",
4394
+ "eslint-visitor-keys": "^3.0.0"
4395
+ },
4396
+ "engines": {
4397
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4398
+ },
4399
+ "funding": {
4400
+ "type": "opencollective",
4401
+ "url": "https://opencollective.com/typescript-eslint"
4402
+ }
4403
+ },
4404
+ "node_modules/@webassemblyjs/ast": {
4405
+ "version": "1.11.1",
4406
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
4407
+ "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
4408
+ "dependencies": {
4409
+ "@webassemblyjs/helper-numbers": "1.11.1",
4410
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
4411
+ }
4412
+ },
4413
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
4414
+ "version": "1.11.1",
4415
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
4416
+ "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
4417
+ },
4418
+ "node_modules/@webassemblyjs/helper-api-error": {
4419
+ "version": "1.11.1",
4420
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
4421
+ "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
4422
+ },
4423
+ "node_modules/@webassemblyjs/helper-buffer": {
4424
+ "version": "1.11.1",
4425
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
4426
+ "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
4427
+ },
4428
+ "node_modules/@webassemblyjs/helper-numbers": {
4429
+ "version": "1.11.1",
4430
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
4431
+ "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
4432
+ "dependencies": {
4433
+ "@webassemblyjs/floating-point-hex-parser": "1.11.1",
4434
+ "@webassemblyjs/helper-api-error": "1.11.1",
4435
+ "@xtuc/long": "4.2.2"
4436
+ }
4437
+ },
4438
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
4439
+ "version": "1.11.1",
4440
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
4441
+ "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
4442
+ },
4443
+ "node_modules/@webassemblyjs/helper-wasm-section": {
4444
+ "version": "1.11.1",
4445
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
4446
+ "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
4447
+ "dependencies": {
4448
+ "@webassemblyjs/ast": "1.11.1",
4449
+ "@webassemblyjs/helper-buffer": "1.11.1",
4450
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
4451
+ "@webassemblyjs/wasm-gen": "1.11.1"
4452
+ }
4453
+ },
4454
+ "node_modules/@webassemblyjs/ieee754": {
4455
+ "version": "1.11.1",
4456
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
4457
+ "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
4458
+ "dependencies": {
4459
+ "@xtuc/ieee754": "^1.2.0"
4460
+ }
4461
+ },
4462
+ "node_modules/@webassemblyjs/leb128": {
4463
+ "version": "1.11.1",
4464
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
4465
+ "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
4466
+ "dependencies": {
4467
+ "@xtuc/long": "4.2.2"
4468
+ }
4469
+ },
4470
+ "node_modules/@webassemblyjs/utf8": {
4471
+ "version": "1.11.1",
4472
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
4473
+ "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
4474
+ },
4475
+ "node_modules/@webassemblyjs/wasm-edit": {
4476
+ "version": "1.11.1",
4477
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
4478
+ "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
4479
+ "dependencies": {
4480
+ "@webassemblyjs/ast": "1.11.1",
4481
+ "@webassemblyjs/helper-buffer": "1.11.1",
4482
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
4483
+ "@webassemblyjs/helper-wasm-section": "1.11.1",
4484
+ "@webassemblyjs/wasm-gen": "1.11.1",
4485
+ "@webassemblyjs/wasm-opt": "1.11.1",
4486
+ "@webassemblyjs/wasm-parser": "1.11.1",
4487
+ "@webassemblyjs/wast-printer": "1.11.1"
4488
+ }
4489
+ },
4490
+ "node_modules/@webassemblyjs/wasm-gen": {
4491
+ "version": "1.11.1",
4492
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
4493
+ "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
4494
+ "dependencies": {
4495
+ "@webassemblyjs/ast": "1.11.1",
4496
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
4497
+ "@webassemblyjs/ieee754": "1.11.1",
4498
+ "@webassemblyjs/leb128": "1.11.1",
4499
+ "@webassemblyjs/utf8": "1.11.1"
4500
+ }
4501
+ },
4502
+ "node_modules/@webassemblyjs/wasm-opt": {
4503
+ "version": "1.11.1",
4504
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
4505
+ "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
4506
+ "dependencies": {
4507
+ "@webassemblyjs/ast": "1.11.1",
4508
+ "@webassemblyjs/helper-buffer": "1.11.1",
4509
+ "@webassemblyjs/wasm-gen": "1.11.1",
4510
+ "@webassemblyjs/wasm-parser": "1.11.1"
4511
+ }
4512
+ },
4513
+ "node_modules/@webassemblyjs/wasm-parser": {
4514
+ "version": "1.11.1",
4515
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
4516
+ "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
4517
+ "dependencies": {
4518
+ "@webassemblyjs/ast": "1.11.1",
4519
+ "@webassemblyjs/helper-api-error": "1.11.1",
4520
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
4521
+ "@webassemblyjs/ieee754": "1.11.1",
4522
+ "@webassemblyjs/leb128": "1.11.1",
4523
+ "@webassemblyjs/utf8": "1.11.1"
4524
+ }
4525
+ },
4526
+ "node_modules/@webassemblyjs/wast-printer": {
4527
+ "version": "1.11.1",
4528
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
4529
+ "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
4530
+ "dependencies": {
4531
+ "@webassemblyjs/ast": "1.11.1",
4532
+ "@xtuc/long": "4.2.2"
4533
+ }
4534
+ },
4535
+ "node_modules/@xtuc/ieee754": {
4536
+ "version": "1.2.0",
4537
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
4538
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
4539
+ },
4540
+ "node_modules/@xtuc/long": {
4541
+ "version": "4.2.2",
4542
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
4543
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
4544
+ },
4545
+ "node_modules/abab": {
4546
+ "version": "2.0.5",
4547
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
4548
+ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q=="
4549
+ },
4550
+ "node_modules/accepts": {
4551
+ "version": "1.3.7",
4552
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
4553
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
4554
+ "dependencies": {
4555
+ "mime-types": "~2.1.24",
4556
+ "negotiator": "0.6.2"
4557
+ },
4558
+ "engines": {
4559
+ "node": ">= 0.6"
4560
+ }
4561
+ },
4562
+ "node_modules/acorn": {
4563
+ "version": "8.7.0",
4564
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
4565
+ "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
4566
+ "bin": {
4567
+ "acorn": "bin/acorn"
4568
+ },
4569
+ "engines": {
4570
+ "node": ">=0.4.0"
4571
+ }
4572
+ },
4573
+ "node_modules/acorn-globals": {
4574
+ "version": "6.0.0",
4575
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
4576
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
4577
+ "dependencies": {
4578
+ "acorn": "^7.1.1",
4579
+ "acorn-walk": "^7.1.1"
4580
+ }
4581
+ },
4582
+ "node_modules/acorn-globals/node_modules/acorn": {
4583
+ "version": "7.4.1",
4584
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
4585
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
4586
+ "bin": {
4587
+ "acorn": "bin/acorn"
4588
+ },
4589
+ "engines": {
4590
+ "node": ">=0.4.0"
4591
+ }
4592
+ },
4593
+ "node_modules/acorn-import-assertions": {
4594
+ "version": "1.8.0",
4595
+ "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
4596
+ "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
4597
+ "peerDependencies": {
4598
+ "acorn": "^8"
4599
+ }
4600
+ },
4601
+ "node_modules/acorn-jsx": {
4602
+ "version": "5.3.2",
4603
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
4604
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
4605
+ "peerDependencies": {
4606
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
4607
+ }
4608
+ },
4609
+ "node_modules/acorn-node": {
4610
+ "version": "1.8.2",
4611
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
4612
+ "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
4613
+ "dependencies": {
4614
+ "acorn": "^7.0.0",
4615
+ "acorn-walk": "^7.0.0",
4616
+ "xtend": "^4.0.2"
4617
+ }
4618
+ },
4619
+ "node_modules/acorn-node/node_modules/acorn": {
4620
+ "version": "7.4.1",
4621
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
4622
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
4623
+ "bin": {
4624
+ "acorn": "bin/acorn"
4625
+ },
4626
+ "engines": {
4627
+ "node": ">=0.4.0"
4628
+ }
4629
+ },
4630
+ "node_modules/acorn-walk": {
4631
+ "version": "7.2.0",
4632
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
4633
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
4634
+ "engines": {
4635
+ "node": ">=0.4.0"
4636
+ }
4637
+ },
4638
+ "node_modules/address": {
4639
+ "version": "1.1.2",
4640
+ "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
4641
+ "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
4642
+ "engines": {
4643
+ "node": ">= 0.12.0"
4644
+ }
4645
+ },
4646
+ "node_modules/adjust-sourcemap-loader": {
4647
+ "version": "4.0.0",
4648
+ "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz",
4649
+ "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==",
4650
+ "dependencies": {
4651
+ "loader-utils": "^2.0.0",
4652
+ "regex-parser": "^2.2.11"
4653
+ },
4654
+ "engines": {
4655
+ "node": ">=8.9"
4656
+ }
4657
+ },
4658
+ "node_modules/agent-base": {
4659
+ "version": "6.0.2",
4660
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
4661
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
4662
+ "dependencies": {
4663
+ "debug": "4"
4664
+ },
4665
+ "engines": {
4666
+ "node": ">= 6.0.0"
4667
+ }
4668
+ },
4669
+ "node_modules/aggregate-error": {
4670
+ "version": "3.1.0",
4671
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
4672
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
4673
+ "dependencies": {
4674
+ "clean-stack": "^2.0.0",
4675
+ "indent-string": "^4.0.0"
4676
+ },
4677
+ "engines": {
4678
+ "node": ">=8"
4679
+ }
4680
+ },
4681
+ "node_modules/ajv": {
4682
+ "version": "6.12.6",
4683
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
4684
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
4685
+ "dependencies": {
4686
+ "fast-deep-equal": "^3.1.1",
4687
+ "fast-json-stable-stringify": "^2.0.0",
4688
+ "json-schema-traverse": "^0.4.1",
4689
+ "uri-js": "^4.2.2"
4690
+ },
4691
+ "funding": {
4692
+ "type": "github",
4693
+ "url": "https://github.com/sponsors/epoberezkin"
4694
+ }
4695
+ },
4696
+ "node_modules/ajv-formats": {
4697
+ "version": "2.1.1",
4698
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
4699
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
4700
+ "dependencies": {
4701
+ "ajv": "^8.0.0"
4702
+ },
4703
+ "peerDependencies": {
4704
+ "ajv": "^8.0.0"
4705
+ },
4706
+ "peerDependenciesMeta": {
4707
+ "ajv": {
4708
+ "optional": true
4709
+ }
4710
+ }
4711
+ },
4712
+ "node_modules/ajv-formats/node_modules/ajv": {
4713
+ "version": "8.9.0",
4714
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
4715
+ "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
4716
+ "dependencies": {
4717
+ "fast-deep-equal": "^3.1.1",
4718
+ "json-schema-traverse": "^1.0.0",
4719
+ "require-from-string": "^2.0.2",
4720
+ "uri-js": "^4.2.2"
4721
+ },
4722
+ "funding": {
4723
+ "type": "github",
4724
+ "url": "https://github.com/sponsors/epoberezkin"
4725
+ }
4726
+ },
4727
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
4728
+ "version": "1.0.0",
4729
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
4730
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
4731
+ },
4732
+ "node_modules/ajv-keywords": {
4733
+ "version": "3.5.2",
4734
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
4735
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
4736
+ "peerDependencies": {
4737
+ "ajv": "^6.9.1"
4738
+ }
4739
+ },
4740
+ "node_modules/ansi-escapes": {
4741
+ "version": "4.3.2",
4742
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
4743
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
4744
+ "dependencies": {
4745
+ "type-fest": "^0.21.3"
4746
+ },
4747
+ "engines": {
4748
+ "node": ">=8"
4749
+ },
4750
+ "funding": {
4751
+ "url": "https://github.com/sponsors/sindresorhus"
4752
+ }
4753
+ },
4754
+ "node_modules/ansi-html-community": {
4755
+ "version": "0.0.8",
4756
+ "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
4757
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
4758
+ "engines": [
4759
+ "node >= 0.8.0"
4760
+ ],
4761
+ "bin": {
4762
+ "ansi-html": "bin/ansi-html"
4763
+ }
4764
+ },
4765
+ "node_modules/ansi-regex": {
4766
+ "version": "5.0.1",
4767
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
4768
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
4769
+ "engines": {
4770
+ "node": ">=8"
4771
+ }
4772
+ },
4773
+ "node_modules/ansi-styles": {
4774
+ "version": "3.2.1",
4775
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
4776
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
4777
+ "dependencies": {
4778
+ "color-convert": "^1.9.0"
4779
+ },
4780
+ "engines": {
4781
+ "node": ">=4"
4782
+ }
4783
+ },
4784
+ "node_modules/anymatch": {
4785
+ "version": "3.1.2",
4786
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
4787
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
4788
+ "dependencies": {
4789
+ "normalize-path": "^3.0.0",
4790
+ "picomatch": "^2.0.4"
4791
+ },
4792
+ "engines": {
4793
+ "node": ">= 8"
4794
+ }
4795
+ },
4796
+ "node_modules/arg": {
4797
+ "version": "5.0.1",
4798
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz",
4799
+ "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA=="
4800
+ },
4801
+ "node_modules/argparse": {
4802
+ "version": "1.0.10",
4803
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
4804
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
4805
+ "dependencies": {
4806
+ "sprintf-js": "~1.0.2"
4807
+ }
4808
+ },
4809
+ "node_modules/aria-query": {
4810
+ "version": "4.2.2",
4811
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
4812
+ "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
4813
+ "dependencies": {
4814
+ "@babel/runtime": "^7.10.2",
4815
+ "@babel/runtime-corejs3": "^7.10.2"
4816
+ },
4817
+ "engines": {
4818
+ "node": ">=6.0"
4819
+ }
4820
+ },
4821
+ "node_modules/array-flatten": {
4822
+ "version": "2.1.2",
4823
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
4824
+ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
4825
+ },
4826
+ "node_modules/array-includes": {
4827
+ "version": "3.1.4",
4828
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
4829
+ "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
4830
+ "dependencies": {
4831
+ "call-bind": "^1.0.2",
4832
+ "define-properties": "^1.1.3",
4833
+ "es-abstract": "^1.19.1",
4834
+ "get-intrinsic": "^1.1.1",
4835
+ "is-string": "^1.0.7"
4836
+ },
4837
+ "engines": {
4838
+ "node": ">= 0.4"
4839
+ },
4840
+ "funding": {
4841
+ "url": "https://github.com/sponsors/ljharb"
4842
+ }
4843
+ },
4844
+ "node_modules/array-union": {
4845
+ "version": "2.1.0",
4846
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
4847
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
4848
+ "engines": {
4849
+ "node": ">=8"
4850
+ }
4851
+ },
4852
+ "node_modules/array.prototype.flat": {
4853
+ "version": "1.2.5",
4854
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
4855
+ "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
4856
+ "dependencies": {
4857
+ "call-bind": "^1.0.2",
4858
+ "define-properties": "^1.1.3",
4859
+ "es-abstract": "^1.19.0"
4860
+ },
4861
+ "engines": {
4862
+ "node": ">= 0.4"
4863
+ },
4864
+ "funding": {
4865
+ "url": "https://github.com/sponsors/ljharb"
4866
+ }
4867
+ },
4868
+ "node_modules/array.prototype.flatmap": {
4869
+ "version": "1.2.5",
4870
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz",
4871
+ "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==",
4872
+ "dependencies": {
4873
+ "call-bind": "^1.0.0",
4874
+ "define-properties": "^1.1.3",
4875
+ "es-abstract": "^1.19.0"
4876
+ },
4877
+ "engines": {
4878
+ "node": ">= 0.4"
4879
+ },
4880
+ "funding": {
4881
+ "url": "https://github.com/sponsors/ljharb"
4882
+ }
4883
+ },
4884
+ "node_modules/asap": {
4885
+ "version": "2.0.6",
4886
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
4887
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
4888
+ },
4889
+ "node_modules/ast-types-flow": {
4890
+ "version": "0.0.7",
4891
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
4892
+ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
4893
+ },
4894
+ "node_modules/async": {
4895
+ "version": "2.6.3",
4896
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
4897
+ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
4898
+ "dependencies": {
4899
+ "lodash": "^4.17.14"
4900
+ }
4901
+ },
4902
+ "node_modules/asynckit": {
4903
+ "version": "0.4.0",
4904
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
4905
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
4906
+ },
4907
+ "node_modules/at-least-node": {
4908
+ "version": "1.0.0",
4909
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
4910
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
4911
+ "engines": {
4912
+ "node": ">= 4.0.0"
4913
+ }
4914
+ },
4915
+ "node_modules/atob": {
4916
+ "version": "2.1.2",
4917
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
4918
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
4919
+ "bin": {
4920
+ "atob": "bin/atob.js"
4921
+ },
4922
+ "engines": {
4923
+ "node": ">= 4.5.0"
4924
+ }
4925
+ },
4926
+ "node_modules/autoprefixer": {
4927
+ "version": "10.4.2",
4928
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz",
4929
+ "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==",
4930
+ "dependencies": {
4931
+ "browserslist": "^4.19.1",
4932
+ "caniuse-lite": "^1.0.30001297",
4933
+ "fraction.js": "^4.1.2",
4934
+ "normalize-range": "^0.1.2",
4935
+ "picocolors": "^1.0.0",
4936
+ "postcss-value-parser": "^4.2.0"
4937
+ },
4938
+ "bin": {
4939
+ "autoprefixer": "bin/autoprefixer"
4940
+ },
4941
+ "engines": {
4942
+ "node": "^10 || ^12 || >=14"
4943
+ },
4944
+ "funding": {
4945
+ "type": "opencollective",
4946
+ "url": "https://opencollective.com/postcss/"
4947
+ },
4948
+ "peerDependencies": {
4949
+ "postcss": "^8.1.0"
4950
+ }
4951
+ },
4952
+ "node_modules/axe-core": {
4953
+ "version": "4.3.5",
4954
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz",
4955
+ "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==",
4956
+ "engines": {
4957
+ "node": ">=4"
4958
+ }
4959
+ },
4960
+ "node_modules/axobject-query": {
4961
+ "version": "2.2.0",
4962
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
4963
+ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA=="
4964
+ },
4965
+ "node_modules/babel-jest": {
4966
+ "version": "27.4.6",
4967
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.6.tgz",
4968
+ "integrity": "sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg==",
4969
+ "dependencies": {
4970
+ "@jest/transform": "^27.4.6",
4971
+ "@jest/types": "^27.4.2",
4972
+ "@types/babel__core": "^7.1.14",
4973
+ "babel-plugin-istanbul": "^6.1.1",
4974
+ "babel-preset-jest": "^27.4.0",
4975
+ "chalk": "^4.0.0",
4976
+ "graceful-fs": "^4.2.4",
4977
+ "slash": "^3.0.0"
4978
+ },
4979
+ "engines": {
4980
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
4981
+ },
4982
+ "peerDependencies": {
4983
+ "@babel/core": "^7.8.0"
4984
+ }
4985
+ },
4986
+ "node_modules/babel-jest/node_modules/ansi-styles": {
4987
+ "version": "4.3.0",
4988
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
4989
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
4990
+ "dependencies": {
4991
+ "color-convert": "^2.0.1"
4992
+ },
4993
+ "engines": {
4994
+ "node": ">=8"
4995
+ },
4996
+ "funding": {
4997
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
4998
+ }
4999
+ },
This file is too large to show in full.
admin/package.json
new
+54
@@ -0,0 +1,54 @@
1
+{
2
+ "name": "admin",
3
+ "version": "0.9.0",
4
+ "private": true,
5
+ "proxy": "http://localhost:63636",
6
+ "scripts": {
7
+ "start": "react-scripts start",
8
+ "build": "cross-env GENERATE_SOURCEMAP=false BUILD_PATH='../dist/admin' react-scripts build",
9
+ "test": "react-scripts test",
10
+ "test-dep": "npm audit --production",
11
+ "eject": "react-scripts eject"
12
+ },
13
+ "dependencies": {
14
+ "@emotion/react": "^11.7.1",
15
+ "@emotion/styled": "^11.6.0",
16
+ "@mui/icons-material": "^5.3.0",
17
+ "@mui/lab": "^5.0.0-alpha.66",
18
+ "@mui/material": "^5.3.0",
19
+ "@mui/styles": "^5.3.0",
20
+ "@mui/x-data-grid": "^5.3.0",
21
+ "@testing-library/jest-dom": "^5.16.1",
22
+ "@testing-library/react": "^12.1.2",
23
+ "@testing-library/user-event": "^13.5.0",
24
+ "@types/jest": "^27.4.0",
25
+ "@types/node": "^16.11.21",
26
+ "@types/react": "^17.0.38",
27
+ "@types/react-dom": "^17.0.11",
28
+ "react": "^17.0.2",
29
+ "react-dom": "^17.0.2",
30
+ "react-router-dom": "^6.2.1",
31
+ "react-scripts": "5.0.0",
32
+ "typescript": "^4.5.5",
33
+ "valtio": "^1.2.9",
34
+ "web-vitals": "^2.1.4"
35
+ },
36
+ "eslintConfig": {
37
+ "extends": [
38
+ "react-app",
39
+ "react-app/jest"
40
+ ]
41
+ },
42
+ "browserslist": {
43
+ "production": [
44
+ ">0.2%",
45
+ "not dead",
46
+ "not op_mini all"
47
+ ],
48
+ "development": [
49
+ "last 1 chrome version",
50
+ "last 1 firefox version",
51
+ "last 1 safari version"
52
+ ]
53
+ }
54
+}
admin/public/favicon.ico
Binary files /dev/null and b/admin/public/favicon.ico differ
admin/public/index.html
new
+20
@@ -0,0 +1,20 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+ <meta name="theme-color" content="#000000" />
8
+ <meta
9
+ name="description"
10
+ content="Web site created using create-react-app"
11
+ />
12
+ <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
13
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" />
14
+ <title>HFS Admin</title>
15
+ </head>
16
+ <body>
17
+ <noscript>You need to enable JavaScript to run this app.</noscript>
18
+ <div id="root"></div>
19
+ </body>
20
+</html>
admin/public/manifest.json
new
+15
@@ -0,0 +1,15 @@
1
+{
2
+ "short_name": "React App",
3
+ "name": "Create React App Sample",
4
+ "icons": [
5
+ {
6
+ "src": "favicon.ico",
7
+ "sizes": "64x64 32x32 24x24 16x16",
8
+ "type": "image/x-icon"
9
+ }
10
+ ],
11
+ "start_url": ".",
12
+ "display": "standalone",
13
+ "theme_color": "#000000",
14
+ "background_color": "#ffffff"
15
+}
admin/public/robots.txt
new
+3
@@ -0,0 +1,3 @@
1
+# https://www.robotstxt.org/robotstxt.html
2
+User-agent: *
3
+Disallow:
admin/src/AccountsPage.ts
new
+11
@@ -0,0 +1,11 @@
1
+import { isValidElement, createElement as h } from "react"
2
+import { useApiComp } from './api'
3
+
4
+export default function AccountsPage() {
5
+ const [res] = useApiComp('get_usernames')
6
+ if (isValidElement(res))
7
+ return res
8
+ return h('ul', {},
9
+ res.list.map((x: string) =>
10
+ h('li', { key: x }, x)))
11
+}
admin/src/App.test.tsx
new
+9
@@ -0,0 +1,9 @@
1
+import React from 'react';
2
+import { render, screen } from '@testing-library/react';
3
+import App from './App';
4
+
5
+test('renders learn react link', () => {
6
+ render(<App />);
7
+ const linkElement = screen.getByText(/learn react/i);
8
+ expect(linkElement).toBeInTheDocument();
9
+});
admin/src/App.ts
new
+39
@@ -0,0 +1,39 @@
1
+import { createElement as h } from 'react';
2
+import { BrowserRouter, Routes, Route, useLocation } from 'react-router-dom';
3
+import MainMenu, { getMenuLabel, mainMenu } from './MainMenu';
4
+import { Box, Typography } from '@mui/material'
5
+import { Dialogs } from './dialog'
6
+
7
+function App() {
8
+ return h(BrowserRouter, {}, h(Routed))
9
+}
10
+
11
+function Routed() {
12
+ const loc = useLocation().pathname.slice(1)
13
+ const current = mainMenu.find(x => x.path === loc)
14
+ const title = current && getMenuLabel(current)
15
+ return h(Box, { display: 'flex' },
16
+ h(MainMenu, { current }),
17
+ h(Box, {
18
+ component: 'main',
19
+ sx: {
20
+ flexGrow: 1,
21
+ height: 'calc(100vh - 1em)',
22
+ overflow: 'auto',
23
+ px: 3,
24
+ pb: '1em',
25
+ }
26
+ },
27
+ title && h(Typography, { variant:'h1', mb:2 }, title),
28
+ h(Routes, {},
29
+ mainMenu.map((it,idx) => {
30
+ const element = it.comp ? h(it.comp) : h('div', {}, 'to be done')
31
+ return h(Route, { key: idx, path: it.path, element })
32
+ })
33
+ )
34
+ ),
35
+ h(Dialogs)
36
+ )
37
+}
38
+
39
+export default App
admin/src/ConfigPage.ts
new
+77
@@ -0,0 +1,77 @@
1
+import { Button } from '@mui/material';
2
+import { createElement as h, isValidElement } from 'react';
3
+import { apiCall, useApiComp } from './api'
4
+import { state, useSnapState } from './state'
5
+import { Refresh } from '@mui/icons-material'
6
+import { Dict } from './misc'
7
+import { subscribeKey } from 'valtio/utils'
8
+import { Form, ServerPort, BoolField, NumberField, StringField } from './Form';
9
+import StringStringField from './StringStringField'
10
+
11
+let loaded: Dict | undefined
12
+
13
+subscribeKey(state, 'config', () => {
14
+ const changes: Dict = {}
15
+ if (state.config)
16
+ for (const [k, v] of Object.entries(state.config))
17
+ if (JSON.stringify(v) !== JSON.stringify(loaded?.[k]))
18
+ changes[k] = v
19
+ state.changes = changes
20
+ console.debug('changes', Object.keys(changes))
21
+})
22
+
23
+export default function ConfigPage() {
24
+ const [res, reload] = useApiComp('get_config', {
25
+ omit: ['vfs', 'accounts']
26
+ })
27
+ let snap = useSnapState()
28
+ if (isValidElement(res))
29
+ return res
30
+ const { changes } = snap
31
+ const config = (loaded !== res) ? (state.config = loaded = res) : snap.config
32
+ return h(Form, {
33
+ sx: { maxWidth:'80em' },
34
+ values: config,
35
+ set(v, { k }) {
36
+ if (v || config[k])
37
+ state.config[k] = v
38
+ },
39
+ sticky: true,
40
+ save: {
41
+ onClick: save,
42
+ disabled: !Object.keys(changes).length,
43
+ },
44
+ addToBar: [h(Button, {
45
+ onClick: reload,
46
+ startIcon: h(Refresh),
47
+ }, 'Reload')],
48
+ defaults({ comp }) {
49
+ const shortField = comp === NumberField || comp === BoolField
50
+ return { md: shortField ? 3 : 6 }
51
+ },
52
+ fields: [
53
+ { k: 'port', comp: ServerPort, label:'HTTP port' },
54
+ { k: 'https_port', comp: ServerPort, label: 'HTTPS port' },
55
+ { k: 'cert', comp: StringField, label: 'HTTPS certificate file' },
56
+ { k: 'private_key', comp: StringField, label: 'HTTPS private key file' },
57
+ { k: 'max_kbps', comp: NumberField, label: 'Max KB/s' },
58
+ { k: 'max_kbps_per_ip', comp: NumberField, label: 'Max KB/s per-ip' },
59
+ { k: 'log', comp: StringField, label: 'Main log file' },
60
+ { k: 'error_log', comp: StringField, label: 'Error log file' },
61
+ { k: 'accounts', comp: StringField, label: 'Accounts file' },
62
+ { k: 'open_browser_at_start', comp: BoolField },
63
+ { k: 'zip_calculate_size_for_seconds', comp: NumberField, label: 'Calculate ZIP size for seconds' },
64
+ { k: 'mime', comp: StringStringField,
65
+ keyLabel: 'Files', keyWidth: 7,
66
+ valueLabel: 'Mime type', valueWidth: 4
67
+ },
68
+ ]
69
+ })
70
+
71
+ async function save() {
72
+ await apiCall('set_config', { values: state.changes })
73
+ Object.assign(state.config, state.changes)
74
+ Object.assign(loaded, state.config)
75
+ console.debug('saved')
76
+ }
77
+}
admin/src/FileCard.ts
new
+75
@@ -0,0 +1,75 @@
1
+import { state, useSnapState } from './state'
2
+import { createElement as h, useEffect, useState } from 'react'
3
+import { Card, CardContent, List, ListItem, ListItemText } from '@mui/material'
4
+import { BoolField, DisplayField, Form } from './Form'
5
+import _ from 'lodash'
6
+import { apiCall } from './api'
7
+import { formatBytes, objSameKeys } from './misc'
8
+import { reloadVfs } from './VfsPage'
9
+import { alertDialog } from './dialog'
10
+import PermField from './PermField'
11
+
12
+export default function FileCard() {
13
+ const { selectedFiles: files } = useSnapState()
14
+ const file = files[0]
15
+ if (!file)
16
+ return null
17
+ return h(Card, {},
18
+ h(CardContent, {},
19
+ files.length === 1 ? h(FileForm, { file })
20
+ : h(List, {},
21
+ files.length + ' selected',
22
+ files.map(f => h(ListItem, { key: f.name },
23
+ h(ListItemText, { primary: f.name, secondary: f.source }) )))
24
+ ))
25
+}
26
+
27
+function FileForm({ file }:any) {
28
+ file = _.omit(file, ['parent', 'children'])
29
+ useEffect(() => setValues(file), [JSON.stringify(file)]) //eslint-disable-line
30
+ const [values, setValues] = useState(file)
31
+ const realFolder = file.source && file.type === 'folder'
32
+ return h(Form, {
33
+ values,
34
+ set(v, { k }) {
35
+ setValues({ ...values, [k]: v })
36
+ },
37
+ save: {
38
+ disabled: isEqualLax(values, file),
39
+ async onClick() {
40
+ if (!values.name)
41
+ return alertDialog(`Name cannot be empty`, 'warning')
42
+ const props = objSameKeys(values, (v,k) =>
43
+ v === file[k] ? undefined : v)
44
+ delete props.source
45
+ await apiCall('set_vfs', {
46
+ uri: values.id,
47
+ props,
48
+ })
49
+ if (props.name) // when the name changes, the id of the selected file is changing too, and we have to update it in the state if we want it to be correctly re-selected after reload
50
+ state.selectedFiles[0].id = file.id.slice(0, -file.name.length) + props.name
51
+ reloadVfs()
52
+ }
53
+ },
54
+ fields: [
55
+ { k: 'name' },
56
+ { k: 'source', comp: DisplayField },
57
+ realFolder && { k: 'hide', xl: values.hide ? 12: 6, label: "Hide elements read from the source" },
58
+ realFolder && { k: 'remove', xl: values.hide ? 12: 6, label: "Remove/skip elements read from the source" },
59
+ { k: 'size', comp: DisplayField, map: formatBytes },
60
+ { k: 'ctime', comp: DisplayField, md: 6, label: 'Created', map: (x:string) => x && new Date(x).toLocaleString() },
61
+ { k: 'mtime', comp: DisplayField, md: 6, label: 'Modified', map: (x:string) => x && new Date(x).toLocaleString() },
62
+ { k: 'hidden', comp: BoolField, md: 6 },
63
+ { k: 'forbid', comp: BoolField, md: 6 },
64
+ { k: 'perm', comp: PermField, label: values.perm ? 'Access restricted' : 'Access not restricted' },
65
+ { k: 'mime', lg: 6, label:"MIME type" },
66
+ realFolder && { k: 'default', lg: 6, label:"File to serve instead of file list" },
67
+ ]
68
+ })
69
+}
70
+
71
+function isEqualLax(a: any,b: any): boolean {
72
+ return a == b //eslint-disable-line
73
+ || (a && b && typeof a === 'object' && typeof b === 'object'
74
+ && Object.entries(a).every(([k,v]) => isEqualLax(v, b[k])) )
75
+}
admin/src/FilePicker.ts
new
+110
@@ -0,0 +1,110 @@
1
+import { createElement as h, useEffect, useMemo, useState } from 'react'
2
+import { useApi, useApiEvents } from './api'
3
+import _ from 'lodash'
4
+import {
5
+ Alert,
6
+ Box,
7
+ Button,
8
+ Checkbox,
9
+ ListItemIcon,
10
+ ListItemText,
11
+ MenuItem,
12
+ MenuList,
13
+ TextField,
14
+ Typography
15
+} from '@mui/material'
16
+import { enforceFinal, formatBytes, isWindowsDrive, spinner } from './misc'
17
+import { ArrowUpward, Home } from '@mui/icons-material'
18
+import { StringField } from './Form'
19
+import { FileIcon, FolderIcon } from './VfsTree'
20
+
21
+export interface DirEntry { n:string, s?:number, m?:string, c?:string, k?:'d' }
22
+
23
+export default function FilePicker({ onSelect }: { onSelect:(v:string[])=>void }) {
24
+ const [cwd, setCwd] = useState('')
25
+ const [ready, setReady] = useState(false)
26
+ const [gotCwd] = useApi('get_cwd')
27
+ useEffect(() => {
28
+ if (gotCwd) {
29
+ setCwd(gotCwd.path)
30
+ setReady(true)
31
+ }
32
+ }, [gotCwd])
33
+ const { list, error, loading } = useApiEvents<DirEntry>(ready && 'ls', { path: cwd })
34
+ useEffect(() => {
35
+ setSel([])
36
+ setFilter('')
37
+ }, [cwd])
38
+
39
+ const [sel, setSel] = useState<string[]>([])
40
+ const [filter, setFilter] = useState('')
41
+ const setFilterBounced = useMemo(() => _.debounce((x:string) => setFilter(x)), [])
42
+ const filterMatch = useMemo(() => {
43
+ const re = new RegExp(_.escapeRegExp(filter), 'i')
44
+ return (v:string) => re.test(v)
45
+ }, [filter])
46
+ if (loading)
47
+ return spinner()
48
+ const pathDelimiter = /[:\\]/.test(cwd) ? '\\' : '/'
49
+ return h(Box, { display: 'flex', flexDirection: 'column', gap: 2 },
50
+ h(Box, { display:'flex', gap: 1 },
51
+ h(Button, {
52
+ variant: 'contained',
53
+ disabled: !sel.length,
54
+ sx: { minWidth: 'max-content' },
55
+ onClick() {
56
+ const cwdPostfixed = enforceFinal(pathDelimiter, cwd)
57
+ onSelect(sel.map(x => cwdPostfixed + x))
58
+ }
59
+ }, `Select (${sel.length})`),
60
+ h(Button, {
61
+ onClick() {
62
+ setCwd( isWindowsDrive(cwd) ? '' : cwd.slice(0, cwd.lastIndexOf(pathDelimiter)) )
63
+ }
64
+ }, h(ArrowUpward)),
65
+ h(Button, {
66
+ onClick() {
67
+ setCwd('')
68
+ }
69
+ }, h(Home)),
70
+ h(TextField, {
71
+ value: filter,
72
+ label: 'Filter results',
73
+ onChange(ev) {
74
+ setFilterBounced(ev.target.value)
75
+ },
76
+ sx: { minWidth: '20em' },
77
+ fullWidth: true,
78
+ }),
79
+ ),
80
+ h(StringField, {
81
+ label: 'Current path',
82
+ value: cwd,
83
+ onChange: setCwd
84
+ }),
85
+ error ? h(Alert, { severity:'error' }, String(error))
86
+ : !list.length ? h(Typography, { p:1 }, 'No elements in this folder')
87
+ : h(MenuList, { sx:{ maxHeight: 'calc(100vh - 24em)', overflow:'auto' } },
88
+ list.map((it:DirEntry) =>
89
+ h(MenuItem, {
90
+ key: it.n,
91
+ sx: { display: filterMatch(it.n) ? undefined : 'none' },
92
+ onClick(){
93
+ const id = it.n
94
+ const removed = sel.filter(x => x !== id)
95
+ setSel(removed.length < sel.length ? removed : [...sel, id])
96
+ },
97
+ onDoubleClick(){
98
+ setCwd( enforceFinal(pathDelimiter, cwd) + it.n )
99
+ }
100
+ },
101
+ h(Checkbox, { checked: sel.includes(it.n) }),
102
+ h(ListItemIcon, {}, h(it.k ? FolderIcon : FileIcon)),
103
+ h(ListItemText, {}, it.n),
104
+ it.k !== 'd' && it.s !== undefined && h(Typography, { variant:'body2', color:'text.secondary', ml:4 }, formatBytes(it.s) )
105
+ )
106
+ )
107
+ )
108
+ )
109
+}
110
+
admin/src/Form.ts
new
+167
@@ -0,0 +1,167 @@
1
+import { createElement as h, isValidElement, ReactElement, useEffect, useState } from 'react'
2
+import { Box, Button, FormControlLabel, Grid, MenuItem, Switch, TextField } from '@mui/material'
3
+import { Dict } from './misc'
4
+import { Save } from '@mui/icons-material'
5
+import _ from 'lodash'
6
+
7
+interface FieldDescriptor { k:string, comp?: any, label?: string, [extraProp:string]:any }
8
+
9
+interface FormProps {
10
+ fields: (FieldDescriptor | ReactElement | null | undefined | false)[]
11
+ defaults?: (f:FieldDescriptor) => Dict | void
12
+ values: Dict
13
+ set: (v: any, field: FieldDescriptor) => void
14
+ save?: Dict
15
+ sticky?: boolean
16
+ addToBar?: ReactElement[]
17
+ [rest:string]: any,
18
+}
19
+export function Form({ fields, values, set, defaults, save, sticky, addToBar=[], ...rest }: FormProps) {
20
+ return h(Box, rest,
21
+ save && h(Box, {
22
+ display: 'flex',
23
+ gap: 2,
24
+ sx: Object.assign({ mb: 4 }, sticky && { zIndex: 2, backgroundColor: 'background.paper', position: 'sticky', top: 0 })
25
+ },
26
+ h(Button, {
27
+ variant: 'contained',
28
+ startIcon: h(Save),
29
+ ...save,
30
+ }, 'Save'),
31
+ ...addToBar,
32
+ ),
33
+ h(Grid, { container:true, rowSpacing:3, columnSpacing:1 },
34
+ fields.map(row => {
35
+ if (!row || isValidElement(row))
36
+ return row
37
+ let field = row
38
+ const { k } = field
39
+ field = {
40
+ value: values?.[k],
41
+ onChange(v:any) { set(v, field) },
42
+ ...field,
43
+ }
44
+ if (!field.label)
45
+ field.label = _.capitalize(k.replaceAll('_', ' '))
46
+ Object.assign(field, defaults?.(field))
47
+ const { xs=12, sm, md, lg, xl, comp=StringField, ...rest } = field
48
+ return h(Grid, { key: k, item: true, xs, sm, md, lg, xl },
49
+ h(comp, rest) )
50
+ })
51
+ )
52
+ )
53
+}
54
+
55
+export interface FieldProps<T> {
56
+ label?: string
57
+ value?: T
58
+ onChange: (v: T, more: { was?: T, event: any, [rest: string]: any }) => void
59
+ [rest: string]: any
60
+}
61
+
62
+export type Field<T> = (props:FieldProps<T>) => ReactElement
63
+
64
+export function StringField({ value, onChange, ...props }: FieldProps<string>) {
65
+ const [state, setState] = useState(() => value ?? '')
66
+ useEffect(() => setState(() => value ?? ''),
67
+ [value])
68
+ return h(TextField, {
69
+ fullWidth: true,
70
+ ...props,
71
+ value: state,
72
+ InputLabelProps: state ? { shrink: true } : undefined,
73
+ onChange(event) {
74
+ setState(event.target.value)
75
+ },
76
+ onKeyDown(ev) {
77
+ if (ev.key === 'Enter')
78
+ go(ev)
79
+ },
80
+ onBlur: go
81
+ })
82
+
83
+ function go(event: any) {
84
+ if (state !== value)
85
+ onChange(state, {
86
+ was: value,
87
+ event,
88
+ cancel() {
89
+ setState(value ?? '')
90
+ }
91
+ })
92
+ }
93
+}
94
+
95
+export function DisplayField({ map, value, empty='-', ...props }: any) {
96
+ if (map)
97
+ value = map(value)
98
+ if (empty !== undefined && value !== 0 && !value)
99
+ value = empty
100
+ return h(StringField, { ...props, value, disabled: true })
101
+}
102
+
103
+interface SelectPair<T> { label: string, value:T }
104
+export function SelectField<T>({ value, onChange, options, ...props }: FieldProps<T> & { options:SelectPair<T>[] }) {
105
+ return h(TextField, { // using TextField because Select is not display label correctly
106
+ ...props,
107
+ select: true,
108
+ fullWidth: true,
109
+ value: value === undefined ? '' : JSON.stringify(value),
110
+ children: options.map((o,i) => {
111
+ const obj = o && typeof o === 'object'
112
+ const value = obj && 'value' in o ? o.value : o
113
+ const label = obj && 'label' in o ? o.label : o
114
+ return h(MenuItem, { key: i, value: JSON.stringify(value), children: label })
115
+ }),
116
+ onChange(event) {
117
+ try {
118
+ onChange(JSON.parse(event.target.value as string) as T, { was: value, event })
119
+ }
120
+ catch {}
121
+ }
122
+ })
123
+}
124
+
125
+export function NumberField({ value, onChange, ...props }: FieldProps<number | null>) {
126
+ // @ts-ignore
127
+ return h(StringField, {
128
+ type: 'number',
129
+ value: typeof value === 'number' ? String(value) : '',
130
+ onChange(v, { was, ...rest }) {
131
+ onChange(v ? Number(v) : null, { ...rest, was:was ? Number(was) : null })
132
+ },
133
+ ...props,
134
+ })
135
+}
136
+
137
+export function BoolField({ label, value, onChange, ...props }: FieldProps<boolean>) {
138
+ const [state, setState] = useState(() => value ?? false)
139
+ useEffect(() => setState(() => value ?? false),
140
+ [value])
141
+ const control = h(Switch, {
142
+ checked: state,
143
+ ...props,
144
+ onChange(event) {
145
+ onChange(event.target.checked, { event, was: value })
146
+ }
147
+ })
148
+ return label ? h(FormControlLabel, { label, control, labelPlacement: 'top' })
149
+ : control
150
+}
151
+
152
+export function ServerPort({ label, value, onChange }: FieldProps<number | null>) {
153
+ return h(Box, { display:'flex' },
154
+ h(SelectField as Field<number>, {
155
+ sx: { flexGrow: 1 },
156
+ label,
157
+ value: Math.min(1, value || 0),
158
+ options: [
159
+ { label: 'off', value: -1 },
160
+ { label: 'automatic port', value: 0 },
161
+ { label: 'choose port', value: 1 },
162
+ ],
163
+ onChange,
164
+ }),
165
+ value! > 0 && h(NumberField, { fullWidth: false, value, onChange }),
166
+ )
167
+}
admin/src/MainMenu.ts
new
+38
@@ -0,0 +1,38 @@
1
+import { createElement as h, FunctionComponent } from 'react';
2
+import { List, ListItemButton, ListItemIcon, ListItemText, Typography } from '@mui/material'
3
+import { AccountTree, ManageAccounts, Monitor, Settings, SvgIconComponent } from '@mui/icons-material'
4
+import _ from 'lodash'
5
+import { Link } from 'react-router-dom'
6
+import MonitorPage from './MonitorPage'
7
+import ConfigPage from './ConfigPage';
8
+import VfsPage from './VfsPage';
9
+import AccountsPage from './AccountsPage';
10
+
11
+interface MenuEntry { path:string, icon:SvgIconComponent, label?: string, comp?: FunctionComponent }
12
+export const mainMenu: MenuEntry[] = [
13
+ { path: 'monitor', icon: Monitor, comp: MonitorPage },
14
+ { path: 'configuration', icon: Settings, comp: ConfigPage },
15
+ { path: 'vfs', icon: AccountTree, label: 'File System', comp: VfsPage },
16
+ { path: 'accounts', icon: ManageAccounts, comp: AccountsPage },
17
+]
18
+
19
+interface MenuProps { current?:MenuEntry }
20
+export default function Menu({ current }: MenuProps) {
21
+ return h(List, { sx:{ pr:1, bgcolor: 'primary.main', color:'primary.contrastText' } },
22
+ h(Typography, { variant:'h4', sx:{ p:2 } }, 'HFS'),
23
+ mainMenu.map(it =>
24
+ h(ListItemButton, {
25
+ key: it.path,
26
+ sx: current===it ? { textDecoration: 'underline' } : undefined,
27
+ //@ts-ignore
28
+ component: Link, to: it.path,
29
+ },
30
+ it.icon && h(ListItemIcon, { sx:{ color: 'primary.contrastText' } }, h(it.icon)),
31
+ h(ListItemText, { primary: getMenuLabel(it) })
32
+ ) )
33
+ )
34
+}
35
+
36
+export function getMenuLabel(it: MenuEntry) {
37
+ return it && (it.label ?? _.capitalize(it.path))
38
+}
admin/src/MonitorPage.ts
new
+34
@@ -0,0 +1,34 @@
1
+import _ from "lodash"
2
+import { isValidElement, createElement as h } from "react"
3
+import { useApiComp } from "./api"
4
+import { Refresh } from '@mui/icons-material'
5
+import { Button } from '@mui/material'
6
+
7
+export default function MonitorPage() {
8
+ const [res, reload] = useApiComp('get_status')
9
+ if (isValidElement(res))
10
+ return res
11
+ return h('div', {},
12
+ h(Button, { onClick: reload, startIcon:h(Refresh) }, 'Reload'),
13
+ h('ul', {},
14
+ pair('started'),
15
+ pair('http', 'HTTP', v => v.active ? 'port '+v.port : 'off'),
16
+ pair('https', 'HTTPS', v => v.active ? 'port '+v.port : 'off'),
17
+ )
18
+ )
19
+
20
+ function pair(k: string, label: string='', render?:(v:any) => string) {
21
+ let v = _.get(res, k)
22
+ if (v === undefined)
23
+ return null
24
+ if (typeof v === 'string' && isoDateRe.test(v))
25
+ v = new Date(v).toLocaleString()
26
+ if (render)
27
+ v = render(v)
28
+ if (!label)
29
+ label = _.capitalize(k.replaceAll('_', ' '))
30
+ return h('li', {}, label + ': ' + v)
31
+ }
32
+}
33
+
34
+const isoDateRe = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/
admin/src/PermField.ts
new
+78
@@ -0,0 +1,78 @@
1
+import { Dict } from './misc'
2
+import { createElement as h, Fragment, isValidElement, useState } from 'react'
3
+import { Button, Grid } from '@mui/material'
4
+import { Field, FieldProps, SelectField } from './Form'
5
+import _ from 'lodash'
6
+import { useApiComp } from './api'
7
+
8
+export default function PermField({ label, value, onChange }: FieldProps<Dict<string> | null> & { keyLabel:string }) {
9
+ const [temp, setTemp] = useState<string|undefined>()
10
+ const [res] = useApiComp('get_usernames')
11
+ const usernames = res.list
12
+
13
+ const permOptions = [{ label:'read', value:'r' }, { label:'none', value:'' }]
14
+ const usernamesLeft = _.difference(usernames, Object.keys(value||{}))
15
+
16
+ return h(Grid, { container: true },
17
+ label && h(Grid, { item: true, xs: 12, pl: 2, py: 1, display: 'flex', alignItems: 'center', justifyContent: 'space-between' },
18
+ label,
19
+ !isValidElement(res) && h(Button, {
20
+ onClick(event){
21
+ setTemp(undefined)
22
+ onChange(null, { event, was: value })
23
+ }
24
+ }, 'Clear')),
25
+ isValidElement(res) ? res : h(Fragment, {},
26
+ // existing entries
27
+ Object.entries(value||{}).map(([username, perm]) => [
28
+ h(Grid, { key:'k', item: true, xs: 6 },
29
+ h(SelectField as Field<string>, {
30
+ label: 'Username',
31
+ options: usernames,
32
+ value: username,
33
+ onChange(v, { was, ...rest }){
34
+ const copy: any = { ...value, [v]: value![was!] }
35
+ delete copy[was!]
36
+ onChange(copy, { was:value, ...rest })
37
+ }
38
+ })),
39
+ h(Grid, { key:'v', item: true, xs: 6 },
40
+ h(SelectField as Field<string>, {
41
+ label: 'Access',
42
+ options: permOptions,
43
+ value: perm,
44
+ onChange(v, { was, ...rest }){
45
+ const copy = { ...value }
46
+ if (v)
47
+ copy[username] = v
48
+ else
49
+ delete copy[username]
50
+ onChange( _.isEmpty(copy) ? null : copy, { was:value, ...rest })
51
+ }
52
+ })),
53
+ ]),
54
+ // row for new entries
55
+ !usernamesLeft.length && h(Grid, { item: true, xs: 12, py: 1, px: 2, color:'text.secondary' }, "No accounts left"),
56
+ usernamesLeft.length>0 && h(Grid, { item: true, xs: 6 },
57
+ h(SelectField as Field<string>, {
58
+ label: value ? "Add access to" : "Restrict access to ",
59
+ value: temp,
60
+ options: usernamesLeft,
61
+ onChange: setTemp
62
+ })),
63
+ usernamesLeft.length>0 && h(Grid, { item: true, xs: 6 },
64
+ h(SelectField as Field<string>, {
65
+ value: undefined,
66
+ label: temp && "Select access type",
67
+ disabled: !temp,
68
+ options: permOptions,
69
+ onChange(v, rest) {
70
+ if (v)
71
+ onChange({ ...value, [temp!]: v }, { ...rest, was: value })
72
+ setTemp(undefined)
73
+ }
74
+ }))
75
+ )
76
+ )
77
+}
78
+
admin/src/StringStringField.ts
new
+92
@@ -0,0 +1,92 @@
1
+import { makeStyles } from '@mui/styles'
2
+import { Dict } from './misc'
3
+import { createElement as h, useEffect, useRef } from 'react'
4
+import { Grid, IconButton, TextField } from '@mui/material'
5
+import { Add, Delete } from '@mui/icons-material'
6
+import { FieldProps, StringField } from './Form'
7
+
8
+const useStyles = makeStyles({
9
+ tableHeader: {
10
+ padding: '.5em 1em',
11
+ fontWeight: 'bold',
12
+ },
13
+ actions: {
14
+ display: 'flex',
15
+ }
16
+})
17
+
18
+export default function StringStringField({ value, onChange, keyLabel='key', valueLabel='value', keyWidth=5, valueWidth=5, actionsWidth=1 }: FieldProps<Dict<string>> & { keyLabel:string }) {
19
+ const refNew = useRef()
20
+ const justEntered = useRef<any>()
21
+ useEffect(() => justEntered.current?.focus?.(),
22
+ [justEntered.current]) //eslint-disable-line
23
+ const styles = useStyles()
24
+ return h(Grid, { container: true },
25
+ // header
26
+ h(Grid, { item: true, xs:keyWidth, className: styles.tableHeader }, keyLabel),
27
+ h(Grid, { item: true, xs:valueWidth, className: styles.tableHeader }, valueLabel),
28
+ h(Grid, { item: true, xs:actionsWidth },
29
+ h(IconButton, {
30
+ onClick() { // @ts-ignore
31
+ refNew.current.focus()
32
+ }
33
+ }, h(Add))),
34
+ // existing entries
35
+ Object.entries(value||{}).map(([id,v]) => [
36
+ h(Grid, { key:'k', item: true, xs: keyWidth, },
37
+ h(StringField, {
38
+ value: id,
39
+ onChange(v, { was, ...rest }){
40
+ const copy = { ...value }
41
+ if (v)
42
+ copy[v] = was !== undefined ? copy[was] : ''
43
+ if (was !== undefined)
44
+ delete copy[was]
45
+ onChange(copy, { was:value, ...rest })
46
+ }
47
+ })),
48
+ h(Grid, { key:'v', item: true, xs: valueWidth, },
49
+ h(StringField, {
50
+ inputRef: justEntered.current === id ? justEntered : undefined,
51
+ value: v,
52
+ onChange(v, { was, ...rest }){
53
+ const copy = { ...value }
54
+ if (v)
55
+ copy[id] = v
56
+ else
57
+ delete copy[id]
58
+ onChange(copy, { was:value, ...rest })
59
+ }
60
+ })),
61
+ h(Grid, { key:'actions', item: true, xs: actionsWidth, className: styles.actions },
62
+ h(IconButton, {
63
+ onClick(event){
64
+ const copy = { ...value }
65
+ delete copy[id]
66
+ onChange(copy, { was:value, event })
67
+ }
68
+ }, h(Delete)))
69
+ ]),
70
+ // empty row for adding
71
+ h(Grid, { item: true, xs: keyWidth, },
72
+ h(StringField, {
73
+ inputRef: refNew,
74
+ value: '',
75
+ onChange(v, more){
76
+ if (!v) return
77
+ more.cancel()
78
+ if (value && v in value)
79
+ return alert(keyLabel + " entry already present")
80
+ justEntered.current = v
81
+ onChange({ ...value, [v]:'' }, { ...more, was:value })
82
+ }
83
+ })),
84
+ h(Grid, { item: true, xs: valueWidth, },
85
+ h(TextField, {
86
+ onFocus() { //@ts-ignore
87
+ setTimeout(()=> refNew.current.focus()) // without setTimeout TextField component is in an inconsistent focus-state
88
+ }
89
+ })),
90
+ )
91
+}
92
+
admin/src/VfsMenuBar.ts
new
+46
@@ -0,0 +1,46 @@
1
+import { state, useSnapState } from './state'
2
+import { createElement as h } from 'react'
3
+import { Box, Button } from '@mui/material'
4
+import { Add, Delete, Refresh } from '@mui/icons-material'
5
+import { alertDialog, confirmDialog } from './dialog'
6
+import { apiCall } from './api'
7
+import { reloadVfs } from './VfsPage'
8
+import addFiles from './addFiles'
9
+
10
+export default function VfsMenuBar() {
11
+ const { selectedFiles } = useSnapState()
12
+ return h(Box, {
13
+ display: 'flex',
14
+ gap: 2,
15
+ mb: 2,
16
+ sx: {
17
+ position: 'sticky',
18
+ top: 0,
19
+ zIndex: 2,
20
+ backgroundColor: 'background.paper',
21
+ },
22
+ },
23
+ h(Button, { variant:'contained', onClick: addFiles, startIcon: h(Add) }, 'Add'),
24
+ h(Button, { onClick: removeFiles, disabled: !selectedFiles.length, startIcon: h(Delete) }, 'Remove'),
25
+ h(Button, { onClick: reloadVfs, startIcon: h(Refresh) }, 'Reload'),
26
+ )
27
+}
28
+
29
+async function removeFiles() {
30
+ const f = state.selectedFiles
31
+ if (!f.length) return
32
+ if (await confirmDialog(`Remove ${f.length} item(s)?`)) {
33
+ try {
34
+ const uris = f.map(x => x.id)
35
+ const { errors } = await apiCall('del_vfs', { uris })
36
+ const urisThatFailed = uris.filter((uri, idx) => errors[idx])
37
+ if (urisThatFailed.length)
38
+ return alertDialog("Following elements couldn't be removed: " + urisThatFailed.join(', '), 'error')
39
+ reloadVfs()
40
+ }
41
+ catch(e) {
42
+ await alertDialog(e as Error)
43
+ }
44
+ }
45
+
46
+}
admin/src/VfsPage.ts
new
+67
@@ -0,0 +1,67 @@
1
+import { createElement as h, isValidElement, useEffect, useMemo, useState } from 'react'
2
+import { useApiComp } from './api'
3
+import { Grid } from '@mui/material'
4
+import { state, useSnapState } from './state'
5
+import FileCard from './FileCard'
6
+import VfsMenuBar from './VfsMenuBar'
7
+import VfsTree from './VfsTree'
8
+
9
+export default function VfsPage() {
10
+ const [id2node] = useState(() => new Map<string, Node>())
11
+ const snap = useSnapState()
12
+ const [res, reload] = useApiComp('get_vfs')
13
+ useMemo(() => snap.vfs || reload(), [snap.vfs, reload])
14
+ useEffect(() => {
15
+ state.vfs = undefined
16
+ if (!res) return
17
+ // rebuild id2node
18
+ id2node.clear()
19
+ const { root } = res
20
+ if (!root) return
21
+ recur(root) // this must be done before state change that would cause Tree to render and expecting id2node
22
+ state.vfs = root
23
+ // refresh objects of selectedFiles
24
+ const ids = state.selectedFiles.map(x => x.id)
25
+ state.selectedFiles = ids.map(id =>
26
+ id2node.get(id)).filter(Boolean) as Node[] // ts doesn't understand that filter(Boolean) removes undefined-s
27
+
28
+ // calculate id and parent fields, and builds the map id2node
29
+ function recur(node: Node, prefix='', parent: Node|undefined=undefined) {
30
+ node.parent = parent
31
+ node.id = prefix + node.name || '/' // root
32
+ id2node.set(node.id, node)
33
+ if (!node.children) return
34
+ for (const n of node.children)
35
+ recur(n, (prefix && node.id) + '/', node)
36
+ }
37
+
38
+ }, [res, id2node])
39
+ if (isValidElement(res)) {
40
+ id2node.clear()
41
+ return res
42
+ }
43
+ return h(Grid, { container:true },
44
+ h(Grid, { item:true, lg: 7 },
45
+ h(VfsMenuBar),
46
+ snap.vfs && h(VfsTree, { id2node })),
47
+ h(Grid, { item:true, lg: 5 },
48
+ h(FileCard)))
49
+}
50
+
51
+export function reloadVfs() {
52
+ state.vfs = undefined
53
+}
54
+
55
+export type Node = {
56
+ id: string
57
+ name: string
58
+ type?: 'folder'
59
+ source?: string
60
+ size?: number
61
+ ctime?: string
62
+ mtime?: string
63
+ children?: Node[]
64
+ parent?: Node
65
+ hidden?: boolean
66
+ perm?: any
67
+}
admin/src/VfsTree.ts
new
+87
@@ -0,0 +1,87 @@
1
+import { makeStyles } from '@mui/styles'
2
+import { state, useSnapState } from './state'
3
+import { createElement as h, ReactElement, useState } from 'react'
4
+import { TreeItem, TreeView } from '@mui/lab'
5
+import {
6
+ ChevronRight,
7
+ ExpandMore,
8
+ Folder,
9
+ Home,
10
+ InsertDriveFileOutlined,
11
+ Lock,
12
+ RemoveRedEye
13
+} from '@mui/icons-material'
14
+import { Node } from './VfsPage'
15
+import { isWindowsDrive } from './misc'
16
+
17
+export const FolderIcon = Folder
18
+export const FileIcon = InsertDriveFileOutlined
19
+
20
+const useStyles = makeStyles({
21
+ label: {
22
+ display: 'flex',
23
+ gap: '.5em',
24
+ lineHeight: '2em',
25
+ alignItems: 'center',
26
+ },
27
+ path: {
28
+ opacity: .4,
29
+ }
30
+})
31
+
32
+export default function VfsTree({ id2node }:{ id2node: Map<string, Node> }) {
33
+ const { vfs, selectedFiles } = useSnapState()
34
+ const [selected, setSelected] = useState<string[]>(selectedFiles.map(x => x.id)) // try to restore selection after reload
35
+ const [expanded, setExpanded] = useState(Array.from(id2node.keys()))
36
+ const styles = useStyles()
37
+ if (!vfs)
38
+ return null
39
+ return h(TreeView, {
40
+ expanded,
41
+ selected,
42
+ multiSelect: true,
43
+ onNodeSelect(ev, ids) {
44
+ setSelected(ids)
45
+ state.selectedFiles = ids.map(id => id2node.get(id)).filter(Boolean) as Node[] // ts doesn't understand that filter(Boolean) removes undefined-s
46
+ }
47
+ }, recur(vfs as Readonly<Node>))
48
+
49
+ function recur(node: Readonly<Node>): ReactElement {
50
+ let { id, name, source } = node
51
+ if (!id)
52
+ debugger
53
+ const folder = node.type === 'folder'
54
+ if (folder && !isWindowsDrive(source) && source === name) // we need a way to show that the name we are displaying is a source in this ambiguous case, so we add a redundant ./
55
+ source = './' + source
56
+ return h(TreeItem, {
57
+ label: !name ? h(Home)
58
+ : h('div', { className: styles.label },
59
+ h(folder ? FolderIcon : FileIcon),
60
+ node.hidden && h(RemoveRedEye),
61
+ node.perm && h(Lock),
62
+ !source?.endsWith(name) ? name
63
+ : h('span', {},
64
+ h('span', { className:styles.path }, source.slice(0,-name.length)),
65
+ h('span', {}, source.slice(-name.length)),
66
+ )
67
+ ),
68
+ key: name,
69
+ collapseIcon: h(ExpandMore, {
70
+ onClick(ev) {
71
+ setExpanded( expanded.filter(x => x !== id) )
72
+ ev.preventDefault()
73
+ ev.stopPropagation()
74
+ }
75
+ }),
76
+ expandIcon: h(ChevronRight, {
77
+ onClick(ev) {
78
+ setExpanded( [...expanded, id] )
79
+ ev.preventDefault()
80
+ ev.stopPropagation()
81
+ }
82
+ }),
83
+ nodeId: id
84
+ }, node.children?.map(recur))
85
+ }
86
+
87
+}
admin/src/addFiles.ts
new
+38
@@ -0,0 +1,38 @@
1
+import { alertDialog, newDialog } from './dialog'
2
+import { createElement as h } from 'react'
3
+import { Box } from '@mui/material'
4
+import { Node, reloadVfs } from './VfsPage'
5
+import { state } from './state'
6
+import { apiCall } from './api'
7
+import FilePicker from './FilePicker'
8
+
9
+export default function addFiles() {
10
+ const close = newDialog({
11
+ title: 'Add files or folders',
12
+ dialogProps: { sx:{ minWidth:'min(90vw, 40em)', minHeight: '70vh' } },
13
+ Content,
14
+ })
15
+
16
+ function Content() {
17
+ let f: Node | undefined = state.selectedFiles[0]
18
+ if (f && f.type !== 'folder')
19
+ f = f.parent
20
+ const under = f?.id
21
+ return h('div', {},
22
+ h(Box, { sx:{ typography: 'body1', px: 1, py: 2 } }, "Selected elements will be added to " + (under || '(home)')),
23
+ h(FilePicker, {
24
+ async onSelect(sel) {
25
+ let failed = await Promise.all(sel.map(source =>
26
+ apiCall('add_vfs', { under, source }).then(() => '', () => source) ))
27
+ failed = failed.filter(Boolean)
28
+ if (failed.length)
29
+ await alertDialog('Some elements have been rejected: '+failed.join(', '), 'error')
30
+ reloadVfs()
31
+ close()
32
+ }
33
+ })
34
+ )
35
+ }
36
+
37
+}
38
+
admin/src/api.ts
new
+124
@@ -0,0 +1,124 @@
1
+import { createElement as h, useEffect, useMemo, useState } from 'react'
2
+import { Dict, Falsy, getCookie, spinner } from './misc'
3
+import { Alert } from '@mui/material'
4
+
5
+export function useApiComp(...args: any[]): ReturnType<typeof useApi> {
6
+ // @ts-ignore
7
+ const [res, reload] = useApi(...args)
8
+ return useMemo(() =>
9
+ res === undefined ? [spinner(), reload]
10
+ : res && res instanceof Error ? [h(Alert, { severity: 'error' }, String(res)), reload]
11
+ : [res, reload],
12
+ [res])
13
+}
14
+
15
+const PREFIX = '/~/api/'
16
+
17
+export function apiCall(cmd: string, params?: Dict) : Promise<any> {
18
+ params = addCsrf(params)
19
+ return fetch(PREFIX+cmd, {
20
+ method: 'POST',
21
+ headers: { 'content-type': 'application/json' },
22
+ body: params && JSON.stringify(params),
23
+ }).then(res => {
24
+ if (res.ok)
25
+ return res.json().then(json => {
26
+ console.debug('API', cmd, params, '>>', json)
27
+ return json
28
+ })
29
+ const msg = 'Failed API ' + cmd
30
+ console.warn(msg + (params ? ' ' + JSON.stringify(params) : ''))
31
+ throw new ApiError(res.status, msg)
32
+ }, err => {
33
+ throw err
34
+ })
35
+}
36
+
37
+export class ApiError extends Error {
38
+ constructor(readonly code:number, message: string) {
39
+ super(message);
40
+ }
41
+}
42
+
43
+export function useApi(cmd: string | Falsy, params?: object) : [any, ()=>void] {
44
+ const [ret, setRet] = useState()
45
+ const [forcer, setForcer] = useState(0)
46
+ const [state] = useState({ loading: false })
47
+ useEffect(()=>{
48
+ setRet(undefined)
49
+ if (!cmd) return
50
+ state.loading = true
51
+ apiCall(cmd, params)
52
+ .then(setRet, setRet)
53
+ .finally(()=> state.loading = false)
54
+ }, [cmd, JSON.stringify(params), forcer]) //eslint-disable-line
55
+ return [ret, ()=> state.loading || setForcer(v => v+1)]
56
+}
57
+
58
+type EventHandler = (type:string, data?:any) => void
59
+
60
+export function apiEvents(cmd: string, params: Dict, cb:EventHandler) {
61
+ const processed: Record<string,string> = {}
62
+ for (const k in params) {
63
+ const v = params[k]
64
+ if (v === undefined) continue
65
+ processed[k] = v === true ? '1' : v
66
+ }
67
+ const source = new EventSource(PREFIX + cmd + '?' + new URLSearchParams(addCsrf(processed)))
68
+ source.onopen = () => cb('connected')
69
+ source.onerror = err => cb('error', err)
70
+ source.onmessage = ({ data }) => {
71
+ if (!data) {
72
+ cb('closed')
73
+ return source.close()
74
+ }
75
+ try { data = JSON.parse(data) }
76
+ catch {
77
+ return cb('string', data)
78
+ }
79
+ cb('msg', data)
80
+ }
81
+ return source
82
+}
83
+
84
+function addCsrf(params?: Dict) {
85
+ return { csrf: getCookie('csrf'), ...params }
86
+}
87
+
88
+export function useApiEvents<Record>(cmd:string|Falsy, params: Dict={}) {
89
+ const [list, setList] = useState<Record[]>([])
90
+ const [error, setError] = useState<any>()
91
+ const [loading, setLoading] = useState(false)
92
+ useEffect(() => {
93
+ if (!cmd) return
94
+ const buffer: Record[] = []
95
+ const flush = () => {
96
+ const chunk = buffer.splice(0, Infinity)
97
+ if (chunk.length)
98
+ setList(list => [ ...list, ...chunk ])
99
+ }
100
+ setLoading(true)
101
+ setList([])
102
+ const timer = setInterval(flush, 1000)
103
+ const src = apiEvents(cmd, params, (type, data) => {
104
+ switch (type) {
105
+ case 'error':
106
+ setError(JSON.stringify(data))
107
+ return stop()
108
+ case 'closed':
109
+ flush()
110
+ return stop()
111
+ case 'msg':
112
+ if (src?.readyState === src?.CLOSED)
113
+ return stop()
114
+ buffer.push(data.entry)
115
+ }
116
+ })
117
+
118
+ function stop() {
119
+ setLoading(false)
120
+ clearInterval(timer)
121
+ }
122
+ }, [cmd, JSON.stringify(params)])
123
+ return { list, loading, error }
124
+}
admin/src/dialog.ts
new
+116
@@ -0,0 +1,116 @@
1
+import { Button, Dialog as MuiDialog, DialogContent, DialogTitle } from '@mui/material'
2
+import { createElement as h, Fragment, FunctionComponent, ReactElement, ReactNode, useEffect, useRef } from 'react'
3
+import { proxy, useSnapshot } from 'valtio'
4
+
5
+interface DialogOptions {
6
+ Content: FunctionComponent,
7
+ closable?: boolean,
8
+ onClose?: (v?:any)=> any,
9
+ className?: string,
10
+ icon?: string | FunctionComponent,
11
+ closableContent?: string | ReactNode,
12
+ reserveClosing?: true
13
+ noFrame?: boolean
14
+ title?: string
15
+ padding?: boolean
16
+ dialogProps?: Record<string, any>,
17
+}
18
+
19
+const dialogs = proxy<DialogOptions[]>([])
20
+
21
+export const dialogsDefaults = {
22
+ closableContent: 'x',
23
+ padding: true,
24
+}
25
+
26
+export function Dialogs() {
27
+ const snap = useSnapshot(dialogs)
28
+ return h(Fragment, {},
29
+ snap.length > 0 && snap.map((d,i) =>
30
+ h(Dialog, { key:i, ...d })))
31
+}
32
+
33
+function Dialog(d:DialogOptions) {
34
+ useEffect(()=>{
35
+ ref.current?.focus()
36
+ }, [])
37
+ const ref = useRef<HTMLElement>()
38
+ d = { ...dialogsDefaults, ...d }
39
+ const p = d.padding ? 2 : 0
40
+ return h(MuiDialog, {
41
+ open: true,
42
+ maxWidth: 'lg',
43
+ onClose: ()=> closeDialog(),
44
+ },
45
+ d.title && h(DialogTitle, {}, d.title),
46
+ h(DialogContent, {
47
+ ...d.dialogProps,
48
+ sx:{ ...d.dialogProps?.sx, px: p, pb: p }
49
+ }, h(d.Content) )
50
+ )
51
+}
52
+
53
+export function newDialog(options: DialogOptions) {
54
+ const $id = Math.random()
55
+ ;(options as any).$id = $id // object identity is not working because of the proxy. This is a possible workaround
56
+ dialogs.push(options)
57
+ return (v?:any) => {
58
+ const i = dialogs.findIndex(x => (x as any).$id === $id)
59
+ if (i < 0) return
60
+ dialogs.splice(i,1)
61
+ options.onClose?.(v)
62
+ }
63
+}
64
+
65
+export function closeDialog(v?:any) {
66
+ let i = dialogs.length
67
+ while (i--) {
68
+ const d = dialogs[i]
69
+ if (d.reserveClosing)
70
+ continue
71
+ dialogs.splice(i,1)
72
+ d.onClose?.(v)
73
+ }
74
+}
75
+
76
+type AlertType = 'error' | 'warning' | 'info'
77
+
78
+export async function alertDialog(msg: ReactElement | string | Error, type:AlertType='info') {
79
+ if (msg instanceof Error) {
80
+ msg = String(msg)
81
+ type = 'error'
82
+ }
83
+ return new Promise(resolve => newDialog({
84
+ className: 'dialog-alert-'+type,
85
+ icon: '!',
86
+ onClose: resolve,
87
+ Content
88
+ }))
89
+
90
+ function Content(){
91
+ if (typeof msg === 'string' || msg instanceof Error)
92
+ msg = h('p', {}, String(msg))
93
+ return msg
94
+ }
95
+}
96
+
97
+interface ConfirmOptions { href?: string }
98
+export async function confirmDialog(msg: string, { href }: ConfirmOptions={}) : Promise<boolean> {
99
+ return new Promise(resolve => newDialog({
100
+ className: 'dialog-confirm',
101
+ icon: '?',
102
+ onClose: resolve,
103
+ Content
104
+ }) )
105
+
106
+ function Content() {
107
+ return h('div', {},
108
+ h('p', {}, msg),
109
+ h('a', {
110
+ href,
111
+ onClick: () => closeDialog(true),
112
+ }, h(Button, {}, 'Confirm'))
113
+ )
114
+ }
115
+}
116
+
admin/src/index.css
new
+13
@@ -0,0 +1,13 @@
1
+body {
2
+ margin: 0;
3
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5
+ sans-serif;
6
+ -webkit-font-smoothing: antialiased;
7
+ -moz-osx-font-smoothing: grayscale;
8
+}
9
+
10
+code {
11
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12
+ monospace;
13
+}
admin/src/index.tsx
new
+17
@@ -0,0 +1,17 @@
1
+import React from 'react';
2
+import ReactDOM from 'react-dom';
3
+import './index.css';
4
+import App from './App';
5
+import reportWebVitals from './reportWebVitals';
6
+
7
+ReactDOM.render(
8
+ <React.StrictMode>
9
+ <App />
10
+ </React.StrictMode>,
11
+ document.getElementById('root')
12
+);
13
+
14
+// If you want to start measuring performance in your app, pass a function
15
+// to log results (for example: reportWebVitals(console.log))
16
+// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
17
+reportWebVitals();
admin/src/logo.svg
new
+1
@@ -0,0 +1 @@
1
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>
admin/src/misc.ts
new
+66
@@ -0,0 +1,66 @@
1
+import { createElement as h, useRef } from 'react'
2
+import { CircularProgress } from '@mui/material'
3
+
4
+export type Dict<T = any> = Record<string, T>
5
+export type Falsy = false | null | undefined | '' | 0
6
+
7
+export function spinner() {
8
+ return h(CircularProgress)
9
+}
10
+
11
+export function getCookie(name: string) {
12
+ const pre = name + '='
13
+ let decodedCookie = decodeURIComponent(document.cookie)
14
+ let ca = decodedCookie.split(';')
15
+ for (let c of ca) {
16
+ c = c.trim()
17
+ if (c.startsWith(pre))
18
+ return c.substring(pre.length, c.length)
19
+ }
20
+ return ''
21
+}
22
+
23
+export function usePrevious(value: any) {
24
+ const ref = useRef(value)
25
+ const ret = ref.current
26
+ ref.current = value
27
+ return ret
28
+}
29
+
30
+export function getOrSet<T>(o:any, k:string, creator:()=>T): T {
31
+ return k in o ? o[k]
32
+ : (o[k] = creator())
33
+}
34
+
35
+export function formatBytes(n: number, post: string = 'B') {
36
+ if (isNaN(Number(n)) || n < 0)
37
+ return ''
38
+ let x = ['', 'K', 'M', 'G', 'T']
39
+ let prevMul = 1
40
+ let mul = 1024
41
+ let i = 0
42
+ while (i < x.length && n > mul) {
43
+ prevMul = mul
44
+ mul *= 1024
45
+ ++i
46
+ }
47
+ n /= prevMul
48
+ return round(n, 1) + ' ' + (x[i]||'') + post
49
+} // formatBytes
50
+
51
+export function round(v: number, decimals: number = 0) {
52
+ decimals = Math.pow(10, decimals)
53
+ return Math.round(v * decimals) / decimals
54
+} // round
55
+
56
+export function objSameKeys<T,R>(src: Record<string,T>, newValue:(value:T,key:string)=>R) {
57
+ return Object.fromEntries(Object.entries(src).map(([k,v]) => [k, newValue(v,k)]))
58
+}
59
+
60
+export function enforceFinal(sub:string, s:string) {
61
+ return !s || s.endsWith(sub) ? s : s+sub
62
+}
63
+
64
+export function isWindowsDrive(s?: string) {
65
+ return s && /^[a-zA-Z]:$/.test(s)
66
+}
admin/src/react-app-env.d.ts
new
+1
@@ -0,0 +1 @@
1
+/// <reference types="react-scripts" />
admin/src/reportWebVitals.ts
new
+15
@@ -0,0 +1,15 @@
1
+import { ReportHandler } from 'web-vitals';
2
+
3
+const reportWebVitals = (onPerfEntry?: ReportHandler) => {
4
+ if (onPerfEntry && onPerfEntry instanceof Function) {
5
+ import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
6
+ getCLS(onPerfEntry);
7
+ getFID(onPerfEntry);
8
+ getFCP(onPerfEntry);
9
+ getLCP(onPerfEntry);
10
+ getTTFB(onPerfEntry);
11
+ });
12
+ }
13
+};
14
+
15
+export default reportWebVitals;
admin/src/setupTests.ts
new
+5
@@ -0,0 +1,5 @@
1
+// jest-dom adds custom jest matchers for asserting on DOM nodes.
2
+// allows you to do things like:
3
+// expect(element).toHaveTextContent(/react/i)
4
+// learn more: https://github.com/testing-library/jest-dom
5
+import '@testing-library/jest-dom';
admin/src/state.ts
new
+21
@@ -0,0 +1,21 @@
1
+import { proxy, useSnapshot } from 'valtio'
2
+import { Dict } from './misc'
3
+import { Node } from './VfsPage'
4
+
5
+export const state = proxy<{
6
+ title: string
7
+ config: Dict
8
+ changes: Dict
9
+ vfs: Node | undefined
10
+ selectedFiles: Node[]
11
+}>({
12
+ title: '',
13
+ config: {},
14
+ changes: {},
15
+ selectedFiles: [],
16
+ vfs: undefined,
17
+})
18
+
19
+export function useSnapState() {
20
+ return useSnapshot(state)
21
+}
admin/tsconfig.json
new
+26
@@ -0,0 +1,26 @@
1
+{
2
+ "compilerOptions": {
3
+ "target": "es5",
4
+ "lib": [
5
+ "dom",
6
+ "dom.iterable",
7
+ "esnext"
8
+ ],
9
+ "allowJs": true,
10
+ "skipLibCheck": true,
11
+ "esModuleInterop": true,
12
+ "allowSyntheticDefaultImports": true,
13
+ "strict": true,
14
+ "forceConsistentCasingInFileNames": true,
15
+ "noFallthroughCasesInSwitch": true,
16
+ "module": "esnext",
17
+ "moduleResolution": "node",
18
+ "resolveJsonModule": true,
19
+ "isolatedModules": true,
20
+ "noEmit": true,
21
+ "jsx": "react-jsx"
22
+ },
23
+ "include": [
24
+ "src"
25
+ ]
26
+}
dev-guidelines.md
+8
@@ -1,3 +1,11 @@
1
- All objects that go in yaml should use snake_case.
2
- Reason: we want something that is both easy for the user and maps directly in our code.
3
Spaces and kebab-case don't play well with javascript and camel is less readable for the user.
4
+
5
+# Project design
6
+- At the moment the admin interface was designed to be completely separated from the normal frontend for the following reasons
7
+ - heavy separation improves security, as it's more unlikely for a bug in the frontend to expose admin commands
8
+ - people interested in building a new frontend won't have to deal with the complexity and features of the admin interface
9
+ - it's easier to keep the frontend smaller for faster load
10
+
11
+ Of course this comes with a price to pay on the programmer's side, more work to do.
package-lock.json
+2
-2
@@ -1,12 +1,12 @@
1
{
2
"name": "hfs",
3
- "version": "0.8.1",
3
+ "version": "0.9.0",
4
"lockfileVersion": 2,
5
"requires": true,
6
"packages": {
7
"": {
8
"name": "hfs",
9
- "version": "0.8.1",
9
+ "version": "0.9.0",
10
"license": "GPL-3.0",
11
"dependencies": {
12
"@koa/router": "^10.1.1",
package.json
+2
-1
@@ -1,6 +1,6 @@
1
{
2
"name": "hfs",
3
- "version": "0.8.2",
3
+ "version": "0.9.0",
4
"description": "HTTP File Server",
5
"keywords": [
6
"file server",
@@ -12,6 +12,7 @@
12
"scripts": {
13
"watch-server": "nodemon --ignore tests/ --watch src -e ts,tsx --exec ts-node src/index.ts",
14
"start-frontend": "cd frontend && npm run start",
15
+ "start-admin": "cd admin && npm run start",
16
"start": "node dist",
17
"build": "npm install && tsc --target es2018 && cp -v -r package*.json READ* plugins tests dist && cp config.yaml dist/config-example.yaml && cp accounts.yaml dist/accounts-example.yaml && cd dist && npm ci --production && cd .. && node afterbuild",
18
"build-all": "rm -rf dist && npm run build && cd frontend && npm install && npm run build && npm audit --production && echo COMPLETED",
src/adminApis.ts
new
+47
@@ -0,0 +1,47 @@
1
+import { ApiHandlers } from './apis'
2
+import { getWholeConfig, setConfig } from './config'
3
+import { getStatus } from './listen'
4
+import { HFS_STARTED } from './index'
5
+import { Server } from 'http'
6
+import vfsApis from './api.vfs'
7
+import { getAccounts } from './perm'
8
+
9
+export const adminApis: ApiHandlers = {
10
+
11
+ ...vfsApis,
12
+
13
+ async set_config({ values }) {
14
+ if (values)
15
+ setConfig(values, true)
16
+ return {}
17
+ },
18
+
19
+ get_config(params) {
20
+ return getWholeConfig(params)
21
+ },
22
+
23
+ get_usernames() {
24
+ return { list: Object.keys(getAccounts()) }
25
+ },
26
+
27
+ async get_status() {
28
+ const st = getStatus()
29
+ return {
30
+ started: HFS_STARTED,
31
+ http: serverStatus(st.httpSrv),
32
+ https: serverStatus(st.httpsSrv),
33
+ }
34
+
35
+ function serverStatus(h: Server) {
36
+ return {
37
+ active: h.listening,
38
+ port: getPort(h),
39
+ }
40
+ }
41
+
42
+ function getPort(srv: Server) {
43
+ return (srv.address() as any)?.port
44
+ }
45
+ },
46
+
47
+}
src/api.vfs.ts
new
+161
@@ -0,0 +1,161 @@
1
+import { getNodeName, nodeIsDirectory, vfs, VfsNode, VfsNodeType } from './vfs'
2
+import _ from 'lodash'
3
+import { stat } from 'fs/promises'
4
+import { ApiError, ApiHandlers } from './apis'
5
+import { dirname } from 'path'
6
+import { saveConfigAsap } from './config'
7
+import createSSE from './sse'
8
+import glob from 'fast-glob'
9
+import { enforceFinal, isWindows } from './misc'
10
+import { exec } from 'child_process'
11
+import { promisify } from 'util'
12
+
13
+type VfsAdmin = { type?: string, size?: number, ctime?: Date, mtime?: Date, children?: VfsAdmin[] } & Omit<VfsNode,'type' | 'children'>
14
+
15
+function saveVfs() {
16
+ saveConfigAsap()
17
+}
18
+
19
+const apis: ApiHandlers = {
20
+
21
+ async get_vfs() {
22
+ return { root:vfs.root && await recur(vfs.root) }
23
+
24
+ async function recur(n: VfsNode): Promise<VfsAdmin> {
25
+ const dir = await nodeIsDirectory(n)
26
+ const stats: Pick<VfsAdmin, 'size' | 'ctime' | 'mtime'> = {}
27
+ try {
28
+ if (n.source && !dir)
29
+ Object.assign(stats, _.pick(await stat(n.source), ['size', 'ctime', 'mtime']))
30
+ }
31
+ catch {
32
+ stats.size = -1
33
+ }
34
+ if (stats && Number(stats.mtime) === Number(stats.ctime))
35
+ delete stats.mtime
36
+ return {
37
+ ...stats,
38
+ ...n,
39
+ name: getNodeName(n),
40
+ type: dir ? 'folder' : undefined,
41
+ children: n.children && await Promise.all(n.children.map(recur)),
42
+ }
43
+ }
44
+ },
45
+
46
+ async set_vfs({ uri, props }) {
47
+ const n = await vfs.urlToNode(uri)
48
+ if (!n)
49
+ return new ApiError(404, 'path not found')
50
+ Object.assign(n, pickProps(props, ['name','source','hidden','forbid','perm','hide','remove']))
51
+ if (getNodeName(_.omit(n, ['name'])) === n.name) // name only if necessary
52
+ delete n.name
53
+ saveVfs()
54
+ return n
55
+ },
56
+
57
+ async add_vfs({ under, source, name }) {
58
+ const n = under ? await vfs.urlToNode(under) : vfs.root
59
+ if (!n)
60
+ return new ApiError(404, 'invalid under')
61
+ if (n.type === VfsNodeType.temp || !await nodeIsDirectory(n))
62
+ return new ApiError(403, 'invalid under')
63
+ const a = n.children || (n.children = [])
64
+ a.unshift({ source, name })
65
+ saveVfs()
66
+ return {}
67
+ },
68
+
69
+ async del_vfs({ uris }) {
70
+ if (!uris || !Array.isArray(uris))
71
+ return new ApiError(400, 'invalid uris')
72
+ return {
73
+ errors: await Promise.all(uris.map(async uri => {
74
+ if (typeof uri !== 'string')
75
+ return 400
76
+ const node = await vfs.urlToNode(uri)
77
+ if (!node || node.type === VfsNodeType.temp)
78
+ return 404
79
+ const parent = dirname(uri)
80
+ const parentNode = await vfs.urlToNode(parent)
81
+ if (!parentNode)
82
+ return 403
83
+ const { children } = parentNode
84
+ if (!children) // shouldn't happen
85
+ return 500
86
+ const idx = children.indexOf(node)
87
+ children.splice(idx, 1)
88
+ saveVfs()
89
+ return 0 // error code 0 is OK
90
+ }))
91
+ }
92
+ },
93
+
94
+ async get_cwd() {
95
+ return { path: process.cwd() }
96
+ },
97
+
98
+ async ls({ path }, ctx) {
99
+ (async () => {
100
+ const sseSrv = createSSE(ctx)
101
+ try {
102
+ if (!path && isWindows()) {
103
+ try {
104
+ const { stdout } = await promisify(exec)('wmic logicaldisk get name')
105
+ for (const drive of stdout.split('\n').slice(1).map(x => x.trim()).filter(Boolean))
106
+ sseSrv.send({ entry: { n: drive } })
107
+ }
108
+ catch(error) {
109
+ console.debug(error)
110
+ }
111
+ return
112
+ }
113
+ const dirStream = glob.stream('*', {
114
+ cwd: path,
115
+ dot: true,
116
+ onlyFiles: false,
117
+ })
118
+ const base = enforceFinal('/', path)
119
+ for await (let path of dirStream) {
120
+ if (ctx.req.aborted)
121
+ return
122
+ if (path instanceof Buffer)
123
+ path = path.toString('utf8')
124
+ try {
125
+ const stats = await stat(base + path)
126
+ const entry = {
127
+ n: path,
128
+ s: stats.size,
129
+ c: stats.ctime,
130
+ m: stats.mtime,
131
+ k: stats.isDirectory() ? 'd' : undefined,
132
+ }
133
+ sseSrv.send({ entry })
134
+ }
135
+ catch {
136
+ console.debug('ls: failed stat for ', path)
137
+ }
138
+ }
139
+ } catch (e) {
140
+ if ((e as any).code !== 'ENOTDIR')
141
+ throw e
142
+ } finally {
143
+ sseSrv.close()
144
+ }
145
+ })().then()
146
+ return false
147
+ }
148
+
149
+}
150
+
151
+export default apis
152
+
153
+// pick only selected props, and consider null and empty string as undefined
154
+function pickProps(o: any, keys: string[]) {
155
+ const ret: any = {}
156
+ if (o && typeof o === 'object')
157
+ for (const k of keys)
158
+ if (k in o)
159
+ ret[k] = o[k] === null && o[k] === '' ? undefined : o[k]
160
+ return ret
161
+}
src/config.ts
+19
-2
@@ -1,12 +1,15 @@
1
import EventEmitter from 'events'
2
import { argv } from './const'
3
import { watchLoad } from './watchLoad'
4
+import fs from 'fs/promises'
5
+import yaml from 'yaml'
6
+import _ from 'lodash'
7
8
export const CFG_ALLOW_CLEAR_TEXT_LOGIN = 'allow clear text login'
9
10
const PATH = 'config.yaml'
11
9
-let started = false
12
+let started = false // this will tell the difference for subscribeConfig()s that are called before or after config is loaded
13
let state:Record<string,any> = {}
14
const emitter = new EventEmitter()
15
emitter.setMaxListeners(10_000)
@@ -53,11 +56,20 @@ export function getConfig(k:string) {
56
return k in state ? state[k] : configProps[k]?.defaultValue
57
}
58
56
-export function setConfig(newCfg: Record<string,any>) {
59
+export function getWholeConfig({ omit=[], only=[] }: { omit:string[], only:string[] }) {
60
+ let copy = _.omit(state, omit)
61
+ if (only.length)
62
+ copy = _.pick(copy, only)
63
+ return _.cloneDeep(copy)
64
+}
65
+
66
+export function setConfig(newCfg: Record<string,any>, partial=false) {
67
for (const k in newCfg)
68
check(k)
69
const oldKeys = Object.keys(state)
70
oldKeys.push(...Object.keys(configProps))
71
+ if (partial)
72
+ return saveConfigAsap()
73
for (const k of oldKeys)
74
if (!newCfg.hasOwnProperty(k))
75
check(k)
@@ -74,3 +86,8 @@ export function setConfig(newCfg: Record<string,any>) {
86
emitter.emit('new.'+k, v, oldV)
87
}
88
}
89
+
90
+export const saveConfigAsap = _.debounce(async () => {
91
+ fs.writeFile(path, yaml.stringify(state))
92
+ .catch(err => console.error('Failed at saving config file, please ensure it is writable.', String(err)))
93
+})
src/const.ts
+2
-2
@@ -5,8 +5,8 @@ export const DEV = process.env.DEV ? 'DEV' : ''
5
if (DEV)
6
console.clear()
7
8
-const SPECIAL_URI = '/~/'
9
-export const FRONTEND_URI = SPECIAL_URI + 'front/'
8
+export const SPECIAL_URI = '/~/'
9
+export const FRONTEND_URI = SPECIAL_URI + 'frontend/'
10
export const API_URI = SPECIAL_URI + 'api/'
11
export const PLUGINS_PUB_URI = SPECIAL_URI + 'plugins/'
12
src/frontEndApis.ts
-13
@@ -1,21 +1,8 @@
1
import { ApiHandlers } from './apis'
2
import * as api_file_list from './api.file_list'
3
import * as api_auth from './api.auth'
4
-import { setConfig } from './config'
4
5
export const frontEndApis: ApiHandlers = {
7
-
6
...api_file_list,
9
-
7
...api_auth,
11
-
12
- async config({ values }, ctx) {
13
- if (isLocalhost(ctx.ip))
14
- setConfig(values)
15
- },
16
-
17
-}
18
-
19
-function isLocalhost(ip: string) {
20
- return ip === '127.0.0.1' || ip === '::1'
8
}
src/index.ts
+13
-2
@@ -9,14 +9,25 @@ import { throttler } from './throttler'
9
import { getAccount, getCurrentUsername, getCurrentUsernameExpanded } from './perm'
10
import { headRequests, gzipper, sessions, frontendAndSharedFiles } from './middlewares'
11
import './listen'
12
+import { serveAdminFiles } from './serveFrontend'
13
+import { adminApis } from './adminApis'
14
15
export const BUILD_TIMESTAMP = "-"
16
export const SESSION_DURATION = 30*60_000
17
+export const HFS_STARTED = new Date()
18
16
-console.log('started', new Date().toLocaleString(), 'build', BUILD_TIMESTAMP, DEV)
19
+console.log('started', HFS_STARTED.toLocaleString(), 'build', BUILD_TIMESTAMP, DEV)
20
console.debug('cwd', process.cwd())
18
-export const app = new Koa({ keys: ['hfs-keys-test'] })
21
22
+const ADMIN_PORT = 63636
23
+new Koa()
24
+ .use(mount(API_URI, apiMiddleware(adminApis)))
25
+ .use(serveAdminFiles)
26
+ .on('error', errorHandler)
27
+ .listen(ADMIN_PORT, '127.0.0.1', () =>
28
+ console.log('admin interface on http://localhost:'+ADMIN_PORT))
29
+
30
+export const app = new Koa({ keys: ['hfs-keys-test'] })
31
app.use(sessions(app))
32
app.use(async (ctx, next) => {
33
ctx.state.usernames = getCurrentUsernameExpanded(ctx) // accounts chained via .belongs for permissions check
src/listen.ts
+7
@@ -118,3 +118,10 @@ function stopServer(srv: http.Server) {
118
})
119
})
120
}
121
+
122
+export function getStatus() {
123
+ return {
124
+ httpSrv,
125
+ httpsSrv,
126
+ }
127
+}
src/middlewares.ts
+13
-1
@@ -8,7 +8,7 @@ import { vfs } from './vfs'
8
import { isDirectory } from './misc'
9
import { zipStreamFromFolder } from './zip'
10
import { serveFileNode } from './serveFile'
11
-import { serveFrontend } from './serveFrontend'
11
+import { serveAdminFiles, serveFrontend } from './serveFrontend'
12
import mount from 'koa-mount'
13
import { Readable } from 'stream'
14
@@ -45,6 +45,7 @@ export const sessions = (app: Application) => session({
45
46
// serve shared files and front-end files
47
const serveFrontendPrefixed = mount(FRONTEND_URI.slice(0,-1), serveFrontend)
48
+
49
export const frontendAndSharedFiles: Koa.Middleware = async (ctx, next) => {
50
const { path } = ctx
51
if (path.includes('..'))
@@ -78,3 +79,14 @@ export const frontendAndSharedFiles: Koa.Middleware = async (ctx, next) => {
79
return serveFileNode(node)(ctx,next)
80
return next()
81
}
82
+
83
+export const admin: Koa.Middleware = async (ctx, next) => {
84
+ const { path } = ctx
85
+ if (path.includes('..'))
86
+ ctx.throw(500)
87
+ if (ctx.body)
88
+ return next()
89
+ if (path === '/')
90
+ serveAdminFiles(ctx, next)
91
+ return next()
92
+}
src/perm.ts
+4
@@ -23,6 +23,10 @@ interface Accounts { [username:string]: Account }
23
24
let accounts: Accounts = {}
25
26
+export function getAccounts() {
27
+ return accounts as Readonly<typeof accounts>
28
+}
29
+
30
export function getCurrentUsername(ctx: Koa.Context): string {
31
return ctx.session?.username || ''
32
}
src/serveFrontend.ts
+47
-30
@@ -6,14 +6,13 @@ import { mapPlugins } from './plugins'
6
import { refresh_session } from './api.auth'
7
import { ApiError } from './apis'
8
9
-const proxyPort = process.env.FRONTEND_PROXY
10
-export const serveFrontend = proxyPort ? serveProxyFrontend() : serveStaticFrontend()
11
-
12
-function serveProxyFrontend() { // used for development
9
+function serveProxyFrontend(port?: string) { // used for development
10
+ if (!port)
11
+ return
12
console.debug('fronted: proxied')
13
let proxy: Koa.Middleware
14
import('koa-better-http-proxy').then(lib =>
16
- proxy = lib.default('localhost:'+proxyPort, {
15
+ proxy = lib.default('localhost:'+port, {
16
filter: ctx => ctx.method === 'GET' || (ctx.status = METHOD_NOT_ALLOWED) && false,
17
proxyReqPathResolver: (ctx) => ctx.path.endsWith('/') ? '/' : ctx.path,
18
userResDecorator(res, data, ctx) {
@@ -27,40 +26,52 @@ function serveProxyFrontend() { // used for development
26
}
27
}
28
30
-function serveStaticFrontend() : Koa.Middleware {
29
+const serveStaticFrontend : Koa.Middleware = async (ctx, next) => {
30
const BASE = 'frontend/'
32
- return async (ctx, next) => {
33
- let { path, method } = ctx
34
- if (method === 'OPTIONS') {
35
- ctx.status = NO_CONTENT
36
- ctx.set({ Allow: 'OPTIONS, GET' })
37
- return
38
- }
39
- if (method !== 'GET')
40
- return ctx.status = METHOD_NOT_ALLOWED
41
- if (path.endsWith('/')) { // we don't cache the index as it's small and may prevent plugins change to apply
42
- ctx.body = await treatIndex(ctx, String(await fs.readFile(BASE + 'index.html')))
43
- ctx.type = 'html'
44
- ctx.set('Cache-Control', 'no-store, no-cache, must-revalidate')
45
- } else {
46
- const fullPath = BASE + path.slice(1)
47
- const modifier = path.includes('static/js') ? // webpack
48
- (s:string) => s.replace(/(return")(static\/)/g, '$1' + FRONTEND_URI.substring(1) + '$2')
49
- : undefined
50
- return serveFile(fullPath, 'auto', modifier)(ctx, next)
51
- }
52
- await next()
31
+ let { path, method } = ctx
32
+ if (method === 'OPTIONS') {
33
+ ctx.status = NO_CONTENT
34
+ ctx.set({ Allow: 'OPTIONS, GET' })
35
+ return
36
+ }
37
+ if (method !== 'GET')
38
+ return ctx.status = METHOD_NOT_ALLOWED
39
+ if (path.endsWith('/')) { // we don't cache the index as it's small and may prevent plugins change to apply
40
+ ctx.body = await treatIndex(ctx, String(await fs.readFile(BASE + 'index.html')))
41
+ ctx.type = 'html'
42
+ ctx.set('Cache-Control', 'no-store, no-cache, must-revalidate')
43
+ } else {
44
+ const fullPath = BASE + path.slice(1)
45
+ const modifier = path.includes('static/js') ? // webpack
46
+ (s:string) => s.replace(/(return")(static\/)/g, '$1' + FRONTEND_URI.substring(1) + '$2')
47
+ : undefined
48
+ return serveFile(fullPath, 'auto', modifier)(ctx, next)
49
}
50
+ await next()
51
}
52
56
-function replaceFrontEndRes(body: string) {
57
- return body.replace(/((?:src|href) *= *['"])\/?(?![a-z]+:\/\/)/g, '$1'+FRONTEND_URI)
53
+function serveAdminProxy(port?: string) { // used for development
54
+ if (!port)
55
+ return
56
+ console.debug('admin: proxied')
57
+ let proxy: Koa.Middleware
58
+ import('koa-better-http-proxy').then(lib =>
59
+ proxy = lib.default('localhost:'+port, {}) )
60
+ return function() { //@ts-ignore
61
+ return proxy.apply(this,arguments)
62
+ }
63
+}
64
+
65
+const serveAdminStatic : Koa.Middleware = async (ctx, next) => {
66
+ const fullPath = 'admin' + (ctx.path.includes('.') ? ctx.path : 'index.html');
67
+ return serveFile(fullPath, 'auto')(ctx, next)
68
}
69
70
async function treatIndex(ctx: Koa.Context, body: string) {
71
const session = await refresh_session({}, ctx)
72
ctx.set('etag', '')
63
- return replaceFrontEndRes(body)
73
+ return body
74
+ .replace(/((?:src|href) *= *['"])\/?(?![a-z]+:\/\/)/g, '$1' + FRONTEND_URI)
75
.replace('_HFS_SESSION_', session instanceof ApiError ? 'null' : JSON.stringify(session))
76
// replacing this text allow us to avoid injecting in frontends that don't support plugins. Don't use a <--comment--> or it will be removed by webpack
77
.replace('_HFS_PLUGINS_', pluginsInjection)
@@ -74,3 +85,9 @@ function pluginsInjection() {
85
return css.map(uri => `\n<link rel='stylesheet' type='text/css' href='${uri}'/>`).join('')
86
+ js.map(uri => `\n<script defer src='${uri}'></script>`).join('')
87
}
88
+
89
+export const serveAdminFiles = serveAdminProxy(process.env.ADMIN_PROXY)
90
+ || serveAdminStatic
91
+
92
+export const serveFrontend = serveProxyFrontend(process.env.FRONTEND_PROXY)
93
+ || serveStaticFrontend
tsconfig.json
+1
-1
@@ -1,5 +1,5 @@
1
{
2
- "exclude": ["frontend","tests"],
2
+ "exclude": ["frontend","admin","tests"],
3
"compilerOptions": {
4
/* Visit https://aka.ms/tsconfig.json to read more about this file */
5