A music player that connects to your cloud/distributed storage.
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

Sync instead of authenticate & always cache locally (#372)

authored by

Steven Vandevelde and committed by
GitHub
0586ae6d 830c35ea

+9902 -6927
+5 -9
Justfile
··· 164 164 cp {{NPM_DIR}}/subworkers/subworkers.js {{BUILD_DIR}}/subworkers.js 165 165 cp {{NPM_DIR}}/remotestoragejs/release/remotestorage.js {{BUILD_DIR}}/vendor/remotestorage.min.js 166 166 cp {{NPM_DIR}}/webnative/dist/index.umd.min.js {{BUILD_DIR}}/vendor/webnative.min.js 167 - cp ./vendor/ipfs.min.js {{BUILD_DIR}}/vendor/ipfs.min.js 168 167 cp ./vendor/pep.js {{BUILD_DIR}}/vendor/pep.js 169 - 170 - {{NPM_DIR}}/.bin/esbuild {{NPM_DIR}}/webnative-elm/src/funnel.js --minify --outfile={{BUILD_DIR}}/vendor/webnative-elm.min.js 171 168 172 169 173 170 # ··· 198 195 199 196 200 197 @install-deps: 201 - pnpm install 198 + npm install 202 199 203 200 mkdir -p vendor 204 201 205 202 just download-vendor-dep pep.js https://raw.githubusercontent.com/mpizenberg/elm-pep/071616d75ca61e261fdefc7b55bc46c34e44ea22/elm-pep.js 206 - just download-vendor-dep ipfs.min.js https://unpkg.com/ipfs@0.62.3/index.min.js 207 203 208 204 209 205 @install-tauri-cli: ··· 219 215 220 216 @server: 221 217 echo "> Booting up web server on port 8000" 222 - nix-shell --run "simple-http-server --port 8000 --try-file {{BUILD_DIR}}/301.html --cors --index --nocache --silent -- {{BUILD_DIR}}" 218 + miniserve --spa --index index.html --port 8000 {{BUILD_DIR}} 223 219 224 220 225 221 @tauri-dev: ··· 239 235 240 236 241 237 @watch-elm: 242 - watchexec -p -w {{SRC_DIR}} -e elm -- just elm js css 238 + watchexec -p -w {{SRC_DIR}} -e elm -- just elm css 243 239 244 240 245 241 @watch-js: 246 - watchexec -p -w {{SRC_DIR}} -e js -- just js 242 + watchexec -p -w {{SRC_DIR}} -e js,ts -- just js 247 243 248 244 249 245 @watch-system: 250 - watchexec -p --ignore *.elm --ignore *.js --ignore *.css -- just system js 246 + watchexec -p --ignore *.elm --ignore *.js --ignore *.ts --ignore *.css -- just system js
+5 -5
elm.json
··· 27 27 "elm/svg": "1.0.1", 28 28 "elm/time": "1.0.0", 29 29 "elm/url": "1.0.0", 30 - "elm/virtual-dom": "1.0.2", 30 + "elm/virtual-dom": "1.0.3", 31 31 "elm-community/dict-extra": "2.4.0", 32 32 "elm-community/html-extra": "3.4.0", 33 - "elm-community/list-extra": "8.5.2", 33 + "elm-community/list-extra": "8.7.0", 34 34 "elm-community/maybe-extra": "5.3.0", 35 35 "elm-explorations/markdown": "1.0.0", 36 - "fission-codes/webnative-elm": "1.0.0", 37 36 "icidasset/elm-binary": "2.1.0", 38 - "icidasset/elm-material-icons": "9.0.0", 37 + "icidasset/elm-material-icons": "11.0.0", 39 38 "icidasset/elm-sha": "2.0.2", 40 39 "jzxhuang/http-extras": "2.1.0", 40 + "lobanov/elm-taskport": "2.0.1", 41 41 "mpizenberg/elm-pointer-events": "4.0.2", 42 42 "newlandsvalley/elm-binary-base64": "1.0.3", 43 43 "noahzgordon/elm-color-extra": "1.0.2", 44 44 "ohanhi/keyboard": "2.0.1", 45 + "prozacchiwawa/elm-urlbase64": "1.0.6", 45 46 "robinheghan/murmur3": "1.0.0", 46 47 "rtfeldman/elm-hex": "1.0.0", 47 48 "ryannhg/date-format": "2.3.0", ··· 51 52 "ymtszw/elm-xml-decode": "3.2.1" 52 53 }, 53 54 "indirect": { 54 - "TSFoster/elm-bytes-extra": "1.3.0", 55 55 "elm/bytes": "1.0.8", 56 56 "elm/parser": "1.1.0", 57 57 "fredcy/elm-parseint": "2.0.1",
+1 -2
nix/shell.nix
··· 19 19 tools = [ 20 20 curl 21 21 just 22 - simple-http-server 22 + (if isM1Mac then pkgs-x86.miniserve else miniserve) 23 23 (if isM1Mac then pkgs-x86.watchexec else watchexec) 24 24 ]; 25 25 ··· 27 27 elmPackages.elm 28 28 elmPackages.elm-format 29 29 nodejs-18_x 30 - nodePackages.pnpm 31 30 rust 32 31 stack 33 32 ];
+6881
package-lock.json
··· 1 + { 2 + "name": "diffuse", 3 + "version": "3.3.0", 4 + "lockfileVersion": 2, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "diffuse", 9 + "version": "3.3.0", 10 + "license": "SEE LICENSE IN LICENSE", 11 + "dependencies": { 12 + "@tokenizer/http": "^0.6.2", 13 + "delay": "^5.0.0", 14 + "elm-taskport": "^2.0.1", 15 + "fast-text-encoding": "^1.0.6", 16 + "file-saver": "^2.0.2", 17 + "jszip": "^3.7.1", 18 + "load-script2": "^2.0.5", 19 + "lunr": "^2.3.8", 20 + "music-metadata-browser": "^2.5.9", 21 + "p-retry": "^4.6.2", 22 + "remotestoragejs": "^1.2.3", 23 + "subworkers": "^1.0.1", 24 + "timer.js": "^1.0.4", 25 + "tocca": "^2.0.9", 26 + "webnative": "file:../../Work/webnative" 27 + }, 28 + "devDependencies": { 29 + "assert": "^2.0.0", 30 + "autoprefixer": "^10.4.13", 31 + "buffer": "^6.0.3", 32 + "elm-review": "^2.8.5", 33 + "esbuild": "^0.16.4", 34 + "eslint": "^8.29.0", 35 + "events": "^3.3.0", 36 + "postcss": "^8.4.19", 37 + "postcss-custom-properties": "^12.1.11", 38 + "postcss-import": "^14.1.0", 39 + "tailwindcss": "^3.2.4", 40 + "tailwindcss-animations": "^2.0.0", 41 + "tailwindcss-interaction-variants": "^5.0.0" 42 + } 43 + }, 44 + "../../Work/webnative": { 45 + "version": "0.35.1", 46 + "license": "Apache-2.0", 47 + "dependencies": { 48 + "@ipld/dag-cbor": "^8.0.0", 49 + "@ipld/dag-pb": "^3.0.1", 50 + "@libp2p/interface-keys": "^1.0.4", 51 + "@libp2p/peer-id": "^1.1.17", 52 + "@multiformats/multiaddr": "^11.1.0", 53 + "blockstore-core": "^2.0.2", 54 + "blockstore-datastore-adapter": "^4.0.0", 55 + "datastore-core": "^8.0.2", 56 + "datastore-level": "^9.0.4", 57 + "events": "^3.3.0", 58 + "fission-bloom-filters": "1.7.1", 59 + "ipfs-core-types": "0.13.0", 60 + "ipfs-repo": "^16.0.0", 61 + "keystore-idb": "^0.15.5", 62 + "localforage": "^1.10.0", 63 + "multiformats": "^10.0.2", 64 + "one-webcrypto": "^1.0.3", 65 + "throttle-debounce": "^3.0.1", 66 + "tweetnacl": "^1.0.3", 67 + "uint8arrays": "^3.0.0", 68 + "wnfs": "0.1.10" 69 + }, 70 + "devDependencies": { 71 + "@esbuild-plugins/node-globals-polyfill": "^0.1.1", 72 + "@ipld/car": "^5.0.0", 73 + "@types/expect": "^24.3.0", 74 + "@types/mocha": "^10.0.0", 75 + "@types/node": "^18.11.9", 76 + "@types/throttle-debounce": "^2.1.0", 77 + "@typescript-eslint/eslint-plugin": "^5.10.0", 78 + "@typescript-eslint/parser": "^5.10.0", 79 + "copyfiles": "^2.4.1", 80 + "esbuild": "^0.15.13", 81 + "eslint": "^8.7.0", 82 + "expect": "^27.4.6", 83 + "fast-check": "^3.3.0", 84 + "globby": "^13.1.2", 85 + "ipfs-core": "0.17.0", 86 + "localforage-driver-memory": "^1.0.5", 87 + "madge": "^5.0.1", 88 + "mocha": "^10.1.0", 89 + "rimraf": "^3.0.2", 90 + "ts-node": "^10.9.1", 91 + "tslib": "^2.4.1", 92 + "typedoc": "^0.23.21", 93 + "typedoc-plugin-missing-exports": "^1.0.0", 94 + "typescript": "^4.8.4", 95 + "util": "^0.12.4" 96 + }, 97 + "engines": { 98 + "node": ">=16" 99 + } 100 + }, 101 + "node_modules/@esbuild/android-arm": { 102 + "version": "0.16.4", 103 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.4.tgz", 104 + "integrity": "sha512-rZzb7r22m20S1S7ufIc6DC6W659yxoOrl7sKP1nCYhuvUlnCFHVSbATG4keGUtV8rDz11sRRDbWkvQZpzPaHiw==", 105 + "cpu": [ 106 + "arm" 107 + ], 108 + "dev": true, 109 + "optional": true, 110 + "os": [ 111 + "android" 112 + ], 113 + "engines": { 114 + "node": ">=12" 115 + } 116 + }, 117 + "node_modules/@esbuild/android-arm64": { 118 + "version": "0.16.4", 119 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.4.tgz", 120 + "integrity": "sha512-VPuTzXFm/m2fcGfN6CiwZTlLzxrKsWbPkG7ArRFpuxyaHUm/XFHQPD4xNwZT6uUmpIHhnSjcaCmcla8COzmZ5Q==", 121 + "cpu": [ 122 + "arm64" 123 + ], 124 + "dev": true, 125 + "optional": true, 126 + "os": [ 127 + "android" 128 + ], 129 + "engines": { 130 + "node": ">=12" 131 + } 132 + }, 133 + "node_modules/@esbuild/android-x64": { 134 + "version": "0.16.4", 135 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.4.tgz", 136 + "integrity": "sha512-MW+B2O++BkcOfMWmuHXB15/l1i7wXhJFqbJhp82IBOais8RBEQv2vQz/jHrDEHaY2X0QY7Wfw86SBL2PbVOr0g==", 137 + "cpu": [ 138 + "x64" 139 + ], 140 + "dev": true, 141 + "optional": true, 142 + "os": [ 143 + "android" 144 + ], 145 + "engines": { 146 + "node": ">=12" 147 + } 148 + }, 149 + "node_modules/@esbuild/darwin-arm64": { 150 + "version": "0.16.4", 151 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.4.tgz", 152 + "integrity": "sha512-a28X1O//aOfxwJVZVs7ZfM8Tyih2Za4nKJrBwW5Wm4yKsnwBy9aiS/xwpxiiTRttw3EaTg4Srerhcm6z0bu9Wg==", 153 + "cpu": [ 154 + "arm64" 155 + ], 156 + "dev": true, 157 + "optional": true, 158 + "os": [ 159 + "darwin" 160 + ], 161 + "engines": { 162 + "node": ">=12" 163 + } 164 + }, 165 + "node_modules/@esbuild/darwin-x64": { 166 + "version": "0.16.4", 167 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.4.tgz", 168 + "integrity": "sha512-e3doCr6Ecfwd7VzlaQqEPrnbvvPjE9uoTpxG5pyLzr2rI2NMjDHmvY1E5EO81O/e9TUOLLkXA5m6T8lfjK9yAA==", 169 + "cpu": [ 170 + "x64" 171 + ], 172 + "dev": true, 173 + "optional": true, 174 + "os": [ 175 + "darwin" 176 + ], 177 + "engines": { 178 + "node": ">=12" 179 + } 180 + }, 181 + "node_modules/@esbuild/freebsd-arm64": { 182 + "version": "0.16.4", 183 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.4.tgz", 184 + "integrity": "sha512-Oup3G/QxBgvvqnXWrBed7xxkFNwAwJVHZcklWyQt7YCAL5bfUkaa6FVWnR78rNQiM8MqqLiT6ZTZSdUFuVIg1w==", 185 + "cpu": [ 186 + "arm64" 187 + ], 188 + "dev": true, 189 + "optional": true, 190 + "os": [ 191 + "freebsd" 192 + ], 193 + "engines": { 194 + "node": ">=12" 195 + } 196 + }, 197 + "node_modules/@esbuild/freebsd-x64": { 198 + "version": "0.16.4", 199 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.4.tgz", 200 + "integrity": "sha512-vAP+eYOxlN/Bpo/TZmzEQapNS8W1njECrqkTpNgvXskkkJC2AwOXwZWai/Kc2vEFZUXQttx6UJbj9grqjD/+9Q==", 201 + "cpu": [ 202 + "x64" 203 + ], 204 + "dev": true, 205 + "optional": true, 206 + "os": [ 207 + "freebsd" 208 + ], 209 + "engines": { 210 + "node": ">=12" 211 + } 212 + }, 213 + "node_modules/@esbuild/linux-arm": { 214 + "version": "0.16.4", 215 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.4.tgz", 216 + "integrity": "sha512-A47ZmtpIPyERxkSvIv+zLd6kNIOtJH03XA0Hy7jaceRDdQaQVGSDt4mZqpWqJYgDk9rg96aglbF6kCRvPGDSUA==", 217 + "cpu": [ 218 + "arm" 219 + ], 220 + "dev": true, 221 + "optional": true, 222 + "os": [ 223 + "linux" 224 + ], 225 + "engines": { 226 + "node": ">=12" 227 + } 228 + }, 229 + "node_modules/@esbuild/linux-arm64": { 230 + "version": "0.16.4", 231 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.4.tgz", 232 + "integrity": "sha512-2zXoBhv4r5pZiyjBKrOdFP4CXOChxXiYD50LRUU+65DkdS5niPFHbboKZd/c81l0ezpw7AQnHeoCy5hFrzzs4g==", 233 + "cpu": [ 234 + "arm64" 235 + ], 236 + "dev": true, 237 + "optional": true, 238 + "os": [ 239 + "linux" 240 + ], 241 + "engines": { 242 + "node": ">=12" 243 + } 244 + }, 245 + "node_modules/@esbuild/linux-ia32": { 246 + "version": "0.16.4", 247 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.4.tgz", 248 + "integrity": "sha512-uxdSrpe9wFhz4yBwt2kl2TxS/NWEINYBUFIxQtaEVtglm1eECvsj1vEKI0KX2k2wCe17zDdQ3v+jVxfwVfvvjw==", 249 + "cpu": [ 250 + "ia32" 251 + ], 252 + "dev": true, 253 + "optional": true, 254 + "os": [ 255 + "linux" 256 + ], 257 + "engines": { 258 + "node": ">=12" 259 + } 260 + }, 261 + "node_modules/@esbuild/linux-loong64": { 262 + "version": "0.16.4", 263 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.4.tgz", 264 + "integrity": "sha512-peDrrUuxbZ9Jw+DwLCh/9xmZAk0p0K1iY5d2IcwmnN+B87xw7kujOkig6ZRcZqgrXgeRGurRHn0ENMAjjD5DEg==", 265 + "cpu": [ 266 + "loong64" 267 + ], 268 + "dev": true, 269 + "optional": true, 270 + "os": [ 271 + "linux" 272 + ], 273 + "engines": { 274 + "node": ">=12" 275 + } 276 + }, 277 + "node_modules/@esbuild/linux-mips64el": { 278 + "version": "0.16.4", 279 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.4.tgz", 280 + "integrity": "sha512-sD9EEUoGtVhFjjsauWjflZklTNr57KdQ6xfloO4yH1u7vNQlOfAlhEzbyBKfgbJlW7rwXYBdl5/NcZ+Mg2XhQA==", 281 + "cpu": [ 282 + "mips64el" 283 + ], 284 + "dev": true, 285 + "optional": true, 286 + "os": [ 287 + "linux" 288 + ], 289 + "engines": { 290 + "node": ">=12" 291 + } 292 + }, 293 + "node_modules/@esbuild/linux-ppc64": { 294 + "version": "0.16.4", 295 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.4.tgz", 296 + "integrity": "sha512-X1HSqHUX9D+d0l6/nIh4ZZJ94eQky8d8z6yxAptpZE3FxCWYWvTDd9X9ST84MGZEJx04VYUD/AGgciddwO0b8g==", 297 + "cpu": [ 298 + "ppc64" 299 + ], 300 + "dev": true, 301 + "optional": true, 302 + "os": [ 303 + "linux" 304 + ], 305 + "engines": { 306 + "node": ">=12" 307 + } 308 + }, 309 + "node_modules/@esbuild/linux-riscv64": { 310 + "version": "0.16.4", 311 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.4.tgz", 312 + "integrity": "sha512-97ANpzyNp0GTXCt6SRdIx1ngwncpkV/z453ZuxbnBROCJ5p/55UjhbaG23UdHj88fGWLKPFtMoU4CBacz4j9FA==", 313 + "cpu": [ 314 + "riscv64" 315 + ], 316 + "dev": true, 317 + "optional": true, 318 + "os": [ 319 + "linux" 320 + ], 321 + "engines": { 322 + "node": ">=12" 323 + } 324 + }, 325 + "node_modules/@esbuild/linux-s390x": { 326 + "version": "0.16.4", 327 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.4.tgz", 328 + "integrity": "sha512-pUvPQLPmbEeJRPjP0DYTC1vjHyhrnCklQmCGYbipkep+oyfTn7GTBJXoPodR7ZS5upmEyc8lzAkn2o29wD786A==", 329 + "cpu": [ 330 + "s390x" 331 + ], 332 + "dev": true, 333 + "optional": true, 334 + "os": [ 335 + "linux" 336 + ], 337 + "engines": { 338 + "node": ">=12" 339 + } 340 + }, 341 + "node_modules/@esbuild/linux-x64": { 342 + "version": "0.16.4", 343 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.4.tgz", 344 + "integrity": "sha512-N55Q0mJs3Sl8+utPRPBrL6NLYZKBCLLx0bme/+RbjvMforTGGzFvsRl4xLTZMUBFC1poDzBEPTEu5nxizQ9Nlw==", 345 + "cpu": [ 346 + "x64" 347 + ], 348 + "dev": true, 349 + "optional": true, 350 + "os": [ 351 + "linux" 352 + ], 353 + "engines": { 354 + "node": ">=12" 355 + } 356 + }, 357 + "node_modules/@esbuild/netbsd-x64": { 358 + "version": "0.16.4", 359 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.4.tgz", 360 + "integrity": "sha512-LHSJLit8jCObEQNYkgsDYBh2JrJT53oJO2HVdkSYLa6+zuLJh0lAr06brXIkljrlI+N7NNW1IAXGn/6IZPi3YQ==", 361 + "cpu": [ 362 + "x64" 363 + ], 364 + "dev": true, 365 + "optional": true, 366 + "os": [ 367 + "netbsd" 368 + ], 369 + "engines": { 370 + "node": ">=12" 371 + } 372 + }, 373 + "node_modules/@esbuild/openbsd-x64": { 374 + "version": "0.16.4", 375 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.4.tgz", 376 + "integrity": "sha512-nLgdc6tWEhcCFg/WVFaUxHcPK3AP/bh+KEwKtl69Ay5IBqUwKDaq/6Xk0E+fh/FGjnLwqFSsarsbPHeKM8t8Sw==", 377 + "cpu": [ 378 + "x64" 379 + ], 380 + "dev": true, 381 + "optional": true, 382 + "os": [ 383 + "openbsd" 384 + ], 385 + "engines": { 386 + "node": ">=12" 387 + } 388 + }, 389 + "node_modules/@esbuild/sunos-x64": { 390 + "version": "0.16.4", 391 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.4.tgz", 392 + "integrity": "sha512-08SluG24GjPO3tXKk95/85n9kpyZtXCVwURR2i4myhrOfi3jspClV0xQQ0W0PYWHioJj+LejFMt41q+PG3mlAQ==", 393 + "cpu": [ 394 + "x64" 395 + ], 396 + "dev": true, 397 + "optional": true, 398 + "os": [ 399 + "sunos" 400 + ], 401 + "engines": { 402 + "node": ">=12" 403 + } 404 + }, 405 + "node_modules/@esbuild/win32-arm64": { 406 + "version": "0.16.4", 407 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.4.tgz", 408 + "integrity": "sha512-yYiRDQcqLYQSvNQcBKN7XogbrSvBE45FEQdH8fuXPl7cngzkCvpsG2H9Uey39IjQ6gqqc+Q4VXYHsQcKW0OMjQ==", 409 + "cpu": [ 410 + "arm64" 411 + ], 412 + "dev": true, 413 + "optional": true, 414 + "os": [ 415 + "win32" 416 + ], 417 + "engines": { 418 + "node": ">=12" 419 + } 420 + }, 421 + "node_modules/@esbuild/win32-ia32": { 422 + "version": "0.16.4", 423 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.4.tgz", 424 + "integrity": "sha512-5rabnGIqexekYkh9zXG5waotq8mrdlRoBqAktjx2W3kb0zsI83mdCwrcAeKYirnUaTGztR5TxXcXmQrEzny83w==", 425 + "cpu": [ 426 + "ia32" 427 + ], 428 + "dev": true, 429 + "optional": true, 430 + "os": [ 431 + "win32" 432 + ], 433 + "engines": { 434 + "node": ">=12" 435 + } 436 + }, 437 + "node_modules/@esbuild/win32-x64": { 438 + "version": "0.16.4", 439 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.4.tgz", 440 + "integrity": "sha512-sN/I8FMPtmtT2Yw+Dly8Ur5vQ5a/RmC8hW7jO9PtPSQUPkowxWpcUZnqOggU7VwyT3Xkj6vcXWd3V/qTXwultQ==", 441 + "cpu": [ 442 + "x64" 443 + ], 444 + "dev": true, 445 + "optional": true, 446 + "os": [ 447 + "win32" 448 + ], 449 + "engines": { 450 + "node": ">=12" 451 + } 452 + }, 453 + "node_modules/@eslint/eslintrc": { 454 + "version": "1.3.3", 455 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", 456 + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", 457 + "dev": true, 458 + "dependencies": { 459 + "ajv": "^6.12.4", 460 + "debug": "^4.3.2", 461 + "espree": "^9.4.0", 462 + "globals": "^13.15.0", 463 + "ignore": "^5.2.0", 464 + "import-fresh": "^3.2.1", 465 + "js-yaml": "^4.1.0", 466 + "minimatch": "^3.1.2", 467 + "strip-json-comments": "^3.1.1" 468 + }, 469 + "engines": { 470 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 471 + }, 472 + "funding": { 473 + "url": "https://opencollective.com/eslint" 474 + } 475 + }, 476 + "node_modules/@humanwhocodes/config-array": { 477 + "version": "0.11.7", 478 + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", 479 + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", 480 + "dev": true, 481 + "dependencies": { 482 + "@humanwhocodes/object-schema": "^1.2.1", 483 + "debug": "^4.1.1", 484 + "minimatch": "^3.0.5" 485 + }, 486 + "engines": { 487 + "node": ">=10.10.0" 488 + } 489 + }, 490 + "node_modules/@humanwhocodes/module-importer": { 491 + "version": "1.0.1", 492 + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 493 + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 494 + "dev": true, 495 + "engines": { 496 + "node": ">=12.22" 497 + }, 498 + "funding": { 499 + "type": "github", 500 + "url": "https://github.com/sponsors/nzakas" 501 + } 502 + }, 503 + "node_modules/@humanwhocodes/object-schema": { 504 + "version": "1.2.1", 505 + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 506 + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 507 + "dev": true 508 + }, 509 + "node_modules/@nodelib/fs.scandir": { 510 + "version": "2.1.5", 511 + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 512 + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 513 + "dev": true, 514 + "dependencies": { 515 + "@nodelib/fs.stat": "2.0.5", 516 + "run-parallel": "^1.1.9" 517 + }, 518 + "engines": { 519 + "node": ">= 8" 520 + } 521 + }, 522 + "node_modules/@nodelib/fs.stat": { 523 + "version": "2.0.5", 524 + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 525 + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 526 + "dev": true, 527 + "engines": { 528 + "node": ">= 8" 529 + } 530 + }, 531 + "node_modules/@nodelib/fs.walk": { 532 + "version": "1.2.8", 533 + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 534 + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 535 + "dev": true, 536 + "dependencies": { 537 + "@nodelib/fs.scandir": "2.1.5", 538 + "fastq": "^1.6.0" 539 + }, 540 + "engines": { 541 + "node": ">= 8" 542 + } 543 + }, 544 + "node_modules/@sindresorhus/is": { 545 + "version": "4.6.0", 546 + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", 547 + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", 548 + "dev": true, 549 + "engines": { 550 + "node": ">=10" 551 + }, 552 + "funding": { 553 + "url": "https://github.com/sindresorhus/is?sponsor=1" 554 + } 555 + }, 556 + "node_modules/@szmarczak/http-timer": { 557 + "version": "4.0.6", 558 + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", 559 + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", 560 + "dev": true, 561 + "dependencies": { 562 + "defer-to-connect": "^2.0.0" 563 + }, 564 + "engines": { 565 + "node": ">=10" 566 + } 567 + }, 568 + "node_modules/@tokenizer/http": { 569 + "version": "0.6.2", 570 + "resolved": "https://registry.npmjs.org/@tokenizer/http/-/http-0.6.2.tgz", 571 + "integrity": "sha512-0+gTDUT9EYxbJvDYRk65Itw68gfGPUmUNz9hlAA4j/Mih7QOfyN6fVxvtTB6ytgOTo7GU1x9KRIGlrqVdjHSYw==", 572 + "dependencies": { 573 + "@tokenizer/range": "^0.5.1", 574 + "debug": "^4.1.1", 575 + "node-fetch": "^2.6.7", 576 + "strtok3": "^6.0.8" 577 + }, 578 + "funding": { 579 + "type": "github", 580 + "url": "https://github.com/sponsors/Borewit" 581 + } 582 + }, 583 + "node_modules/@tokenizer/range": { 584 + "version": "0.5.3", 585 + "resolved": "https://registry.npmjs.org/@tokenizer/range/-/range-0.5.3.tgz", 586 + "integrity": "sha512-EcPMjCrLL4xaxZtdmN4E+78fSML2R1seiuCKmaIe4pjm7JEDVn8bUejuTMCGpPiqz1SkTgd90xj6c7aIrsHy+A==", 587 + "dependencies": { 588 + "debug": "^4.3.2", 589 + "strtok3": "^6.3.0" 590 + }, 591 + "engines": { 592 + "node": ">=10" 593 + }, 594 + "funding": { 595 + "type": "github", 596 + "url": "https://github.com/sponsors/Borewit" 597 + } 598 + }, 599 + "node_modules/@tokenizer/token": { 600 + "version": "0.3.0", 601 + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 602 + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" 603 + }, 604 + "node_modules/@types/cacheable-request": { 605 + "version": "6.0.3", 606 + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", 607 + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", 608 + "dev": true, 609 + "dependencies": { 610 + "@types/http-cache-semantics": "*", 611 + "@types/keyv": "^3.1.4", 612 + "@types/node": "*", 613 + "@types/responselike": "^1.0.0" 614 + } 615 + }, 616 + "node_modules/@types/http-cache-semantics": { 617 + "version": "4.0.1", 618 + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", 619 + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", 620 + "dev": true 621 + }, 622 + "node_modules/@types/keyv": { 623 + "version": "3.1.4", 624 + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", 625 + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", 626 + "dev": true, 627 + "dependencies": { 628 + "@types/node": "*" 629 + } 630 + }, 631 + "node_modules/@types/node": { 632 + "version": "18.11.13", 633 + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.13.tgz", 634 + "integrity": "sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w==", 635 + "dev": true 636 + }, 637 + "node_modules/@types/responselike": { 638 + "version": "1.0.0", 639 + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", 640 + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", 641 + "dev": true, 642 + "dependencies": { 643 + "@types/node": "*" 644 + } 645 + }, 646 + "node_modules/@types/retry": { 647 + "version": "0.12.0", 648 + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", 649 + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" 650 + }, 651 + "node_modules/abort-controller": { 652 + "version": "3.0.0", 653 + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 654 + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 655 + "dependencies": { 656 + "event-target-shim": "^5.0.0" 657 + }, 658 + "engines": { 659 + "node": ">=6.5" 660 + } 661 + }, 662 + "node_modules/acorn": { 663 + "version": "8.8.1", 664 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", 665 + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", 666 + "dev": true, 667 + "bin": { 668 + "acorn": "bin/acorn" 669 + }, 670 + "engines": { 671 + "node": ">=0.4.0" 672 + } 673 + }, 674 + "node_modules/acorn-jsx": { 675 + "version": "5.3.2", 676 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 677 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 678 + "dev": true, 679 + "peerDependencies": { 680 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 681 + } 682 + }, 683 + "node_modules/acorn-node": { 684 + "version": "1.8.2", 685 + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 686 + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 687 + "dev": true, 688 + "dependencies": { 689 + "acorn": "^7.0.0", 690 + "acorn-walk": "^7.0.0", 691 + "xtend": "^4.0.2" 692 + } 693 + }, 694 + "node_modules/acorn-node/node_modules/acorn": { 695 + "version": "7.4.1", 696 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 697 + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 698 + "dev": true, 699 + "bin": { 700 + "acorn": "bin/acorn" 701 + }, 702 + "engines": { 703 + "node": ">=0.4.0" 704 + } 705 + }, 706 + "node_modules/acorn-walk": { 707 + "version": "7.2.0", 708 + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 709 + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 710 + "dev": true, 711 + "engines": { 712 + "node": ">=0.4.0" 713 + } 714 + }, 715 + "node_modules/ajv": { 716 + "version": "6.12.6", 717 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 718 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 719 + "dev": true, 720 + "dependencies": { 721 + "fast-deep-equal": "^3.1.1", 722 + "fast-json-stable-stringify": "^2.0.0", 723 + "json-schema-traverse": "^0.4.1", 724 + "uri-js": "^4.2.2" 725 + }, 726 + "funding": { 727 + "type": "github", 728 + "url": "https://github.com/sponsors/epoberezkin" 729 + } 730 + }, 731 + "node_modules/ansi-escapes": { 732 + "version": "4.3.2", 733 + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 734 + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 735 + "dev": true, 736 + "dependencies": { 737 + "type-fest": "^0.21.3" 738 + }, 739 + "engines": { 740 + "node": ">=8" 741 + }, 742 + "funding": { 743 + "url": "https://github.com/sponsors/sindresorhus" 744 + } 745 + }, 746 + "node_modules/ansi-escapes/node_modules/type-fest": { 747 + "version": "0.21.3", 748 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 749 + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 750 + "dev": true, 751 + "engines": { 752 + "node": ">=10" 753 + }, 754 + "funding": { 755 + "url": "https://github.com/sponsors/sindresorhus" 756 + } 757 + }, 758 + "node_modules/ansi-regex": { 759 + "version": "5.0.1", 760 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 761 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 762 + "dev": true, 763 + "engines": { 764 + "node": ">=8" 765 + } 766 + }, 767 + "node_modules/ansi-styles": { 768 + "version": "4.3.0", 769 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 770 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 771 + "dev": true, 772 + "dependencies": { 773 + "color-convert": "^2.0.1" 774 + }, 775 + "engines": { 776 + "node": ">=8" 777 + }, 778 + "funding": { 779 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 780 + } 781 + }, 782 + "node_modules/anymatch": { 783 + "version": "3.1.3", 784 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 785 + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 786 + "dev": true, 787 + "dependencies": { 788 + "normalize-path": "^3.0.0", 789 + "picomatch": "^2.0.4" 790 + }, 791 + "engines": { 792 + "node": ">= 8" 793 + } 794 + }, 795 + "node_modules/arg": { 796 + "version": "5.0.2", 797 + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 798 + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 799 + "dev": true 800 + }, 801 + "node_modules/argparse": { 802 + "version": "2.0.1", 803 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 804 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 805 + "dev": true 806 + }, 807 + "node_modules/assert": { 808 + "version": "2.0.0", 809 + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", 810 + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", 811 + "dev": true, 812 + "dependencies": { 813 + "es6-object-assign": "^1.1.0", 814 + "is-nan": "^1.2.1", 815 + "object-is": "^1.0.1", 816 + "util": "^0.12.0" 817 + } 818 + }, 819 + "node_modules/at-least-node": { 820 + "version": "1.0.0", 821 + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", 822 + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", 823 + "dev": true, 824 + "engines": { 825 + "node": ">= 4.0.0" 826 + } 827 + }, 828 + "node_modules/autoprefixer": { 829 + "version": "10.4.13", 830 + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", 831 + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", 832 + "dev": true, 833 + "funding": [ 834 + { 835 + "type": "opencollective", 836 + "url": "https://opencollective.com/postcss/" 837 + }, 838 + { 839 + "type": "tidelift", 840 + "url": "https://tidelift.com/funding/github/npm/autoprefixer" 841 + } 842 + ], 843 + "dependencies": { 844 + "browserslist": "^4.21.4", 845 + "caniuse-lite": "^1.0.30001426", 846 + "fraction.js": "^4.2.0", 847 + "normalize-range": "^0.1.2", 848 + "picocolors": "^1.0.0", 849 + "postcss-value-parser": "^4.2.0" 850 + }, 851 + "bin": { 852 + "autoprefixer": "bin/autoprefixer" 853 + }, 854 + "engines": { 855 + "node": "^10 || ^12 || >=14" 856 + }, 857 + "peerDependencies": { 858 + "postcss": "^8.1.0" 859 + } 860 + }, 861 + "node_modules/available-typed-arrays": { 862 + "version": "1.0.5", 863 + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 864 + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 865 + "dev": true, 866 + "engines": { 867 + "node": ">= 0.4" 868 + }, 869 + "funding": { 870 + "url": "https://github.com/sponsors/ljharb" 871 + } 872 + }, 873 + "node_modules/balanced-match": { 874 + "version": "1.0.2", 875 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 876 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 877 + "dev": true 878 + }, 879 + "node_modules/base64-js": { 880 + "version": "1.5.1", 881 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 882 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 883 + "funding": [ 884 + { 885 + "type": "github", 886 + "url": "https://github.com/sponsors/feross" 887 + }, 888 + { 889 + "type": "patreon", 890 + "url": "https://www.patreon.com/feross" 891 + }, 892 + { 893 + "type": "consulting", 894 + "url": "https://feross.org/support" 895 + } 896 + ] 897 + }, 898 + "node_modules/binary-extensions": { 899 + "version": "2.2.0", 900 + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 901 + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 902 + "dev": true, 903 + "engines": { 904 + "node": ">=8" 905 + } 906 + }, 907 + "node_modules/bl": { 908 + "version": "4.1.0", 909 + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 910 + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 911 + "dev": true, 912 + "dependencies": { 913 + "buffer": "^5.5.0", 914 + "inherits": "^2.0.4", 915 + "readable-stream": "^3.4.0" 916 + } 917 + }, 918 + "node_modules/bl/node_modules/buffer": { 919 + "version": "5.7.1", 920 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 921 + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 922 + "dev": true, 923 + "funding": [ 924 + { 925 + "type": "github", 926 + "url": "https://github.com/sponsors/feross" 927 + }, 928 + { 929 + "type": "patreon", 930 + "url": "https://www.patreon.com/feross" 931 + }, 932 + { 933 + "type": "consulting", 934 + "url": "https://feross.org/support" 935 + } 936 + ], 937 + "dependencies": { 938 + "base64-js": "^1.3.1", 939 + "ieee754": "^1.1.13" 940 + } 941 + }, 942 + "node_modules/bl/node_modules/readable-stream": { 943 + "version": "3.6.0", 944 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 945 + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 946 + "dev": true, 947 + "dependencies": { 948 + "inherits": "^2.0.3", 949 + "string_decoder": "^1.1.1", 950 + "util-deprecate": "^1.0.1" 951 + }, 952 + "engines": { 953 + "node": ">= 6" 954 + } 955 + }, 956 + "node_modules/brace-expansion": { 957 + "version": "1.1.11", 958 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 959 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 960 + "dev": true, 961 + "dependencies": { 962 + "balanced-match": "^1.0.0", 963 + "concat-map": "0.0.1" 964 + } 965 + }, 966 + "node_modules/braces": { 967 + "version": "3.0.2", 968 + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 969 + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 970 + "dev": true, 971 + "dependencies": { 972 + "fill-range": "^7.0.1" 973 + }, 974 + "engines": { 975 + "node": ">=8" 976 + } 977 + }, 978 + "node_modules/browserslist": { 979 + "version": "4.21.4", 980 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 981 + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 982 + "dev": true, 983 + "funding": [ 984 + { 985 + "type": "opencollective", 986 + "url": "https://opencollective.com/browserslist" 987 + }, 988 + { 989 + "type": "tidelift", 990 + "url": "https://tidelift.com/funding/github/npm/browserslist" 991 + } 992 + ], 993 + "dependencies": { 994 + "caniuse-lite": "^1.0.30001400", 995 + "electron-to-chromium": "^1.4.251", 996 + "node-releases": "^2.0.6", 997 + "update-browserslist-db": "^1.0.9" 998 + }, 999 + "bin": { 1000 + "browserslist": "cli.js" 1001 + }, 1002 + "engines": { 1003 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1004 + } 1005 + }, 1006 + "node_modules/buffer": { 1007 + "version": "6.0.3", 1008 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 1009 + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 1010 + "funding": [ 1011 + { 1012 + "type": "github", 1013 + "url": "https://github.com/sponsors/feross" 1014 + }, 1015 + { 1016 + "type": "patreon", 1017 + "url": "https://www.patreon.com/feross" 1018 + }, 1019 + { 1020 + "type": "consulting", 1021 + "url": "https://feross.org/support" 1022 + } 1023 + ], 1024 + "dependencies": { 1025 + "base64-js": "^1.3.1", 1026 + "ieee754": "^1.2.1" 1027 + } 1028 + }, 1029 + "node_modules/cacheable-lookup": { 1030 + "version": "5.0.4", 1031 + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", 1032 + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", 1033 + "dev": true, 1034 + "engines": { 1035 + "node": ">=10.6.0" 1036 + } 1037 + }, 1038 + "node_modules/cacheable-request": { 1039 + "version": "7.0.2", 1040 + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", 1041 + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", 1042 + "dev": true, 1043 + "dependencies": { 1044 + "clone-response": "^1.0.2", 1045 + "get-stream": "^5.1.0", 1046 + "http-cache-semantics": "^4.0.0", 1047 + "keyv": "^4.0.0", 1048 + "lowercase-keys": "^2.0.0", 1049 + "normalize-url": "^6.0.1", 1050 + "responselike": "^2.0.0" 1051 + }, 1052 + "engines": { 1053 + "node": ">=8" 1054 + } 1055 + }, 1056 + "node_modules/call-bind": { 1057 + "version": "1.0.2", 1058 + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1059 + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1060 + "dev": true, 1061 + "dependencies": { 1062 + "function-bind": "^1.1.1", 1063 + "get-intrinsic": "^1.0.2" 1064 + }, 1065 + "funding": { 1066 + "url": "https://github.com/sponsors/ljharb" 1067 + } 1068 + }, 1069 + "node_modules/callsites": { 1070 + "version": "3.1.0", 1071 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1072 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1073 + "dev": true, 1074 + "engines": { 1075 + "node": ">=6" 1076 + } 1077 + }, 1078 + "node_modules/camelcase-css": { 1079 + "version": "2.0.1", 1080 + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 1081 + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 1082 + "dev": true, 1083 + "engines": { 1084 + "node": ">= 6" 1085 + } 1086 + }, 1087 + "node_modules/caniuse-lite": { 1088 + "version": "1.0.30001439", 1089 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", 1090 + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", 1091 + "dev": true, 1092 + "funding": [ 1093 + { 1094 + "type": "opencollective", 1095 + "url": "https://opencollective.com/browserslist" 1096 + }, 1097 + { 1098 + "type": "tidelift", 1099 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1100 + } 1101 + ] 1102 + }, 1103 + "node_modules/chalk": { 1104 + "version": "4.1.2", 1105 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1106 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1107 + "dev": true, 1108 + "dependencies": { 1109 + "ansi-styles": "^4.1.0", 1110 + "supports-color": "^7.1.0" 1111 + }, 1112 + "engines": { 1113 + "node": ">=10" 1114 + }, 1115 + "funding": { 1116 + "url": "https://github.com/chalk/chalk?sponsor=1" 1117 + } 1118 + }, 1119 + "node_modules/chokidar": { 1120 + "version": "3.5.3", 1121 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1122 + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1123 + "dev": true, 1124 + "funding": [ 1125 + { 1126 + "type": "individual", 1127 + "url": "https://paulmillr.com/funding/" 1128 + } 1129 + ], 1130 + "dependencies": { 1131 + "anymatch": "~3.1.2", 1132 + "braces": "~3.0.2", 1133 + "glob-parent": "~5.1.2", 1134 + "is-binary-path": "~2.1.0", 1135 + "is-glob": "~4.0.1", 1136 + "normalize-path": "~3.0.0", 1137 + "readdirp": "~3.6.0" 1138 + }, 1139 + "engines": { 1140 + "node": ">= 8.10.0" 1141 + }, 1142 + "optionalDependencies": { 1143 + "fsevents": "~2.3.2" 1144 + } 1145 + }, 1146 + "node_modules/cli-cursor": { 1147 + "version": "3.1.0", 1148 + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 1149 + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 1150 + "dev": true, 1151 + "dependencies": { 1152 + "restore-cursor": "^3.1.0" 1153 + }, 1154 + "engines": { 1155 + "node": ">=8" 1156 + } 1157 + }, 1158 + "node_modules/cli-spinners": { 1159 + "version": "2.7.0", 1160 + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", 1161 + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", 1162 + "dev": true, 1163 + "engines": { 1164 + "node": ">=6" 1165 + }, 1166 + "funding": { 1167 + "url": "https://github.com/sponsors/sindresorhus" 1168 + } 1169 + }, 1170 + "node_modules/clone": { 1171 + "version": "1.0.4", 1172 + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 1173 + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", 1174 + "dev": true, 1175 + "engines": { 1176 + "node": ">=0.8" 1177 + } 1178 + }, 1179 + "node_modules/clone-response": { 1180 + "version": "1.0.3", 1181 + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", 1182 + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", 1183 + "dev": true, 1184 + "dependencies": { 1185 + "mimic-response": "^1.0.0" 1186 + }, 1187 + "funding": { 1188 + "url": "https://github.com/sponsors/sindresorhus" 1189 + } 1190 + }, 1191 + "node_modules/color-convert": { 1192 + "version": "2.0.1", 1193 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1194 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1195 + "dev": true, 1196 + "dependencies": { 1197 + "color-name": "~1.1.4" 1198 + }, 1199 + "engines": { 1200 + "node": ">=7.0.0" 1201 + } 1202 + }, 1203 + "node_modules/color-name": { 1204 + "version": "1.1.4", 1205 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1206 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1207 + "dev": true 1208 + }, 1209 + "node_modules/concat-map": { 1210 + "version": "0.0.1", 1211 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1212 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1213 + "dev": true 1214 + }, 1215 + "node_modules/content-type": { 1216 + "version": "1.0.4", 1217 + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 1218 + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 1219 + "engines": { 1220 + "node": ">= 0.6" 1221 + } 1222 + }, 1223 + "node_modules/core-util-is": { 1224 + "version": "1.0.3", 1225 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 1226 + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 1227 + }, 1228 + "node_modules/cross-spawn": { 1229 + "version": "7.0.3", 1230 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1231 + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1232 + "dev": true, 1233 + "dependencies": { 1234 + "path-key": "^3.1.0", 1235 + "shebang-command": "^2.0.0", 1236 + "which": "^2.0.1" 1237 + }, 1238 + "engines": { 1239 + "node": ">= 8" 1240 + } 1241 + }, 1242 + "node_modules/cssesc": { 1243 + "version": "3.0.0", 1244 + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 1245 + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 1246 + "dev": true, 1247 + "bin": { 1248 + "cssesc": "bin/cssesc" 1249 + }, 1250 + "engines": { 1251 + "node": ">=4" 1252 + } 1253 + }, 1254 + "node_modules/debug": { 1255 + "version": "4.3.4", 1256 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1257 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1258 + "dependencies": { 1259 + "ms": "2.1.2" 1260 + }, 1261 + "engines": { 1262 + "node": ">=6.0" 1263 + }, 1264 + "peerDependenciesMeta": { 1265 + "supports-color": { 1266 + "optional": true 1267 + } 1268 + } 1269 + }, 1270 + "node_modules/decompress-response": { 1271 + "version": "6.0.0", 1272 + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 1273 + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 1274 + "dev": true, 1275 + "dependencies": { 1276 + "mimic-response": "^3.1.0" 1277 + }, 1278 + "engines": { 1279 + "node": ">=10" 1280 + }, 1281 + "funding": { 1282 + "url": "https://github.com/sponsors/sindresorhus" 1283 + } 1284 + }, 1285 + "node_modules/decompress-response/node_modules/mimic-response": { 1286 + "version": "3.1.0", 1287 + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 1288 + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 1289 + "dev": true, 1290 + "engines": { 1291 + "node": ">=10" 1292 + }, 1293 + "funding": { 1294 + "url": "https://github.com/sponsors/sindresorhus" 1295 + } 1296 + }, 1297 + "node_modules/deep-is": { 1298 + "version": "0.1.4", 1299 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1300 + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1301 + "dev": true 1302 + }, 1303 + "node_modules/defaults": { 1304 + "version": "1.0.4", 1305 + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", 1306 + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", 1307 + "dev": true, 1308 + "dependencies": { 1309 + "clone": "^1.0.2" 1310 + }, 1311 + "funding": { 1312 + "url": "https://github.com/sponsors/sindresorhus" 1313 + } 1314 + }, 1315 + "node_modules/defer-to-connect": { 1316 + "version": "2.0.1", 1317 + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", 1318 + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", 1319 + "dev": true, 1320 + "engines": { 1321 + "node": ">=10" 1322 + } 1323 + }, 1324 + "node_modules/define-properties": { 1325 + "version": "1.1.4", 1326 + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", 1327 + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", 1328 + "dev": true, 1329 + "dependencies": { 1330 + "has-property-descriptors": "^1.0.0", 1331 + "object-keys": "^1.1.1" 1332 + }, 1333 + "engines": { 1334 + "node": ">= 0.4" 1335 + }, 1336 + "funding": { 1337 + "url": "https://github.com/sponsors/ljharb" 1338 + } 1339 + }, 1340 + "node_modules/defined": { 1341 + "version": "1.0.1", 1342 + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 1343 + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 1344 + "dev": true, 1345 + "funding": { 1346 + "url": "https://github.com/sponsors/ljharb" 1347 + } 1348 + }, 1349 + "node_modules/delay": { 1350 + "version": "5.0.0", 1351 + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", 1352 + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", 1353 + "engines": { 1354 + "node": ">=10" 1355 + }, 1356 + "funding": { 1357 + "url": "https://github.com/sponsors/sindresorhus" 1358 + } 1359 + }, 1360 + "node_modules/detective": { 1361 + "version": "5.2.1", 1362 + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", 1363 + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", 1364 + "dev": true, 1365 + "dependencies": { 1366 + "acorn-node": "^1.8.2", 1367 + "defined": "^1.0.0", 1368 + "minimist": "^1.2.6" 1369 + }, 1370 + "bin": { 1371 + "detective": "bin/detective.js" 1372 + }, 1373 + "engines": { 1374 + "node": ">=0.8.0" 1375 + } 1376 + }, 1377 + "node_modules/didyoumean": { 1378 + "version": "1.2.2", 1379 + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 1380 + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 1381 + "dev": true 1382 + }, 1383 + "node_modules/dlv": { 1384 + "version": "1.1.3", 1385 + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 1386 + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 1387 + "dev": true 1388 + }, 1389 + "node_modules/doctrine": { 1390 + "version": "3.0.0", 1391 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1392 + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1393 + "dev": true, 1394 + "dependencies": { 1395 + "esutils": "^2.0.2" 1396 + }, 1397 + "engines": { 1398 + "node": ">=6.0.0" 1399 + } 1400 + }, 1401 + "node_modules/electron-to-chromium": { 1402 + "version": "1.4.284", 1403 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", 1404 + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", 1405 + "dev": true 1406 + }, 1407 + "node_modules/elm-review": { 1408 + "version": "2.8.5", 1409 + "resolved": "https://registry.npmjs.org/elm-review/-/elm-review-2.8.5.tgz", 1410 + "integrity": "sha512-e3HmCoBZPdcnwdyelnL02GVE1ZXOIjuP/fo4DvrQjxd5082b4lOUxzbh/pWeKdU9a1mtrHNYkWalEXPYeig3Kw==", 1411 + "dev": true, 1412 + "dependencies": { 1413 + "chalk": "^4.0.0", 1414 + "chokidar": "^3.5.2", 1415 + "cross-spawn": "^7.0.3", 1416 + "elm-tooling": "^1.6.0", 1417 + "fast-levenshtein": "^3.0.0", 1418 + "find-up": "^4.1.0", 1419 + "folder-hash": "^3.3.0", 1420 + "fs-extra": "^9.0.0", 1421 + "glob": "^7.1.4", 1422 + "got": "^11.8.5", 1423 + "minimist": "^1.2.6", 1424 + "ora": "^5.4.0", 1425 + "path-key": "^3.1.1", 1426 + "prompts": "^2.2.1", 1427 + "strip-ansi": "^6.0.0", 1428 + "temp": "^0.9.1", 1429 + "terminal-link": "^2.1.1", 1430 + "which": "^2.0.2", 1431 + "wrap-ansi": "^6.2.0" 1432 + }, 1433 + "bin": { 1434 + "elm-review": "bin/elm-review" 1435 + }, 1436 + "engines": { 1437 + "node": ">=10.0.0" 1438 + }, 1439 + "funding": { 1440 + "url": "https://github.com/sponsors/jfmengels" 1441 + } 1442 + }, 1443 + "node_modules/elm-taskport": { 1444 + "version": "2.0.1", 1445 + "resolved": "https://registry.npmjs.org/elm-taskport/-/elm-taskport-2.0.1.tgz", 1446 + "integrity": "sha512-8UgIjzmGuoU6Wt6VC0tkJnzvc5xHL5yH7GdN+/QNxaaA3ckoyveCtV0QJqNCRa42bpyR1JhOwLSApwf2Id5xZg==" 1447 + }, 1448 + "node_modules/elm-tooling": { 1449 + "version": "1.10.0", 1450 + "resolved": "https://registry.npmjs.org/elm-tooling/-/elm-tooling-1.10.0.tgz", 1451 + "integrity": "sha512-fMLXs7xHpr6LodtmvVJKepYC6chgSOfe5Hgv8GcFO+Id7O/CuT9+CAfrlzYxvBn91cm6ekWwHFDjPD765v5iBA==", 1452 + "dev": true, 1453 + "bin": { 1454 + "elm-tooling": "index.js" 1455 + } 1456 + }, 1457 + "node_modules/emoji-regex": { 1458 + "version": "8.0.0", 1459 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1460 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1461 + "dev": true 1462 + }, 1463 + "node_modules/end-of-stream": { 1464 + "version": "1.4.4", 1465 + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1466 + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1467 + "dev": true, 1468 + "dependencies": { 1469 + "once": "^1.4.0" 1470 + } 1471 + }, 1472 + "node_modules/es6-object-assign": { 1473 + "version": "1.1.0", 1474 + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", 1475 + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", 1476 + "dev": true 1477 + }, 1478 + "node_modules/esbuild": { 1479 + "version": "0.16.4", 1480 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.4.tgz", 1481 + "integrity": "sha512-qQrPMQpPTWf8jHugLWHoGqZjApyx3OEm76dlTXobHwh/EBbavbRdjXdYi/GWr43GyN0sfpap14GPkb05NH3ROA==", 1482 + "dev": true, 1483 + "hasInstallScript": true, 1484 + "bin": { 1485 + "esbuild": "bin/esbuild" 1486 + }, 1487 + "engines": { 1488 + "node": ">=12" 1489 + }, 1490 + "optionalDependencies": { 1491 + "@esbuild/android-arm": "0.16.4", 1492 + "@esbuild/android-arm64": "0.16.4", 1493 + "@esbuild/android-x64": "0.16.4", 1494 + "@esbuild/darwin-arm64": "0.16.4", 1495 + "@esbuild/darwin-x64": "0.16.4", 1496 + "@esbuild/freebsd-arm64": "0.16.4", 1497 + "@esbuild/freebsd-x64": "0.16.4", 1498 + "@esbuild/linux-arm": "0.16.4", 1499 + "@esbuild/linux-arm64": "0.16.4", 1500 + "@esbuild/linux-ia32": "0.16.4", 1501 + "@esbuild/linux-loong64": "0.16.4", 1502 + "@esbuild/linux-mips64el": "0.16.4", 1503 + "@esbuild/linux-ppc64": "0.16.4", 1504 + "@esbuild/linux-riscv64": "0.16.4", 1505 + "@esbuild/linux-s390x": "0.16.4", 1506 + "@esbuild/linux-x64": "0.16.4", 1507 + "@esbuild/netbsd-x64": "0.16.4", 1508 + "@esbuild/openbsd-x64": "0.16.4", 1509 + "@esbuild/sunos-x64": "0.16.4", 1510 + "@esbuild/win32-arm64": "0.16.4", 1511 + "@esbuild/win32-ia32": "0.16.4", 1512 + "@esbuild/win32-x64": "0.16.4" 1513 + } 1514 + }, 1515 + "node_modules/escalade": { 1516 + "version": "3.1.1", 1517 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1518 + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1519 + "dev": true, 1520 + "engines": { 1521 + "node": ">=6" 1522 + } 1523 + }, 1524 + "node_modules/escape-string-regexp": { 1525 + "version": "4.0.0", 1526 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1527 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1528 + "dev": true, 1529 + "engines": { 1530 + "node": ">=10" 1531 + }, 1532 + "funding": { 1533 + "url": "https://github.com/sponsors/sindresorhus" 1534 + } 1535 + }, 1536 + "node_modules/eslint": { 1537 + "version": "8.29.0", 1538 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", 1539 + "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", 1540 + "dev": true, 1541 + "dependencies": { 1542 + "@eslint/eslintrc": "^1.3.3", 1543 + "@humanwhocodes/config-array": "^0.11.6", 1544 + "@humanwhocodes/module-importer": "^1.0.1", 1545 + "@nodelib/fs.walk": "^1.2.8", 1546 + "ajv": "^6.10.0", 1547 + "chalk": "^4.0.0", 1548 + "cross-spawn": "^7.0.2", 1549 + "debug": "^4.3.2", 1550 + "doctrine": "^3.0.0", 1551 + "escape-string-regexp": "^4.0.0", 1552 + "eslint-scope": "^7.1.1", 1553 + "eslint-utils": "^3.0.0", 1554 + "eslint-visitor-keys": "^3.3.0", 1555 + "espree": "^9.4.0", 1556 + "esquery": "^1.4.0", 1557 + "esutils": "^2.0.2", 1558 + "fast-deep-equal": "^3.1.3", 1559 + "file-entry-cache": "^6.0.1", 1560 + "find-up": "^5.0.0", 1561 + "glob-parent": "^6.0.2", 1562 + "globals": "^13.15.0", 1563 + "grapheme-splitter": "^1.0.4", 1564 + "ignore": "^5.2.0", 1565 + "import-fresh": "^3.0.0", 1566 + "imurmurhash": "^0.1.4", 1567 + "is-glob": "^4.0.0", 1568 + "is-path-inside": "^3.0.3", 1569 + "js-sdsl": "^4.1.4", 1570 + "js-yaml": "^4.1.0", 1571 + "json-stable-stringify-without-jsonify": "^1.0.1", 1572 + "levn": "^0.4.1", 1573 + "lodash.merge": "^4.6.2", 1574 + "minimatch": "^3.1.2", 1575 + "natural-compare": "^1.4.0", 1576 + "optionator": "^0.9.1", 1577 + "regexpp": "^3.2.0", 1578 + "strip-ansi": "^6.0.1", 1579 + "strip-json-comments": "^3.1.0", 1580 + "text-table": "^0.2.0" 1581 + }, 1582 + "bin": { 1583 + "eslint": "bin/eslint.js" 1584 + }, 1585 + "engines": { 1586 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1587 + }, 1588 + "funding": { 1589 + "url": "https://opencollective.com/eslint" 1590 + } 1591 + }, 1592 + "node_modules/eslint-scope": { 1593 + "version": "7.1.1", 1594 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 1595 + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 1596 + "dev": true, 1597 + "dependencies": { 1598 + "esrecurse": "^4.3.0", 1599 + "estraverse": "^5.2.0" 1600 + }, 1601 + "engines": { 1602 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1603 + } 1604 + }, 1605 + "node_modules/eslint-utils": { 1606 + "version": "3.0.0", 1607 + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 1608 + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 1609 + "dev": true, 1610 + "dependencies": { 1611 + "eslint-visitor-keys": "^2.0.0" 1612 + }, 1613 + "engines": { 1614 + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 1615 + }, 1616 + "funding": { 1617 + "url": "https://github.com/sponsors/mysticatea" 1618 + }, 1619 + "peerDependencies": { 1620 + "eslint": ">=5" 1621 + } 1622 + }, 1623 + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 1624 + "version": "2.1.0", 1625 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 1626 + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 1627 + "dev": true, 1628 + "engines": { 1629 + "node": ">=10" 1630 + } 1631 + }, 1632 + "node_modules/eslint-visitor-keys": { 1633 + "version": "3.3.0", 1634 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 1635 + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 1636 + "dev": true, 1637 + "engines": { 1638 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1639 + } 1640 + }, 1641 + "node_modules/eslint/node_modules/find-up": { 1642 + "version": "5.0.0", 1643 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1644 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1645 + "dev": true, 1646 + "dependencies": { 1647 + "locate-path": "^6.0.0", 1648 + "path-exists": "^4.0.0" 1649 + }, 1650 + "engines": { 1651 + "node": ">=10" 1652 + }, 1653 + "funding": { 1654 + "url": "https://github.com/sponsors/sindresorhus" 1655 + } 1656 + }, 1657 + "node_modules/eslint/node_modules/glob-parent": { 1658 + "version": "6.0.2", 1659 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1660 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1661 + "dev": true, 1662 + "dependencies": { 1663 + "is-glob": "^4.0.3" 1664 + }, 1665 + "engines": { 1666 + "node": ">=10.13.0" 1667 + } 1668 + }, 1669 + "node_modules/eslint/node_modules/locate-path": { 1670 + "version": "6.0.0", 1671 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1672 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1673 + "dev": true, 1674 + "dependencies": { 1675 + "p-locate": "^5.0.0" 1676 + }, 1677 + "engines": { 1678 + "node": ">=10" 1679 + }, 1680 + "funding": { 1681 + "url": "https://github.com/sponsors/sindresorhus" 1682 + } 1683 + }, 1684 + "node_modules/eslint/node_modules/p-limit": { 1685 + "version": "3.1.0", 1686 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1687 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1688 + "dev": true, 1689 + "dependencies": { 1690 + "yocto-queue": "^0.1.0" 1691 + }, 1692 + "engines": { 1693 + "node": ">=10" 1694 + }, 1695 + "funding": { 1696 + "url": "https://github.com/sponsors/sindresorhus" 1697 + } 1698 + }, 1699 + "node_modules/eslint/node_modules/p-locate": { 1700 + "version": "5.0.0", 1701 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1702 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1703 + "dev": true, 1704 + "dependencies": { 1705 + "p-limit": "^3.0.2" 1706 + }, 1707 + "engines": { 1708 + "node": ">=10" 1709 + }, 1710 + "funding": { 1711 + "url": "https://github.com/sponsors/sindresorhus" 1712 + } 1713 + }, 1714 + "node_modules/espree": { 1715 + "version": "9.4.1", 1716 + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", 1717 + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", 1718 + "dev": true, 1719 + "dependencies": { 1720 + "acorn": "^8.8.0", 1721 + "acorn-jsx": "^5.3.2", 1722 + "eslint-visitor-keys": "^3.3.0" 1723 + }, 1724 + "engines": { 1725 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1726 + }, 1727 + "funding": { 1728 + "url": "https://opencollective.com/eslint" 1729 + } 1730 + }, 1731 + "node_modules/esquery": { 1732 + "version": "1.4.0", 1733 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 1734 + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 1735 + "dev": true, 1736 + "dependencies": { 1737 + "estraverse": "^5.1.0" 1738 + }, 1739 + "engines": { 1740 + "node": ">=0.10" 1741 + } 1742 + }, 1743 + "node_modules/esrecurse": { 1744 + "version": "4.3.0", 1745 + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1746 + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1747 + "dev": true, 1748 + "dependencies": { 1749 + "estraverse": "^5.2.0" 1750 + }, 1751 + "engines": { 1752 + "node": ">=4.0" 1753 + } 1754 + }, 1755 + "node_modules/estraverse": { 1756 + "version": "5.3.0", 1757 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1758 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1759 + "dev": true, 1760 + "engines": { 1761 + "node": ">=4.0" 1762 + } 1763 + }, 1764 + "node_modules/esutils": { 1765 + "version": "2.0.3", 1766 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1767 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1768 + "dev": true, 1769 + "engines": { 1770 + "node": ">=0.10.0" 1771 + } 1772 + }, 1773 + "node_modules/event-target-shim": { 1774 + "version": "5.0.1", 1775 + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 1776 + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 1777 + "engines": { 1778 + "node": ">=6" 1779 + } 1780 + }, 1781 + "node_modules/events": { 1782 + "version": "3.3.0", 1783 + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1784 + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 1785 + "engines": { 1786 + "node": ">=0.8.x" 1787 + } 1788 + }, 1789 + "node_modules/fast-deep-equal": { 1790 + "version": "3.1.3", 1791 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1792 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1793 + "dev": true 1794 + }, 1795 + "node_modules/fast-glob": { 1796 + "version": "3.2.12", 1797 + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 1798 + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 1799 + "dev": true, 1800 + "dependencies": { 1801 + "@nodelib/fs.stat": "^2.0.2", 1802 + "@nodelib/fs.walk": "^1.2.3", 1803 + "glob-parent": "^5.1.2", 1804 + "merge2": "^1.3.0", 1805 + "micromatch": "^4.0.4" 1806 + }, 1807 + "engines": { 1808 + "node": ">=8.6.0" 1809 + } 1810 + }, 1811 + "node_modules/fast-json-stable-stringify": { 1812 + "version": "2.1.0", 1813 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1814 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1815 + "dev": true 1816 + }, 1817 + "node_modules/fast-levenshtein": { 1818 + "version": "3.0.0", 1819 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", 1820 + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", 1821 + "dev": true, 1822 + "dependencies": { 1823 + "fastest-levenshtein": "^1.0.7" 1824 + } 1825 + }, 1826 + "node_modules/fast-text-encoding": { 1827 + "version": "1.0.6", 1828 + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", 1829 + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" 1830 + }, 1831 + "node_modules/fastest-levenshtein": { 1832 + "version": "1.0.16", 1833 + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", 1834 + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", 1835 + "dev": true, 1836 + "engines": { 1837 + "node": ">= 4.9.1" 1838 + } 1839 + }, 1840 + "node_modules/fastq": { 1841 + "version": "1.14.0", 1842 + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", 1843 + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", 1844 + "dev": true, 1845 + "dependencies": { 1846 + "reusify": "^1.0.4" 1847 + } 1848 + }, 1849 + "node_modules/file-entry-cache": { 1850 + "version": "6.0.1", 1851 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1852 + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1853 + "dev": true, 1854 + "dependencies": { 1855 + "flat-cache": "^3.0.4" 1856 + }, 1857 + "engines": { 1858 + "node": "^10.12.0 || >=12.0.0" 1859 + } 1860 + }, 1861 + "node_modules/file-saver": { 1862 + "version": "2.0.5", 1863 + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", 1864 + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" 1865 + }, 1866 + "node_modules/file-type": { 1867 + "version": "16.5.4", 1868 + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", 1869 + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", 1870 + "dependencies": { 1871 + "readable-web-to-node-stream": "^3.0.0", 1872 + "strtok3": "^6.2.4", 1873 + "token-types": "^4.1.1" 1874 + }, 1875 + "engines": { 1876 + "node": ">=10" 1877 + }, 1878 + "funding": { 1879 + "url": "https://github.com/sindresorhus/file-type?sponsor=1" 1880 + } 1881 + }, 1882 + "node_modules/fill-range": { 1883 + "version": "7.0.1", 1884 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1885 + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1886 + "dev": true, 1887 + "dependencies": { 1888 + "to-regex-range": "^5.0.1" 1889 + }, 1890 + "engines": { 1891 + "node": ">=8" 1892 + } 1893 + }, 1894 + "node_modules/find-up": { 1895 + "version": "4.1.0", 1896 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1897 + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1898 + "dev": true, 1899 + "dependencies": { 1900 + "locate-path": "^5.0.0", 1901 + "path-exists": "^4.0.0" 1902 + }, 1903 + "engines": { 1904 + "node": ">=8" 1905 + } 1906 + }, 1907 + "node_modules/flat-cache": { 1908 + "version": "3.0.4", 1909 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1910 + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1911 + "dev": true, 1912 + "dependencies": { 1913 + "flatted": "^3.1.0", 1914 + "rimraf": "^3.0.2" 1915 + }, 1916 + "engines": { 1917 + "node": "^10.12.0 || >=12.0.0" 1918 + } 1919 + }, 1920 + "node_modules/flatted": { 1921 + "version": "3.2.7", 1922 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 1923 + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 1924 + "dev": true 1925 + }, 1926 + "node_modules/folder-hash": { 1927 + "version": "3.3.3", 1928 + "resolved": "https://registry.npmjs.org/folder-hash/-/folder-hash-3.3.3.tgz", 1929 + "integrity": "sha512-SDgHBgV+RCjrYs8aUwCb9rTgbTVuSdzvFmLaChsLre1yf+D64khCW++VYciaByZ8Rm0uKF8R/XEpXuTRSGUM1A==", 1930 + "dev": true, 1931 + "dependencies": { 1932 + "debug": "^4.1.1", 1933 + "graceful-fs": "~4.2.0", 1934 + "minimatch": "~3.0.4" 1935 + }, 1936 + "bin": { 1937 + "folder-hash": "bin/folder-hash" 1938 + }, 1939 + "engines": { 1940 + "node": ">=6.0.0" 1941 + } 1942 + }, 1943 + "node_modules/folder-hash/node_modules/minimatch": { 1944 + "version": "3.0.8", 1945 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", 1946 + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", 1947 + "dev": true, 1948 + "dependencies": { 1949 + "brace-expansion": "^1.1.7" 1950 + }, 1951 + "engines": { 1952 + "node": "*" 1953 + } 1954 + }, 1955 + "node_modules/for-each": { 1956 + "version": "0.3.3", 1957 + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 1958 + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 1959 + "dev": true, 1960 + "dependencies": { 1961 + "is-callable": "^1.1.3" 1962 + } 1963 + }, 1964 + "node_modules/fraction.js": { 1965 + "version": "4.2.0", 1966 + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 1967 + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", 1968 + "dev": true, 1969 + "engines": { 1970 + "node": "*" 1971 + }, 1972 + "funding": { 1973 + "type": "patreon", 1974 + "url": "https://www.patreon.com/infusion" 1975 + } 1976 + }, 1977 + "node_modules/fs-extra": { 1978 + "version": "9.1.0", 1979 + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", 1980 + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", 1981 + "dev": true, 1982 + "dependencies": { 1983 + "at-least-node": "^1.0.0", 1984 + "graceful-fs": "^4.2.0", 1985 + "jsonfile": "^6.0.1", 1986 + "universalify": "^2.0.0" 1987 + }, 1988 + "engines": { 1989 + "node": ">=10" 1990 + } 1991 + }, 1992 + "node_modules/fs.realpath": { 1993 + "version": "1.0.0", 1994 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1995 + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1996 + "dev": true 1997 + }, 1998 + "node_modules/fsevents": { 1999 + "version": "2.3.2", 2000 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2001 + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2002 + "dev": true, 2003 + "hasInstallScript": true, 2004 + "optional": true, 2005 + "os": [ 2006 + "darwin" 2007 + ], 2008 + "engines": { 2009 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2010 + } 2011 + }, 2012 + "node_modules/function-bind": { 2013 + "version": "1.1.1", 2014 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2015 + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 2016 + "dev": true 2017 + }, 2018 + "node_modules/get-intrinsic": { 2019 + "version": "1.1.3", 2020 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 2021 + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 2022 + "dev": true, 2023 + "dependencies": { 2024 + "function-bind": "^1.1.1", 2025 + "has": "^1.0.3", 2026 + "has-symbols": "^1.0.3" 2027 + }, 2028 + "funding": { 2029 + "url": "https://github.com/sponsors/ljharb" 2030 + } 2031 + }, 2032 + "node_modules/get-stream": { 2033 + "version": "5.2.0", 2034 + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 2035 + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 2036 + "dev": true, 2037 + "dependencies": { 2038 + "pump": "^3.0.0" 2039 + }, 2040 + "engines": { 2041 + "node": ">=8" 2042 + }, 2043 + "funding": { 2044 + "url": "https://github.com/sponsors/sindresorhus" 2045 + } 2046 + }, 2047 + "node_modules/glob": { 2048 + "version": "7.2.3", 2049 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2050 + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2051 + "dev": true, 2052 + "dependencies": { 2053 + "fs.realpath": "^1.0.0", 2054 + "inflight": "^1.0.4", 2055 + "inherits": "2", 2056 + "minimatch": "^3.1.1", 2057 + "once": "^1.3.0", 2058 + "path-is-absolute": "^1.0.0" 2059 + }, 2060 + "engines": { 2061 + "node": "*" 2062 + }, 2063 + "funding": { 2064 + "url": "https://github.com/sponsors/isaacs" 2065 + } 2066 + }, 2067 + "node_modules/glob-parent": { 2068 + "version": "5.1.2", 2069 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2070 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2071 + "dev": true, 2072 + "dependencies": { 2073 + "is-glob": "^4.0.1" 2074 + }, 2075 + "engines": { 2076 + "node": ">= 6" 2077 + } 2078 + }, 2079 + "node_modules/globals": { 2080 + "version": "13.18.0", 2081 + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", 2082 + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", 2083 + "dev": true, 2084 + "dependencies": { 2085 + "type-fest": "^0.20.2" 2086 + }, 2087 + "engines": { 2088 + "node": ">=8" 2089 + }, 2090 + "funding": { 2091 + "url": "https://github.com/sponsors/sindresorhus" 2092 + } 2093 + }, 2094 + "node_modules/gopd": { 2095 + "version": "1.0.1", 2096 + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 2097 + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 2098 + "dev": true, 2099 + "dependencies": { 2100 + "get-intrinsic": "^1.1.3" 2101 + }, 2102 + "funding": { 2103 + "url": "https://github.com/sponsors/ljharb" 2104 + } 2105 + }, 2106 + "node_modules/got": { 2107 + "version": "11.8.6", 2108 + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", 2109 + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", 2110 + "dev": true, 2111 + "dependencies": { 2112 + "@sindresorhus/is": "^4.0.0", 2113 + "@szmarczak/http-timer": "^4.0.5", 2114 + "@types/cacheable-request": "^6.0.1", 2115 + "@types/responselike": "^1.0.0", 2116 + "cacheable-lookup": "^5.0.3", 2117 + "cacheable-request": "^7.0.2", 2118 + "decompress-response": "^6.0.0", 2119 + "http2-wrapper": "^1.0.0-beta.5.2", 2120 + "lowercase-keys": "^2.0.0", 2121 + "p-cancelable": "^2.0.0", 2122 + "responselike": "^2.0.0" 2123 + }, 2124 + "engines": { 2125 + "node": ">=10.19.0" 2126 + }, 2127 + "funding": { 2128 + "url": "https://github.com/sindresorhus/got?sponsor=1" 2129 + } 2130 + }, 2131 + "node_modules/graceful-fs": { 2132 + "version": "4.2.10", 2133 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 2134 + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 2135 + "dev": true 2136 + }, 2137 + "node_modules/grapheme-splitter": { 2138 + "version": "1.0.4", 2139 + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 2140 + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 2141 + "dev": true 2142 + }, 2143 + "node_modules/has": { 2144 + "version": "1.0.3", 2145 + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2146 + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2147 + "dev": true, 2148 + "dependencies": { 2149 + "function-bind": "^1.1.1" 2150 + }, 2151 + "engines": { 2152 + "node": ">= 0.4.0" 2153 + } 2154 + }, 2155 + "node_modules/has-flag": { 2156 + "version": "4.0.0", 2157 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2158 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2159 + "dev": true, 2160 + "engines": { 2161 + "node": ">=8" 2162 + } 2163 + }, 2164 + "node_modules/has-property-descriptors": { 2165 + "version": "1.0.0", 2166 + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 2167 + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 2168 + "dev": true, 2169 + "dependencies": { 2170 + "get-intrinsic": "^1.1.1" 2171 + }, 2172 + "funding": { 2173 + "url": "https://github.com/sponsors/ljharb" 2174 + } 2175 + }, 2176 + "node_modules/has-symbols": { 2177 + "version": "1.0.3", 2178 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 2179 + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 2180 + "dev": true, 2181 + "engines": { 2182 + "node": ">= 0.4" 2183 + }, 2184 + "funding": { 2185 + "url": "https://github.com/sponsors/ljharb" 2186 + } 2187 + }, 2188 + "node_modules/has-tostringtag": { 2189 + "version": "1.0.0", 2190 + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 2191 + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 2192 + "dev": true, 2193 + "dependencies": { 2194 + "has-symbols": "^1.0.2" 2195 + }, 2196 + "engines": { 2197 + "node": ">= 0.4" 2198 + }, 2199 + "funding": { 2200 + "url": "https://github.com/sponsors/ljharb" 2201 + } 2202 + }, 2203 + "node_modules/http-cache-semantics": { 2204 + "version": "4.1.0", 2205 + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 2206 + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", 2207 + "dev": true 2208 + }, 2209 + "node_modules/http2-wrapper": { 2210 + "version": "1.0.3", 2211 + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", 2212 + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", 2213 + "dev": true, 2214 + "dependencies": { 2215 + "quick-lru": "^5.1.1", 2216 + "resolve-alpn": "^1.0.0" 2217 + }, 2218 + "engines": { 2219 + "node": ">=10.19.0" 2220 + } 2221 + }, 2222 + "node_modules/ieee754": { 2223 + "version": "1.2.1", 2224 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 2225 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 2226 + "funding": [ 2227 + { 2228 + "type": "github", 2229 + "url": "https://github.com/sponsors/feross" 2230 + }, 2231 + { 2232 + "type": "patreon", 2233 + "url": "https://www.patreon.com/feross" 2234 + }, 2235 + { 2236 + "type": "consulting", 2237 + "url": "https://feross.org/support" 2238 + } 2239 + ] 2240 + }, 2241 + "node_modules/ignore": { 2242 + "version": "5.2.1", 2243 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", 2244 + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", 2245 + "dev": true, 2246 + "engines": { 2247 + "node": ">= 4" 2248 + } 2249 + }, 2250 + "node_modules/immediate": { 2251 + "version": "3.0.6", 2252 + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 2253 + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" 2254 + }, 2255 + "node_modules/import-fresh": { 2256 + "version": "3.3.0", 2257 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 2258 + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 2259 + "dev": true, 2260 + "dependencies": { 2261 + "parent-module": "^1.0.0", 2262 + "resolve-from": "^4.0.0" 2263 + }, 2264 + "engines": { 2265 + "node": ">=6" 2266 + }, 2267 + "funding": { 2268 + "url": "https://github.com/sponsors/sindresorhus" 2269 + } 2270 + }, 2271 + "node_modules/imurmurhash": { 2272 + "version": "0.1.4", 2273 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2274 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 2275 + "dev": true, 2276 + "engines": { 2277 + "node": ">=0.8.19" 2278 + } 2279 + }, 2280 + "node_modules/inflight": { 2281 + "version": "1.0.6", 2282 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2283 + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 2284 + "dev": true, 2285 + "dependencies": { 2286 + "once": "^1.3.0", 2287 + "wrappy": "1" 2288 + } 2289 + }, 2290 + "node_modules/inherits": { 2291 + "version": "2.0.4", 2292 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2293 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 2294 + }, 2295 + "node_modules/is-arguments": { 2296 + "version": "1.1.1", 2297 + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 2298 + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 2299 + "dev": true, 2300 + "dependencies": { 2301 + "call-bind": "^1.0.2", 2302 + "has-tostringtag": "^1.0.0" 2303 + }, 2304 + "engines": { 2305 + "node": ">= 0.4" 2306 + }, 2307 + "funding": { 2308 + "url": "https://github.com/sponsors/ljharb" 2309 + } 2310 + }, 2311 + "node_modules/is-binary-path": { 2312 + "version": "2.1.0", 2313 + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2314 + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2315 + "dev": true, 2316 + "dependencies": { 2317 + "binary-extensions": "^2.0.0" 2318 + }, 2319 + "engines": { 2320 + "node": ">=8" 2321 + } 2322 + }, 2323 + "node_modules/is-callable": { 2324 + "version": "1.2.7", 2325 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 2326 + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 2327 + "dev": true, 2328 + "engines": { 2329 + "node": ">= 0.4" 2330 + }, 2331 + "funding": { 2332 + "url": "https://github.com/sponsors/ljharb" 2333 + } 2334 + }, 2335 + "node_modules/is-core-module": { 2336 + "version": "2.11.0", 2337 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 2338 + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 2339 + "dev": true, 2340 + "dependencies": { 2341 + "has": "^1.0.3" 2342 + }, 2343 + "funding": { 2344 + "url": "https://github.com/sponsors/ljharb" 2345 + } 2346 + }, 2347 + "node_modules/is-extglob": { 2348 + "version": "2.1.1", 2349 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2350 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2351 + "dev": true, 2352 + "engines": { 2353 + "node": ">=0.10.0" 2354 + } 2355 + }, 2356 + "node_modules/is-fullwidth-code-point": { 2357 + "version": "3.0.0", 2358 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2359 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2360 + "dev": true, 2361 + "engines": { 2362 + "node": ">=8" 2363 + } 2364 + }, 2365 + "node_modules/is-generator-function": { 2366 + "version": "1.0.10", 2367 + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", 2368 + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", 2369 + "dev": true, 2370 + "dependencies": { 2371 + "has-tostringtag": "^1.0.0" 2372 + }, 2373 + "engines": { 2374 + "node": ">= 0.4" 2375 + }, 2376 + "funding": { 2377 + "url": "https://github.com/sponsors/ljharb" 2378 + } 2379 + }, 2380 + "node_modules/is-glob": { 2381 + "version": "4.0.3", 2382 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2383 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2384 + "dev": true, 2385 + "dependencies": { 2386 + "is-extglob": "^2.1.1" 2387 + }, 2388 + "engines": { 2389 + "node": ">=0.10.0" 2390 + } 2391 + }, 2392 + "node_modules/is-interactive": { 2393 + "version": "1.0.0", 2394 + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", 2395 + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", 2396 + "dev": true, 2397 + "engines": { 2398 + "node": ">=8" 2399 + } 2400 + }, 2401 + "node_modules/is-nan": { 2402 + "version": "1.3.2", 2403 + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", 2404 + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", 2405 + "dev": true, 2406 + "dependencies": { 2407 + "call-bind": "^1.0.0", 2408 + "define-properties": "^1.1.3" 2409 + }, 2410 + "engines": { 2411 + "node": ">= 0.4" 2412 + }, 2413 + "funding": { 2414 + "url": "https://github.com/sponsors/ljharb" 2415 + } 2416 + }, 2417 + "node_modules/is-number": { 2418 + "version": "7.0.0", 2419 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2420 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2421 + "dev": true, 2422 + "engines": { 2423 + "node": ">=0.12.0" 2424 + } 2425 + }, 2426 + "node_modules/is-path-inside": { 2427 + "version": "3.0.3", 2428 + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 2429 + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 2430 + "dev": true, 2431 + "engines": { 2432 + "node": ">=8" 2433 + } 2434 + }, 2435 + "node_modules/is-typed-array": { 2436 + "version": "1.1.10", 2437 + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", 2438 + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", 2439 + "dev": true, 2440 + "dependencies": { 2441 + "available-typed-arrays": "^1.0.5", 2442 + "call-bind": "^1.0.2", 2443 + "for-each": "^0.3.3", 2444 + "gopd": "^1.0.1", 2445 + "has-tostringtag": "^1.0.0" 2446 + }, 2447 + "engines": { 2448 + "node": ">= 0.4" 2449 + }, 2450 + "funding": { 2451 + "url": "https://github.com/sponsors/ljharb" 2452 + } 2453 + }, 2454 + "node_modules/is-unicode-supported": { 2455 + "version": "0.1.0", 2456 + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 2457 + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 2458 + "dev": true, 2459 + "engines": { 2460 + "node": ">=10" 2461 + }, 2462 + "funding": { 2463 + "url": "https://github.com/sponsors/sindresorhus" 2464 + } 2465 + }, 2466 + "node_modules/isarray": { 2467 + "version": "1.0.0", 2468 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2469 + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 2470 + }, 2471 + "node_modules/isexe": { 2472 + "version": "2.0.0", 2473 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2474 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2475 + "dev": true 2476 + }, 2477 + "node_modules/js-sdsl": { 2478 + "version": "4.2.0", 2479 + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", 2480 + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", 2481 + "dev": true, 2482 + "funding": { 2483 + "type": "opencollective", 2484 + "url": "https://opencollective.com/js-sdsl" 2485 + } 2486 + }, 2487 + "node_modules/js-yaml": { 2488 + "version": "4.1.0", 2489 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2490 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2491 + "dev": true, 2492 + "dependencies": { 2493 + "argparse": "^2.0.1" 2494 + }, 2495 + "bin": { 2496 + "js-yaml": "bin/js-yaml.js" 2497 + } 2498 + }, 2499 + "node_modules/json-buffer": { 2500 + "version": "3.0.1", 2501 + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 2502 + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 2503 + "dev": true 2504 + }, 2505 + "node_modules/json-schema-traverse": { 2506 + "version": "0.4.1", 2507 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2508 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2509 + "dev": true 2510 + }, 2511 + "node_modules/json-stable-stringify-without-jsonify": { 2512 + "version": "1.0.1", 2513 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2514 + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2515 + "dev": true 2516 + }, 2517 + "node_modules/jsonfile": { 2518 + "version": "6.1.0", 2519 + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 2520 + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 2521 + "dev": true, 2522 + "dependencies": { 2523 + "universalify": "^2.0.0" 2524 + }, 2525 + "optionalDependencies": { 2526 + "graceful-fs": "^4.1.6" 2527 + } 2528 + }, 2529 + "node_modules/jszip": { 2530 + "version": "3.10.1", 2531 + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", 2532 + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", 2533 + "dependencies": { 2534 + "lie": "~3.3.0", 2535 + "pako": "~1.0.2", 2536 + "readable-stream": "~2.3.6", 2537 + "setimmediate": "^1.0.5" 2538 + } 2539 + }, 2540 + "node_modules/keyv": { 2541 + "version": "4.5.2", 2542 + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", 2543 + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", 2544 + "dev": true, 2545 + "dependencies": { 2546 + "json-buffer": "3.0.1" 2547 + } 2548 + }, 2549 + "node_modules/kleur": { 2550 + "version": "3.0.3", 2551 + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 2552 + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", 2553 + "dev": true, 2554 + "engines": { 2555 + "node": ">=6" 2556 + } 2557 + }, 2558 + "node_modules/levn": { 2559 + "version": "0.4.1", 2560 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2561 + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2562 + "dev": true, 2563 + "dependencies": { 2564 + "prelude-ls": "^1.2.1", 2565 + "type-check": "~0.4.0" 2566 + }, 2567 + "engines": { 2568 + "node": ">= 0.8.0" 2569 + } 2570 + }, 2571 + "node_modules/lie": { 2572 + "version": "3.3.0", 2573 + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 2574 + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 2575 + "dependencies": { 2576 + "immediate": "~3.0.5" 2577 + } 2578 + }, 2579 + "node_modules/lilconfig": { 2580 + "version": "2.0.6", 2581 + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", 2582 + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", 2583 + "dev": true, 2584 + "engines": { 2585 + "node": ">=10" 2586 + } 2587 + }, 2588 + "node_modules/load-script2": { 2589 + "version": "2.0.6", 2590 + "resolved": "https://registry.npmjs.org/load-script2/-/load-script2-2.0.6.tgz", 2591 + "integrity": "sha512-pyuw/AR+ycZkRKgkMyXOIf/o2OnRQPc9grjZ04wVOeoJ7SqX97WlcZahl+3/r5qi09L/5d0iCVZ0q4OqNT/v0Q==", 2592 + "funding": [ 2593 + { 2594 + "type": "github", 2595 + "url": "https://github.com/sponsors/feross" 2596 + }, 2597 + { 2598 + "type": "patreon", 2599 + "url": "https://www.patreon.com/feross" 2600 + }, 2601 + { 2602 + "type": "consulting", 2603 + "url": "https://feross.org/support" 2604 + } 2605 + ] 2606 + }, 2607 + "node_modules/locate-path": { 2608 + "version": "5.0.0", 2609 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2610 + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2611 + "dev": true, 2612 + "dependencies": { 2613 + "p-locate": "^4.1.0" 2614 + }, 2615 + "engines": { 2616 + "node": ">=8" 2617 + } 2618 + }, 2619 + "node_modules/lodash": { 2620 + "version": "4.17.21", 2621 + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2622 + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2623 + "dev": true 2624 + }, 2625 + "node_modules/lodash.merge": { 2626 + "version": "4.6.2", 2627 + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2628 + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2629 + "dev": true 2630 + }, 2631 + "node_modules/log-symbols": { 2632 + "version": "4.1.0", 2633 + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 2634 + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 2635 + "dev": true, 2636 + "dependencies": { 2637 + "chalk": "^4.1.0", 2638 + "is-unicode-supported": "^0.1.0" 2639 + }, 2640 + "engines": { 2641 + "node": ">=10" 2642 + }, 2643 + "funding": { 2644 + "url": "https://github.com/sponsors/sindresorhus" 2645 + } 2646 + }, 2647 + "node_modules/lowercase-keys": { 2648 + "version": "2.0.0", 2649 + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 2650 + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", 2651 + "dev": true, 2652 + "engines": { 2653 + "node": ">=8" 2654 + } 2655 + }, 2656 + "node_modules/lunr": { 2657 + "version": "2.3.9", 2658 + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", 2659 + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" 2660 + }, 2661 + "node_modules/media-typer": { 2662 + "version": "1.1.0", 2663 + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 2664 + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", 2665 + "engines": { 2666 + "node": ">= 0.8" 2667 + } 2668 + }, 2669 + "node_modules/merge2": { 2670 + "version": "1.4.1", 2671 + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2672 + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2673 + "dev": true, 2674 + "engines": { 2675 + "node": ">= 8" 2676 + } 2677 + }, 2678 + "node_modules/micromatch": { 2679 + "version": "4.0.5", 2680 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 2681 + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 2682 + "dev": true, 2683 + "dependencies": { 2684 + "braces": "^3.0.2", 2685 + "picomatch": "^2.3.1" 2686 + }, 2687 + "engines": { 2688 + "node": ">=8.6" 2689 + } 2690 + }, 2691 + "node_modules/mimic-fn": { 2692 + "version": "2.1.0", 2693 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2694 + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2695 + "dev": true, 2696 + "engines": { 2697 + "node": ">=6" 2698 + } 2699 + }, 2700 + "node_modules/mimic-response": { 2701 + "version": "1.0.1", 2702 + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 2703 + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 2704 + "dev": true, 2705 + "engines": { 2706 + "node": ">=4" 2707 + } 2708 + }, 2709 + "node_modules/minimatch": { 2710 + "version": "3.1.2", 2711 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2712 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2713 + "dev": true, 2714 + "dependencies": { 2715 + "brace-expansion": "^1.1.7" 2716 + }, 2717 + "engines": { 2718 + "node": "*" 2719 + } 2720 + }, 2721 + "node_modules/minimist": { 2722 + "version": "1.2.7", 2723 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 2724 + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", 2725 + "dev": true, 2726 + "funding": { 2727 + "url": "https://github.com/sponsors/ljharb" 2728 + } 2729 + }, 2730 + "node_modules/mkdirp": { 2731 + "version": "0.5.6", 2732 + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 2733 + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 2734 + "dev": true, 2735 + "dependencies": { 2736 + "minimist": "^1.2.6" 2737 + }, 2738 + "bin": { 2739 + "mkdirp": "bin/cmd.js" 2740 + } 2741 + }, 2742 + "node_modules/ms": { 2743 + "version": "2.1.2", 2744 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2745 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2746 + }, 2747 + "node_modules/music-metadata": { 2748 + "version": "7.13.0", 2749 + "resolved": "https://registry.npmjs.org/music-metadata/-/music-metadata-7.13.0.tgz", 2750 + "integrity": "sha512-EoDmAoK84Z9xarNEgjE7YQ4x7cIwHI9kOI3RdA2QlEHCsqBvBuBbIcP3vONGO/SBiPhXe5FF+IVAW+1T2owjEA==", 2751 + "dependencies": { 2752 + "@tokenizer/token": "^0.3.0", 2753 + "content-type": "^1.0.4", 2754 + "debug": "^4.3.4", 2755 + "file-type": "^16.5.4", 2756 + "media-typer": "^1.1.0", 2757 + "strtok3": "^6.3.0", 2758 + "token-types": "^4.2.1" 2759 + }, 2760 + "engines": { 2761 + "node": ">=10" 2762 + }, 2763 + "funding": { 2764 + "type": "github", 2765 + "url": "https://github.com/sponsors/Borewit" 2766 + } 2767 + }, 2768 + "node_modules/music-metadata-browser": { 2769 + "version": "2.5.9", 2770 + "resolved": "https://registry.npmjs.org/music-metadata-browser/-/music-metadata-browser-2.5.9.tgz", 2771 + "integrity": "sha512-+HmJRuNvSxprB1CNPm6AuQygaxhnrpkfg2P4jWUY6zE8Lench6HbjsothtL636fhfnUYP8hM0MmlqC12yfp3kg==", 2772 + "dependencies": { 2773 + "buffer": "^6.0.3", 2774 + "debug": "^4.3.4", 2775 + "music-metadata": "^7.12.6", 2776 + "readable-stream": "^4.1.0", 2777 + "readable-web-to-node-stream": "^3.0.2" 2778 + }, 2779 + "funding": { 2780 + "type": "github", 2781 + "url": "https://github.com/sponsors/Borewit" 2782 + } 2783 + }, 2784 + "node_modules/music-metadata-browser/node_modules/readable-stream": { 2785 + "version": "4.2.0", 2786 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", 2787 + "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", 2788 + "dependencies": { 2789 + "abort-controller": "^3.0.0", 2790 + "buffer": "^6.0.3", 2791 + "events": "^3.3.0", 2792 + "process": "^0.11.10" 2793 + }, 2794 + "engines": { 2795 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 2796 + } 2797 + }, 2798 + "node_modules/nanoid": { 2799 + "version": "3.3.4", 2800 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 2801 + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 2802 + "dev": true, 2803 + "bin": { 2804 + "nanoid": "bin/nanoid.cjs" 2805 + }, 2806 + "engines": { 2807 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2808 + } 2809 + }, 2810 + "node_modules/natural-compare": { 2811 + "version": "1.4.0", 2812 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2813 + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2814 + "dev": true 2815 + }, 2816 + "node_modules/node-fetch": { 2817 + "version": "2.6.7", 2818 + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 2819 + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 2820 + "dependencies": { 2821 + "whatwg-url": "^5.0.0" 2822 + }, 2823 + "engines": { 2824 + "node": "4.x || >=6.0.0" 2825 + }, 2826 + "peerDependencies": { 2827 + "encoding": "^0.1.0" 2828 + }, 2829 + "peerDependenciesMeta": { 2830 + "encoding": { 2831 + "optional": true 2832 + } 2833 + } 2834 + }, 2835 + "node_modules/node-releases": { 2836 + "version": "2.0.6", 2837 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", 2838 + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", 2839 + "dev": true 2840 + }, 2841 + "node_modules/normalize-path": { 2842 + "version": "3.0.0", 2843 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2844 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2845 + "dev": true, 2846 + "engines": { 2847 + "node": ">=0.10.0" 2848 + } 2849 + }, 2850 + "node_modules/normalize-range": { 2851 + "version": "0.1.2", 2852 + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 2853 + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 2854 + "dev": true, 2855 + "engines": { 2856 + "node": ">=0.10.0" 2857 + } 2858 + }, 2859 + "node_modules/normalize-url": { 2860 + "version": "6.1.0", 2861 + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", 2862 + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", 2863 + "dev": true, 2864 + "engines": { 2865 + "node": ">=10" 2866 + }, 2867 + "funding": { 2868 + "url": "https://github.com/sponsors/sindresorhus" 2869 + } 2870 + }, 2871 + "node_modules/object-hash": { 2872 + "version": "3.0.0", 2873 + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 2874 + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 2875 + "dev": true, 2876 + "engines": { 2877 + "node": ">= 6" 2878 + } 2879 + }, 2880 + "node_modules/object-is": { 2881 + "version": "1.1.5", 2882 + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 2883 + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 2884 + "dev": true, 2885 + "dependencies": { 2886 + "call-bind": "^1.0.2", 2887 + "define-properties": "^1.1.3" 2888 + }, 2889 + "engines": { 2890 + "node": ">= 0.4" 2891 + }, 2892 + "funding": { 2893 + "url": "https://github.com/sponsors/ljharb" 2894 + } 2895 + }, 2896 + "node_modules/object-keys": { 2897 + "version": "1.1.1", 2898 + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 2899 + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 2900 + "dev": true, 2901 + "engines": { 2902 + "node": ">= 0.4" 2903 + } 2904 + }, 2905 + "node_modules/once": { 2906 + "version": "1.4.0", 2907 + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2908 + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2909 + "dev": true, 2910 + "dependencies": { 2911 + "wrappy": "1" 2912 + } 2913 + }, 2914 + "node_modules/onetime": { 2915 + "version": "5.1.2", 2916 + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2917 + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2918 + "dev": true, 2919 + "dependencies": { 2920 + "mimic-fn": "^2.1.0" 2921 + }, 2922 + "engines": { 2923 + "node": ">=6" 2924 + }, 2925 + "funding": { 2926 + "url": "https://github.com/sponsors/sindresorhus" 2927 + } 2928 + }, 2929 + "node_modules/optionator": { 2930 + "version": "0.9.1", 2931 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 2932 + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 2933 + "dev": true, 2934 + "dependencies": { 2935 + "deep-is": "^0.1.3", 2936 + "fast-levenshtein": "^2.0.6", 2937 + "levn": "^0.4.1", 2938 + "prelude-ls": "^1.2.1", 2939 + "type-check": "^0.4.0", 2940 + "word-wrap": "^1.2.3" 2941 + }, 2942 + "engines": { 2943 + "node": ">= 0.8.0" 2944 + } 2945 + }, 2946 + "node_modules/optionator/node_modules/fast-levenshtein": { 2947 + "version": "2.0.6", 2948 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2949 + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 2950 + "dev": true 2951 + }, 2952 + "node_modules/ora": { 2953 + "version": "5.4.1", 2954 + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", 2955 + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", 2956 + "dev": true, 2957 + "dependencies": { 2958 + "bl": "^4.1.0", 2959 + "chalk": "^4.1.0", 2960 + "cli-cursor": "^3.1.0", 2961 + "cli-spinners": "^2.5.0", 2962 + "is-interactive": "^1.0.0", 2963 + "is-unicode-supported": "^0.1.0", 2964 + "log-symbols": "^4.1.0", 2965 + "strip-ansi": "^6.0.0", 2966 + "wcwidth": "^1.0.1" 2967 + }, 2968 + "engines": { 2969 + "node": ">=10" 2970 + }, 2971 + "funding": { 2972 + "url": "https://github.com/sponsors/sindresorhus" 2973 + } 2974 + }, 2975 + "node_modules/p-cancelable": { 2976 + "version": "2.1.1", 2977 + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", 2978 + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", 2979 + "dev": true, 2980 + "engines": { 2981 + "node": ">=8" 2982 + } 2983 + }, 2984 + "node_modules/p-limit": { 2985 + "version": "2.3.0", 2986 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2987 + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2988 + "dev": true, 2989 + "dependencies": { 2990 + "p-try": "^2.0.0" 2991 + }, 2992 + "engines": { 2993 + "node": ">=6" 2994 + }, 2995 + "funding": { 2996 + "url": "https://github.com/sponsors/sindresorhus" 2997 + } 2998 + }, 2999 + "node_modules/p-locate": { 3000 + "version": "4.1.0", 3001 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 3002 + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 3003 + "dev": true, 3004 + "dependencies": { 3005 + "p-limit": "^2.2.0" 3006 + }, 3007 + "engines": { 3008 + "node": ">=8" 3009 + } 3010 + }, 3011 + "node_modules/p-retry": { 3012 + "version": "4.6.2", 3013 + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", 3014 + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", 3015 + "dependencies": { 3016 + "@types/retry": "0.12.0", 3017 + "retry": "^0.13.1" 3018 + }, 3019 + "engines": { 3020 + "node": ">=8" 3021 + } 3022 + }, 3023 + "node_modules/p-try": { 3024 + "version": "2.2.0", 3025 + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 3026 + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 3027 + "dev": true, 3028 + "engines": { 3029 + "node": ">=6" 3030 + } 3031 + }, 3032 + "node_modules/pako": { 3033 + "version": "1.0.11", 3034 + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 3035 + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 3036 + }, 3037 + "node_modules/parent-module": { 3038 + "version": "1.0.1", 3039 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 3040 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 3041 + "dev": true, 3042 + "dependencies": { 3043 + "callsites": "^3.0.0" 3044 + }, 3045 + "engines": { 3046 + "node": ">=6" 3047 + } 3048 + }, 3049 + "node_modules/path-exists": { 3050 + "version": "4.0.0", 3051 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 3052 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 3053 + "dev": true, 3054 + "engines": { 3055 + "node": ">=8" 3056 + } 3057 + }, 3058 + "node_modules/path-is-absolute": { 3059 + "version": "1.0.1", 3060 + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3061 + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 3062 + "dev": true, 3063 + "engines": { 3064 + "node": ">=0.10.0" 3065 + } 3066 + }, 3067 + "node_modules/path-key": { 3068 + "version": "3.1.1", 3069 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 3070 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 3071 + "dev": true, 3072 + "engines": { 3073 + "node": ">=8" 3074 + } 3075 + }, 3076 + "node_modules/path-parse": { 3077 + "version": "1.0.7", 3078 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 3079 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 3080 + "dev": true 3081 + }, 3082 + "node_modules/peek-readable": { 3083 + "version": "4.1.0", 3084 + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", 3085 + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", 3086 + "engines": { 3087 + "node": ">=8" 3088 + }, 3089 + "funding": { 3090 + "type": "github", 3091 + "url": "https://github.com/sponsors/Borewit" 3092 + } 3093 + }, 3094 + "node_modules/picocolors": { 3095 + "version": "1.0.0", 3096 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 3097 + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 3098 + "dev": true 3099 + }, 3100 + "node_modules/picomatch": { 3101 + "version": "2.3.1", 3102 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 3103 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 3104 + "dev": true, 3105 + "engines": { 3106 + "node": ">=8.6" 3107 + }, 3108 + "funding": { 3109 + "url": "https://github.com/sponsors/jonschlinkert" 3110 + } 3111 + }, 3112 + "node_modules/pify": { 3113 + "version": "2.3.0", 3114 + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 3115 + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 3116 + "dev": true, 3117 + "engines": { 3118 + "node": ">=0.10.0" 3119 + } 3120 + }, 3121 + "node_modules/postcss": { 3122 + "version": "8.4.19", 3123 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", 3124 + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", 3125 + "dev": true, 3126 + "funding": [ 3127 + { 3128 + "type": "opencollective", 3129 + "url": "https://opencollective.com/postcss/" 3130 + }, 3131 + { 3132 + "type": "tidelift", 3133 + "url": "https://tidelift.com/funding/github/npm/postcss" 3134 + } 3135 + ], 3136 + "dependencies": { 3137 + "nanoid": "^3.3.4", 3138 + "picocolors": "^1.0.0", 3139 + "source-map-js": "^1.0.2" 3140 + }, 3141 + "engines": { 3142 + "node": "^10 || ^12 || >=14" 3143 + } 3144 + }, 3145 + "node_modules/postcss-custom-properties": { 3146 + "version": "12.1.11", 3147 + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", 3148 + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", 3149 + "dev": true, 3150 + "dependencies": { 3151 + "postcss-value-parser": "^4.2.0" 3152 + }, 3153 + "engines": { 3154 + "node": "^12 || ^14 || >=16" 3155 + }, 3156 + "funding": { 3157 + "type": "opencollective", 3158 + "url": "https://opencollective.com/csstools" 3159 + }, 3160 + "peerDependencies": { 3161 + "postcss": "^8.2" 3162 + } 3163 + }, 3164 + "node_modules/postcss-import": { 3165 + "version": "14.1.0", 3166 + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", 3167 + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", 3168 + "dev": true, 3169 + "dependencies": { 3170 + "postcss-value-parser": "^4.0.0", 3171 + "read-cache": "^1.0.0", 3172 + "resolve": "^1.1.7" 3173 + }, 3174 + "engines": { 3175 + "node": ">=10.0.0" 3176 + }, 3177 + "peerDependencies": { 3178 + "postcss": "^8.0.0" 3179 + } 3180 + }, 3181 + "node_modules/postcss-js": { 3182 + "version": "4.0.0", 3183 + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 3184 + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 3185 + "dev": true, 3186 + "dependencies": { 3187 + "camelcase-css": "^2.0.1" 3188 + }, 3189 + "engines": { 3190 + "node": "^12 || ^14 || >= 16" 3191 + }, 3192 + "funding": { 3193 + "type": "opencollective", 3194 + "url": "https://opencollective.com/postcss/" 3195 + }, 3196 + "peerDependencies": { 3197 + "postcss": "^8.3.3" 3198 + } 3199 + }, 3200 + "node_modules/postcss-load-config": { 3201 + "version": "3.1.4", 3202 + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 3203 + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 3204 + "dev": true, 3205 + "dependencies": { 3206 + "lilconfig": "^2.0.5", 3207 + "yaml": "^1.10.2" 3208 + }, 3209 + "engines": { 3210 + "node": ">= 10" 3211 + }, 3212 + "funding": { 3213 + "type": "opencollective", 3214 + "url": "https://opencollective.com/postcss/" 3215 + }, 3216 + "peerDependencies": { 3217 + "postcss": ">=8.0.9", 3218 + "ts-node": ">=9.0.0" 3219 + }, 3220 + "peerDependenciesMeta": { 3221 + "postcss": { 3222 + "optional": true 3223 + }, 3224 + "ts-node": { 3225 + "optional": true 3226 + } 3227 + } 3228 + }, 3229 + "node_modules/postcss-nested": { 3230 + "version": "6.0.0", 3231 + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", 3232 + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", 3233 + "dev": true, 3234 + "dependencies": { 3235 + "postcss-selector-parser": "^6.0.10" 3236 + }, 3237 + "engines": { 3238 + "node": ">=12.0" 3239 + }, 3240 + "funding": { 3241 + "type": "opencollective", 3242 + "url": "https://opencollective.com/postcss/" 3243 + }, 3244 + "peerDependencies": { 3245 + "postcss": "^8.2.14" 3246 + } 3247 + }, 3248 + "node_modules/postcss-selector-parser": { 3249 + "version": "6.0.11", 3250 + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", 3251 + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", 3252 + "dev": true, 3253 + "dependencies": { 3254 + "cssesc": "^3.0.0", 3255 + "util-deprecate": "^1.0.2" 3256 + }, 3257 + "engines": { 3258 + "node": ">=4" 3259 + } 3260 + }, 3261 + "node_modules/postcss-value-parser": { 3262 + "version": "4.2.0", 3263 + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 3264 + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 3265 + "dev": true 3266 + }, 3267 + "node_modules/prelude-ls": { 3268 + "version": "1.2.1", 3269 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 3270 + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 3271 + "dev": true, 3272 + "engines": { 3273 + "node": ">= 0.8.0" 3274 + } 3275 + }, 3276 + "node_modules/process": { 3277 + "version": "0.11.10", 3278 + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 3279 + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", 3280 + "engines": { 3281 + "node": ">= 0.6.0" 3282 + } 3283 + }, 3284 + "node_modules/process-nextick-args": { 3285 + "version": "2.0.1", 3286 + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 3287 + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 3288 + }, 3289 + "node_modules/prompts": { 3290 + "version": "2.4.2", 3291 + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", 3292 + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", 3293 + "dev": true, 3294 + "dependencies": { 3295 + "kleur": "^3.0.3", 3296 + "sisteransi": "^1.0.5" 3297 + }, 3298 + "engines": { 3299 + "node": ">= 6" 3300 + } 3301 + }, 3302 + "node_modules/pump": { 3303 + "version": "3.0.0", 3304 + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 3305 + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 3306 + "dev": true, 3307 + "dependencies": { 3308 + "end-of-stream": "^1.1.0", 3309 + "once": "^1.3.1" 3310 + } 3311 + }, 3312 + "node_modules/punycode": { 3313 + "version": "2.1.1", 3314 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 3315 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 3316 + "dev": true, 3317 + "engines": { 3318 + "node": ">=6" 3319 + } 3320 + }, 3321 + "node_modules/queue-microtask": { 3322 + "version": "1.2.3", 3323 + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 3324 + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 3325 + "dev": true, 3326 + "funding": [ 3327 + { 3328 + "type": "github", 3329 + "url": "https://github.com/sponsors/feross" 3330 + }, 3331 + { 3332 + "type": "patreon", 3333 + "url": "https://www.patreon.com/feross" 3334 + }, 3335 + { 3336 + "type": "consulting", 3337 + "url": "https://feross.org/support" 3338 + } 3339 + ] 3340 + }, 3341 + "node_modules/quick-lru": { 3342 + "version": "5.1.1", 3343 + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 3344 + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 3345 + "dev": true, 3346 + "engines": { 3347 + "node": ">=10" 3348 + }, 3349 + "funding": { 3350 + "url": "https://github.com/sponsors/sindresorhus" 3351 + } 3352 + }, 3353 + "node_modules/read-cache": { 3354 + "version": "1.0.0", 3355 + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 3356 + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 3357 + "dev": true, 3358 + "dependencies": { 3359 + "pify": "^2.3.0" 3360 + } 3361 + }, 3362 + "node_modules/readable-stream": { 3363 + "version": "2.3.7", 3364 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 3365 + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 3366 + "dependencies": { 3367 + "core-util-is": "~1.0.0", 3368 + "inherits": "~2.0.3", 3369 + "isarray": "~1.0.0", 3370 + "process-nextick-args": "~2.0.0", 3371 + "safe-buffer": "~5.1.1", 3372 + "string_decoder": "~1.1.1", 3373 + "util-deprecate": "~1.0.1" 3374 + } 3375 + }, 3376 + "node_modules/readable-web-to-node-stream": { 3377 + "version": "3.0.2", 3378 + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 3379 + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 3380 + "dependencies": { 3381 + "readable-stream": "^3.6.0" 3382 + }, 3383 + "engines": { 3384 + "node": ">=8" 3385 + }, 3386 + "funding": { 3387 + "type": "github", 3388 + "url": "https://github.com/sponsors/Borewit" 3389 + } 3390 + }, 3391 + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { 3392 + "version": "3.6.0", 3393 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 3394 + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 3395 + "dependencies": { 3396 + "inherits": "^2.0.3", 3397 + "string_decoder": "^1.1.1", 3398 + "util-deprecate": "^1.0.1" 3399 + }, 3400 + "engines": { 3401 + "node": ">= 6" 3402 + } 3403 + }, 3404 + "node_modules/readdirp": { 3405 + "version": "3.6.0", 3406 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 3407 + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 3408 + "dev": true, 3409 + "dependencies": { 3410 + "picomatch": "^2.2.1" 3411 + }, 3412 + "engines": { 3413 + "node": ">=8.10.0" 3414 + } 3415 + }, 3416 + "node_modules/regexpp": { 3417 + "version": "3.2.0", 3418 + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 3419 + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 3420 + "dev": true, 3421 + "engines": { 3422 + "node": ">=8" 3423 + }, 3424 + "funding": { 3425 + "url": "https://github.com/sponsors/mysticatea" 3426 + } 3427 + }, 3428 + "node_modules/remotestoragejs": { 3429 + "version": "1.2.3", 3430 + "resolved": "https://registry.npmjs.org/remotestoragejs/-/remotestoragejs-1.2.3.tgz", 3431 + "integrity": "sha512-uXmWjBC3OoPR7q4v5MHAkYCLzNMvCe7afUeDQSoqdQ53Zw4BjhlF8ARGRVhe+5nbCBuJspaA2O5lTiqp4GVdeA==", 3432 + "dependencies": { 3433 + "tv4": "^1.3.0", 3434 + "webfinger.js": "^2.7.0", 3435 + "xhr2": "^0.2.0" 3436 + } 3437 + }, 3438 + "node_modules/resolve": { 3439 + "version": "1.22.1", 3440 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 3441 + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 3442 + "dev": true, 3443 + "dependencies": { 3444 + "is-core-module": "^2.9.0", 3445 + "path-parse": "^1.0.7", 3446 + "supports-preserve-symlinks-flag": "^1.0.0" 3447 + }, 3448 + "bin": { 3449 + "resolve": "bin/resolve" 3450 + }, 3451 + "funding": { 3452 + "url": "https://github.com/sponsors/ljharb" 3453 + } 3454 + }, 3455 + "node_modules/resolve-alpn": { 3456 + "version": "1.2.1", 3457 + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", 3458 + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", 3459 + "dev": true 3460 + }, 3461 + "node_modules/resolve-from": { 3462 + "version": "4.0.0", 3463 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 3464 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 3465 + "dev": true, 3466 + "engines": { 3467 + "node": ">=4" 3468 + } 3469 + }, 3470 + "node_modules/responselike": { 3471 + "version": "2.0.1", 3472 + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", 3473 + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", 3474 + "dev": true, 3475 + "dependencies": { 3476 + "lowercase-keys": "^2.0.0" 3477 + }, 3478 + "funding": { 3479 + "url": "https://github.com/sponsors/sindresorhus" 3480 + } 3481 + }, 3482 + "node_modules/restore-cursor": { 3483 + "version": "3.1.0", 3484 + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 3485 + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 3486 + "dev": true, 3487 + "dependencies": { 3488 + "onetime": "^5.1.0", 3489 + "signal-exit": "^3.0.2" 3490 + }, 3491 + "engines": { 3492 + "node": ">=8" 3493 + } 3494 + }, 3495 + "node_modules/retry": { 3496 + "version": "0.13.1", 3497 + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", 3498 + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", 3499 + "engines": { 3500 + "node": ">= 4" 3501 + } 3502 + }, 3503 + "node_modules/reusify": { 3504 + "version": "1.0.4", 3505 + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 3506 + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 3507 + "dev": true, 3508 + "engines": { 3509 + "iojs": ">=1.0.0", 3510 + "node": ">=0.10.0" 3511 + } 3512 + }, 3513 + "node_modules/rimraf": { 3514 + "version": "3.0.2", 3515 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 3516 + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 3517 + "dev": true, 3518 + "dependencies": { 3519 + "glob": "^7.1.3" 3520 + }, 3521 + "bin": { 3522 + "rimraf": "bin.js" 3523 + }, 3524 + "funding": { 3525 + "url": "https://github.com/sponsors/isaacs" 3526 + } 3527 + }, 3528 + "node_modules/run-parallel": { 3529 + "version": "1.2.0", 3530 + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 3531 + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 3532 + "dev": true, 3533 + "funding": [ 3534 + { 3535 + "type": "github", 3536 + "url": "https://github.com/sponsors/feross" 3537 + }, 3538 + { 3539 + "type": "patreon", 3540 + "url": "https://www.patreon.com/feross" 3541 + }, 3542 + { 3543 + "type": "consulting", 3544 + "url": "https://feross.org/support" 3545 + } 3546 + ], 3547 + "dependencies": { 3548 + "queue-microtask": "^1.2.2" 3549 + } 3550 + }, 3551 + "node_modules/safe-buffer": { 3552 + "version": "5.1.2", 3553 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 3554 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 3555 + }, 3556 + "node_modules/setimmediate": { 3557 + "version": "1.0.5", 3558 + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 3559 + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" 3560 + }, 3561 + "node_modules/shebang-command": { 3562 + "version": "2.0.0", 3563 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3564 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3565 + "dev": true, 3566 + "dependencies": { 3567 + "shebang-regex": "^3.0.0" 3568 + }, 3569 + "engines": { 3570 + "node": ">=8" 3571 + } 3572 + }, 3573 + "node_modules/shebang-regex": { 3574 + "version": "3.0.0", 3575 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3576 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3577 + "dev": true, 3578 + "engines": { 3579 + "node": ">=8" 3580 + } 3581 + }, 3582 + "node_modules/signal-exit": { 3583 + "version": "3.0.7", 3584 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 3585 + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 3586 + "dev": true 3587 + }, 3588 + "node_modules/sisteransi": { 3589 + "version": "1.0.5", 3590 + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 3591 + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", 3592 + "dev": true 3593 + }, 3594 + "node_modules/source-map-js": { 3595 + "version": "1.0.2", 3596 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 3597 + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 3598 + "dev": true, 3599 + "engines": { 3600 + "node": ">=0.10.0" 3601 + } 3602 + }, 3603 + "node_modules/string_decoder": { 3604 + "version": "1.1.1", 3605 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 3606 + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 3607 + "dependencies": { 3608 + "safe-buffer": "~5.1.0" 3609 + } 3610 + }, 3611 + "node_modules/string-width": { 3612 + "version": "4.2.3", 3613 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3614 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3615 + "dev": true, 3616 + "dependencies": { 3617 + "emoji-regex": "^8.0.0", 3618 + "is-fullwidth-code-point": "^3.0.0", 3619 + "strip-ansi": "^6.0.1" 3620 + }, 3621 + "engines": { 3622 + "node": ">=8" 3623 + } 3624 + }, 3625 + "node_modules/strip-ansi": { 3626 + "version": "6.0.1", 3627 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3628 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3629 + "dev": true, 3630 + "dependencies": { 3631 + "ansi-regex": "^5.0.1" 3632 + }, 3633 + "engines": { 3634 + "node": ">=8" 3635 + } 3636 + }, 3637 + "node_modules/strip-json-comments": { 3638 + "version": "3.1.1", 3639 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3640 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3641 + "dev": true, 3642 + "engines": { 3643 + "node": ">=8" 3644 + }, 3645 + "funding": { 3646 + "url": "https://github.com/sponsors/sindresorhus" 3647 + } 3648 + }, 3649 + "node_modules/strtok3": { 3650 + "version": "6.3.0", 3651 + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", 3652 + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", 3653 + "dependencies": { 3654 + "@tokenizer/token": "^0.3.0", 3655 + "peek-readable": "^4.1.0" 3656 + }, 3657 + "engines": { 3658 + "node": ">=10" 3659 + }, 3660 + "funding": { 3661 + "type": "github", 3662 + "url": "https://github.com/sponsors/Borewit" 3663 + } 3664 + }, 3665 + "node_modules/subworkers": { 3666 + "version": "1.0.1", 3667 + "resolved": "https://registry.npmjs.org/subworkers/-/subworkers-1.0.1.tgz", 3668 + "integrity": "sha512-5R3HH7AMvvuWozRqgOCe/zJic3Hn/mdVHpg7ILuo2BV8qosTiDDngLpsvNernPnUnH57fP3IWU8Eux354E2WcQ==" 3669 + }, 3670 + "node_modules/supports-color": { 3671 + "version": "7.2.0", 3672 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3673 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3674 + "dev": true, 3675 + "dependencies": { 3676 + "has-flag": "^4.0.0" 3677 + }, 3678 + "engines": { 3679 + "node": ">=8" 3680 + } 3681 + }, 3682 + "node_modules/supports-hyperlinks": { 3683 + "version": "2.3.0", 3684 + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", 3685 + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", 3686 + "dev": true, 3687 + "dependencies": { 3688 + "has-flag": "^4.0.0", 3689 + "supports-color": "^7.0.0" 3690 + }, 3691 + "engines": { 3692 + "node": ">=8" 3693 + } 3694 + }, 3695 + "node_modules/supports-preserve-symlinks-flag": { 3696 + "version": "1.0.0", 3697 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3698 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 3699 + "dev": true, 3700 + "engines": { 3701 + "node": ">= 0.4" 3702 + }, 3703 + "funding": { 3704 + "url": "https://github.com/sponsors/ljharb" 3705 + } 3706 + }, 3707 + "node_modules/tailwindcss": { 3708 + "version": "3.2.4", 3709 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", 3710 + "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", 3711 + "dev": true, 3712 + "dependencies": { 3713 + "arg": "^5.0.2", 3714 + "chokidar": "^3.5.3", 3715 + "color-name": "^1.1.4", 3716 + "detective": "^5.2.1", 3717 + "didyoumean": "^1.2.2", 3718 + "dlv": "^1.1.3", 3719 + "fast-glob": "^3.2.12", 3720 + "glob-parent": "^6.0.2", 3721 + "is-glob": "^4.0.3", 3722 + "lilconfig": "^2.0.6", 3723 + "micromatch": "^4.0.5", 3724 + "normalize-path": "^3.0.0", 3725 + "object-hash": "^3.0.0", 3726 + "picocolors": "^1.0.0", 3727 + "postcss": "^8.4.18", 3728 + "postcss-import": "^14.1.0", 3729 + "postcss-js": "^4.0.0", 3730 + "postcss-load-config": "^3.1.4", 3731 + "postcss-nested": "6.0.0", 3732 + "postcss-selector-parser": "^6.0.10", 3733 + "postcss-value-parser": "^4.2.0", 3734 + "quick-lru": "^5.1.1", 3735 + "resolve": "^1.22.1" 3736 + }, 3737 + "bin": { 3738 + "tailwind": "lib/cli.js", 3739 + "tailwindcss": "lib/cli.js" 3740 + }, 3741 + "engines": { 3742 + "node": ">=12.13.0" 3743 + }, 3744 + "peerDependencies": { 3745 + "postcss": "^8.0.9" 3746 + } 3747 + }, 3748 + "node_modules/tailwindcss-animations": { 3749 + "version": "2.0.0", 3750 + "resolved": "https://registry.npmjs.org/tailwindcss-animations/-/tailwindcss-animations-2.0.0.tgz", 3751 + "integrity": "sha512-YLdhPiQeDtpnqWd0J70rvy08MDbsq+BBLrzMmPR1Pe6MJDFYDuk4CYGI14GVgj7xRBGkByzp/rAfBcUWD7zpng==", 3752 + "deprecated": "Use Tailwind 1.6's animation utilities", 3753 + "dev": true, 3754 + "dependencies": { 3755 + "lodash": "^4.17.15" 3756 + } 3757 + }, 3758 + "node_modules/tailwindcss-interaction-variants": { 3759 + "version": "5.0.0", 3760 + "resolved": "https://registry.npmjs.org/tailwindcss-interaction-variants/-/tailwindcss-interaction-variants-5.0.0.tgz", 3761 + "integrity": "sha512-Tmx9HjwuNA3G7cLUcebGkNchKkNVIZXBroxa0LBoq/KUb/xEKEM8qugUG7QczSNPhaZzpXmo3IzPkRhf4tDaOQ==", 3762 + "deprecated": "Use Tailwind's JIT engine", 3763 + "dev": true, 3764 + "dependencies": { 3765 + "lodash": "^4.17.19", 3766 + "postcss-selector-parser": "^6.0.2" 3767 + } 3768 + }, 3769 + "node_modules/tailwindcss/node_modules/glob-parent": { 3770 + "version": "6.0.2", 3771 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 3772 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 3773 + "dev": true, 3774 + "dependencies": { 3775 + "is-glob": "^4.0.3" 3776 + }, 3777 + "engines": { 3778 + "node": ">=10.13.0" 3779 + } 3780 + }, 3781 + "node_modules/temp": { 3782 + "version": "0.9.4", 3783 + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", 3784 + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", 3785 + "dev": true, 3786 + "dependencies": { 3787 + "mkdirp": "^0.5.1", 3788 + "rimraf": "~2.6.2" 3789 + }, 3790 + "engines": { 3791 + "node": ">=6.0.0" 3792 + } 3793 + }, 3794 + "node_modules/temp/node_modules/rimraf": { 3795 + "version": "2.6.3", 3796 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 3797 + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 3798 + "dev": true, 3799 + "dependencies": { 3800 + "glob": "^7.1.3" 3801 + }, 3802 + "bin": { 3803 + "rimraf": "bin.js" 3804 + } 3805 + }, 3806 + "node_modules/terminal-link": { 3807 + "version": "2.1.1", 3808 + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", 3809 + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", 3810 + "dev": true, 3811 + "dependencies": { 3812 + "ansi-escapes": "^4.2.1", 3813 + "supports-hyperlinks": "^2.0.0" 3814 + }, 3815 + "engines": { 3816 + "node": ">=8" 3817 + }, 3818 + "funding": { 3819 + "url": "https://github.com/sponsors/sindresorhus" 3820 + } 3821 + }, 3822 + "node_modules/text-table": { 3823 + "version": "0.2.0", 3824 + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 3825 + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 3826 + "dev": true 3827 + }, 3828 + "node_modules/timer.js": { 3829 + "version": "1.0.4", 3830 + "resolved": "https://registry.npmjs.org/timer.js/-/timer.js-1.0.4.tgz", 3831 + "integrity": "sha512-UU/lL02CjPMu8cu29h/uyt5yBqcm0vlx51Je9xCmVcH+TLS+X/+chv4V4rHlb37ZiI4iUVyLuC3QvyoFMzadwQ==" 3832 + }, 3833 + "node_modules/to-regex-range": { 3834 + "version": "5.0.1", 3835 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3836 + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3837 + "dev": true, 3838 + "dependencies": { 3839 + "is-number": "^7.0.0" 3840 + }, 3841 + "engines": { 3842 + "node": ">=8.0" 3843 + } 3844 + }, 3845 + "node_modules/tocca": { 3846 + "version": "2.0.9", 3847 + "resolved": "https://registry.npmjs.org/tocca/-/tocca-2.0.9.tgz", 3848 + "integrity": "sha512-FXofUGAFcgEIEOS3m9Dk9URaY3x+JeerPfVFc8K820PjV0JcCsH98BFxrVOTANC8YvM4QTrmKMol2/818gFmCw==" 3849 + }, 3850 + "node_modules/token-types": { 3851 + "version": "4.2.1", 3852 + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", 3853 + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", 3854 + "dependencies": { 3855 + "@tokenizer/token": "^0.3.0", 3856 + "ieee754": "^1.2.1" 3857 + }, 3858 + "engines": { 3859 + "node": ">=10" 3860 + }, 3861 + "funding": { 3862 + "type": "github", 3863 + "url": "https://github.com/sponsors/Borewit" 3864 + } 3865 + }, 3866 + "node_modules/tr46": { 3867 + "version": "0.0.3", 3868 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 3869 + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 3870 + }, 3871 + "node_modules/tv4": { 3872 + "version": "1.3.0", 3873 + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", 3874 + "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", 3875 + "engines": { 3876 + "node": ">= 0.8.0" 3877 + } 3878 + }, 3879 + "node_modules/type-check": { 3880 + "version": "0.4.0", 3881 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 3882 + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 3883 + "dev": true, 3884 + "dependencies": { 3885 + "prelude-ls": "^1.2.1" 3886 + }, 3887 + "engines": { 3888 + "node": ">= 0.8.0" 3889 + } 3890 + }, 3891 + "node_modules/type-fest": { 3892 + "version": "0.20.2", 3893 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 3894 + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 3895 + "dev": true, 3896 + "engines": { 3897 + "node": ">=10" 3898 + }, 3899 + "funding": { 3900 + "url": "https://github.com/sponsors/sindresorhus" 3901 + } 3902 + }, 3903 + "node_modules/universalify": { 3904 + "version": "2.0.0", 3905 + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", 3906 + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", 3907 + "dev": true, 3908 + "engines": { 3909 + "node": ">= 10.0.0" 3910 + } 3911 + }, 3912 + "node_modules/update-browserslist-db": { 3913 + "version": "1.0.10", 3914 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 3915 + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 3916 + "dev": true, 3917 + "funding": [ 3918 + { 3919 + "type": "opencollective", 3920 + "url": "https://opencollective.com/browserslist" 3921 + }, 3922 + { 3923 + "type": "tidelift", 3924 + "url": "https://tidelift.com/funding/github/npm/browserslist" 3925 + } 3926 + ], 3927 + "dependencies": { 3928 + "escalade": "^3.1.1", 3929 + "picocolors": "^1.0.0" 3930 + }, 3931 + "bin": { 3932 + "browserslist-lint": "cli.js" 3933 + }, 3934 + "peerDependencies": { 3935 + "browserslist": ">= 4.21.0" 3936 + } 3937 + }, 3938 + "node_modules/uri-js": { 3939 + "version": "4.4.1", 3940 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3941 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3942 + "dev": true, 3943 + "dependencies": { 3944 + "punycode": "^2.1.0" 3945 + } 3946 + }, 3947 + "node_modules/util": { 3948 + "version": "0.12.5", 3949 + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", 3950 + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", 3951 + "dev": true, 3952 + "dependencies": { 3953 + "inherits": "^2.0.3", 3954 + "is-arguments": "^1.0.4", 3955 + "is-generator-function": "^1.0.7", 3956 + "is-typed-array": "^1.1.3", 3957 + "which-typed-array": "^1.1.2" 3958 + } 3959 + }, 3960 + "node_modules/util-deprecate": { 3961 + "version": "1.0.2", 3962 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3963 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 3964 + }, 3965 + "node_modules/wcwidth": { 3966 + "version": "1.0.1", 3967 + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 3968 + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", 3969 + "dev": true, 3970 + "dependencies": { 3971 + "defaults": "^1.0.3" 3972 + } 3973 + }, 3974 + "node_modules/webfinger.js": { 3975 + "version": "2.7.1", 3976 + "resolved": "https://registry.npmjs.org/webfinger.js/-/webfinger.js-2.7.1.tgz", 3977 + "integrity": "sha512-H4RokaE4RC39N3uiRTcjKMmy6yYg06lUPORQHvv8DjowZ6I5SalxUeoqHbtTN3EVBmYP/XHQ8Ow6BLEIpe2DtA==", 3978 + "dependencies": { 3979 + "xhr2": "0.2.1" 3980 + } 3981 + }, 3982 + "node_modules/webidl-conversions": { 3983 + "version": "3.0.1", 3984 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 3985 + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 3986 + }, 3987 + "node_modules/webnative": { 3988 + "resolved": "../../Work/webnative", 3989 + "link": true 3990 + }, 3991 + "node_modules/whatwg-url": { 3992 + "version": "5.0.0", 3993 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 3994 + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 3995 + "dependencies": { 3996 + "tr46": "~0.0.3", 3997 + "webidl-conversions": "^3.0.0" 3998 + } 3999 + }, 4000 + "node_modules/which": { 4001 + "version": "2.0.2", 4002 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 4003 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 4004 + "dev": true, 4005 + "dependencies": { 4006 + "isexe": "^2.0.0" 4007 + }, 4008 + "bin": { 4009 + "node-which": "bin/node-which" 4010 + }, 4011 + "engines": { 4012 + "node": ">= 8" 4013 + } 4014 + }, 4015 + "node_modules/which-typed-array": { 4016 + "version": "1.1.9", 4017 + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", 4018 + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", 4019 + "dev": true, 4020 + "dependencies": { 4021 + "available-typed-arrays": "^1.0.5", 4022 + "call-bind": "^1.0.2", 4023 + "for-each": "^0.3.3", 4024 + "gopd": "^1.0.1", 4025 + "has-tostringtag": "^1.0.0", 4026 + "is-typed-array": "^1.1.10" 4027 + }, 4028 + "engines": { 4029 + "node": ">= 0.4" 4030 + }, 4031 + "funding": { 4032 + "url": "https://github.com/sponsors/ljharb" 4033 + } 4034 + }, 4035 + "node_modules/word-wrap": { 4036 + "version": "1.2.3", 4037 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 4038 + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 4039 + "dev": true, 4040 + "engines": { 4041 + "node": ">=0.10.0" 4042 + } 4043 + }, 4044 + "node_modules/wrap-ansi": { 4045 + "version": "6.2.0", 4046 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 4047 + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 4048 + "dev": true, 4049 + "dependencies": { 4050 + "ansi-styles": "^4.0.0", 4051 + "string-width": "^4.1.0", 4052 + "strip-ansi": "^6.0.0" 4053 + }, 4054 + "engines": { 4055 + "node": ">=8" 4056 + } 4057 + }, 4058 + "node_modules/wrappy": { 4059 + "version": "1.0.2", 4060 + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 4061 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 4062 + "dev": true 4063 + }, 4064 + "node_modules/xhr2": { 4065 + "version": "0.2.1", 4066 + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", 4067 + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", 4068 + "engines": { 4069 + "node": ">= 6" 4070 + } 4071 + }, 4072 + "node_modules/xtend": { 4073 + "version": "4.0.2", 4074 + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 4075 + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 4076 + "dev": true, 4077 + "engines": { 4078 + "node": ">=0.4" 4079 + } 4080 + }, 4081 + "node_modules/yaml": { 4082 + "version": "1.10.2", 4083 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 4084 + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 4085 + "dev": true, 4086 + "engines": { 4087 + "node": ">= 6" 4088 + } 4089 + }, 4090 + "node_modules/yocto-queue": { 4091 + "version": "0.1.0", 4092 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 4093 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 4094 + "dev": true, 4095 + "engines": { 4096 + "node": ">=10" 4097 + }, 4098 + "funding": { 4099 + "url": "https://github.com/sponsors/sindresorhus" 4100 + } 4101 + } 4102 + }, 4103 + "dependencies": { 4104 + "@esbuild/android-arm": { 4105 + "version": "0.16.4", 4106 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.4.tgz", 4107 + "integrity": "sha512-rZzb7r22m20S1S7ufIc6DC6W659yxoOrl7sKP1nCYhuvUlnCFHVSbATG4keGUtV8rDz11sRRDbWkvQZpzPaHiw==", 4108 + "dev": true, 4109 + "optional": true 4110 + }, 4111 + "@esbuild/android-arm64": { 4112 + "version": "0.16.4", 4113 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.4.tgz", 4114 + "integrity": "sha512-VPuTzXFm/m2fcGfN6CiwZTlLzxrKsWbPkG7ArRFpuxyaHUm/XFHQPD4xNwZT6uUmpIHhnSjcaCmcla8COzmZ5Q==", 4115 + "dev": true, 4116 + "optional": true 4117 + }, 4118 + "@esbuild/android-x64": { 4119 + "version": "0.16.4", 4120 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.4.tgz", 4121 + "integrity": "sha512-MW+B2O++BkcOfMWmuHXB15/l1i7wXhJFqbJhp82IBOais8RBEQv2vQz/jHrDEHaY2X0QY7Wfw86SBL2PbVOr0g==", 4122 + "dev": true, 4123 + "optional": true 4124 + }, 4125 + "@esbuild/darwin-arm64": { 4126 + "version": "0.16.4", 4127 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.4.tgz", 4128 + "integrity": "sha512-a28X1O//aOfxwJVZVs7ZfM8Tyih2Za4nKJrBwW5Wm4yKsnwBy9aiS/xwpxiiTRttw3EaTg4Srerhcm6z0bu9Wg==", 4129 + "dev": true, 4130 + "optional": true 4131 + }, 4132 + "@esbuild/darwin-x64": { 4133 + "version": "0.16.4", 4134 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.4.tgz", 4135 + "integrity": "sha512-e3doCr6Ecfwd7VzlaQqEPrnbvvPjE9uoTpxG5pyLzr2rI2NMjDHmvY1E5EO81O/e9TUOLLkXA5m6T8lfjK9yAA==", 4136 + "dev": true, 4137 + "optional": true 4138 + }, 4139 + "@esbuild/freebsd-arm64": { 4140 + "version": "0.16.4", 4141 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.4.tgz", 4142 + "integrity": "sha512-Oup3G/QxBgvvqnXWrBed7xxkFNwAwJVHZcklWyQt7YCAL5bfUkaa6FVWnR78rNQiM8MqqLiT6ZTZSdUFuVIg1w==", 4143 + "dev": true, 4144 + "optional": true 4145 + }, 4146 + "@esbuild/freebsd-x64": { 4147 + "version": "0.16.4", 4148 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.4.tgz", 4149 + "integrity": "sha512-vAP+eYOxlN/Bpo/TZmzEQapNS8W1njECrqkTpNgvXskkkJC2AwOXwZWai/Kc2vEFZUXQttx6UJbj9grqjD/+9Q==", 4150 + "dev": true, 4151 + "optional": true 4152 + }, 4153 + "@esbuild/linux-arm": { 4154 + "version": "0.16.4", 4155 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.4.tgz", 4156 + "integrity": "sha512-A47ZmtpIPyERxkSvIv+zLd6kNIOtJH03XA0Hy7jaceRDdQaQVGSDt4mZqpWqJYgDk9rg96aglbF6kCRvPGDSUA==", 4157 + "dev": true, 4158 + "optional": true 4159 + }, 4160 + "@esbuild/linux-arm64": { 4161 + "version": "0.16.4", 4162 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.4.tgz", 4163 + "integrity": "sha512-2zXoBhv4r5pZiyjBKrOdFP4CXOChxXiYD50LRUU+65DkdS5niPFHbboKZd/c81l0ezpw7AQnHeoCy5hFrzzs4g==", 4164 + "dev": true, 4165 + "optional": true 4166 + }, 4167 + "@esbuild/linux-ia32": { 4168 + "version": "0.16.4", 4169 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.4.tgz", 4170 + "integrity": "sha512-uxdSrpe9wFhz4yBwt2kl2TxS/NWEINYBUFIxQtaEVtglm1eECvsj1vEKI0KX2k2wCe17zDdQ3v+jVxfwVfvvjw==", 4171 + "dev": true, 4172 + "optional": true 4173 + }, 4174 + "@esbuild/linux-loong64": { 4175 + "version": "0.16.4", 4176 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.4.tgz", 4177 + "integrity": "sha512-peDrrUuxbZ9Jw+DwLCh/9xmZAk0p0K1iY5d2IcwmnN+B87xw7kujOkig6ZRcZqgrXgeRGurRHn0ENMAjjD5DEg==", 4178 + "dev": true, 4179 + "optional": true 4180 + }, 4181 + "@esbuild/linux-mips64el": { 4182 + "version": "0.16.4", 4183 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.4.tgz", 4184 + "integrity": "sha512-sD9EEUoGtVhFjjsauWjflZklTNr57KdQ6xfloO4yH1u7vNQlOfAlhEzbyBKfgbJlW7rwXYBdl5/NcZ+Mg2XhQA==", 4185 + "dev": true, 4186 + "optional": true 4187 + }, 4188 + "@esbuild/linux-ppc64": { 4189 + "version": "0.16.4", 4190 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.4.tgz", 4191 + "integrity": "sha512-X1HSqHUX9D+d0l6/nIh4ZZJ94eQky8d8z6yxAptpZE3FxCWYWvTDd9X9ST84MGZEJx04VYUD/AGgciddwO0b8g==", 4192 + "dev": true, 4193 + "optional": true 4194 + }, 4195 + "@esbuild/linux-riscv64": { 4196 + "version": "0.16.4", 4197 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.4.tgz", 4198 + "integrity": "sha512-97ANpzyNp0GTXCt6SRdIx1ngwncpkV/z453ZuxbnBROCJ5p/55UjhbaG23UdHj88fGWLKPFtMoU4CBacz4j9FA==", 4199 + "dev": true, 4200 + "optional": true 4201 + }, 4202 + "@esbuild/linux-s390x": { 4203 + "version": "0.16.4", 4204 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.4.tgz", 4205 + "integrity": "sha512-pUvPQLPmbEeJRPjP0DYTC1vjHyhrnCklQmCGYbipkep+oyfTn7GTBJXoPodR7ZS5upmEyc8lzAkn2o29wD786A==", 4206 + "dev": true, 4207 + "optional": true 4208 + }, 4209 + "@esbuild/linux-x64": { 4210 + "version": "0.16.4", 4211 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.4.tgz", 4212 + "integrity": "sha512-N55Q0mJs3Sl8+utPRPBrL6NLYZKBCLLx0bme/+RbjvMforTGGzFvsRl4xLTZMUBFC1poDzBEPTEu5nxizQ9Nlw==", 4213 + "dev": true, 4214 + "optional": true 4215 + }, 4216 + "@esbuild/netbsd-x64": { 4217 + "version": "0.16.4", 4218 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.4.tgz", 4219 + "integrity": "sha512-LHSJLit8jCObEQNYkgsDYBh2JrJT53oJO2HVdkSYLa6+zuLJh0lAr06brXIkljrlI+N7NNW1IAXGn/6IZPi3YQ==", 4220 + "dev": true, 4221 + "optional": true 4222 + }, 4223 + "@esbuild/openbsd-x64": { 4224 + "version": "0.16.4", 4225 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.4.tgz", 4226 + "integrity": "sha512-nLgdc6tWEhcCFg/WVFaUxHcPK3AP/bh+KEwKtl69Ay5IBqUwKDaq/6Xk0E+fh/FGjnLwqFSsarsbPHeKM8t8Sw==", 4227 + "dev": true, 4228 + "optional": true 4229 + }, 4230 + "@esbuild/sunos-x64": { 4231 + "version": "0.16.4", 4232 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.4.tgz", 4233 + "integrity": "sha512-08SluG24GjPO3tXKk95/85n9kpyZtXCVwURR2i4myhrOfi3jspClV0xQQ0W0PYWHioJj+LejFMt41q+PG3mlAQ==", 4234 + "dev": true, 4235 + "optional": true 4236 + }, 4237 + "@esbuild/win32-arm64": { 4238 + "version": "0.16.4", 4239 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.4.tgz", 4240 + "integrity": "sha512-yYiRDQcqLYQSvNQcBKN7XogbrSvBE45FEQdH8fuXPl7cngzkCvpsG2H9Uey39IjQ6gqqc+Q4VXYHsQcKW0OMjQ==", 4241 + "dev": true, 4242 + "optional": true 4243 + }, 4244 + "@esbuild/win32-ia32": { 4245 + "version": "0.16.4", 4246 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.4.tgz", 4247 + "integrity": "sha512-5rabnGIqexekYkh9zXG5waotq8mrdlRoBqAktjx2W3kb0zsI83mdCwrcAeKYirnUaTGztR5TxXcXmQrEzny83w==", 4248 + "dev": true, 4249 + "optional": true 4250 + }, 4251 + "@esbuild/win32-x64": { 4252 + "version": "0.16.4", 4253 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.4.tgz", 4254 + "integrity": "sha512-sN/I8FMPtmtT2Yw+Dly8Ur5vQ5a/RmC8hW7jO9PtPSQUPkowxWpcUZnqOggU7VwyT3Xkj6vcXWd3V/qTXwultQ==", 4255 + "dev": true, 4256 + "optional": true 4257 + }, 4258 + "@eslint/eslintrc": { 4259 + "version": "1.3.3", 4260 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", 4261 + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", 4262 + "dev": true, 4263 + "requires": { 4264 + "ajv": "^6.12.4", 4265 + "debug": "^4.3.2", 4266 + "espree": "^9.4.0", 4267 + "globals": "^13.15.0", 4268 + "ignore": "^5.2.0", 4269 + "import-fresh": "^3.2.1", 4270 + "js-yaml": "^4.1.0", 4271 + "minimatch": "^3.1.2", 4272 + "strip-json-comments": "^3.1.1" 4273 + } 4274 + }, 4275 + "@humanwhocodes/config-array": { 4276 + "version": "0.11.7", 4277 + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", 4278 + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", 4279 + "dev": true, 4280 + "requires": { 4281 + "@humanwhocodes/object-schema": "^1.2.1", 4282 + "debug": "^4.1.1", 4283 + "minimatch": "^3.0.5" 4284 + } 4285 + }, 4286 + "@humanwhocodes/module-importer": { 4287 + "version": "1.0.1", 4288 + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 4289 + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 4290 + "dev": true 4291 + }, 4292 + "@humanwhocodes/object-schema": { 4293 + "version": "1.2.1", 4294 + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 4295 + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 4296 + "dev": true 4297 + }, 4298 + "@nodelib/fs.scandir": { 4299 + "version": "2.1.5", 4300 + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 4301 + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 4302 + "dev": true, 4303 + "requires": { 4304 + "@nodelib/fs.stat": "2.0.5", 4305 + "run-parallel": "^1.1.9" 4306 + } 4307 + }, 4308 + "@nodelib/fs.stat": { 4309 + "version": "2.0.5", 4310 + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 4311 + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 4312 + "dev": true 4313 + }, 4314 + "@nodelib/fs.walk": { 4315 + "version": "1.2.8", 4316 + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 4317 + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 4318 + "dev": true, 4319 + "requires": { 4320 + "@nodelib/fs.scandir": "2.1.5", 4321 + "fastq": "^1.6.0" 4322 + } 4323 + }, 4324 + "@sindresorhus/is": { 4325 + "version": "4.6.0", 4326 + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", 4327 + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", 4328 + "dev": true 4329 + }, 4330 + "@szmarczak/http-timer": { 4331 + "version": "4.0.6", 4332 + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", 4333 + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", 4334 + "dev": true, 4335 + "requires": { 4336 + "defer-to-connect": "^2.0.0" 4337 + } 4338 + }, 4339 + "@tokenizer/http": { 4340 + "version": "0.6.2", 4341 + "resolved": "https://registry.npmjs.org/@tokenizer/http/-/http-0.6.2.tgz", 4342 + "integrity": "sha512-0+gTDUT9EYxbJvDYRk65Itw68gfGPUmUNz9hlAA4j/Mih7QOfyN6fVxvtTB6ytgOTo7GU1x9KRIGlrqVdjHSYw==", 4343 + "requires": { 4344 + "@tokenizer/range": "^0.5.1", 4345 + "debug": "^4.1.1", 4346 + "node-fetch": "^2.6.7", 4347 + "strtok3": "^6.0.8" 4348 + } 4349 + }, 4350 + "@tokenizer/range": { 4351 + "version": "0.5.3", 4352 + "resolved": "https://registry.npmjs.org/@tokenizer/range/-/range-0.5.3.tgz", 4353 + "integrity": "sha512-EcPMjCrLL4xaxZtdmN4E+78fSML2R1seiuCKmaIe4pjm7JEDVn8bUejuTMCGpPiqz1SkTgd90xj6c7aIrsHy+A==", 4354 + "requires": { 4355 + "debug": "^4.3.2", 4356 + "strtok3": "^6.3.0" 4357 + } 4358 + }, 4359 + "@tokenizer/token": { 4360 + "version": "0.3.0", 4361 + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 4362 + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" 4363 + }, 4364 + "@types/cacheable-request": { 4365 + "version": "6.0.3", 4366 + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", 4367 + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", 4368 + "dev": true, 4369 + "requires": { 4370 + "@types/http-cache-semantics": "*", 4371 + "@types/keyv": "^3.1.4", 4372 + "@types/node": "*", 4373 + "@types/responselike": "^1.0.0" 4374 + } 4375 + }, 4376 + "@types/http-cache-semantics": { 4377 + "version": "4.0.1", 4378 + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", 4379 + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", 4380 + "dev": true 4381 + }, 4382 + "@types/keyv": { 4383 + "version": "3.1.4", 4384 + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", 4385 + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", 4386 + "dev": true, 4387 + "requires": { 4388 + "@types/node": "*" 4389 + } 4390 + }, 4391 + "@types/node": { 4392 + "version": "18.11.13", 4393 + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.13.tgz", 4394 + "integrity": "sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w==", 4395 + "dev": true 4396 + }, 4397 + "@types/responselike": { 4398 + "version": "1.0.0", 4399 + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", 4400 + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", 4401 + "dev": true, 4402 + "requires": { 4403 + "@types/node": "*" 4404 + } 4405 + }, 4406 + "@types/retry": { 4407 + "version": "0.12.0", 4408 + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", 4409 + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" 4410 + }, 4411 + "abort-controller": { 4412 + "version": "3.0.0", 4413 + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 4414 + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 4415 + "requires": { 4416 + "event-target-shim": "^5.0.0" 4417 + } 4418 + }, 4419 + "acorn": { 4420 + "version": "8.8.1", 4421 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", 4422 + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", 4423 + "dev": true 4424 + }, 4425 + "acorn-jsx": { 4426 + "version": "5.3.2", 4427 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 4428 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 4429 + "dev": true, 4430 + "requires": {} 4431 + }, 4432 + "acorn-node": { 4433 + "version": "1.8.2", 4434 + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 4435 + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 4436 + "dev": true, 4437 + "requires": { 4438 + "acorn": "^7.0.0", 4439 + "acorn-walk": "^7.0.0", 4440 + "xtend": "^4.0.2" 4441 + }, 4442 + "dependencies": { 4443 + "acorn": { 4444 + "version": "7.4.1", 4445 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 4446 + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 4447 + "dev": true 4448 + } 4449 + } 4450 + }, 4451 + "acorn-walk": { 4452 + "version": "7.2.0", 4453 + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 4454 + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 4455 + "dev": true 4456 + }, 4457 + "ajv": { 4458 + "version": "6.12.6", 4459 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 4460 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 4461 + "dev": true, 4462 + "requires": { 4463 + "fast-deep-equal": "^3.1.1", 4464 + "fast-json-stable-stringify": "^2.0.0", 4465 + "json-schema-traverse": "^0.4.1", 4466 + "uri-js": "^4.2.2" 4467 + } 4468 + }, 4469 + "ansi-escapes": { 4470 + "version": "4.3.2", 4471 + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 4472 + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 4473 + "dev": true, 4474 + "requires": { 4475 + "type-fest": "^0.21.3" 4476 + }, 4477 + "dependencies": { 4478 + "type-fest": { 4479 + "version": "0.21.3", 4480 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 4481 + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 4482 + "dev": true 4483 + } 4484 + } 4485 + }, 4486 + "ansi-regex": { 4487 + "version": "5.0.1", 4488 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 4489 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 4490 + "dev": true 4491 + }, 4492 + "ansi-styles": { 4493 + "version": "4.3.0", 4494 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 4495 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 4496 + "dev": true, 4497 + "requires": { 4498 + "color-convert": "^2.0.1" 4499 + } 4500 + }, 4501 + "anymatch": { 4502 + "version": "3.1.3", 4503 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 4504 + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 4505 + "dev": true, 4506 + "requires": { 4507 + "normalize-path": "^3.0.0", 4508 + "picomatch": "^2.0.4" 4509 + } 4510 + }, 4511 + "arg": { 4512 + "version": "5.0.2", 4513 + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 4514 + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 4515 + "dev": true 4516 + }, 4517 + "argparse": { 4518 + "version": "2.0.1", 4519 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 4520 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 4521 + "dev": true 4522 + }, 4523 + "assert": { 4524 + "version": "2.0.0", 4525 + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", 4526 + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", 4527 + "dev": true, 4528 + "requires": { 4529 + "es6-object-assign": "^1.1.0", 4530 + "is-nan": "^1.2.1", 4531 + "object-is": "^1.0.1", 4532 + "util": "^0.12.0" 4533 + } 4534 + }, 4535 + "at-least-node": { 4536 + "version": "1.0.0", 4537 + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", 4538 + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", 4539 + "dev": true 4540 + }, 4541 + "autoprefixer": { 4542 + "version": "10.4.13", 4543 + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", 4544 + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", 4545 + "dev": true, 4546 + "requires": { 4547 + "browserslist": "^4.21.4", 4548 + "caniuse-lite": "^1.0.30001426", 4549 + "fraction.js": "^4.2.0", 4550 + "normalize-range": "^0.1.2", 4551 + "picocolors": "^1.0.0", 4552 + "postcss-value-parser": "^4.2.0" 4553 + } 4554 + }, 4555 + "available-typed-arrays": { 4556 + "version": "1.0.5", 4557 + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 4558 + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 4559 + "dev": true 4560 + }, 4561 + "balanced-match": { 4562 + "version": "1.0.2", 4563 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 4564 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 4565 + "dev": true 4566 + }, 4567 + "base64-js": { 4568 + "version": "1.5.1", 4569 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 4570 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 4571 + }, 4572 + "binary-extensions": { 4573 + "version": "2.2.0", 4574 + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 4575 + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 4576 + "dev": true 4577 + }, 4578 + "bl": { 4579 + "version": "4.1.0", 4580 + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 4581 + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 4582 + "dev": true, 4583 + "requires": { 4584 + "buffer": "^5.5.0", 4585 + "inherits": "^2.0.4", 4586 + "readable-stream": "^3.4.0" 4587 + }, 4588 + "dependencies": { 4589 + "buffer": { 4590 + "version": "5.7.1", 4591 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 4592 + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 4593 + "dev": true, 4594 + "requires": { 4595 + "base64-js": "^1.3.1", 4596 + "ieee754": "^1.1.13" 4597 + } 4598 + }, 4599 + "readable-stream": { 4600 + "version": "3.6.0", 4601 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 4602 + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 4603 + "dev": true, 4604 + "requires": { 4605 + "inherits": "^2.0.3", 4606 + "string_decoder": "^1.1.1", 4607 + "util-deprecate": "^1.0.1" 4608 + } 4609 + } 4610 + } 4611 + }, 4612 + "brace-expansion": { 4613 + "version": "1.1.11", 4614 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 4615 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 4616 + "dev": true, 4617 + "requires": { 4618 + "balanced-match": "^1.0.0", 4619 + "concat-map": "0.0.1" 4620 + } 4621 + }, 4622 + "braces": { 4623 + "version": "3.0.2", 4624 + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 4625 + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 4626 + "dev": true, 4627 + "requires": { 4628 + "fill-range": "^7.0.1" 4629 + } 4630 + }, 4631 + "browserslist": { 4632 + "version": "4.21.4", 4633 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 4634 + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 4635 + "dev": true, 4636 + "requires": { 4637 + "caniuse-lite": "^1.0.30001400", 4638 + "electron-to-chromium": "^1.4.251", 4639 + "node-releases": "^2.0.6", 4640 + "update-browserslist-db": "^1.0.9" 4641 + } 4642 + }, 4643 + "buffer": { 4644 + "version": "6.0.3", 4645 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 4646 + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 4647 + "requires": { 4648 + "base64-js": "^1.3.1", 4649 + "ieee754": "^1.2.1" 4650 + } 4651 + }, 4652 + "cacheable-lookup": { 4653 + "version": "5.0.4", 4654 + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", 4655 + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", 4656 + "dev": true 4657 + }, 4658 + "cacheable-request": { 4659 + "version": "7.0.2", 4660 + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", 4661 + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", 4662 + "dev": true, 4663 + "requires": { 4664 + "clone-response": "^1.0.2", 4665 + "get-stream": "^5.1.0", 4666 + "http-cache-semantics": "^4.0.0", 4667 + "keyv": "^4.0.0", 4668 + "lowercase-keys": "^2.0.0", 4669 + "normalize-url": "^6.0.1", 4670 + "responselike": "^2.0.0" 4671 + } 4672 + }, 4673 + "call-bind": { 4674 + "version": "1.0.2", 4675 + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 4676 + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 4677 + "dev": true, 4678 + "requires": { 4679 + "function-bind": "^1.1.1", 4680 + "get-intrinsic": "^1.0.2" 4681 + } 4682 + }, 4683 + "callsites": { 4684 + "version": "3.1.0", 4685 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 4686 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 4687 + "dev": true 4688 + }, 4689 + "camelcase-css": { 4690 + "version": "2.0.1", 4691 + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 4692 + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 4693 + "dev": true 4694 + }, 4695 + "caniuse-lite": { 4696 + "version": "1.0.30001439", 4697 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", 4698 + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", 4699 + "dev": true 4700 + }, 4701 + "chalk": { 4702 + "version": "4.1.2", 4703 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 4704 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 4705 + "dev": true, 4706 + "requires": { 4707 + "ansi-styles": "^4.1.0", 4708 + "supports-color": "^7.1.0" 4709 + } 4710 + }, 4711 + "chokidar": { 4712 + "version": "3.5.3", 4713 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 4714 + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 4715 + "dev": true, 4716 + "requires": { 4717 + "anymatch": "~3.1.2", 4718 + "braces": "~3.0.2", 4719 + "fsevents": "~2.3.2", 4720 + "glob-parent": "~5.1.2", 4721 + "is-binary-path": "~2.1.0", 4722 + "is-glob": "~4.0.1", 4723 + "normalize-path": "~3.0.0", 4724 + "readdirp": "~3.6.0" 4725 + } 4726 + }, 4727 + "cli-cursor": { 4728 + "version": "3.1.0", 4729 + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 4730 + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 4731 + "dev": true, 4732 + "requires": { 4733 + "restore-cursor": "^3.1.0" 4734 + } 4735 + }, 4736 + "cli-spinners": { 4737 + "version": "2.7.0", 4738 + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", 4739 + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", 4740 + "dev": true 4741 + }, 4742 + "clone": { 4743 + "version": "1.0.4", 4744 + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 4745 + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", 4746 + "dev": true 4747 + }, 4748 + "clone-response": { 4749 + "version": "1.0.3", 4750 + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", 4751 + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", 4752 + "dev": true, 4753 + "requires": { 4754 + "mimic-response": "^1.0.0" 4755 + } 4756 + }, 4757 + "color-convert": { 4758 + "version": "2.0.1", 4759 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 4760 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 4761 + "dev": true, 4762 + "requires": { 4763 + "color-name": "~1.1.4" 4764 + } 4765 + }, 4766 + "color-name": { 4767 + "version": "1.1.4", 4768 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 4769 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 4770 + "dev": true 4771 + }, 4772 + "concat-map": { 4773 + "version": "0.0.1", 4774 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 4775 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 4776 + "dev": true 4777 + }, 4778 + "content-type": { 4779 + "version": "1.0.4", 4780 + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 4781 + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 4782 + }, 4783 + "core-util-is": { 4784 + "version": "1.0.3", 4785 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 4786 + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 4787 + }, 4788 + "cross-spawn": { 4789 + "version": "7.0.3", 4790 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 4791 + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 4792 + "dev": true, 4793 + "requires": { 4794 + "path-key": "^3.1.0", 4795 + "shebang-command": "^2.0.0", 4796 + "which": "^2.0.1" 4797 + } 4798 + }, 4799 + "cssesc": { 4800 + "version": "3.0.0", 4801 + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 4802 + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 4803 + "dev": true 4804 + }, 4805 + "debug": { 4806 + "version": "4.3.4", 4807 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 4808 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 4809 + "requires": { 4810 + "ms": "2.1.2" 4811 + } 4812 + }, 4813 + "decompress-response": { 4814 + "version": "6.0.0", 4815 + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 4816 + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 4817 + "dev": true, 4818 + "requires": { 4819 + "mimic-response": "^3.1.0" 4820 + }, 4821 + "dependencies": { 4822 + "mimic-response": { 4823 + "version": "3.1.0", 4824 + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 4825 + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 4826 + "dev": true 4827 + } 4828 + } 4829 + }, 4830 + "deep-is": { 4831 + "version": "0.1.4", 4832 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 4833 + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 4834 + "dev": true 4835 + }, 4836 + "defaults": { 4837 + "version": "1.0.4", 4838 + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", 4839 + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", 4840 + "dev": true, 4841 + "requires": { 4842 + "clone": "^1.0.2" 4843 + } 4844 + }, 4845 + "defer-to-connect": { 4846 + "version": "2.0.1", 4847 + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", 4848 + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", 4849 + "dev": true 4850 + }, 4851 + "define-properties": { 4852 + "version": "1.1.4", 4853 + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", 4854 + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", 4855 + "dev": true, 4856 + "requires": { 4857 + "has-property-descriptors": "^1.0.0", 4858 + "object-keys": "^1.1.1" 4859 + } 4860 + }, 4861 + "defined": { 4862 + "version": "1.0.1", 4863 + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 4864 + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 4865 + "dev": true 4866 + }, 4867 + "delay": { 4868 + "version": "5.0.0", 4869 + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", 4870 + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==" 4871 + }, 4872 + "detective": { 4873 + "version": "5.2.1", 4874 + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", 4875 + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", 4876 + "dev": true, 4877 + "requires": { 4878 + "acorn-node": "^1.8.2", 4879 + "defined": "^1.0.0", 4880 + "minimist": "^1.2.6" 4881 + } 4882 + }, 4883 + "didyoumean": { 4884 + "version": "1.2.2", 4885 + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 4886 + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 4887 + "dev": true 4888 + }, 4889 + "dlv": { 4890 + "version": "1.1.3", 4891 + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 4892 + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 4893 + "dev": true 4894 + }, 4895 + "doctrine": { 4896 + "version": "3.0.0", 4897 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 4898 + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 4899 + "dev": true, 4900 + "requires": { 4901 + "esutils": "^2.0.2" 4902 + } 4903 + }, 4904 + "electron-to-chromium": { 4905 + "version": "1.4.284", 4906 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", 4907 + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", 4908 + "dev": true 4909 + }, 4910 + "elm-review": { 4911 + "version": "2.8.5", 4912 + "resolved": "https://registry.npmjs.org/elm-review/-/elm-review-2.8.5.tgz", 4913 + "integrity": "sha512-e3HmCoBZPdcnwdyelnL02GVE1ZXOIjuP/fo4DvrQjxd5082b4lOUxzbh/pWeKdU9a1mtrHNYkWalEXPYeig3Kw==", 4914 + "dev": true, 4915 + "requires": { 4916 + "chalk": "^4.0.0", 4917 + "chokidar": "^3.5.2", 4918 + "cross-spawn": "^7.0.3", 4919 + "elm-tooling": "^1.6.0", 4920 + "fast-levenshtein": "^3.0.0", 4921 + "find-up": "^4.1.0", 4922 + "folder-hash": "^3.3.0", 4923 + "fs-extra": "^9.0.0", 4924 + "glob": "^7.1.4", 4925 + "got": "^11.8.5", 4926 + "minimist": "^1.2.6", 4927 + "ora": "^5.4.0", 4928 + "path-key": "^3.1.1", 4929 + "prompts": "^2.2.1", 4930 + "strip-ansi": "^6.0.0", 4931 + "temp": "^0.9.1", 4932 + "terminal-link": "^2.1.1", 4933 + "which": "^2.0.2", 4934 + "wrap-ansi": "^6.2.0" 4935 + } 4936 + }, 4937 + "elm-taskport": { 4938 + "version": "2.0.1", 4939 + "resolved": "https://registry.npmjs.org/elm-taskport/-/elm-taskport-2.0.1.tgz", 4940 + "integrity": "sha512-8UgIjzmGuoU6Wt6VC0tkJnzvc5xHL5yH7GdN+/QNxaaA3ckoyveCtV0QJqNCRa42bpyR1JhOwLSApwf2Id5xZg==" 4941 + }, 4942 + "elm-tooling": { 4943 + "version": "1.10.0", 4944 + "resolved": "https://registry.npmjs.org/elm-tooling/-/elm-tooling-1.10.0.tgz", 4945 + "integrity": "sha512-fMLXs7xHpr6LodtmvVJKepYC6chgSOfe5Hgv8GcFO+Id7O/CuT9+CAfrlzYxvBn91cm6ekWwHFDjPD765v5iBA==", 4946 + "dev": true 4947 + }, 4948 + "emoji-regex": { 4949 + "version": "8.0.0", 4950 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 4951 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 4952 + "dev": true 4953 + }, 4954 + "end-of-stream": { 4955 + "version": "1.4.4", 4956 + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 4957 + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 4958 + "dev": true, 4959 + "requires": { 4960 + "once": "^1.4.0" 4961 + } 4962 + }, 4963 + "es6-object-assign": { 4964 + "version": "1.1.0", 4965 + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", 4966 + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", 4967 + "dev": true 4968 + }, 4969 + "esbuild": { 4970 + "version": "0.16.4", 4971 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.4.tgz", 4972 + "integrity": "sha512-qQrPMQpPTWf8jHugLWHoGqZjApyx3OEm76dlTXobHwh/EBbavbRdjXdYi/GWr43GyN0sfpap14GPkb05NH3ROA==", 4973 + "dev": true, 4974 + "requires": { 4975 + "@esbuild/android-arm": "0.16.4", 4976 + "@esbuild/android-arm64": "0.16.4", 4977 + "@esbuild/android-x64": "0.16.4", 4978 + "@esbuild/darwin-arm64": "0.16.4", 4979 + "@esbuild/darwin-x64": "0.16.4", 4980 + "@esbuild/freebsd-arm64": "0.16.4", 4981 + "@esbuild/freebsd-x64": "0.16.4", 4982 + "@esbuild/linux-arm": "0.16.4", 4983 + "@esbuild/linux-arm64": "0.16.4", 4984 + "@esbuild/linux-ia32": "0.16.4", 4985 + "@esbuild/linux-loong64": "0.16.4", 4986 + "@esbuild/linux-mips64el": "0.16.4", 4987 + "@esbuild/linux-ppc64": "0.16.4", 4988 + "@esbuild/linux-riscv64": "0.16.4", 4989 + "@esbuild/linux-s390x": "0.16.4", 4990 + "@esbuild/linux-x64": "0.16.4", 4991 + "@esbuild/netbsd-x64": "0.16.4", 4992 + "@esbuild/openbsd-x64": "0.16.4", 4993 + "@esbuild/sunos-x64": "0.16.4", 4994 + "@esbuild/win32-arm64": "0.16.4", 4995 + "@esbuild/win32-ia32": "0.16.4", 4996 + "@esbuild/win32-x64": "0.16.4" 4997 + } 4998 + }, 4999 + "escalade": { 5000 + "version": "3.1.1", 5001 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 5002 + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 5003 + "dev": true 5004 + }, 5005 + "escape-string-regexp": { 5006 + "version": "4.0.0", 5007 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 5008 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 5009 + "dev": true 5010 + }, 5011 + "eslint": { 5012 + "version": "8.29.0", 5013 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", 5014 + "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", 5015 + "dev": true, 5016 + "requires": { 5017 + "@eslint/eslintrc": "^1.3.3", 5018 + "@humanwhocodes/config-array": "^0.11.6", 5019 + "@humanwhocodes/module-importer": "^1.0.1", 5020 + "@nodelib/fs.walk": "^1.2.8", 5021 + "ajv": "^6.10.0", 5022 + "chalk": "^4.0.0", 5023 + "cross-spawn": "^7.0.2", 5024 + "debug": "^4.3.2", 5025 + "doctrine": "^3.0.0", 5026 + "escape-string-regexp": "^4.0.0", 5027 + "eslint-scope": "^7.1.1", 5028 + "eslint-utils": "^3.0.0", 5029 + "eslint-visitor-keys": "^3.3.0", 5030 + "espree": "^9.4.0", 5031 + "esquery": "^1.4.0", 5032 + "esutils": "^2.0.2", 5033 + "fast-deep-equal": "^3.1.3", 5034 + "file-entry-cache": "^6.0.1", 5035 + "find-up": "^5.0.0", 5036 + "glob-parent": "^6.0.2", 5037 + "globals": "^13.15.0", 5038 + "grapheme-splitter": "^1.0.4", 5039 + "ignore": "^5.2.0", 5040 + "import-fresh": "^3.0.0", 5041 + "imurmurhash": "^0.1.4", 5042 + "is-glob": "^4.0.0", 5043 + "is-path-inside": "^3.0.3", 5044 + "js-sdsl": "^4.1.4", 5045 + "js-yaml": "^4.1.0", 5046 + "json-stable-stringify-without-jsonify": "^1.0.1", 5047 + "levn": "^0.4.1", 5048 + "lodash.merge": "^4.6.2", 5049 + "minimatch": "^3.1.2", 5050 + "natural-compare": "^1.4.0", 5051 + "optionator": "^0.9.1", 5052 + "regexpp": "^3.2.0", 5053 + "strip-ansi": "^6.0.1", 5054 + "strip-json-comments": "^3.1.0", 5055 + "text-table": "^0.2.0" 5056 + }, 5057 + "dependencies": { 5058 + "find-up": { 5059 + "version": "5.0.0", 5060 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 5061 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 5062 + "dev": true, 5063 + "requires": { 5064 + "locate-path": "^6.0.0", 5065 + "path-exists": "^4.0.0" 5066 + } 5067 + }, 5068 + "glob-parent": { 5069 + "version": "6.0.2", 5070 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 5071 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 5072 + "dev": true, 5073 + "requires": { 5074 + "is-glob": "^4.0.3" 5075 + } 5076 + }, 5077 + "locate-path": { 5078 + "version": "6.0.0", 5079 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 5080 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 5081 + "dev": true, 5082 + "requires": { 5083 + "p-locate": "^5.0.0" 5084 + } 5085 + }, 5086 + "p-limit": { 5087 + "version": "3.1.0", 5088 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 5089 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 5090 + "dev": true, 5091 + "requires": { 5092 + "yocto-queue": "^0.1.0" 5093 + } 5094 + }, 5095 + "p-locate": { 5096 + "version": "5.0.0", 5097 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 5098 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 5099 + "dev": true, 5100 + "requires": { 5101 + "p-limit": "^3.0.2" 5102 + } 5103 + } 5104 + } 5105 + }, 5106 + "eslint-scope": { 5107 + "version": "7.1.1", 5108 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 5109 + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 5110 + "dev": true, 5111 + "requires": { 5112 + "esrecurse": "^4.3.0", 5113 + "estraverse": "^5.2.0" 5114 + } 5115 + }, 5116 + "eslint-utils": { 5117 + "version": "3.0.0", 5118 + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 5119 + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 5120 + "dev": true, 5121 + "requires": { 5122 + "eslint-visitor-keys": "^2.0.0" 5123 + }, 5124 + "dependencies": { 5125 + "eslint-visitor-keys": { 5126 + "version": "2.1.0", 5127 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 5128 + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 5129 + "dev": true 5130 + } 5131 + } 5132 + }, 5133 + "eslint-visitor-keys": { 5134 + "version": "3.3.0", 5135 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 5136 + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 5137 + "dev": true 5138 + }, 5139 + "espree": { 5140 + "version": "9.4.1", 5141 + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", 5142 + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", 5143 + "dev": true, 5144 + "requires": { 5145 + "acorn": "^8.8.0", 5146 + "acorn-jsx": "^5.3.2", 5147 + "eslint-visitor-keys": "^3.3.0" 5148 + } 5149 + }, 5150 + "esquery": { 5151 + "version": "1.4.0", 5152 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 5153 + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 5154 + "dev": true, 5155 + "requires": { 5156 + "estraverse": "^5.1.0" 5157 + } 5158 + }, 5159 + "esrecurse": { 5160 + "version": "4.3.0", 5161 + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 5162 + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 5163 + "dev": true, 5164 + "requires": { 5165 + "estraverse": "^5.2.0" 5166 + } 5167 + }, 5168 + "estraverse": { 5169 + "version": "5.3.0", 5170 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 5171 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 5172 + "dev": true 5173 + }, 5174 + "esutils": { 5175 + "version": "2.0.3", 5176 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 5177 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 5178 + "dev": true 5179 + }, 5180 + "event-target-shim": { 5181 + "version": "5.0.1", 5182 + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 5183 + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 5184 + }, 5185 + "events": { 5186 + "version": "3.3.0", 5187 + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 5188 + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" 5189 + }, 5190 + "fast-deep-equal": { 5191 + "version": "3.1.3", 5192 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 5193 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 5194 + "dev": true 5195 + }, 5196 + "fast-glob": { 5197 + "version": "3.2.12", 5198 + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 5199 + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 5200 + "dev": true, 5201 + "requires": { 5202 + "@nodelib/fs.stat": "^2.0.2", 5203 + "@nodelib/fs.walk": "^1.2.3", 5204 + "glob-parent": "^5.1.2", 5205 + "merge2": "^1.3.0", 5206 + "micromatch": "^4.0.4" 5207 + } 5208 + }, 5209 + "fast-json-stable-stringify": { 5210 + "version": "2.1.0", 5211 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 5212 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 5213 + "dev": true 5214 + }, 5215 + "fast-levenshtein": { 5216 + "version": "3.0.0", 5217 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", 5218 + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", 5219 + "dev": true, 5220 + "requires": { 5221 + "fastest-levenshtein": "^1.0.7" 5222 + } 5223 + }, 5224 + "fast-text-encoding": { 5225 + "version": "1.0.6", 5226 + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", 5227 + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" 5228 + }, 5229 + "fastest-levenshtein": { 5230 + "version": "1.0.16", 5231 + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", 5232 + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", 5233 + "dev": true 5234 + }, 5235 + "fastq": { 5236 + "version": "1.14.0", 5237 + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", 5238 + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", 5239 + "dev": true, 5240 + "requires": { 5241 + "reusify": "^1.0.4" 5242 + } 5243 + }, 5244 + "file-entry-cache": { 5245 + "version": "6.0.1", 5246 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 5247 + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 5248 + "dev": true, 5249 + "requires": { 5250 + "flat-cache": "^3.0.4" 5251 + } 5252 + }, 5253 + "file-saver": { 5254 + "version": "2.0.5", 5255 + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", 5256 + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" 5257 + }, 5258 + "file-type": { 5259 + "version": "16.5.4", 5260 + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", 5261 + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", 5262 + "requires": { 5263 + "readable-web-to-node-stream": "^3.0.0", 5264 + "strtok3": "^6.2.4", 5265 + "token-types": "^4.1.1" 5266 + } 5267 + }, 5268 + "fill-range": { 5269 + "version": "7.0.1", 5270 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 5271 + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 5272 + "dev": true, 5273 + "requires": { 5274 + "to-regex-range": "^5.0.1" 5275 + } 5276 + }, 5277 + "find-up": { 5278 + "version": "4.1.0", 5279 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 5280 + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 5281 + "dev": true, 5282 + "requires": { 5283 + "locate-path": "^5.0.0", 5284 + "path-exists": "^4.0.0" 5285 + } 5286 + }, 5287 + "flat-cache": { 5288 + "version": "3.0.4", 5289 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 5290 + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 5291 + "dev": true, 5292 + "requires": { 5293 + "flatted": "^3.1.0", 5294 + "rimraf": "^3.0.2" 5295 + } 5296 + }, 5297 + "flatted": { 5298 + "version": "3.2.7", 5299 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 5300 + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 5301 + "dev": true 5302 + }, 5303 + "folder-hash": { 5304 + "version": "3.3.3", 5305 + "resolved": "https://registry.npmjs.org/folder-hash/-/folder-hash-3.3.3.tgz", 5306 + "integrity": "sha512-SDgHBgV+RCjrYs8aUwCb9rTgbTVuSdzvFmLaChsLre1yf+D64khCW++VYciaByZ8Rm0uKF8R/XEpXuTRSGUM1A==", 5307 + "dev": true, 5308 + "requires": { 5309 + "debug": "^4.1.1", 5310 + "graceful-fs": "~4.2.0", 5311 + "minimatch": "~3.0.4" 5312 + }, 5313 + "dependencies": { 5314 + "minimatch": { 5315 + "version": "3.0.8", 5316 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", 5317 + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", 5318 + "dev": true, 5319 + "requires": { 5320 + "brace-expansion": "^1.1.7" 5321 + } 5322 + } 5323 + } 5324 + }, 5325 + "for-each": { 5326 + "version": "0.3.3", 5327 + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 5328 + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 5329 + "dev": true, 5330 + "requires": { 5331 + "is-callable": "^1.1.3" 5332 + } 5333 + }, 5334 + "fraction.js": { 5335 + "version": "4.2.0", 5336 + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 5337 + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", 5338 + "dev": true 5339 + }, 5340 + "fs-extra": { 5341 + "version": "9.1.0", 5342 + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", 5343 + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", 5344 + "dev": true, 5345 + "requires": { 5346 + "at-least-node": "^1.0.0", 5347 + "graceful-fs": "^4.2.0", 5348 + "jsonfile": "^6.0.1", 5349 + "universalify": "^2.0.0" 5350 + } 5351 + }, 5352 + "fs.realpath": { 5353 + "version": "1.0.0", 5354 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 5355 + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 5356 + "dev": true 5357 + }, 5358 + "fsevents": { 5359 + "version": "2.3.2", 5360 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 5361 + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 5362 + "dev": true, 5363 + "optional": true 5364 + }, 5365 + "function-bind": { 5366 + "version": "1.1.1", 5367 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 5368 + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 5369 + "dev": true 5370 + }, 5371 + "get-intrinsic": { 5372 + "version": "1.1.3", 5373 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 5374 + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 5375 + "dev": true, 5376 + "requires": { 5377 + "function-bind": "^1.1.1", 5378 + "has": "^1.0.3", 5379 + "has-symbols": "^1.0.3" 5380 + } 5381 + }, 5382 + "get-stream": { 5383 + "version": "5.2.0", 5384 + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 5385 + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 5386 + "dev": true, 5387 + "requires": { 5388 + "pump": "^3.0.0" 5389 + } 5390 + }, 5391 + "glob": { 5392 + "version": "7.2.3", 5393 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 5394 + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 5395 + "dev": true, 5396 + "requires": { 5397 + "fs.realpath": "^1.0.0", 5398 + "inflight": "^1.0.4", 5399 + "inherits": "2", 5400 + "minimatch": "^3.1.1", 5401 + "once": "^1.3.0", 5402 + "path-is-absolute": "^1.0.0" 5403 + } 5404 + }, 5405 + "glob-parent": { 5406 + "version": "5.1.2", 5407 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 5408 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 5409 + "dev": true, 5410 + "requires": { 5411 + "is-glob": "^4.0.1" 5412 + } 5413 + }, 5414 + "globals": { 5415 + "version": "13.18.0", 5416 + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", 5417 + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", 5418 + "dev": true, 5419 + "requires": { 5420 + "type-fest": "^0.20.2" 5421 + } 5422 + }, 5423 + "gopd": { 5424 + "version": "1.0.1", 5425 + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 5426 + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 5427 + "dev": true, 5428 + "requires": { 5429 + "get-intrinsic": "^1.1.3" 5430 + } 5431 + }, 5432 + "got": { 5433 + "version": "11.8.6", 5434 + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", 5435 + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", 5436 + "dev": true, 5437 + "requires": { 5438 + "@sindresorhus/is": "^4.0.0", 5439 + "@szmarczak/http-timer": "^4.0.5", 5440 + "@types/cacheable-request": "^6.0.1", 5441 + "@types/responselike": "^1.0.0", 5442 + "cacheable-lookup": "^5.0.3", 5443 + "cacheable-request": "^7.0.2", 5444 + "decompress-response": "^6.0.0", 5445 + "http2-wrapper": "^1.0.0-beta.5.2", 5446 + "lowercase-keys": "^2.0.0", 5447 + "p-cancelable": "^2.0.0", 5448 + "responselike": "^2.0.0" 5449 + } 5450 + }, 5451 + "graceful-fs": { 5452 + "version": "4.2.10", 5453 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 5454 + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 5455 + "dev": true 5456 + }, 5457 + "grapheme-splitter": { 5458 + "version": "1.0.4", 5459 + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 5460 + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 5461 + "dev": true 5462 + }, 5463 + "has": { 5464 + "version": "1.0.3", 5465 + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 5466 + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 5467 + "dev": true, 5468 + "requires": { 5469 + "function-bind": "^1.1.1" 5470 + } 5471 + }, 5472 + "has-flag": { 5473 + "version": "4.0.0", 5474 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 5475 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 5476 + "dev": true 5477 + }, 5478 + "has-property-descriptors": { 5479 + "version": "1.0.0", 5480 + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 5481 + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 5482 + "dev": true, 5483 + "requires": { 5484 + "get-intrinsic": "^1.1.1" 5485 + } 5486 + }, 5487 + "has-symbols": { 5488 + "version": "1.0.3", 5489 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 5490 + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 5491 + "dev": true 5492 + }, 5493 + "has-tostringtag": { 5494 + "version": "1.0.0", 5495 + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 5496 + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 5497 + "dev": true, 5498 + "requires": { 5499 + "has-symbols": "^1.0.2" 5500 + } 5501 + }, 5502 + "http-cache-semantics": { 5503 + "version": "4.1.0", 5504 + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 5505 + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", 5506 + "dev": true 5507 + }, 5508 + "http2-wrapper": { 5509 + "version": "1.0.3", 5510 + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", 5511 + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", 5512 + "dev": true, 5513 + "requires": { 5514 + "quick-lru": "^5.1.1", 5515 + "resolve-alpn": "^1.0.0" 5516 + } 5517 + }, 5518 + "ieee754": { 5519 + "version": "1.2.1", 5520 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 5521 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 5522 + }, 5523 + "ignore": { 5524 + "version": "5.2.1", 5525 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", 5526 + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", 5527 + "dev": true 5528 + }, 5529 + "immediate": { 5530 + "version": "3.0.6", 5531 + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 5532 + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" 5533 + }, 5534 + "import-fresh": { 5535 + "version": "3.3.0", 5536 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 5537 + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 5538 + "dev": true, 5539 + "requires": { 5540 + "parent-module": "^1.0.0", 5541 + "resolve-from": "^4.0.0" 5542 + } 5543 + }, 5544 + "imurmurhash": { 5545 + "version": "0.1.4", 5546 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 5547 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 5548 + "dev": true 5549 + }, 5550 + "inflight": { 5551 + "version": "1.0.6", 5552 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 5553 + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 5554 + "dev": true, 5555 + "requires": { 5556 + "once": "^1.3.0", 5557 + "wrappy": "1" 5558 + } 5559 + }, 5560 + "inherits": { 5561 + "version": "2.0.4", 5562 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 5563 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 5564 + }, 5565 + "is-arguments": { 5566 + "version": "1.1.1", 5567 + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 5568 + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 5569 + "dev": true, 5570 + "requires": { 5571 + "call-bind": "^1.0.2", 5572 + "has-tostringtag": "^1.0.0" 5573 + } 5574 + }, 5575 + "is-binary-path": { 5576 + "version": "2.1.0", 5577 + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 5578 + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 5579 + "dev": true, 5580 + "requires": { 5581 + "binary-extensions": "^2.0.0" 5582 + } 5583 + }, 5584 + "is-callable": { 5585 + "version": "1.2.7", 5586 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 5587 + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 5588 + "dev": true 5589 + }, 5590 + "is-core-module": { 5591 + "version": "2.11.0", 5592 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 5593 + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 5594 + "dev": true, 5595 + "requires": { 5596 + "has": "^1.0.3" 5597 + } 5598 + }, 5599 + "is-extglob": { 5600 + "version": "2.1.1", 5601 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 5602 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 5603 + "dev": true 5604 + }, 5605 + "is-fullwidth-code-point": { 5606 + "version": "3.0.0", 5607 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 5608 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 5609 + "dev": true 5610 + }, 5611 + "is-generator-function": { 5612 + "version": "1.0.10", 5613 + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", 5614 + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", 5615 + "dev": true, 5616 + "requires": { 5617 + "has-tostringtag": "^1.0.0" 5618 + } 5619 + }, 5620 + "is-glob": { 5621 + "version": "4.0.3", 5622 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 5623 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 5624 + "dev": true, 5625 + "requires": { 5626 + "is-extglob": "^2.1.1" 5627 + } 5628 + }, 5629 + "is-interactive": { 5630 + "version": "1.0.0", 5631 + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", 5632 + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", 5633 + "dev": true 5634 + }, 5635 + "is-nan": { 5636 + "version": "1.3.2", 5637 + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", 5638 + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", 5639 + "dev": true, 5640 + "requires": { 5641 + "call-bind": "^1.0.0", 5642 + "define-properties": "^1.1.3" 5643 + } 5644 + }, 5645 + "is-number": { 5646 + "version": "7.0.0", 5647 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 5648 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 5649 + "dev": true 5650 + }, 5651 + "is-path-inside": { 5652 + "version": "3.0.3", 5653 + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 5654 + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 5655 + "dev": true 5656 + }, 5657 + "is-typed-array": { 5658 + "version": "1.1.10", 5659 + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", 5660 + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", 5661 + "dev": true, 5662 + "requires": { 5663 + "available-typed-arrays": "^1.0.5", 5664 + "call-bind": "^1.0.2", 5665 + "for-each": "^0.3.3", 5666 + "gopd": "^1.0.1", 5667 + "has-tostringtag": "^1.0.0" 5668 + } 5669 + }, 5670 + "is-unicode-supported": { 5671 + "version": "0.1.0", 5672 + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 5673 + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 5674 + "dev": true 5675 + }, 5676 + "isarray": { 5677 + "version": "1.0.0", 5678 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 5679 + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 5680 + }, 5681 + "isexe": { 5682 + "version": "2.0.0", 5683 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 5684 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 5685 + "dev": true 5686 + }, 5687 + "js-sdsl": { 5688 + "version": "4.2.0", 5689 + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", 5690 + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", 5691 + "dev": true 5692 + }, 5693 + "js-yaml": { 5694 + "version": "4.1.0", 5695 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 5696 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 5697 + "dev": true, 5698 + "requires": { 5699 + "argparse": "^2.0.1" 5700 + } 5701 + }, 5702 + "json-buffer": { 5703 + "version": "3.0.1", 5704 + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 5705 + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 5706 + "dev": true 5707 + }, 5708 + "json-schema-traverse": { 5709 + "version": "0.4.1", 5710 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 5711 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 5712 + "dev": true 5713 + }, 5714 + "json-stable-stringify-without-jsonify": { 5715 + "version": "1.0.1", 5716 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 5717 + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 5718 + "dev": true 5719 + }, 5720 + "jsonfile": { 5721 + "version": "6.1.0", 5722 + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 5723 + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 5724 + "dev": true, 5725 + "requires": { 5726 + "graceful-fs": "^4.1.6", 5727 + "universalify": "^2.0.0" 5728 + } 5729 + }, 5730 + "jszip": { 5731 + "version": "3.10.1", 5732 + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", 5733 + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", 5734 + "requires": { 5735 + "lie": "~3.3.0", 5736 + "pako": "~1.0.2", 5737 + "readable-stream": "~2.3.6", 5738 + "setimmediate": "^1.0.5" 5739 + } 5740 + }, 5741 + "keyv": { 5742 + "version": "4.5.2", 5743 + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", 5744 + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", 5745 + "dev": true, 5746 + "requires": { 5747 + "json-buffer": "3.0.1" 5748 + } 5749 + }, 5750 + "kleur": { 5751 + "version": "3.0.3", 5752 + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 5753 + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", 5754 + "dev": true 5755 + }, 5756 + "levn": { 5757 + "version": "0.4.1", 5758 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 5759 + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 5760 + "dev": true, 5761 + "requires": { 5762 + "prelude-ls": "^1.2.1", 5763 + "type-check": "~0.4.0" 5764 + } 5765 + }, 5766 + "lie": { 5767 + "version": "3.3.0", 5768 + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 5769 + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 5770 + "requires": { 5771 + "immediate": "~3.0.5" 5772 + } 5773 + }, 5774 + "lilconfig": { 5775 + "version": "2.0.6", 5776 + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", 5777 + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", 5778 + "dev": true 5779 + }, 5780 + "load-script2": { 5781 + "version": "2.0.6", 5782 + "resolved": "https://registry.npmjs.org/load-script2/-/load-script2-2.0.6.tgz", 5783 + "integrity": "sha512-pyuw/AR+ycZkRKgkMyXOIf/o2OnRQPc9grjZ04wVOeoJ7SqX97WlcZahl+3/r5qi09L/5d0iCVZ0q4OqNT/v0Q==" 5784 + }, 5785 + "locate-path": { 5786 + "version": "5.0.0", 5787 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 5788 + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 5789 + "dev": true, 5790 + "requires": { 5791 + "p-locate": "^4.1.0" 5792 + } 5793 + }, 5794 + "lodash": { 5795 + "version": "4.17.21", 5796 + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 5797 + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 5798 + "dev": true 5799 + }, 5800 + "lodash.merge": { 5801 + "version": "4.6.2", 5802 + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 5803 + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 5804 + "dev": true 5805 + }, 5806 + "log-symbols": { 5807 + "version": "4.1.0", 5808 + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 5809 + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 5810 + "dev": true, 5811 + "requires": { 5812 + "chalk": "^4.1.0", 5813 + "is-unicode-supported": "^0.1.0" 5814 + } 5815 + }, 5816 + "lowercase-keys": { 5817 + "version": "2.0.0", 5818 + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 5819 + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", 5820 + "dev": true 5821 + }, 5822 + "lunr": { 5823 + "version": "2.3.9", 5824 + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", 5825 + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" 5826 + }, 5827 + "media-typer": { 5828 + "version": "1.1.0", 5829 + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 5830 + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==" 5831 + }, 5832 + "merge2": { 5833 + "version": "1.4.1", 5834 + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 5835 + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 5836 + "dev": true 5837 + }, 5838 + "micromatch": { 5839 + "version": "4.0.5", 5840 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 5841 + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 5842 + "dev": true, 5843 + "requires": { 5844 + "braces": "^3.0.2", 5845 + "picomatch": "^2.3.1" 5846 + } 5847 + }, 5848 + "mimic-fn": { 5849 + "version": "2.1.0", 5850 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 5851 + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 5852 + "dev": true 5853 + }, 5854 + "mimic-response": { 5855 + "version": "1.0.1", 5856 + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 5857 + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 5858 + "dev": true 5859 + }, 5860 + "minimatch": { 5861 + "version": "3.1.2", 5862 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 5863 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 5864 + "dev": true, 5865 + "requires": { 5866 + "brace-expansion": "^1.1.7" 5867 + } 5868 + }, 5869 + "minimist": { 5870 + "version": "1.2.7", 5871 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 5872 + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", 5873 + "dev": true 5874 + }, 5875 + "mkdirp": { 5876 + "version": "0.5.6", 5877 + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 5878 + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 5879 + "dev": true, 5880 + "requires": { 5881 + "minimist": "^1.2.6" 5882 + } 5883 + }, 5884 + "ms": { 5885 + "version": "2.1.2", 5886 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 5887 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 5888 + }, 5889 + "music-metadata": { 5890 + "version": "7.13.0", 5891 + "resolved": "https://registry.npmjs.org/music-metadata/-/music-metadata-7.13.0.tgz", 5892 + "integrity": "sha512-EoDmAoK84Z9xarNEgjE7YQ4x7cIwHI9kOI3RdA2QlEHCsqBvBuBbIcP3vONGO/SBiPhXe5FF+IVAW+1T2owjEA==", 5893 + "requires": { 5894 + "@tokenizer/token": "^0.3.0", 5895 + "content-type": "^1.0.4", 5896 + "debug": "^4.3.4", 5897 + "file-type": "^16.5.4", 5898 + "media-typer": "^1.1.0", 5899 + "strtok3": "^6.3.0", 5900 + "token-types": "^4.2.1" 5901 + } 5902 + }, 5903 + "music-metadata-browser": { 5904 + "version": "2.5.9", 5905 + "resolved": "https://registry.npmjs.org/music-metadata-browser/-/music-metadata-browser-2.5.9.tgz", 5906 + "integrity": "sha512-+HmJRuNvSxprB1CNPm6AuQygaxhnrpkfg2P4jWUY6zE8Lench6HbjsothtL636fhfnUYP8hM0MmlqC12yfp3kg==", 5907 + "requires": { 5908 + "buffer": "^6.0.3", 5909 + "debug": "^4.3.4", 5910 + "music-metadata": "^7.12.6", 5911 + "readable-stream": "^4.1.0", 5912 + "readable-web-to-node-stream": "^3.0.2" 5913 + }, 5914 + "dependencies": { 5915 + "readable-stream": { 5916 + "version": "4.2.0", 5917 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", 5918 + "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", 5919 + "requires": { 5920 + "abort-controller": "^3.0.0", 5921 + "buffer": "^6.0.3", 5922 + "events": "^3.3.0", 5923 + "process": "^0.11.10" 5924 + } 5925 + } 5926 + } 5927 + }, 5928 + "nanoid": { 5929 + "version": "3.3.4", 5930 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 5931 + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 5932 + "dev": true 5933 + }, 5934 + "natural-compare": { 5935 + "version": "1.4.0", 5936 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 5937 + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 5938 + "dev": true 5939 + }, 5940 + "node-fetch": { 5941 + "version": "2.6.7", 5942 + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 5943 + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 5944 + "requires": { 5945 + "whatwg-url": "^5.0.0" 5946 + } 5947 + }, 5948 + "node-releases": { 5949 + "version": "2.0.6", 5950 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", 5951 + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", 5952 + "dev": true 5953 + }, 5954 + "normalize-path": { 5955 + "version": "3.0.0", 5956 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 5957 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 5958 + "dev": true 5959 + }, 5960 + "normalize-range": { 5961 + "version": "0.1.2", 5962 + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 5963 + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 5964 + "dev": true 5965 + }, 5966 + "normalize-url": { 5967 + "version": "6.1.0", 5968 + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", 5969 + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", 5970 + "dev": true 5971 + }, 5972 + "object-hash": { 5973 + "version": "3.0.0", 5974 + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 5975 + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 5976 + "dev": true 5977 + }, 5978 + "object-is": { 5979 + "version": "1.1.5", 5980 + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 5981 + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 5982 + "dev": true, 5983 + "requires": { 5984 + "call-bind": "^1.0.2", 5985 + "define-properties": "^1.1.3" 5986 + } 5987 + }, 5988 + "object-keys": { 5989 + "version": "1.1.1", 5990 + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 5991 + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 5992 + "dev": true 5993 + }, 5994 + "once": { 5995 + "version": "1.4.0", 5996 + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 5997 + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 5998 + "dev": true, 5999 + "requires": { 6000 + "wrappy": "1" 6001 + } 6002 + }, 6003 + "onetime": { 6004 + "version": "5.1.2", 6005 + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 6006 + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 6007 + "dev": true, 6008 + "requires": { 6009 + "mimic-fn": "^2.1.0" 6010 + } 6011 + }, 6012 + "optionator": { 6013 + "version": "0.9.1", 6014 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 6015 + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 6016 + "dev": true, 6017 + "requires": { 6018 + "deep-is": "^0.1.3", 6019 + "fast-levenshtein": "^2.0.6", 6020 + "levn": "^0.4.1", 6021 + "prelude-ls": "^1.2.1", 6022 + "type-check": "^0.4.0", 6023 + "word-wrap": "^1.2.3" 6024 + }, 6025 + "dependencies": { 6026 + "fast-levenshtein": { 6027 + "version": "2.0.6", 6028 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 6029 + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 6030 + "dev": true 6031 + } 6032 + } 6033 + }, 6034 + "ora": { 6035 + "version": "5.4.1", 6036 + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", 6037 + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", 6038 + "dev": true, 6039 + "requires": { 6040 + "bl": "^4.1.0", 6041 + "chalk": "^4.1.0", 6042 + "cli-cursor": "^3.1.0", 6043 + "cli-spinners": "^2.5.0", 6044 + "is-interactive": "^1.0.0", 6045 + "is-unicode-supported": "^0.1.0", 6046 + "log-symbols": "^4.1.0", 6047 + "strip-ansi": "^6.0.0", 6048 + "wcwidth": "^1.0.1" 6049 + } 6050 + }, 6051 + "p-cancelable": { 6052 + "version": "2.1.1", 6053 + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", 6054 + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", 6055 + "dev": true 6056 + }, 6057 + "p-limit": { 6058 + "version": "2.3.0", 6059 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 6060 + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 6061 + "dev": true, 6062 + "requires": { 6063 + "p-try": "^2.0.0" 6064 + } 6065 + }, 6066 + "p-locate": { 6067 + "version": "4.1.0", 6068 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 6069 + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 6070 + "dev": true, 6071 + "requires": { 6072 + "p-limit": "^2.2.0" 6073 + } 6074 + }, 6075 + "p-retry": { 6076 + "version": "4.6.2", 6077 + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", 6078 + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", 6079 + "requires": { 6080 + "@types/retry": "0.12.0", 6081 + "retry": "^0.13.1" 6082 + } 6083 + }, 6084 + "p-try": { 6085 + "version": "2.2.0", 6086 + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 6087 + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 6088 + "dev": true 6089 + }, 6090 + "pako": { 6091 + "version": "1.0.11", 6092 + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 6093 + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 6094 + }, 6095 + "parent-module": { 6096 + "version": "1.0.1", 6097 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 6098 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 6099 + "dev": true, 6100 + "requires": { 6101 + "callsites": "^3.0.0" 6102 + } 6103 + }, 6104 + "path-exists": { 6105 + "version": "4.0.0", 6106 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 6107 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 6108 + "dev": true 6109 + }, 6110 + "path-is-absolute": { 6111 + "version": "1.0.1", 6112 + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 6113 + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 6114 + "dev": true 6115 + }, 6116 + "path-key": { 6117 + "version": "3.1.1", 6118 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 6119 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 6120 + "dev": true 6121 + }, 6122 + "path-parse": { 6123 + "version": "1.0.7", 6124 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 6125 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 6126 + "dev": true 6127 + }, 6128 + "peek-readable": { 6129 + "version": "4.1.0", 6130 + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", 6131 + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" 6132 + }, 6133 + "picocolors": { 6134 + "version": "1.0.0", 6135 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 6136 + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 6137 + "dev": true 6138 + }, 6139 + "picomatch": { 6140 + "version": "2.3.1", 6141 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 6142 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 6143 + "dev": true 6144 + }, 6145 + "pify": { 6146 + "version": "2.3.0", 6147 + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 6148 + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 6149 + "dev": true 6150 + }, 6151 + "postcss": { 6152 + "version": "8.4.19", 6153 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", 6154 + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", 6155 + "dev": true, 6156 + "requires": { 6157 + "nanoid": "^3.3.4", 6158 + "picocolors": "^1.0.0", 6159 + "source-map-js": "^1.0.2" 6160 + } 6161 + }, 6162 + "postcss-custom-properties": { 6163 + "version": "12.1.11", 6164 + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", 6165 + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", 6166 + "dev": true, 6167 + "requires": { 6168 + "postcss-value-parser": "^4.2.0" 6169 + } 6170 + }, 6171 + "postcss-import": { 6172 + "version": "14.1.0", 6173 + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", 6174 + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", 6175 + "dev": true, 6176 + "requires": { 6177 + "postcss-value-parser": "^4.0.0", 6178 + "read-cache": "^1.0.0", 6179 + "resolve": "^1.1.7" 6180 + } 6181 + }, 6182 + "postcss-js": { 6183 + "version": "4.0.0", 6184 + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 6185 + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 6186 + "dev": true, 6187 + "requires": { 6188 + "camelcase-css": "^2.0.1" 6189 + } 6190 + }, 6191 + "postcss-load-config": { 6192 + "version": "3.1.4", 6193 + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 6194 + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 6195 + "dev": true, 6196 + "requires": { 6197 + "lilconfig": "^2.0.5", 6198 + "yaml": "^1.10.2" 6199 + } 6200 + }, 6201 + "postcss-nested": { 6202 + "version": "6.0.0", 6203 + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", 6204 + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", 6205 + "dev": true, 6206 + "requires": { 6207 + "postcss-selector-parser": "^6.0.10" 6208 + } 6209 + }, 6210 + "postcss-selector-parser": { 6211 + "version": "6.0.11", 6212 + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", 6213 + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", 6214 + "dev": true, 6215 + "requires": { 6216 + "cssesc": "^3.0.0", 6217 + "util-deprecate": "^1.0.2" 6218 + } 6219 + }, 6220 + "postcss-value-parser": { 6221 + "version": "4.2.0", 6222 + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 6223 + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 6224 + "dev": true 6225 + }, 6226 + "prelude-ls": { 6227 + "version": "1.2.1", 6228 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 6229 + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 6230 + "dev": true 6231 + }, 6232 + "process": { 6233 + "version": "0.11.10", 6234 + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 6235 + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" 6236 + }, 6237 + "process-nextick-args": { 6238 + "version": "2.0.1", 6239 + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 6240 + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 6241 + }, 6242 + "prompts": { 6243 + "version": "2.4.2", 6244 + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", 6245 + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", 6246 + "dev": true, 6247 + "requires": { 6248 + "kleur": "^3.0.3", 6249 + "sisteransi": "^1.0.5" 6250 + } 6251 + }, 6252 + "pump": { 6253 + "version": "3.0.0", 6254 + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 6255 + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 6256 + "dev": true, 6257 + "requires": { 6258 + "end-of-stream": "^1.1.0", 6259 + "once": "^1.3.1" 6260 + } 6261 + }, 6262 + "punycode": { 6263 + "version": "2.1.1", 6264 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 6265 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 6266 + "dev": true 6267 + }, 6268 + "queue-microtask": { 6269 + "version": "1.2.3", 6270 + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 6271 + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 6272 + "dev": true 6273 + }, 6274 + "quick-lru": { 6275 + "version": "5.1.1", 6276 + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 6277 + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 6278 + "dev": true 6279 + }, 6280 + "read-cache": { 6281 + "version": "1.0.0", 6282 + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 6283 + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 6284 + "dev": true, 6285 + "requires": { 6286 + "pify": "^2.3.0" 6287 + } 6288 + }, 6289 + "readable-stream": { 6290 + "version": "2.3.7", 6291 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 6292 + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 6293 + "requires": { 6294 + "core-util-is": "~1.0.0", 6295 + "inherits": "~2.0.3", 6296 + "isarray": "~1.0.0", 6297 + "process-nextick-args": "~2.0.0", 6298 + "safe-buffer": "~5.1.1", 6299 + "string_decoder": "~1.1.1", 6300 + "util-deprecate": "~1.0.1" 6301 + } 6302 + }, 6303 + "readable-web-to-node-stream": { 6304 + "version": "3.0.2", 6305 + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 6306 + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 6307 + "requires": { 6308 + "readable-stream": "^3.6.0" 6309 + }, 6310 + "dependencies": { 6311 + "readable-stream": { 6312 + "version": "3.6.0", 6313 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 6314 + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 6315 + "requires": { 6316 + "inherits": "^2.0.3", 6317 + "string_decoder": "^1.1.1", 6318 + "util-deprecate": "^1.0.1" 6319 + } 6320 + } 6321 + } 6322 + }, 6323 + "readdirp": { 6324 + "version": "3.6.0", 6325 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 6326 + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 6327 + "dev": true, 6328 + "requires": { 6329 + "picomatch": "^2.2.1" 6330 + } 6331 + }, 6332 + "regexpp": { 6333 + "version": "3.2.0", 6334 + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 6335 + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 6336 + "dev": true 6337 + }, 6338 + "remotestoragejs": { 6339 + "version": "1.2.3", 6340 + "resolved": "https://registry.npmjs.org/remotestoragejs/-/remotestoragejs-1.2.3.tgz", 6341 + "integrity": "sha512-uXmWjBC3OoPR7q4v5MHAkYCLzNMvCe7afUeDQSoqdQ53Zw4BjhlF8ARGRVhe+5nbCBuJspaA2O5lTiqp4GVdeA==", 6342 + "requires": { 6343 + "tv4": "^1.3.0", 6344 + "webfinger.js": "^2.7.0", 6345 + "xhr2": "^0.2.0" 6346 + } 6347 + }, 6348 + "resolve": { 6349 + "version": "1.22.1", 6350 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 6351 + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 6352 + "dev": true, 6353 + "requires": { 6354 + "is-core-module": "^2.9.0", 6355 + "path-parse": "^1.0.7", 6356 + "supports-preserve-symlinks-flag": "^1.0.0" 6357 + } 6358 + }, 6359 + "resolve-alpn": { 6360 + "version": "1.2.1", 6361 + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", 6362 + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", 6363 + "dev": true 6364 + }, 6365 + "resolve-from": { 6366 + "version": "4.0.0", 6367 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 6368 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 6369 + "dev": true 6370 + }, 6371 + "responselike": { 6372 + "version": "2.0.1", 6373 + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", 6374 + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", 6375 + "dev": true, 6376 + "requires": { 6377 + "lowercase-keys": "^2.0.0" 6378 + } 6379 + }, 6380 + "restore-cursor": { 6381 + "version": "3.1.0", 6382 + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 6383 + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 6384 + "dev": true, 6385 + "requires": { 6386 + "onetime": "^5.1.0", 6387 + "signal-exit": "^3.0.2" 6388 + } 6389 + }, 6390 + "retry": { 6391 + "version": "0.13.1", 6392 + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", 6393 + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" 6394 + }, 6395 + "reusify": { 6396 + "version": "1.0.4", 6397 + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 6398 + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 6399 + "dev": true 6400 + }, 6401 + "rimraf": { 6402 + "version": "3.0.2", 6403 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 6404 + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 6405 + "dev": true, 6406 + "requires": { 6407 + "glob": "^7.1.3" 6408 + } 6409 + }, 6410 + "run-parallel": { 6411 + "version": "1.2.0", 6412 + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 6413 + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 6414 + "dev": true, 6415 + "requires": { 6416 + "queue-microtask": "^1.2.2" 6417 + } 6418 + }, 6419 + "safe-buffer": { 6420 + "version": "5.1.2", 6421 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 6422 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 6423 + }, 6424 + "setimmediate": { 6425 + "version": "1.0.5", 6426 + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 6427 + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" 6428 + }, 6429 + "shebang-command": { 6430 + "version": "2.0.0", 6431 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 6432 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 6433 + "dev": true, 6434 + "requires": { 6435 + "shebang-regex": "^3.0.0" 6436 + } 6437 + }, 6438 + "shebang-regex": { 6439 + "version": "3.0.0", 6440 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 6441 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 6442 + "dev": true 6443 + }, 6444 + "signal-exit": { 6445 + "version": "3.0.7", 6446 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 6447 + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 6448 + "dev": true 6449 + }, 6450 + "sisteransi": { 6451 + "version": "1.0.5", 6452 + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 6453 + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", 6454 + "dev": true 6455 + }, 6456 + "source-map-js": { 6457 + "version": "1.0.2", 6458 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 6459 + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 6460 + "dev": true 6461 + }, 6462 + "string_decoder": { 6463 + "version": "1.1.1", 6464 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 6465 + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 6466 + "requires": { 6467 + "safe-buffer": "~5.1.0" 6468 + } 6469 + }, 6470 + "string-width": { 6471 + "version": "4.2.3", 6472 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 6473 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 6474 + "dev": true, 6475 + "requires": { 6476 + "emoji-regex": "^8.0.0", 6477 + "is-fullwidth-code-point": "^3.0.0", 6478 + "strip-ansi": "^6.0.1" 6479 + } 6480 + }, 6481 + "strip-ansi": { 6482 + "version": "6.0.1", 6483 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 6484 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 6485 + "dev": true, 6486 + "requires": { 6487 + "ansi-regex": "^5.0.1" 6488 + } 6489 + }, 6490 + "strip-json-comments": { 6491 + "version": "3.1.1", 6492 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 6493 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 6494 + "dev": true 6495 + }, 6496 + "strtok3": { 6497 + "version": "6.3.0", 6498 + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", 6499 + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", 6500 + "requires": { 6501 + "@tokenizer/token": "^0.3.0", 6502 + "peek-readable": "^4.1.0" 6503 + } 6504 + }, 6505 + "subworkers": { 6506 + "version": "1.0.1", 6507 + "resolved": "https://registry.npmjs.org/subworkers/-/subworkers-1.0.1.tgz", 6508 + "integrity": "sha512-5R3HH7AMvvuWozRqgOCe/zJic3Hn/mdVHpg7ILuo2BV8qosTiDDngLpsvNernPnUnH57fP3IWU8Eux354E2WcQ==" 6509 + }, 6510 + "supports-color": { 6511 + "version": "7.2.0", 6512 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 6513 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 6514 + "dev": true, 6515 + "requires": { 6516 + "has-flag": "^4.0.0" 6517 + } 6518 + }, 6519 + "supports-hyperlinks": { 6520 + "version": "2.3.0", 6521 + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", 6522 + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", 6523 + "dev": true, 6524 + "requires": { 6525 + "has-flag": "^4.0.0", 6526 + "supports-color": "^7.0.0" 6527 + } 6528 + }, 6529 + "supports-preserve-symlinks-flag": { 6530 + "version": "1.0.0", 6531 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 6532 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 6533 + "dev": true 6534 + }, 6535 + "tailwindcss": { 6536 + "version": "3.2.4", 6537 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", 6538 + "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", 6539 + "dev": true, 6540 + "requires": { 6541 + "arg": "^5.0.2", 6542 + "chokidar": "^3.5.3", 6543 + "color-name": "^1.1.4", 6544 + "detective": "^5.2.1", 6545 + "didyoumean": "^1.2.2", 6546 + "dlv": "^1.1.3", 6547 + "fast-glob": "^3.2.12", 6548 + "glob-parent": "^6.0.2", 6549 + "is-glob": "^4.0.3", 6550 + "lilconfig": "^2.0.6", 6551 + "micromatch": "^4.0.5", 6552 + "normalize-path": "^3.0.0", 6553 + "object-hash": "^3.0.0", 6554 + "picocolors": "^1.0.0", 6555 + "postcss": "^8.4.18", 6556 + "postcss-import": "^14.1.0", 6557 + "postcss-js": "^4.0.0", 6558 + "postcss-load-config": "^3.1.4", 6559 + "postcss-nested": "6.0.0", 6560 + "postcss-selector-parser": "^6.0.10", 6561 + "postcss-value-parser": "^4.2.0", 6562 + "quick-lru": "^5.1.1", 6563 + "resolve": "^1.22.1" 6564 + }, 6565 + "dependencies": { 6566 + "glob-parent": { 6567 + "version": "6.0.2", 6568 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 6569 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 6570 + "dev": true, 6571 + "requires": { 6572 + "is-glob": "^4.0.3" 6573 + } 6574 + } 6575 + } 6576 + }, 6577 + "tailwindcss-animations": { 6578 + "version": "2.0.0", 6579 + "resolved": "https://registry.npmjs.org/tailwindcss-animations/-/tailwindcss-animations-2.0.0.tgz", 6580 + "integrity": "sha512-YLdhPiQeDtpnqWd0J70rvy08MDbsq+BBLrzMmPR1Pe6MJDFYDuk4CYGI14GVgj7xRBGkByzp/rAfBcUWD7zpng==", 6581 + "dev": true, 6582 + "requires": { 6583 + "lodash": "^4.17.15" 6584 + } 6585 + }, 6586 + "tailwindcss-interaction-variants": { 6587 + "version": "5.0.0", 6588 + "resolved": "https://registry.npmjs.org/tailwindcss-interaction-variants/-/tailwindcss-interaction-variants-5.0.0.tgz", 6589 + "integrity": "sha512-Tmx9HjwuNA3G7cLUcebGkNchKkNVIZXBroxa0LBoq/KUb/xEKEM8qugUG7QczSNPhaZzpXmo3IzPkRhf4tDaOQ==", 6590 + "dev": true, 6591 + "requires": { 6592 + "lodash": "^4.17.19", 6593 + "postcss-selector-parser": "^6.0.2" 6594 + } 6595 + }, 6596 + "temp": { 6597 + "version": "0.9.4", 6598 + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", 6599 + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", 6600 + "dev": true, 6601 + "requires": { 6602 + "mkdirp": "^0.5.1", 6603 + "rimraf": "~2.6.2" 6604 + }, 6605 + "dependencies": { 6606 + "rimraf": { 6607 + "version": "2.6.3", 6608 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 6609 + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 6610 + "dev": true, 6611 + "requires": { 6612 + "glob": "^7.1.3" 6613 + } 6614 + } 6615 + } 6616 + }, 6617 + "terminal-link": { 6618 + "version": "2.1.1", 6619 + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", 6620 + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", 6621 + "dev": true, 6622 + "requires": { 6623 + "ansi-escapes": "^4.2.1", 6624 + "supports-hyperlinks": "^2.0.0" 6625 + } 6626 + }, 6627 + "text-table": { 6628 + "version": "0.2.0", 6629 + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 6630 + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 6631 + "dev": true 6632 + }, 6633 + "timer.js": { 6634 + "version": "1.0.4", 6635 + "resolved": "https://registry.npmjs.org/timer.js/-/timer.js-1.0.4.tgz", 6636 + "integrity": "sha512-UU/lL02CjPMu8cu29h/uyt5yBqcm0vlx51Je9xCmVcH+TLS+X/+chv4V4rHlb37ZiI4iUVyLuC3QvyoFMzadwQ==" 6637 + }, 6638 + "to-regex-range": { 6639 + "version": "5.0.1", 6640 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 6641 + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 6642 + "dev": true, 6643 + "requires": { 6644 + "is-number": "^7.0.0" 6645 + } 6646 + }, 6647 + "tocca": { 6648 + "version": "2.0.9", 6649 + "resolved": "https://registry.npmjs.org/tocca/-/tocca-2.0.9.tgz", 6650 + "integrity": "sha512-FXofUGAFcgEIEOS3m9Dk9URaY3x+JeerPfVFc8K820PjV0JcCsH98BFxrVOTANC8YvM4QTrmKMol2/818gFmCw==" 6651 + }, 6652 + "token-types": { 6653 + "version": "4.2.1", 6654 + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", 6655 + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", 6656 + "requires": { 6657 + "@tokenizer/token": "^0.3.0", 6658 + "ieee754": "^1.2.1" 6659 + } 6660 + }, 6661 + "tr46": { 6662 + "version": "0.0.3", 6663 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 6664 + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 6665 + }, 6666 + "tv4": { 6667 + "version": "1.3.0", 6668 + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", 6669 + "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==" 6670 + }, 6671 + "type-check": { 6672 + "version": "0.4.0", 6673 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 6674 + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 6675 + "dev": true, 6676 + "requires": { 6677 + "prelude-ls": "^1.2.1" 6678 + } 6679 + }, 6680 + "type-fest": { 6681 + "version": "0.20.2", 6682 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 6683 + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 6684 + "dev": true 6685 + }, 6686 + "universalify": { 6687 + "version": "2.0.0", 6688 + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", 6689 + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", 6690 + "dev": true 6691 + }, 6692 + "update-browserslist-db": { 6693 + "version": "1.0.10", 6694 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 6695 + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 6696 + "dev": true, 6697 + "requires": { 6698 + "escalade": "^3.1.1", 6699 + "picocolors": "^1.0.0" 6700 + } 6701 + }, 6702 + "uri-js": { 6703 + "version": "4.4.1", 6704 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 6705 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 6706 + "dev": true, 6707 + "requires": { 6708 + "punycode": "^2.1.0" 6709 + } 6710 + }, 6711 + "util": { 6712 + "version": "0.12.5", 6713 + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", 6714 + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", 6715 + "dev": true, 6716 + "requires": { 6717 + "inherits": "^2.0.3", 6718 + "is-arguments": "^1.0.4", 6719 + "is-generator-function": "^1.0.7", 6720 + "is-typed-array": "^1.1.3", 6721 + "which-typed-array": "^1.1.2" 6722 + } 6723 + }, 6724 + "util-deprecate": { 6725 + "version": "1.0.2", 6726 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 6727 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 6728 + }, 6729 + "wcwidth": { 6730 + "version": "1.0.1", 6731 + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 6732 + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", 6733 + "dev": true, 6734 + "requires": { 6735 + "defaults": "^1.0.3" 6736 + } 6737 + }, 6738 + "webfinger.js": { 6739 + "version": "2.7.1", 6740 + "resolved": "https://registry.npmjs.org/webfinger.js/-/webfinger.js-2.7.1.tgz", 6741 + "integrity": "sha512-H4RokaE4RC39N3uiRTcjKMmy6yYg06lUPORQHvv8DjowZ6I5SalxUeoqHbtTN3EVBmYP/XHQ8Ow6BLEIpe2DtA==", 6742 + "requires": { 6743 + "xhr2": "0.2.1" 6744 + } 6745 + }, 6746 + "webidl-conversions": { 6747 + "version": "3.0.1", 6748 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 6749 + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 6750 + }, 6751 + "webnative": { 6752 + "version": "file:../../Work/webnative", 6753 + "requires": { 6754 + "@esbuild-plugins/node-globals-polyfill": "^0.1.1", 6755 + "@ipld/car": "^5.0.0", 6756 + "@ipld/dag-cbor": "^8.0.0", 6757 + "@ipld/dag-pb": "^3.0.1", 6758 + "@libp2p/interface-keys": "^1.0.4", 6759 + "@libp2p/peer-id": "^1.1.17", 6760 + "@multiformats/multiaddr": "^11.1.0", 6761 + "@types/expect": "^24.3.0", 6762 + "@types/mocha": "^10.0.0", 6763 + "@types/node": "^18.11.9", 6764 + "@types/throttle-debounce": "^2.1.0", 6765 + "@typescript-eslint/eslint-plugin": "^5.10.0", 6766 + "@typescript-eslint/parser": "^5.10.0", 6767 + "blockstore-core": "^2.0.2", 6768 + "blockstore-datastore-adapter": "^4.0.0", 6769 + "copyfiles": "^2.4.1", 6770 + "datastore-core": "^8.0.2", 6771 + "datastore-level": "^9.0.4", 6772 + "esbuild": "^0.15.13", 6773 + "eslint": "^8.7.0", 6774 + "events": "^3.3.0", 6775 + "expect": "^27.4.6", 6776 + "fast-check": "^3.3.0", 6777 + "fission-bloom-filters": "1.7.1", 6778 + "globby": "^13.1.2", 6779 + "ipfs-core": "0.17.0", 6780 + "ipfs-core-types": "0.13.0", 6781 + "ipfs-repo": "^16.0.0", 6782 + "keystore-idb": "^0.15.5", 6783 + "localforage": "^1.10.0", 6784 + "localforage-driver-memory": "^1.0.5", 6785 + "madge": "^5.0.1", 6786 + "mocha": "^10.1.0", 6787 + "multiformats": "^10.0.2", 6788 + "one-webcrypto": "^1.0.3", 6789 + "rimraf": "^3.0.2", 6790 + "throttle-debounce": "^3.0.1", 6791 + "ts-node": "^10.9.1", 6792 + "tslib": "^2.4.1", 6793 + "tweetnacl": "^1.0.3", 6794 + "typedoc": "^0.23.21", 6795 + "typedoc-plugin-missing-exports": "^1.0.0", 6796 + "typescript": "^4.8.4", 6797 + "uint8arrays": "^3.0.0", 6798 + "util": "^0.12.4", 6799 + "wnfs": "0.1.10" 6800 + } 6801 + }, 6802 + "whatwg-url": { 6803 + "version": "5.0.0", 6804 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 6805 + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 6806 + "requires": { 6807 + "tr46": "~0.0.3", 6808 + "webidl-conversions": "^3.0.0" 6809 + } 6810 + }, 6811 + "which": { 6812 + "version": "2.0.2", 6813 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 6814 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 6815 + "dev": true, 6816 + "requires": { 6817 + "isexe": "^2.0.0" 6818 + } 6819 + }, 6820 + "which-typed-array": { 6821 + "version": "1.1.9", 6822 + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", 6823 + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", 6824 + "dev": true, 6825 + "requires": { 6826 + "available-typed-arrays": "^1.0.5", 6827 + "call-bind": "^1.0.2", 6828 + "for-each": "^0.3.3", 6829 + "gopd": "^1.0.1", 6830 + "has-tostringtag": "^1.0.0", 6831 + "is-typed-array": "^1.1.10" 6832 + } 6833 + }, 6834 + "word-wrap": { 6835 + "version": "1.2.3", 6836 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 6837 + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 6838 + "dev": true 6839 + }, 6840 + "wrap-ansi": { 6841 + "version": "6.2.0", 6842 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 6843 + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 6844 + "dev": true, 6845 + "requires": { 6846 + "ansi-styles": "^4.0.0", 6847 + "string-width": "^4.1.0", 6848 + "strip-ansi": "^6.0.0" 6849 + } 6850 + }, 6851 + "wrappy": { 6852 + "version": "1.0.2", 6853 + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 6854 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 6855 + "dev": true 6856 + }, 6857 + "xhr2": { 6858 + "version": "0.2.1", 6859 + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", 6860 + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==" 6861 + }, 6862 + "xtend": { 6863 + "version": "4.0.2", 6864 + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 6865 + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 6866 + "dev": true 6867 + }, 6868 + "yaml": { 6869 + "version": "1.10.2", 6870 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 6871 + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 6872 + "dev": true 6873 + }, 6874 + "yocto-queue": { 6875 + "version": "0.1.0", 6876 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 6877 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 6878 + "dev": true 6879 + } 6880 + } 6881 + }
+14 -14
package.json
··· 1 1 { 2 - "name": "Diffuse", 2 + "name": "diffuse", 3 3 "description": "A music player that connects to your cloud/distributed storage", 4 - "version": "3.2.0", 4 + "version": "3.3.0", 5 5 "author": "Steven Vandevelde <icid.asset@gmail.com>", 6 6 "homepage": "https://diffuse.sh", 7 7 "repository": "github:icidasset/diffuse", 8 8 "license": "SEE LICENSE IN LICENSE", 9 9 "devDependencies": { 10 10 "assert": "^2.0.0", 11 - "autoprefixer": "^10.4.7", 11 + "autoprefixer": "^10.4.13", 12 12 "buffer": "^6.0.3", 13 - "elm-review": "^2.7.2", 14 - "esbuild": "^0.14.42", 15 - "eslint": "^8.17.0", 13 + "elm-review": "^2.8.5", 14 + "esbuild": "^0.16.4", 15 + "eslint": "^8.29.0", 16 16 "events": "^3.3.0", 17 - "postcss": "^8.4.14", 18 - "postcss-custom-properties": "^12.1.7", 17 + "postcss": "^8.4.19", 18 + "postcss-custom-properties": "^12.1.11", 19 19 "postcss-import": "^14.1.0", 20 - "tailwindcss": "^3.0.24", 20 + "tailwindcss": "^3.2.4", 21 21 "tailwindcss-animations": "^2.0.0", 22 22 "tailwindcss-interaction-variants": "^5.0.0" 23 23 }, 24 24 "dependencies": { 25 25 "@tokenizer/http": "^0.6.2", 26 26 "delay": "^5.0.0", 27 - "fast-text-encoding": "^1.0.3", 27 + "elm-taskport": "^2.0.1", 28 + "fast-text-encoding": "^1.0.6", 28 29 "file-saver": "^2.0.2", 29 30 "jszip": "^3.7.1", 30 31 "load-script2": "^2.0.5", 31 32 "lunr": "^2.3.8", 32 - "music-metadata-browser": "^2.5.6", 33 - "p-retry": "^4.6.1", 33 + "music-metadata-browser": "^2.5.9", 34 + "p-retry": "^4.6.2", 34 35 "remotestoragejs": "^1.2.3", 35 36 "subworkers": "^1.0.1", 36 37 "timer.js": "^1.0.4", 37 38 "tocca": "^2.0.9", 38 - "webnative": "^0.34.0", 39 - "webnative-elm": "7.0.0" 39 + "webnative": "file:../../Work/webnative" 40 40 } 41 41 }
-3444
pnpm-lock.yaml
··· 1 - lockfileVersion: 5.4 2 - 3 - specifiers: 4 - '@tokenizer/http': ^0.6.2 5 - assert: ^2.0.0 6 - autoprefixer: ^10.4.7 7 - buffer: ^6.0.3 8 - delay: ^5.0.0 9 - elm-review: ^2.7.2 10 - esbuild: ^0.14.42 11 - eslint: ^8.17.0 12 - events: ^3.3.0 13 - fast-text-encoding: ^1.0.3 14 - file-saver: ^2.0.2 15 - jszip: ^3.7.1 16 - load-script2: ^2.0.5 17 - lunr: ^2.3.8 18 - music-metadata-browser: ^2.5.6 19 - p-retry: ^4.6.1 20 - postcss: ^8.4.14 21 - postcss-custom-properties: ^12.1.7 22 - postcss-import: ^14.1.0 23 - remotestoragejs: ^1.2.3 24 - subworkers: ^1.0.1 25 - tailwindcss: ^3.0.24 26 - tailwindcss-animations: ^2.0.0 27 - tailwindcss-interaction-variants: ^5.0.0 28 - timer.js: ^1.0.4 29 - tocca: ^2.0.9 30 - webnative: ^0.34.0 31 - webnative-elm: 7.0.0 32 - 33 - dependencies: 34 - '@tokenizer/http': 0.6.2 35 - delay: 5.0.0 36 - fast-text-encoding: 1.0.3 37 - file-saver: 2.0.5 38 - jszip: 3.7.1 39 - load-script2: 2.0.6 40 - lunr: 2.3.9 41 - music-metadata-browser: 2.5.6 42 - p-retry: 4.6.1 43 - remotestoragejs: 1.2.3 44 - subworkers: 1.0.1 45 - timer.js: 1.0.4 46 - tocca: 2.0.9 47 - webnative: 0.34.1 48 - webnative-elm: 7.0.0_webnative@0.34.1 49 - 50 - devDependencies: 51 - assert: 2.0.0 52 - autoprefixer: 10.4.7_postcss@8.4.14 53 - buffer: 6.0.3 54 - elm-review: 2.7.2 55 - esbuild: 0.14.42 56 - eslint: 8.17.0 57 - events: 3.3.0 58 - postcss: 8.4.14 59 - postcss-custom-properties: 12.1.7_postcss@8.4.14 60 - postcss-import: 14.1.0_postcss@8.4.14 61 - tailwindcss: 3.0.24_postcss@8.4.14 62 - tailwindcss-animations: 2.0.0 63 - tailwindcss-interaction-variants: 5.0.0 64 - 65 - packages: 66 - 67 - /@eslint/eslintrc/1.3.0: 68 - resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} 69 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 70 - dependencies: 71 - ajv: 6.12.6 72 - debug: 4.3.4 73 - espree: 9.3.2 74 - globals: 13.15.0 75 - ignore: 5.2.0 76 - import-fresh: 3.3.0 77 - js-yaml: 4.1.0 78 - minimatch: 3.1.2 79 - strip-json-comments: 3.1.1 80 - transitivePeerDependencies: 81 - - supports-color 82 - dev: true 83 - 84 - /@humanwhocodes/config-array/0.9.3: 85 - resolution: {integrity: sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==} 86 - engines: {node: '>=10.10.0'} 87 - dependencies: 88 - '@humanwhocodes/object-schema': 1.2.1 89 - debug: 4.3.4 90 - minimatch: 3.1.2 91 - transitivePeerDependencies: 92 - - supports-color 93 - dev: true 94 - 95 - /@humanwhocodes/object-schema/1.2.1: 96 - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 97 - dev: true 98 - 99 - /@ipld/dag-cbor/7.0.3: 100 - resolution: {integrity: sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==} 101 - dependencies: 102 - cborg: 1.6.1 103 - multiformats: 9.6.3 104 - dev: false 105 - 106 - /@ipld/dag-pb/2.1.18: 107 - resolution: {integrity: sha512-ZBnf2fuX9y3KccADURG5vb9FaOeMjFkCrNysB0PtftME/4iCTjxfaLoNq/IAh5fTqUOMXvryN6Jyka4ZGuMLIg==} 108 - dependencies: 109 - multiformats: 9.6.3 110 - dev: false 111 - 112 - /@libp2p/interface-connection/3.0.1: 113 - resolution: {integrity: sha512-x+Ws74EhxvSym2fTQMP8/xpV3p8A3ar8yOq4dq/44HSvEMMKcuQvEq2jShVK0aXEpg1ce/KHY83FgY1zToFM2A==} 114 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 115 - dependencies: 116 - '@libp2p/interface-peer-id': 1.0.4 117 - '@libp2p/interfaces': 3.0.3 118 - '@multiformats/multiaddr': 10.4.0 119 - it-stream-types: 1.0.4 120 - uint8arraylist: 2.3.2 121 - transitivePeerDependencies: 122 - - supports-color 123 - - undici 124 - dev: false 125 - 126 - /@libp2p/interface-keychain/1.0.3: 127 - resolution: {integrity: sha512-JCqe43LNwfgkZgT9bzUlrvaLzJmgIbY1MtsTxdJD/D9I7YyknTSGR3YII9BG0kRzex568/yiqlKxkYboxfh+BQ==} 128 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 129 - dependencies: 130 - multiformats: 9.6.3 131 - dev: false 132 - 133 - /@libp2p/interface-keys/1.0.3: 134 - resolution: {integrity: sha512-K8/HlRl/swbVTWuGHNHF28EytszYfUhKgUHfv8CdbMk9ZA/bgO4uU+d9rcrg/Dhw3511U3aRz2bwl2psn6rJfg==} 135 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 136 - dev: false 137 - 138 - /@libp2p/interface-peer-id/1.0.4: 139 - resolution: {integrity: sha512-VRnE0MqmS1kN43hyKCEdkhz0gciuDML7hpL3p8zDm0LnveNMLJsR+/VSUaugCi/muOzLaLk26WffKWbMYfnGfA==} 140 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 141 - dependencies: 142 - multiformats: 9.6.3 143 - dev: false 144 - 145 - /@libp2p/interface-peer-info/1.0.2: 146 - resolution: {integrity: sha512-8dGBj8+6PdBDsMAASxX2sECnWhK7zAnv8iCFgYXY5Z6fbQwA+7iVAea9FdjgyLapdIzDarttPt3Gdou8tXZdGg==} 147 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 148 - dependencies: 149 - '@libp2p/interface-peer-id': 1.0.4 150 - '@multiformats/multiaddr': 10.4.0 151 - transitivePeerDependencies: 152 - - supports-color 153 - - undici 154 - dev: false 155 - 156 - /@libp2p/interface-pubsub/2.0.1: 157 - resolution: {integrity: sha512-j6XSYz5Ir5yJH6KCtYMUGYlbBFfDGx/vPfFe1X3UFIC6qZ9N+IMkde6C5DCQ8calhCyM1pB2K5StAlztsZV2BQ==} 158 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 159 - dependencies: 160 - '@libp2p/interface-connection': 3.0.1 161 - '@libp2p/interface-peer-id': 1.0.4 162 - '@libp2p/interfaces': 3.0.3 163 - it-pushable: 3.1.0 164 - uint8arraylist: 2.3.2 165 - transitivePeerDependencies: 166 - - supports-color 167 - - undici 168 - dev: false 169 - 170 - /@libp2p/interfaces/3.0.3: 171 - resolution: {integrity: sha512-8IIxw7TKpaYTtVfZN3jePLlm/E/VzqPpqerN+jhA+1s86akRSeyxVBYi3W9SWDSf0oIauHJSDE8KNxLceAfeag==} 172 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 173 - dev: false 174 - 175 - /@libp2p/logger/2.0.1: 176 - resolution: {integrity: sha512-Mtj7ImjRYbaANuT53QRqc7ooBYpWieLo7KbqYYGas5O2AWQeOu/zyGBMM35WbWIo7sMuhCas9XBPJdFOR7A05w==} 177 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 178 - dependencies: 179 - '@libp2p/interface-peer-id': 1.0.4 180 - debug: 4.3.4 181 - interface-datastore: 7.0.0 182 - multiformats: 9.6.3 183 - transitivePeerDependencies: 184 - - supports-color 185 - dev: false 186 - 187 - /@libp2p/peer-id/1.1.15: 188 - resolution: {integrity: sha512-Y33JLEfsLmLUjuC2nhQ2lBXP6PIsR892gSsNy4Vd7oILkuRhjPouIojP9BbME0m9bhVbAws+Zh9NBKtp7UH7wA==} 189 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 190 - dependencies: 191 - '@libp2p/interface-peer-id': 1.0.4 192 - err-code: 3.0.1 193 - multiformats: 9.6.3 194 - uint8arrays: 3.0.0 195 - dev: false 196 - 197 - /@multiformats/base-x/4.0.1: 198 - resolution: {integrity: sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==} 199 - dev: false 200 - 201 - /@multiformats/multiaddr/10.4.0: 202 - resolution: {integrity: sha512-yKGscSuSmv/6anczK4WmRGgYzRRxqRrL9wLnNVIL4sYzQdaHkhqDGksI7L0z1RFZ/MY4wiud4hcB6VuKd9pmbw==} 203 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 204 - dependencies: 205 - dns-over-http-resolver: 2.1.0 206 - err-code: 3.0.1 207 - is-ip: 5.0.0 208 - multiformats: 9.6.3 209 - uint8arrays: 3.0.0 210 - varint: 6.0.0 211 - transitivePeerDependencies: 212 - - supports-color 213 - - undici 214 - dev: false 215 - 216 - /@nodelib/fs.scandir/2.1.5: 217 - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 218 - engines: {node: '>= 8'} 219 - dependencies: 220 - '@nodelib/fs.stat': 2.0.5 221 - run-parallel: 1.2.0 222 - dev: true 223 - 224 - /@nodelib/fs.stat/2.0.5: 225 - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 226 - engines: {node: '>= 8'} 227 - dev: true 228 - 229 - /@nodelib/fs.walk/1.2.8: 230 - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 231 - engines: {node: '>= 8'} 232 - dependencies: 233 - '@nodelib/fs.scandir': 2.1.5 234 - fastq: 1.11.1 235 - dev: true 236 - 237 - /@protobufjs/aspromise/1.1.2: 238 - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} 239 - dev: false 240 - 241 - /@protobufjs/base64/1.1.2: 242 - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} 243 - dev: false 244 - 245 - /@protobufjs/codegen/2.0.4: 246 - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} 247 - dev: false 248 - 249 - /@protobufjs/eventemitter/1.1.0: 250 - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} 251 - dev: false 252 - 253 - /@protobufjs/fetch/1.1.0: 254 - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} 255 - dependencies: 256 - '@protobufjs/aspromise': 1.1.2 257 - '@protobufjs/inquire': 1.1.0 258 - dev: false 259 - 260 - /@protobufjs/float/1.0.2: 261 - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} 262 - dev: false 263 - 264 - /@protobufjs/inquire/1.1.0: 265 - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} 266 - dev: false 267 - 268 - /@protobufjs/path/1.1.2: 269 - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} 270 - dev: false 271 - 272 - /@protobufjs/pool/1.1.0: 273 - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} 274 - dev: false 275 - 276 - /@protobufjs/utf8/1.1.0: 277 - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} 278 - dev: false 279 - 280 - /@sindresorhus/is/2.1.1: 281 - resolution: {integrity: sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==} 282 - engines: {node: '>=10'} 283 - dev: true 284 - 285 - /@szmarczak/http-timer/4.0.5: 286 - resolution: {integrity: sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==} 287 - engines: {node: '>=10'} 288 - dependencies: 289 - defer-to-connect: 2.0.0 290 - dev: true 291 - 292 - /@tokenizer/http/0.6.2: 293 - resolution: {integrity: sha512-0+gTDUT9EYxbJvDYRk65Itw68gfGPUmUNz9hlAA4j/Mih7QOfyN6fVxvtTB6ytgOTo7GU1x9KRIGlrqVdjHSYw==} 294 - dependencies: 295 - '@tokenizer/range': 0.5.1 296 - debug: 4.3.4 297 - node-fetch: 2.6.7 298 - strtok3: 6.3.0 299 - transitivePeerDependencies: 300 - - encoding 301 - - supports-color 302 - dev: false 303 - 304 - /@tokenizer/range/0.5.1: 305 - resolution: {integrity: sha512-yXASo+mUC/NO954ZaVXmv+pD3wUUoq9P3lQ4MQ8JfYxmivSFXte1TbHDqqsW7seWxqiPttA+0LaZKmFP+1jYjA==} 306 - engines: {node: '>=10'} 307 - dependencies: 308 - debug: 4.3.4 309 - strtok3: 6.3.0 310 - transitivePeerDependencies: 311 - - supports-color 312 - dev: false 313 - 314 - /@tokenizer/token/0.3.0: 315 - resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} 316 - dev: false 317 - 318 - /@types/cacheable-request/6.0.1: 319 - resolution: {integrity: sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==} 320 - dependencies: 321 - '@types/http-cache-semantics': 4.0.0 322 - '@types/keyv': 3.1.1 323 - '@types/node': 16.4.1 324 - '@types/responselike': 1.0.0 325 - dev: true 326 - 327 - /@types/http-cache-semantics/4.0.0: 328 - resolution: {integrity: sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==} 329 - dev: true 330 - 331 - /@types/keyv/3.1.1: 332 - resolution: {integrity: sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==} 333 - dependencies: 334 - '@types/node': 16.4.1 335 - dev: true 336 - 337 - /@types/long/4.0.1: 338 - resolution: {integrity: sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==} 339 - dev: false 340 - 341 - /@types/node/16.4.1: 342 - resolution: {integrity: sha512-UW7cbLqf/Wu5XH2RKKY1cHwUNLicIDRLMraYKz+HHAerJ0ZffUEk+fMnd8qU2JaS6cAy0r8tsaf7yqHASf/Y0Q==} 343 - dev: true 344 - 345 - /@types/node/18.7.15: 346 - resolution: {integrity: sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ==} 347 - dev: false 348 - 349 - /@types/responselike/1.0.0: 350 - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} 351 - dependencies: 352 - '@types/node': 16.4.1 353 - dev: true 354 - 355 - /@types/retry/0.12.0: 356 - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} 357 - dev: false 358 - 359 - /@zxing/text-encoding/0.9.0: 360 - resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} 361 - requiresBuild: true 362 - dev: false 363 - optional: true 364 - 365 - /abstract-level/1.0.3: 366 - resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} 367 - engines: {node: '>=12'} 368 - dependencies: 369 - buffer: 6.0.3 370 - catering: 2.1.1 371 - is-buffer: 2.0.5 372 - level-supports: 4.0.1 373 - level-transcoder: 1.0.1 374 - module-error: 1.0.2 375 - queue-microtask: 1.2.3 376 - dev: false 377 - 378 - /acorn-jsx/5.3.2_acorn@8.7.1: 379 - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 380 - peerDependencies: 381 - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 382 - dependencies: 383 - acorn: 8.7.1 384 - dev: true 385 - 386 - /acorn-node/1.8.2: 387 - resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} 388 - dependencies: 389 - acorn: 7.4.1 390 - acorn-walk: 7.2.0 391 - xtend: 4.0.2 392 - dev: true 393 - 394 - /acorn-walk/7.2.0: 395 - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 396 - engines: {node: '>=0.4.0'} 397 - dev: true 398 - 399 - /acorn/7.4.1: 400 - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 401 - engines: {node: '>=0.4.0'} 402 - hasBin: true 403 - dev: true 404 - 405 - /acorn/8.7.1: 406 - resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} 407 - engines: {node: '>=0.4.0'} 408 - hasBin: true 409 - dev: true 410 - 411 - /ajv/6.12.6: 412 - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 413 - dependencies: 414 - fast-deep-equal: 3.1.3 415 - fast-json-stable-stringify: 2.1.0 416 - json-schema-traverse: 0.4.1 417 - uri-js: 4.4.1 418 - dev: true 419 - 420 - /ansi-escapes/4.3.1: 421 - resolution: {integrity: sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==} 422 - engines: {node: '>=8'} 423 - dependencies: 424 - type-fest: 0.11.0 425 - dev: true 426 - 427 - /ansi-regex/5.0.1: 428 - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 429 - engines: {node: '>=8'} 430 - dev: true 431 - 432 - /ansi-styles/4.3.0: 433 - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 434 - engines: {node: '>=8'} 435 - dependencies: 436 - color-convert: 2.0.1 437 - dev: true 438 - 439 - /anymatch/3.1.2: 440 - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 441 - engines: {node: '>= 8'} 442 - dependencies: 443 - normalize-path: 3.0.0 444 - picomatch: 2.3.0 445 - dev: true 446 - 447 - /arg/5.0.1: 448 - resolution: {integrity: sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==} 449 - dev: true 450 - 451 - /argparse/2.0.1: 452 - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 453 - dev: true 454 - 455 - /assert/2.0.0: 456 - resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} 457 - dependencies: 458 - es6-object-assign: 1.1.0 459 - is-nan: 1.3.2 460 - object-is: 1.1.5 461 - util: 0.12.4 462 - dev: true 463 - 464 - /at-least-node/1.0.0: 465 - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} 466 - engines: {node: '>= 4.0.0'} 467 - dev: true 468 - 469 - /autoprefixer/10.4.7_postcss@8.4.14: 470 - resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==} 471 - engines: {node: ^10 || ^12 || >=14} 472 - hasBin: true 473 - peerDependencies: 474 - postcss: ^8.1.0 475 - dependencies: 476 - browserslist: 4.20.3 477 - caniuse-lite: 1.0.30001346 478 - fraction.js: 4.2.0 479 - normalize-range: 0.1.2 480 - picocolors: 1.0.0 481 - postcss: 8.4.14 482 - postcss-value-parser: 4.2.0 483 - dev: true 484 - 485 - /available-typed-arrays/1.0.4: 486 - resolution: {integrity: sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==} 487 - engines: {node: '>= 0.4'} 488 - 489 - /balanced-match/1.0.2: 490 - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 491 - dev: true 492 - 493 - /base64-js/1.5.1: 494 - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 495 - 496 - /binary-extensions/2.1.0: 497 - resolution: {integrity: sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==} 498 - engines: {node: '>=8'} 499 - dev: true 500 - 501 - /bl/4.1.0: 502 - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 503 - dependencies: 504 - buffer: 5.7.1 505 - inherits: 2.0.4 506 - readable-stream: 3.6.0 507 - dev: true 508 - 509 - /blakejs/1.1.0: 510 - resolution: {integrity: sha512-1TSf2Cf2KycDPzjJpzamYhr6PFSEgKWyoc4rQ/BarXJzp/jM0FC7yP1rLWtMOWT2EIJtjPv9fwpKquRNbRV7Lg==} 511 - dev: false 512 - 513 - /blockstore-core/2.0.1: 514 - resolution: {integrity: sha512-YRT0Y6Qh4ebt3GFFbHn4rQS1VGjT0gEZX6w7ZCQjnX+iZdrVXob4/IoSCVfYxGePs7hi7xsov10Yh9sLvxBeFA==} 515 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 516 - dependencies: 517 - err-code: 3.0.1 518 - interface-blockstore: 3.0.0 519 - interface-store: 3.0.0 520 - it-all: 1.0.6 521 - it-drain: 1.0.5 522 - it-filter: 1.0.3 523 - it-take: 1.0.2 524 - multiformats: 9.6.3 525 - dev: false 526 - 527 - /blockstore-datastore-adapter/3.0.1: 528 - resolution: {integrity: sha512-mhYy0IAc0ORz6phIjbbmL78aW0Tfhy9hAIugKEOcZ9gC0E6CJinZRljgWP68HFZ7ia3jGVcqDNNP17J6x5mYug==} 529 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 530 - dependencies: 531 - blockstore-core: 2.0.1 532 - err-code: 3.0.1 533 - interface-blockstore: 3.0.0 534 - interface-datastore: 7.0.0 535 - it-drain: 1.0.5 536 - it-pushable: 3.1.0 537 - multiformats: 9.6.3 538 - dev: false 539 - 540 - /brace-expansion/1.1.11: 541 - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 542 - dependencies: 543 - balanced-match: 1.0.2 544 - concat-map: 0.0.1 545 - dev: true 546 - 547 - /braces/3.0.2: 548 - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 549 - engines: {node: '>=8'} 550 - dependencies: 551 - fill-range: 7.0.1 552 - dev: true 553 - 554 - /browser-level/1.0.1: 555 - resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} 556 - dependencies: 557 - abstract-level: 1.0.3 558 - catering: 2.1.1 559 - module-error: 1.0.2 560 - run-parallel-limit: 1.1.0 561 - dev: false 562 - 563 - /browserslist/4.20.3: 564 - resolution: {integrity: sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==} 565 - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 566 - hasBin: true 567 - dependencies: 568 - caniuse-lite: 1.0.30001346 569 - electron-to-chromium: 1.4.146 570 - escalade: 3.1.1 571 - node-releases: 2.0.5 572 - picocolors: 1.0.0 573 - dev: true 574 - 575 - /buffer/5.7.1: 576 - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 577 - dependencies: 578 - base64-js: 1.5.1 579 - ieee754: 1.2.1 580 - dev: true 581 - 582 - /buffer/6.0.3: 583 - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 584 - dependencies: 585 - base64-js: 1.5.1 586 - ieee754: 1.2.1 587 - 588 - /bytes/3.1.2: 589 - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 590 - engines: {node: '>= 0.8'} 591 - dev: false 592 - 593 - /cacheable-lookup/2.0.1: 594 - resolution: {integrity: sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==} 595 - engines: {node: '>=10'} 596 - dependencies: 597 - '@types/keyv': 3.1.1 598 - keyv: 4.0.3 599 - dev: true 600 - 601 - /cacheable-request/7.0.1: 602 - resolution: {integrity: sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==} 603 - engines: {node: '>=8'} 604 - dependencies: 605 - clone-response: 1.0.2 606 - get-stream: 5.2.0 607 - http-cache-semantics: 4.1.0 608 - keyv: 4.0.3 609 - lowercase-keys: 2.0.0 610 - normalize-url: 4.5.0 611 - responselike: 2.0.0 612 - dev: true 613 - 614 - /call-bind/1.0.2: 615 - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 616 - dependencies: 617 - function-bind: 1.1.1 618 - get-intrinsic: 1.1.1 619 - 620 - /callsites/3.1.0: 621 - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 622 - engines: {node: '>=6'} 623 - dev: true 624 - 625 - /camelcase-css/2.0.1: 626 - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 627 - engines: {node: '>= 6'} 628 - dev: true 629 - 630 - /caniuse-lite/1.0.30001346: 631 - resolution: {integrity: sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==} 632 - dev: true 633 - 634 - /catering/2.1.1: 635 - resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} 636 - engines: {node: '>=6'} 637 - dev: false 638 - 639 - /cborg/1.6.1: 640 - resolution: {integrity: sha512-dOGlTG610S6t3j7EYFxPBH7KiF1OlSAdWtMI4Iv1dabcId/L/nUvkfOEPge+vDp9YoPerEMiDoy5+Vm2oEqmQw==} 641 - hasBin: true 642 - dev: false 643 - 644 - /chalk/4.1.2: 645 - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 646 - engines: {node: '>=10'} 647 - dependencies: 648 - ansi-styles: 4.3.0 649 - supports-color: 7.2.0 650 - dev: true 651 - 652 - /chokidar/3.5.3: 653 - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 654 - engines: {node: '>= 8.10.0'} 655 - dependencies: 656 - anymatch: 3.1.2 657 - braces: 3.0.2 658 - glob-parent: 5.1.2 659 - is-binary-path: 2.1.0 660 - is-glob: 4.0.3 661 - normalize-path: 3.0.0 662 - readdirp: 3.6.0 663 - optionalDependencies: 664 - fsevents: 2.3.2 665 - dev: true 666 - 667 - /cids/1.1.9: 668 - resolution: {integrity: sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg==} 669 - engines: {node: '>=4.0.0', npm: '>=3.0.0'} 670 - deprecated: This module has been superseded by the multiformats module 671 - dependencies: 672 - multibase: 4.0.6 673 - multicodec: 3.2.1 674 - multihashes: 4.0.3 675 - uint8arrays: 3.0.0 676 - dev: false 677 - 678 - /classic-level/1.2.0: 679 - resolution: {integrity: sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==} 680 - engines: {node: '>=12'} 681 - requiresBuild: true 682 - dependencies: 683 - abstract-level: 1.0.3 684 - catering: 2.1.1 685 - module-error: 1.0.2 686 - napi-macros: 2.0.0 687 - node-gyp-build: 4.5.0 688 - dev: false 689 - 690 - /cli-cursor/3.1.0: 691 - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} 692 - engines: {node: '>=8'} 693 - dependencies: 694 - restore-cursor: 3.1.0 695 - dev: true 696 - 697 - /cli-spinners/2.5.0: 698 - resolution: {integrity: sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==} 699 - engines: {node: '>=6'} 700 - dev: true 701 - 702 - /clone-regexp/3.0.0: 703 - resolution: {integrity: sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==} 704 - engines: {node: '>=12'} 705 - dependencies: 706 - is-regexp: 3.1.0 707 - dev: false 708 - 709 - /clone-response/1.0.2: 710 - resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} 711 - dependencies: 712 - mimic-response: 1.0.1 713 - dev: true 714 - 715 - /clone/1.0.4: 716 - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} 717 - engines: {node: '>=0.8'} 718 - dev: true 719 - 720 - /color-convert/2.0.1: 721 - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 722 - engines: {node: '>=7.0.0'} 723 - dependencies: 724 - color-name: 1.1.4 725 - dev: true 726 - 727 - /color-name/1.1.4: 728 - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 729 - dev: true 730 - 731 - /concat-map/0.0.1: 732 - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 733 - dev: true 734 - 735 - /content-type/1.0.4: 736 - resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} 737 - engines: {node: '>= 0.6'} 738 - dev: false 739 - 740 - /convert-hrtime/5.0.0: 741 - resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} 742 - engines: {node: '>=12'} 743 - dev: false 744 - 745 - /core-util-is/1.0.2: 746 - resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} 747 - dev: false 748 - 749 - /cross-spawn/7.0.3: 750 - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 751 - engines: {node: '>= 8'} 752 - dependencies: 753 - path-key: 3.1.1 754 - shebang-command: 2.0.0 755 - which: 2.0.2 756 - dev: true 757 - 758 - /cssesc/3.0.0: 759 - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 760 - engines: {node: '>=4'} 761 - hasBin: true 762 - dev: true 763 - 764 - /cuint/0.2.2: 765 - resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} 766 - dev: false 767 - 768 - /datastore-core/8.0.1: 769 - resolution: {integrity: sha512-FSzrX8fsYUfbA1dq2DvVr9+CYMRAVDKSVe+wGY+Ipiv7ikUDpZZI0htC/o6Fbg0yDxiGDXGOmEIsS5RBb5NchQ==} 770 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 771 - dependencies: 772 - '@libp2p/logger': 2.0.1 773 - err-code: 3.0.1 774 - interface-datastore: 7.0.0 775 - it-all: 1.0.6 776 - it-drain: 1.0.5 777 - it-filter: 1.0.3 778 - it-map: 1.0.6 779 - it-merge: 1.0.4 780 - it-pipe: 2.0.4 781 - it-pushable: 3.1.0 782 - it-take: 1.0.2 783 - uint8arrays: 3.0.0 784 - transitivePeerDependencies: 785 - - supports-color 786 - dev: false 787 - 788 - /datastore-level/9.0.1: 789 - resolution: {integrity: sha512-U23xpjtItZFCqYUNDYo7++vNI7f5/JUeedJOPxm+hyqR4TneDx9TPpuLGZRrehkaJ5v2kwfYiep0P8wyfI+clg==} 790 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 791 - dependencies: 792 - abstract-level: 1.0.3 793 - datastore-core: 8.0.1 794 - interface-datastore: 7.0.0 795 - it-filter: 1.0.3 796 - it-map: 1.0.6 797 - it-sort: 1.0.1 798 - it-take: 1.0.2 799 - level: 8.0.0 800 - transitivePeerDependencies: 801 - - supports-color 802 - dev: false 803 - 804 - /debug/4.3.4: 805 - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 806 - engines: {node: '>=6.0'} 807 - peerDependencies: 808 - supports-color: '*' 809 - peerDependenciesMeta: 810 - supports-color: 811 - optional: true 812 - dependencies: 813 - ms: 2.1.2 814 - 815 - /decompress-response/5.0.0: 816 - resolution: {integrity: sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==} 817 - engines: {node: '>=10'} 818 - dependencies: 819 - mimic-response: 2.1.0 820 - dev: true 821 - 822 - /deep-is/0.1.3: 823 - resolution: {integrity: sha512-GtxAN4HvBachZzm4OnWqc45ESpUCMwkYcsjnsPs23FwJbsO+k4t0k9bQCgOmzIlpHO28+WPK/KRbRk0DDHuuDw==} 824 - dev: true 825 - 826 - /defaults/1.0.3: 827 - resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} 828 - dependencies: 829 - clone: 1.0.4 830 - dev: true 831 - 832 - /defer-to-connect/2.0.0: 833 - resolution: {integrity: sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==} 834 - engines: {node: '>=10'} 835 - dev: true 836 - 837 - /define-properties/1.1.3: 838 - resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} 839 - engines: {node: '>= 0.4'} 840 - dependencies: 841 - object-keys: 1.1.1 842 - 843 - /defined/1.0.0: 844 - resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==} 845 - dev: true 846 - 847 - /delay/5.0.0: 848 - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} 849 - engines: {node: '>=10'} 850 - dev: false 851 - 852 - /detective/5.2.0: 853 - resolution: {integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==} 854 - engines: {node: '>=0.8.0'} 855 - hasBin: true 856 - dependencies: 857 - acorn-node: 1.8.2 858 - defined: 1.0.0 859 - minimist: 1.2.5 860 - dev: true 861 - 862 - /didyoumean/1.2.2: 863 - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 864 - dev: true 865 - 866 - /dlv/1.1.3: 867 - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 868 - dev: true 869 - 870 - /dns-over-http-resolver/1.2.3: 871 - resolution: {integrity: sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA==} 872 - dependencies: 873 - debug: 4.3.4 874 - native-fetch: 3.0.0 875 - receptacle: 1.3.2 876 - transitivePeerDependencies: 877 - - node-fetch 878 - - supports-color 879 - dev: false 880 - 881 - /dns-over-http-resolver/2.1.0: 882 - resolution: {integrity: sha512-eb8RGy6k54JdD7Rjw8g65y1MyA4z3m3IIYh7uazkgZuKIdFn8gYt8dydMm3op+2UshDdk9EexrXcDluKNY/CDg==} 883 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 884 - dependencies: 885 - debug: 4.3.4 886 - native-fetch: 4.0.2 887 - receptacle: 1.3.2 888 - transitivePeerDependencies: 889 - - supports-color 890 - - undici 891 - dev: false 892 - 893 - /doctrine/3.0.0: 894 - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 895 - engines: {node: '>=6.0.0'} 896 - dependencies: 897 - esutils: 2.0.3 898 - dev: true 899 - 900 - /duplexer3/0.1.4: 901 - resolution: {integrity: sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==} 902 - dev: true 903 - 904 - /electron-to-chromium/1.4.146: 905 - resolution: {integrity: sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg==} 906 - dev: true 907 - 908 - /elm-review/2.7.2: 909 - resolution: {integrity: sha512-llkRvxgR2GOmtc7wi2vAM+u9j61Pf1fmPsAbpsE4X0ZfusJv0Dddor3lHNNZ0MmpYzNxpm7npxNqYRXs5JIz9A==} 910 - engines: {node: '>=10.0.0'} 911 - hasBin: true 912 - dependencies: 913 - chalk: 4.1.2 914 - chokidar: 3.5.3 915 - cross-spawn: 7.0.3 916 - elm-tooling: 1.7.0 917 - fast-levenshtein: 3.0.0 918 - find-up: 4.1.0 919 - folder-hash: 3.3.3 920 - fs-extra: 9.0.1 921 - glob: 7.1.7 922 - got: 10.7.0 923 - minimist: 1.2.5 924 - ora: 5.4.1 925 - path-key: 3.1.1 926 - prompts: 2.4.0 927 - strip-ansi: 6.0.1 928 - temp: 0.9.4 929 - terminal-link: 2.1.1 930 - which: 2.0.2 931 - wrap-ansi: 6.2.0 932 - transitivePeerDependencies: 933 - - supports-color 934 - dev: true 935 - 936 - /elm-tooling/1.7.0: 937 - resolution: {integrity: sha512-EHZ54voWrG3BhUONbH/wFw5U95H6N7R4QFgXHDrPIaDBDdeyNkpFu4QWArSWkhzxyCF7hqT8ya2yy7SferDsgg==} 938 - hasBin: true 939 - dev: true 940 - 941 - /emoji-regex/8.0.0: 942 - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 943 - dev: true 944 - 945 - /end-of-stream/1.4.4: 946 - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 947 - dependencies: 948 - once: 1.4.0 949 - dev: true 950 - 951 - /err-code/2.0.3: 952 - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} 953 - dev: false 954 - 955 - /err-code/3.0.1: 956 - resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} 957 - dev: false 958 - 959 - /es-abstract/1.18.3: 960 - resolution: {integrity: sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==} 961 - engines: {node: '>= 0.4'} 962 - dependencies: 963 - call-bind: 1.0.2 964 - es-to-primitive: 1.2.1 965 - function-bind: 1.1.1 966 - get-intrinsic: 1.1.1 967 - has: 1.0.3 968 - has-symbols: 1.0.2 969 - is-callable: 1.2.3 970 - is-negative-zero: 2.0.1 971 - is-regex: 1.1.3 972 - is-string: 1.0.6 973 - object-inspect: 1.11.0 974 - object-keys: 1.1.1 975 - object.assign: 4.1.2 976 - string.prototype.trimend: 1.0.4 977 - string.prototype.trimstart: 1.0.4 978 - unbox-primitive: 1.0.1 979 - 980 - /es-to-primitive/1.2.1: 981 - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 982 - engines: {node: '>= 0.4'} 983 - dependencies: 984 - is-callable: 1.2.3 985 - is-date-object: 1.0.4 986 - is-symbol: 1.0.4 987 - 988 - /es6-object-assign/1.1.0: 989 - resolution: {integrity: sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=} 990 - dev: true 991 - 992 - /esbuild-android-64/0.14.42: 993 - resolution: {integrity: sha512-P4Y36VUtRhK/zivqGVMqhptSrFILAGlYp0Z8r9UQqHJ3iWztRCNWnlBzD9HRx0DbueXikzOiwyOri+ojAFfW6A==} 994 - engines: {node: '>=12'} 995 - cpu: [x64] 996 - os: [android] 997 - requiresBuild: true 998 - dev: true 999 - optional: true 1000 - 1001 - /esbuild-android-arm64/0.14.42: 1002 - resolution: {integrity: sha512-0cOqCubq+RWScPqvtQdjXG3Czb3AWI2CaKw3HeXry2eoA2rrPr85HF7IpdU26UWdBXgPYtlTN1LUiuXbboROhg==} 1003 - engines: {node: '>=12'} 1004 - cpu: [arm64] 1005 - os: [android] 1006 - requiresBuild: true 1007 - dev: true 1008 - optional: true 1009 - 1010 - /esbuild-darwin-64/0.14.42: 1011 - resolution: {integrity: sha512-ipiBdCA3ZjYgRfRLdQwP82rTiv/YVMtW36hTvAN5ZKAIfxBOyPXY7Cejp3bMXWgzKD8B6O+zoMzh01GZsCuEIA==} 1012 - engines: {node: '>=12'} 1013 - cpu: [x64] 1014 - os: [darwin] 1015 - requiresBuild: true 1016 - dev: true 1017 - optional: true 1018 - 1019 - /esbuild-darwin-arm64/0.14.42: 1020 - resolution: {integrity: sha512-bU2tHRqTPOaoH/4m0zYHbFWpiYDmaA0gt90/3BMEFaM0PqVK/a6MA2V/ypV5PO0v8QxN6gH5hBPY4YJ2lopXgA==} 1021 - engines: {node: '>=12'} 1022 - cpu: [arm64] 1023 - os: [darwin] 1024 - requiresBuild: true 1025 - dev: true 1026 - optional: true 1027 - 1028 - /esbuild-freebsd-64/0.14.42: 1029 - resolution: {integrity: sha512-75h1+22Ivy07+QvxHyhVqOdekupiTZVLN1PMwCDonAqyXd8TVNJfIRFrdL8QmSJrOJJ5h8H1I9ETyl2L8LQDaw==} 1030 - engines: {node: '>=12'} 1031 - cpu: [x64] 1032 - os: [freebsd] 1033 - requiresBuild: true 1034 - dev: true 1035 - optional: true 1036 - 1037 - /esbuild-freebsd-arm64/0.14.42: 1038 - resolution: {integrity: sha512-W6Jebeu5TTDQMJUJVarEzRU9LlKpNkPBbjqSu+GUPTHDCly5zZEQq9uHkmHHl7OKm+mQ2zFySN83nmfCeZCyNA==} 1039 - engines: {node: '>=12'} 1040 - cpu: [arm64] 1041 - os: [freebsd] 1042 - requiresBuild: true 1043 - dev: true 1044 - optional: true 1045 - 1046 - /esbuild-linux-32/0.14.42: 1047 - resolution: {integrity: sha512-Ooy/Bj+mJ1z4jlWcK5Dl6SlPlCgQB9zg1UrTCeY8XagvuWZ4qGPyYEWGkT94HUsRi2hKsXvcs6ThTOjBaJSMfg==} 1048 - engines: {node: '>=12'} 1049 - cpu: [ia32] 1050 - os: [linux] 1051 - requiresBuild: true 1052 - dev: true 1053 - optional: true 1054 - 1055 - /esbuild-linux-64/0.14.42: 1056 - resolution: {integrity: sha512-2L0HbzQfbTuemUWfVqNIjOfaTRt9zsvjnme6lnr7/MO9toz/MJ5tZhjqrG6uDWDxhsaHI2/nsDgrv8uEEN2eoA==} 1057 - engines: {node: '>=12'} 1058 - cpu: [x64] 1059 - os: [linux] 1060 - requiresBuild: true 1061 - dev: true 1062 - optional: true 1063 - 1064 - /esbuild-linux-arm/0.14.42: 1065 - resolution: {integrity: sha512-STq69yzCMhdRaWnh29UYrLSr/qaWMm/KqwaRF1pMEK7kDiagaXhSL1zQGXbYv94GuGY/zAwzK98+6idCMUOOCg==} 1066 - engines: {node: '>=12'} 1067 - cpu: [arm] 1068 - os: [linux] 1069 - requiresBuild: true 1070 - dev: true 1071 - optional: true 1072 - 1073 - /esbuild-linux-arm64/0.14.42: 1074 - resolution: {integrity: sha512-c3Ug3e9JpVr8jAcfbhirtpBauLxzYPpycjWulD71CF6ZSY26tvzmXMJYooQ2YKqDY4e/fPu5K8bm7MiXMnyxuA==} 1075 - engines: {node: '>=12'} 1076 - cpu: [arm64] 1077 - os: [linux] 1078 - requiresBuild: true 1079 - dev: true 1080 - optional: true 1081 - 1082 - /esbuild-linux-mips64le/0.14.42: 1083 - resolution: {integrity: sha512-QuvpHGbYlkyXWf2cGm51LBCHx6eUakjaSrRpUqhPwjh/uvNUYvLmz2LgPTTPwCqaKt0iwL+OGVL0tXA5aDbAbg==} 1084 - engines: {node: '>=12'} 1085 - cpu: [mips64el] 1086 - os: [linux] 1087 - requiresBuild: true 1088 - dev: true 1089 - optional: true 1090 - 1091 - /esbuild-linux-ppc64le/0.14.42: 1092 - resolution: {integrity: sha512-8ohIVIWDbDT+i7lCx44YCyIRrOW1MYlks9fxTo0ME2LS/fxxdoJBwHWzaDYhjvf8kNpA+MInZvyOEAGoVDrMHg==} 1093 - engines: {node: '>=12'} 1094 - cpu: [ppc64] 1095 - os: [linux] 1096 - requiresBuild: true 1097 - dev: true 1098 - optional: true 1099 - 1100 - /esbuild-linux-riscv64/0.14.42: 1101 - resolution: {integrity: sha512-DzDqK3TuoXktPyG1Lwx7vhaF49Onv3eR61KwQyxYo4y5UKTpL3NmuarHSIaSVlTFDDpcIajCDwz5/uwKLLgKiQ==} 1102 - engines: {node: '>=12'} 1103 - cpu: [riscv64] 1104 - os: [linux] 1105 - requiresBuild: true 1106 - dev: true 1107 - optional: true 1108 - 1109 - /esbuild-linux-s390x/0.14.42: 1110 - resolution: {integrity: sha512-YFRhPCxl8nb//Wn6SiS5pmtplBi4z9yC2gLrYoYI/tvwuB1jldir9r7JwAGy1Ck4D7sE7wBN9GFtUUX/DLdcEQ==} 1111 - engines: {node: '>=12'} 1112 - cpu: [s390x] 1113 - os: [linux] 1114 - requiresBuild: true 1115 - dev: true 1116 - optional: true 1117 - 1118 - /esbuild-netbsd-64/0.14.42: 1119 - resolution: {integrity: sha512-QYSD2k+oT9dqB/4eEM9c+7KyNYsIPgzYOSrmfNGDIyJrbT1d+CFVKvnKahDKNJLfOYj8N4MgyFaU9/Ytc6w5Vw==} 1120 - engines: {node: '>=12'} 1121 - cpu: [x64] 1122 - os: [netbsd] 1123 - requiresBuild: true 1124 - dev: true 1125 - optional: true 1126 - 1127 - /esbuild-openbsd-64/0.14.42: 1128 - resolution: {integrity: sha512-M2meNVIKWsm2HMY7+TU9AxM7ZVwI9havdsw6m/6EzdXysyCFFSoaTQ/Jg03izjCsK17FsVRHqRe26Llj6x0MNA==} 1129 - engines: {node: '>=12'} 1130 - cpu: [x64] 1131 - os: [openbsd] 1132 - requiresBuild: true 1133 - dev: true 1134 - optional: true 1135 - 1136 - /esbuild-sunos-64/0.14.42: 1137 - resolution: {integrity: sha512-uXV8TAZEw36DkgW8Ak3MpSJs1ofBb3Smkc/6pZ29sCAN1KzCAQzsje4sUwugf+FVicrHvlamCOlFZIXgct+iqQ==} 1138 - engines: {node: '>=12'} 1139 - cpu: [x64] 1140 - os: [sunos] 1141 - requiresBuild: true 1142 - dev: true 1143 - optional: true 1144 - 1145 - /esbuild-windows-32/0.14.42: 1146 - resolution: {integrity: sha512-4iw/8qWmRICWi9ZOnJJf9sYt6wmtp3hsN4TdI5NqgjfOkBVMxNdM9Vt3626G1Rda9ya2Q0hjQRD9W1o+m6Lz6g==} 1147 - engines: {node: '>=12'} 1148 - cpu: [ia32] 1149 - os: [win32] 1150 - requiresBuild: true 1151 - dev: true 1152 - optional: true 1153 - 1154 - /esbuild-windows-64/0.14.42: 1155 - resolution: {integrity: sha512-j3cdK+Y3+a5H0wHKmLGTJcq0+/2mMBHPWkItR3vytp/aUGD/ua/t2BLdfBIzbNN9nLCRL9sywCRpOpFMx3CxzA==} 1156 - engines: {node: '>=12'} 1157 - cpu: [x64] 1158 - os: [win32] 1159 - requiresBuild: true 1160 - dev: true 1161 - optional: true 1162 - 1163 - /esbuild-windows-arm64/0.14.42: 1164 - resolution: {integrity: sha512-+lRAARnF+hf8J0mN27ujO+VbhPbDqJ8rCcJKye4y7YZLV6C4n3pTRThAb388k/zqF5uM0lS5O201u0OqoWSicw==} 1165 - engines: {node: '>=12'} 1166 - cpu: [arm64] 1167 - os: [win32] 1168 - requiresBuild: true 1169 - dev: true 1170 - optional: true 1171 - 1172 - /esbuild/0.14.42: 1173 - resolution: {integrity: sha512-V0uPZotCEHokJdNqyozH6qsaQXqmZEOiZWrXnds/zaH/0SyrIayRXWRB98CENO73MIZ9T3HBIOsmds5twWtmgw==} 1174 - engines: {node: '>=12'} 1175 - hasBin: true 1176 - requiresBuild: true 1177 - optionalDependencies: 1178 - esbuild-android-64: 0.14.42 1179 - esbuild-android-arm64: 0.14.42 1180 - esbuild-darwin-64: 0.14.42 1181 - esbuild-darwin-arm64: 0.14.42 1182 - esbuild-freebsd-64: 0.14.42 1183 - esbuild-freebsd-arm64: 0.14.42 1184 - esbuild-linux-32: 0.14.42 1185 - esbuild-linux-64: 0.14.42 1186 - esbuild-linux-arm: 0.14.42 1187 - esbuild-linux-arm64: 0.14.42 1188 - esbuild-linux-mips64le: 0.14.42 1189 - esbuild-linux-ppc64le: 0.14.42 1190 - esbuild-linux-riscv64: 0.14.42 1191 - esbuild-linux-s390x: 0.14.42 1192 - esbuild-netbsd-64: 0.14.42 1193 - esbuild-openbsd-64: 0.14.42 1194 - esbuild-sunos-64: 0.14.42 1195 - esbuild-windows-32: 0.14.42 1196 - esbuild-windows-64: 0.14.42 1197 - esbuild-windows-arm64: 0.14.42 1198 - dev: true 1199 - 1200 - /escalade/3.1.1: 1201 - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1202 - engines: {node: '>=6'} 1203 - dev: true 1204 - 1205 - /escape-string-regexp/4.0.0: 1206 - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1207 - engines: {node: '>=10'} 1208 - dev: true 1209 - 1210 - /eslint-scope/7.1.1: 1211 - resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} 1212 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1213 - dependencies: 1214 - esrecurse: 4.3.0 1215 - estraverse: 5.2.0 1216 - dev: true 1217 - 1218 - /eslint-utils/3.0.0_eslint@8.17.0: 1219 - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 1220 - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 1221 - peerDependencies: 1222 - eslint: '>=5' 1223 - dependencies: 1224 - eslint: 8.17.0 1225 - eslint-visitor-keys: 2.1.0 1226 - dev: true 1227 - 1228 - /eslint-visitor-keys/2.1.0: 1229 - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 1230 - engines: {node: '>=10'} 1231 - dev: true 1232 - 1233 - /eslint-visitor-keys/3.3.0: 1234 - resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 1235 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1236 - dev: true 1237 - 1238 - /eslint/8.17.0: 1239 - resolution: {integrity: sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==} 1240 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1241 - hasBin: true 1242 - dependencies: 1243 - '@eslint/eslintrc': 1.3.0 1244 - '@humanwhocodes/config-array': 0.9.3 1245 - ajv: 6.12.6 1246 - chalk: 4.1.2 1247 - cross-spawn: 7.0.3 1248 - debug: 4.3.4 1249 - doctrine: 3.0.0 1250 - escape-string-regexp: 4.0.0 1251 - eslint-scope: 7.1.1 1252 - eslint-utils: 3.0.0_eslint@8.17.0 1253 - eslint-visitor-keys: 3.3.0 1254 - espree: 9.3.2 1255 - esquery: 1.4.0 1256 - esutils: 2.0.3 1257 - fast-deep-equal: 3.1.3 1258 - file-entry-cache: 6.0.1 1259 - functional-red-black-tree: 1.0.1 1260 - glob-parent: 6.0.2 1261 - globals: 13.15.0 1262 - ignore: 5.2.0 1263 - import-fresh: 3.3.0 1264 - imurmurhash: 0.1.4 1265 - is-glob: 4.0.3 1266 - js-yaml: 4.1.0 1267 - json-stable-stringify-without-jsonify: 1.0.1 1268 - levn: 0.4.1 1269 - lodash.merge: 4.6.2 1270 - minimatch: 3.1.2 1271 - natural-compare: 1.4.0 1272 - optionator: 0.9.1 1273 - regexpp: 3.2.0 1274 - strip-ansi: 6.0.1 1275 - strip-json-comments: 3.1.1 1276 - text-table: 0.2.0 1277 - v8-compile-cache: 2.3.0 1278 - transitivePeerDependencies: 1279 - - supports-color 1280 - dev: true 1281 - 1282 - /espree/9.3.2: 1283 - resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} 1284 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1285 - dependencies: 1286 - acorn: 8.7.1 1287 - acorn-jsx: 5.3.2_acorn@8.7.1 1288 - eslint-visitor-keys: 3.3.0 1289 - dev: true 1290 - 1291 - /esquery/1.4.0: 1292 - resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} 1293 - engines: {node: '>=0.10'} 1294 - dependencies: 1295 - estraverse: 5.2.0 1296 - dev: true 1297 - 1298 - /esrecurse/4.3.0: 1299 - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1300 - engines: {node: '>=4.0'} 1301 - dependencies: 1302 - estraverse: 5.2.0 1303 - dev: true 1304 - 1305 - /estraverse/5.2.0: 1306 - resolution: {integrity: sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==} 1307 - engines: {node: '>=4.0'} 1308 - dev: true 1309 - 1310 - /esutils/2.0.3: 1311 - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1312 - engines: {node: '>=0.10.0'} 1313 - dev: true 1314 - 1315 - /eventemitter3/4.0.7: 1316 - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} 1317 - dev: false 1318 - 1319 - /events/3.3.0: 1320 - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 1321 - engines: {node: '>=0.8.x'} 1322 - dev: true 1323 - 1324 - /fast-deep-equal/3.1.3: 1325 - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1326 - dev: true 1327 - 1328 - /fast-fifo/1.1.0: 1329 - resolution: {integrity: sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g==} 1330 - dev: false 1331 - 1332 - /fast-glob/3.2.11: 1333 - resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} 1334 - engines: {node: '>=8.6.0'} 1335 - dependencies: 1336 - '@nodelib/fs.stat': 2.0.5 1337 - '@nodelib/fs.walk': 1.2.8 1338 - glob-parent: 5.1.2 1339 - merge2: 1.4.1 1340 - micromatch: 4.0.4 1341 - dev: true 1342 - 1343 - /fast-json-stable-stringify/2.1.0: 1344 - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1345 - dev: true 1346 - 1347 - /fast-levenshtein/2.0.6: 1348 - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1349 - dev: true 1350 - 1351 - /fast-levenshtein/3.0.0: 1352 - resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} 1353 - dependencies: 1354 - fastest-levenshtein: 1.0.12 1355 - dev: true 1356 - 1357 - /fast-text-encoding/1.0.3: 1358 - resolution: {integrity: sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==} 1359 - dev: false 1360 - 1361 - /fastest-levenshtein/1.0.12: 1362 - resolution: {integrity: sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==} 1363 - dev: true 1364 - 1365 - /fastq/1.11.1: 1366 - resolution: {integrity: sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==} 1367 - dependencies: 1368 - reusify: 1.0.4 1369 - dev: true 1370 - 1371 - /file-entry-cache/6.0.1: 1372 - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1373 - engines: {node: ^10.12.0 || >=12.0.0} 1374 - dependencies: 1375 - flat-cache: 3.0.4 1376 - dev: true 1377 - 1378 - /file-saver/2.0.5: 1379 - resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} 1380 - dev: false 1381 - 1382 - /file-type/16.5.3: 1383 - resolution: {integrity: sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A==} 1384 - engines: {node: '>=10'} 1385 - dependencies: 1386 - readable-web-to-node-stream: 3.0.2 1387 - strtok3: 6.3.0 1388 - token-types: 4.2.0 1389 - dev: false 1390 - 1391 - /fill-range/7.0.1: 1392 - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1393 - engines: {node: '>=8'} 1394 - dependencies: 1395 - to-regex-range: 5.0.1 1396 - dev: true 1397 - 1398 - /find-up/4.1.0: 1399 - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1400 - engines: {node: '>=8'} 1401 - dependencies: 1402 - locate-path: 5.0.0 1403 - path-exists: 4.0.0 1404 - dev: true 1405 - 1406 - /fission-bloom-filters/1.7.1: 1407 - resolution: {integrity: sha512-AAVWxwqgSDK+/3Tn2kx+a9j/ND/pyVNVZgn/rL5pfQaX7w0qfP81PlLCNKhM4XKOhcg1kFXNcoWkQKg3MyyULw==} 1408 - dependencies: 1409 - buffer: 6.0.3 1410 - is-buffer: 2.0.5 1411 - lodash: 4.17.21 1412 - lodash.eq: 4.0.0 1413 - lodash.indexof: 4.0.5 1414 - reflect-metadata: 0.1.13 1415 - seedrandom: 3.0.5 1416 - xxhashjs: 0.2.2 1417 - dev: false 1418 - 1419 - /flat-cache/3.0.4: 1420 - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1421 - engines: {node: ^10.12.0 || >=12.0.0} 1422 - dependencies: 1423 - flatted: 3.2.1 1424 - rimraf: 3.0.2 1425 - dev: true 1426 - 1427 - /flatted/3.2.1: 1428 - resolution: {integrity: sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==} 1429 - dev: true 1430 - 1431 - /fnv1a/1.1.1: 1432 - resolution: {integrity: sha512-S2HviLR9UyNbt8R+vU6YeQtL8RliPwez9DQEVba5MAvN3Od+RSgKUSL2+qveOMt3owIeBukKoRu2enoOck5uag==} 1433 - dev: false 1434 - 1435 - /folder-hash/3.3.3: 1436 - resolution: {integrity: sha512-SDgHBgV+RCjrYs8aUwCb9rTgbTVuSdzvFmLaChsLre1yf+D64khCW++VYciaByZ8Rm0uKF8R/XEpXuTRSGUM1A==} 1437 - engines: {node: '>=6.0.0'} 1438 - hasBin: true 1439 - dependencies: 1440 - debug: 4.3.4 1441 - graceful-fs: 4.2.4 1442 - minimatch: 3.0.4 1443 - transitivePeerDependencies: 1444 - - supports-color 1445 - dev: true 1446 - 1447 - /foreach/2.0.5: 1448 - resolution: {integrity: sha1-C+4AUBiusmDQo6865ljdATbsG5k=} 1449 - 1450 - /fraction.js/4.2.0: 1451 - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} 1452 - dev: true 1453 - 1454 - /fs-extra/9.0.1: 1455 - resolution: {integrity: sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==} 1456 - engines: {node: '>=10'} 1457 - dependencies: 1458 - at-least-node: 1.0.0 1459 - graceful-fs: 4.2.4 1460 - jsonfile: 6.1.0 1461 - universalify: 1.0.0 1462 - dev: true 1463 - 1464 - /fs.realpath/1.0.0: 1465 - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1466 - dev: true 1467 - 1468 - /fsevents/2.3.2: 1469 - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1470 - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1471 - os: [darwin] 1472 - requiresBuild: true 1473 - dev: true 1474 - optional: true 1475 - 1476 - /function-bind/1.1.1: 1477 - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1478 - 1479 - /function-timeout/0.1.1: 1480 - resolution: {integrity: sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==} 1481 - engines: {node: '>=14.16'} 1482 - dev: false 1483 - 1484 - /functional-red-black-tree/1.0.1: 1485 - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} 1486 - dev: true 1487 - 1488 - /get-intrinsic/1.1.1: 1489 - resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} 1490 - dependencies: 1491 - function-bind: 1.1.1 1492 - has: 1.0.3 1493 - has-symbols: 1.0.2 1494 - 1495 - /get-stream/5.2.0: 1496 - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 1497 - engines: {node: '>=8'} 1498 - dependencies: 1499 - pump: 3.0.0 1500 - dev: true 1501 - 1502 - /glob-parent/5.1.2: 1503 - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1504 - engines: {node: '>= 6'} 1505 - dependencies: 1506 - is-glob: 4.0.3 1507 - dev: true 1508 - 1509 - /glob-parent/6.0.2: 1510 - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1511 - engines: {node: '>=10.13.0'} 1512 - dependencies: 1513 - is-glob: 4.0.3 1514 - dev: true 1515 - 1516 - /glob/7.1.7: 1517 - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} 1518 - dependencies: 1519 - fs.realpath: 1.0.0 1520 - inflight: 1.0.6 1521 - inherits: 2.0.4 1522 - minimatch: 3.1.2 1523 - once: 1.4.0 1524 - path-is-absolute: 1.0.1 1525 - dev: true 1526 - 1527 - /globals/13.15.0: 1528 - resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==} 1529 - engines: {node: '>=8'} 1530 - dependencies: 1531 - type-fest: 0.20.2 1532 - dev: true 1533 - 1534 - /got/10.7.0: 1535 - resolution: {integrity: sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==} 1536 - engines: {node: '>=10'} 1537 - dependencies: 1538 - '@sindresorhus/is': 2.1.1 1539 - '@szmarczak/http-timer': 4.0.5 1540 - '@types/cacheable-request': 6.0.1 1541 - '@types/keyv': 3.1.1 1542 - '@types/responselike': 1.0.0 1543 - cacheable-lookup: 2.0.1 1544 - cacheable-request: 7.0.1 1545 - decompress-response: 5.0.0 1546 - duplexer3: 0.1.4 1547 - get-stream: 5.2.0 1548 - lowercase-keys: 2.0.0 1549 - mimic-response: 2.1.0 1550 - p-cancelable: 2.0.0 1551 - p-event: 4.2.0 1552 - responselike: 2.0.0 1553 - to-readable-stream: 2.1.0 1554 - type-fest: 0.10.0 1555 - dev: true 1556 - 1557 - /graceful-fs/4.2.4: 1558 - resolution: {integrity: sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==} 1559 - 1560 - /has-bigints/1.0.1: 1561 - resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==} 1562 - 1563 - /has-flag/4.0.0: 1564 - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1565 - engines: {node: '>=8'} 1566 - dev: true 1567 - 1568 - /has-symbols/1.0.2: 1569 - resolution: {integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==} 1570 - engines: {node: '>= 0.4'} 1571 - 1572 - /has/1.0.3: 1573 - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1574 - engines: {node: '>= 0.4.0'} 1575 - dependencies: 1576 - function-bind: 1.1.1 1577 - 1578 - /http-cache-semantics/4.1.0: 1579 - resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} 1580 - dev: true 1581 - 1582 - /ieee754/1.2.1: 1583 - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1584 - 1585 - /ignore/5.2.0: 1586 - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} 1587 - engines: {node: '>= 4'} 1588 - dev: true 1589 - 1590 - /immediate/3.0.6: 1591 - resolution: {integrity: sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=} 1592 - dev: false 1593 - 1594 - /import-fresh/3.3.0: 1595 - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1596 - engines: {node: '>=6'} 1597 - dependencies: 1598 - parent-module: 1.0.1 1599 - resolve-from: 4.0.0 1600 - dev: true 1601 - 1602 - /imurmurhash/0.1.4: 1603 - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1604 - engines: {node: '>=0.8.19'} 1605 - dev: true 1606 - 1607 - /indexes-of/1.0.1: 1608 - resolution: {integrity: sha1-8w9xbI4r00bHtn0985FVZqfAVgc=} 1609 - dev: true 1610 - 1611 - /inflight/1.0.6: 1612 - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1613 - dependencies: 1614 - once: 1.4.0 1615 - wrappy: 1.0.2 1616 - dev: true 1617 - 1618 - /inherits/2.0.4: 1619 - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1620 - 1621 - /interface-blockstore/3.0.0: 1622 - resolution: {integrity: sha512-D2f0/J4EK/if130XC5diOJLYBpz6PnEmHweQt8UxvSl3Ajf8WBuWZ6bN306GytQXoVNnYHd9PmSVKZTN3NXGWQ==} 1623 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 1624 - dependencies: 1625 - interface-store: 3.0.0 1626 - multiformats: 9.6.3 1627 - dev: false 1628 - 1629 - /interface-datastore/7.0.0: 1630 - resolution: {integrity: sha512-q9OveOhexQ3Fx8h4YbuR4mZtUHwvlOynKnIwTm6x8oBTWfIyAKtlYtrOYdlHfqQztbYpdzRFcapopNJBMx36NQ==} 1631 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 1632 - dependencies: 1633 - interface-store: 3.0.0 1634 - nanoid: 3.3.4 1635 - uint8arrays: 3.0.0 1636 - dev: false 1637 - 1638 - /interface-ipld-format/1.0.1: 1639 - resolution: {integrity: sha512-WV/ar+KQJVoQpqRDYdo7YPGYIUHJxCuOEhdvsRpzLqoOIVCqPKdMMYmsLL1nCRsF3yYNio+PAJbCKiv6drrEAg==} 1640 - deprecated: This module has been superseded by the multiformats module 1641 - dependencies: 1642 - cids: 1.1.9 1643 - multicodec: 3.2.1 1644 - multihashes: 4.0.3 1645 - dev: false 1646 - 1647 - /interface-store/3.0.0: 1648 - resolution: {integrity: sha512-IBJn3hE6hYutwdDcStR76mcwfV98vZc49LkEN9ANHHpsxcm6YbGMJxowO2G3FITU4U5ZH4KJPlHOT6Oe2vzTWA==} 1649 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 1650 - dev: false 1651 - 1652 - /ip-regex/4.3.0: 1653 - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} 1654 - engines: {node: '>=8'} 1655 - dev: false 1656 - 1657 - /ip-regex/5.0.0: 1658 - resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==} 1659 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1660 - dev: false 1661 - 1662 - /ipfs-core-types/0.11.2-8f351a89.0: 1663 - resolution: {integrity: sha512-N8CniRGR69SwPuxw+Li3ROa/kC+xAM6xA8swhEdSucjyMJFyCPX/s0gSCikfweBiHEsjdbCEJcbSa5ULdc0srQ==} 1664 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 1665 - dependencies: 1666 - '@ipld/dag-pb': 2.1.18 1667 - '@libp2p/interface-keychain': 1.0.3 1668 - '@libp2p/interface-peer-id': 1.0.4 1669 - '@libp2p/interface-peer-info': 1.0.2 1670 - '@libp2p/interface-pubsub': 2.0.1 1671 - '@multiformats/multiaddr': 10.4.0 1672 - '@types/node': 18.7.15 1673 - interface-datastore: 7.0.0 1674 - ipfs-unixfs: 7.0.0 1675 - multiformats: 9.6.3 1676 - transitivePeerDependencies: 1677 - - supports-color 1678 - - undici 1679 - dev: false 1680 - 1681 - /ipfs-repo-migrations/13.0.2: 1682 - resolution: {integrity: sha512-j5RgvyLI4VyF3ErWd2814vLaTjPf/GR5W73KHbObsF1Up0CLj24GzUcxebxM2FAWdW5FqUEY6sKqmiaxZ6QKnQ==} 1683 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 1684 - dependencies: 1685 - '@ipld/dag-pb': 2.1.18 1686 - cborg: 1.6.1 1687 - datastore-core: 8.0.1 1688 - debug: 4.3.4 1689 - fnv1a: 1.1.1 1690 - interface-blockstore: 3.0.0 1691 - interface-datastore: 7.0.0 1692 - it-length: 1.0.4 1693 - multiaddr: 10.0.1 1694 - multiformats: 9.6.3 1695 - protobufjs: 7.1.0 1696 - uint8arrays: 3.0.0 1697 - varint: 6.0.0 1698 - transitivePeerDependencies: 1699 - - node-fetch 1700 - - supports-color 1701 - dev: false 1702 - 1703 - /ipfs-repo/15.0.2: 1704 - resolution: {integrity: sha512-aAy7e2ZOiWNoYextxm6Ib6p9DpBDRLPjqtRE4xW8dYdD1tk7u2SGqp6X6OuXHqMypNSR8DuGvPJ4lV2n1asOGg==} 1705 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 1706 - dependencies: 1707 - '@ipld/dag-pb': 2.1.18 1708 - bytes: 3.1.2 1709 - cborg: 1.6.1 1710 - datastore-core: 8.0.1 1711 - debug: 4.3.4 1712 - err-code: 3.0.1 1713 - interface-blockstore: 3.0.0 1714 - interface-datastore: 7.0.0 1715 - ipfs-repo-migrations: 13.0.2 1716 - it-drain: 1.0.5 1717 - it-filter: 1.0.3 1718 - it-first: 1.0.7 1719 - it-map: 1.0.6 1720 - it-merge: 1.0.4 1721 - it-parallel-batch: 1.0.10 1722 - it-pipe: 2.0.4 1723 - it-pushable: 3.1.0 1724 - just-safe-get: 4.1.1 1725 - just-safe-set: 4.1.1 1726 - merge-options: 3.0.4 1727 - mortice: 3.0.1 1728 - multiformats: 9.6.3 1729 - p-queue: 7.3.0 1730 - proper-lockfile: 4.1.2 1731 - sort-keys: 5.0.0 1732 - uint8arrays: 3.0.0 1733 - transitivePeerDependencies: 1734 - - node-fetch 1735 - - supports-color 1736 - dev: false 1737 - 1738 - /ipfs-unixfs/6.0.9: 1739 - resolution: {integrity: sha512-0DQ7p0/9dRB6XCb0mVCTli33GzIzSVx5udpJuVM47tGcD+W+Bl4LsnoLswd3ggNnNEakMv1FdoFITiEnchXDqQ==} 1740 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 1741 - dependencies: 1742 - err-code: 3.0.1 1743 - protobufjs: 6.11.2 1744 - dev: false 1745 - 1746 - /ipfs-unixfs/7.0.0: 1747 - resolution: {integrity: sha512-qm3pj3jQE/WCQGIWypyXWtDjDfzQTxFMMaT57sNJ+EQlYEJryKeGQEBTubhhX+tva7ntqt+N/FD15RkDjWlh9w==} 1748 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 1749 - dependencies: 1750 - err-code: 3.0.1 1751 - protobufjs: 7.1.0 1752 - dev: false 1753 - 1754 - /ipld-dag-pb/0.22.3: 1755 - resolution: {integrity: sha512-dfG5C5OVAR4FEP7Al2CrHWvAyIM7UhAQrjnOYOIxXGQz5NlEj6wGX0XQf6Ru6or1na6upvV3NQfstapQG8X2rg==} 1756 - engines: {node: '>=6.0.0', npm: '>=3.0.0'} 1757 - deprecated: This module has been superseded by @ipld/dag-pb and multiformats 1758 - dependencies: 1759 - cids: 1.1.9 1760 - interface-ipld-format: 1.0.1 1761 - multicodec: 3.2.1 1762 - multihashing-async: 2.0.1 1763 - protobufjs: 6.11.2 1764 - stable: 0.1.8 1765 - uint8arrays: 2.1.7 1766 - dev: false 1767 - 1768 - /is-arguments/1.1.0: 1769 - resolution: {integrity: sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==} 1770 - engines: {node: '>= 0.4'} 1771 - dependencies: 1772 - call-bind: 1.0.2 1773 - 1774 - /is-bigint/1.0.2: 1775 - resolution: {integrity: sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==} 1776 - 1777 - /is-binary-path/2.1.0: 1778 - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1779 - engines: {node: '>=8'} 1780 - dependencies: 1781 - binary-extensions: 2.1.0 1782 - dev: true 1783 - 1784 - /is-boolean-object/1.1.1: 1785 - resolution: {integrity: sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==} 1786 - engines: {node: '>= 0.4'} 1787 - dependencies: 1788 - call-bind: 1.0.2 1789 - 1790 - /is-buffer/2.0.5: 1791 - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} 1792 - engines: {node: '>=4'} 1793 - dev: false 1794 - 1795 - /is-callable/1.2.3: 1796 - resolution: {integrity: sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==} 1797 - engines: {node: '>= 0.4'} 1798 - 1799 - /is-core-module/2.8.1: 1800 - resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} 1801 - dependencies: 1802 - has: 1.0.3 1803 - dev: true 1804 - 1805 - /is-date-object/1.0.4: 1806 - resolution: {integrity: sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==} 1807 - engines: {node: '>= 0.4'} 1808 - 1809 - /is-extglob/2.1.1: 1810 - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1811 - engines: {node: '>=0.10.0'} 1812 - dev: true 1813 - 1814 - /is-fullwidth-code-point/3.0.0: 1815 - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1816 - engines: {node: '>=8'} 1817 - dev: true 1818 - 1819 - /is-generator-function/1.0.9: 1820 - resolution: {integrity: sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==} 1821 - engines: {node: '>= 0.4'} 1822 - 1823 - /is-glob/4.0.3: 1824 - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1825 - engines: {node: '>=0.10.0'} 1826 - dependencies: 1827 - is-extglob: 2.1.1 1828 - dev: true 1829 - 1830 - /is-interactive/1.0.0: 1831 - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} 1832 - engines: {node: '>=8'} 1833 - dev: true 1834 - 1835 - /is-ip/3.1.0: 1836 - resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} 1837 - engines: {node: '>=8'} 1838 - dependencies: 1839 - ip-regex: 4.3.0 1840 - dev: false 1841 - 1842 - /is-ip/5.0.0: 1843 - resolution: {integrity: sha512-uhmKwcdWJ1nTmBdoBxdHilfJs4qdLBIvVHKRels2+UCZmfcfefuQWziadaYLpN7t/bUrJOjJHv+R1di1q7Q1HQ==} 1844 - engines: {node: '>=14.16'} 1845 - dependencies: 1846 - ip-regex: 5.0.0 1847 - super-regex: 0.2.0 1848 - dev: false 1849 - 1850 - /is-nan/1.3.2: 1851 - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} 1852 - engines: {node: '>= 0.4'} 1853 - dependencies: 1854 - call-bind: 1.0.2 1855 - define-properties: 1.1.3 1856 - dev: true 1857 - 1858 - /is-negative-zero/2.0.1: 1859 - resolution: {integrity: sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==} 1860 - engines: {node: '>= 0.4'} 1861 - 1862 - /is-number-object/1.0.5: 1863 - resolution: {integrity: sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==} 1864 - engines: {node: '>= 0.4'} 1865 - 1866 - /is-number/7.0.0: 1867 - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1868 - engines: {node: '>=0.12.0'} 1869 - dev: true 1870 - 1871 - /is-plain-obj/2.1.0: 1872 - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} 1873 - engines: {node: '>=8'} 1874 - dev: false 1875 - 1876 - /is-plain-obj/4.1.0: 1877 - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 1878 - engines: {node: '>=12'} 1879 - dev: false 1880 - 1881 - /is-regex/1.1.3: 1882 - resolution: {integrity: sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==} 1883 - engines: {node: '>= 0.4'} 1884 - dependencies: 1885 - call-bind: 1.0.2 1886 - has-symbols: 1.0.2 1887 - 1888 - /is-regexp/3.1.0: 1889 - resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} 1890 - engines: {node: '>=12'} 1891 - dev: false 1892 - 1893 - /is-string/1.0.6: 1894 - resolution: {integrity: sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==} 1895 - engines: {node: '>= 0.4'} 1896 - 1897 - /is-symbol/1.0.4: 1898 - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1899 - engines: {node: '>= 0.4'} 1900 - dependencies: 1901 - has-symbols: 1.0.2 1902 - 1903 - /is-typed-array/1.1.5: 1904 - resolution: {integrity: sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==} 1905 - engines: {node: '>= 0.4'} 1906 - dependencies: 1907 - available-typed-arrays: 1.0.4 1908 - call-bind: 1.0.2 1909 - es-abstract: 1.18.3 1910 - foreach: 2.0.5 1911 - has-symbols: 1.0.2 1912 - 1913 - /is-unicode-supported/0.1.0: 1914 - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 1915 - engines: {node: '>=10'} 1916 - dev: true 1917 - 1918 - /isarray/1.0.0: 1919 - resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} 1920 - dev: false 1921 - 1922 - /isexe/2.0.0: 1923 - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1924 - dev: true 1925 - 1926 - /it-all/1.0.6: 1927 - resolution: {integrity: sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==} 1928 - dev: false 1929 - 1930 - /it-batch/1.0.9: 1931 - resolution: {integrity: sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA==} 1932 - dev: false 1933 - 1934 - /it-drain/1.0.5: 1935 - resolution: {integrity: sha512-r/GjkiW1bZswC04TNmUnLxa6uovme7KKwPhc+cb1hHU65E3AByypHH6Pm91WHuvqfFsm+9ws0kPtDBV3/8vmIg==} 1936 - dev: false 1937 - 1938 - /it-filter/1.0.3: 1939 - resolution: {integrity: sha512-EI3HpzUrKjTH01miLHWmhNWy3Xpbx4OXMXltgrNprL5lDpF3giVpHIouFpr5l+evXw6aOfxhnt01BIB+4VQA+w==} 1940 - dev: false 1941 - 1942 - /it-first/1.0.7: 1943 - resolution: {integrity: sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==} 1944 - dev: false 1945 - 1946 - /it-length/1.0.4: 1947 - resolution: {integrity: sha512-KN4jXzp77/GQ4fxUGMbsJx3ALUZ6SP3E79tzs2weGghtImDLFZzua/l3fOK0LN/hMH0M330HJRZWwYZfDNuCIA==} 1948 - dev: false 1949 - 1950 - /it-map/1.0.6: 1951 - resolution: {integrity: sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ==} 1952 - dev: false 1953 - 1954 - /it-merge/1.0.4: 1955 - resolution: {integrity: sha512-DcL6GksTD2HQ7+5/q3JznXaLNfwjyG3/bObaF98da+oHfUiPmdo64oJlT9J8R8G5sJRU7thwaY5zxoAKCn7FJw==} 1956 - dependencies: 1957 - it-pushable: 1.4.2 1958 - dev: false 1959 - 1960 - /it-parallel-batch/1.0.10: 1961 - resolution: {integrity: sha512-3+4gW15xdf/BOx9zij0QVnB1bDGSLOTABlaVm7ebHH1S9gDUgd5aLNb0WsFXPTfKe104iC6lxdzfbMGh1B07rg==} 1962 - dependencies: 1963 - it-batch: 1.0.9 1964 - dev: false 1965 - 1966 - /it-pipe/2.0.4: 1967 - resolution: {integrity: sha512-lK0BV0egwfc64DFJva+0Jh1z8UxwmYBpAHDwq21s0OenRCaEDIntx/iOyWH/jg5efBU6Xa8igzmOqm2CPPNDgg==} 1968 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 1969 - dependencies: 1970 - it-merge: 1.0.4 1971 - it-pushable: 3.1.0 1972 - it-stream-types: 1.0.4 1973 - dev: false 1974 - 1975 - /it-pushable/1.4.2: 1976 - resolution: {integrity: sha512-vVPu0CGRsTI8eCfhMknA7KIBqqGFolbRx+1mbQ6XuZ7YCz995Qj7L4XUviwClFunisDq96FdxzF5FnAbw15afg==} 1977 - dependencies: 1978 - fast-fifo: 1.1.0 1979 - dev: false 1980 - 1981 - /it-pushable/3.1.0: 1982 - resolution: {integrity: sha512-sEAdT86u6aIWvLkH4hlOmgvHpRyUOUG22HD365H+Dh67zYpaPdILmT4Om7Wjdb+m/SjEB81z3nYCoIrgVYpOFA==} 1983 - dev: false 1984 - 1985 - /it-sort/1.0.1: 1986 - resolution: {integrity: sha512-c+C48cP7XMMebB9irLrJs2EmpLILId8NYSojqAqN8etE8ienx0azBgaKvZHYH1DkerqIul0Fl2FqISu2BZgTEQ==} 1987 - dependencies: 1988 - it-all: 1.0.6 1989 - dev: false 1990 - 1991 - /it-stream-types/1.0.4: 1992 - resolution: {integrity: sha512-0F3CqTIcIHwtnmIgqd03a7sw8BegAmE32N2w7anIGdALea4oAN4ltqPgDMZ7zn4XPLZifXEZlBXSzgg64L1Ebw==} 1993 - dev: false 1994 - 1995 - /it-take/1.0.2: 1996 - resolution: {integrity: sha512-u7I6qhhxH7pSevcYNaMECtkvZW365ARqAIt9K+xjdK1B2WUDEjQSfETkOCT8bxFq/59LqrN3cMLUtTgmDBaygw==} 1997 - dev: false 1998 - 1999 - /js-sha3/0.8.0: 2000 - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} 2001 - dev: false 2002 - 2003 - /js-yaml/4.1.0: 2004 - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 2005 - hasBin: true 2006 - dependencies: 2007 - argparse: 2.0.1 2008 - dev: true 2009 - 2010 - /json-buffer/3.0.1: 2011 - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 2012 - dev: true 2013 - 2014 - /json-schema-traverse/0.4.1: 2015 - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 2016 - dev: true 2017 - 2018 - /json-stable-stringify-without-jsonify/1.0.1: 2019 - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 2020 - dev: true 2021 - 2022 - /jsonfile/6.1.0: 2023 - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 2024 - dependencies: 2025 - universalify: 2.0.0 2026 - optionalDependencies: 2027 - graceful-fs: 4.2.4 2028 - dev: true 2029 - 2030 - /jszip/3.7.1: 2031 - resolution: {integrity: sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==} 2032 - dependencies: 2033 - lie: 3.3.0 2034 - pako: 1.0.11 2035 - readable-stream: 2.3.7 2036 - set-immediate-shim: 1.0.1 2037 - dev: false 2038 - 2039 - /just-safe-get/4.1.1: 2040 - resolution: {integrity: sha512-Tgnp513ipAnS8oneoirig1V4buSR6aiuflN+BBm133Tz+hs58tad0bat6MkMSCPr2QtCQaHQ6BWC/aadWPGp9g==} 2041 - dev: false 2042 - 2043 - /just-safe-set/4.1.1: 2044 - resolution: {integrity: sha512-3tQtDVCvZfWc64yEbh2D8R80Zlz+x9LJVpkQ4K3ppdiO7iI1Jzf6wYgsAs1o/EMSwucRbaNb6JHex/24TbSaKw==} 2045 - dev: false 2046 - 2047 - /keystore-idb/0.15.5: 2048 - resolution: {integrity: sha512-7bcUAnY5iD0+N75odQVTCs8mhXBW+yLt9/HH8+VUrl44FGllpAhu7q3/w9QpNMHxLQv3OXs1fsA042CAviN79Q==} 2049 - engines: {node: '>=10.21.0'} 2050 - dependencies: 2051 - localforage: 1.10.0 2052 - one-webcrypto: 1.0.3 2053 - uint8arrays: 3.0.0 2054 - dev: false 2055 - 2056 - /keyv/4.0.3: 2057 - resolution: {integrity: sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==} 2058 - dependencies: 2059 - json-buffer: 3.0.1 2060 - dev: true 2061 - 2062 - /kleur/3.0.3: 2063 - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 2064 - engines: {node: '>=6'} 2065 - dev: true 2066 - 2067 - /level-supports/4.0.1: 2068 - resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} 2069 - engines: {node: '>=12'} 2070 - dev: false 2071 - 2072 - /level-transcoder/1.0.1: 2073 - resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} 2074 - engines: {node: '>=12'} 2075 - dependencies: 2076 - buffer: 6.0.3 2077 - module-error: 1.0.2 2078 - dev: false 2079 - 2080 - /level/8.0.0: 2081 - resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} 2082 - engines: {node: '>=12'} 2083 - dependencies: 2084 - browser-level: 1.0.1 2085 - classic-level: 1.2.0 2086 - dev: false 2087 - 2088 - /levn/0.4.1: 2089 - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 2090 - engines: {node: '>= 0.8.0'} 2091 - dependencies: 2092 - prelude-ls: 1.2.1 2093 - type-check: 0.4.0 2094 - dev: true 2095 - 2096 - /lie/3.1.1: 2097 - resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} 2098 - dependencies: 2099 - immediate: 3.0.6 2100 - dev: false 2101 - 2102 - /lie/3.3.0: 2103 - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} 2104 - dependencies: 2105 - immediate: 3.0.6 2106 - dev: false 2107 - 2108 - /lilconfig/2.0.5: 2109 - resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} 2110 - engines: {node: '>=10'} 2111 - dev: true 2112 - 2113 - /load-script2/2.0.6: 2114 - resolution: {integrity: sha512-pyuw/AR+ycZkRKgkMyXOIf/o2OnRQPc9grjZ04wVOeoJ7SqX97WlcZahl+3/r5qi09L/5d0iCVZ0q4OqNT/v0Q==} 2115 - dev: false 2116 - 2117 - /localforage/1.10.0: 2118 - resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} 2119 - dependencies: 2120 - lie: 3.1.1 2121 - dev: false 2122 - 2123 - /locate-path/5.0.0: 2124 - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 2125 - engines: {node: '>=8'} 2126 - dependencies: 2127 - p-locate: 4.1.0 2128 - dev: true 2129 - 2130 - /lodash.eq/4.0.0: 2131 - resolution: {integrity: sha512-vbrJpXL6kQNG6TkInxX12DZRfuYVllSxhwYqjYB78g2zF3UI15nFO/0AgmZnZRnaQ38sZtjCiVjGr2rnKt4v0g==} 2132 - dev: false 2133 - 2134 - /lodash.indexof/4.0.5: 2135 - resolution: {integrity: sha512-t9wLWMQsawdVmf6/IcAgVGqAJkNzYVcn4BHYZKTPW//l7N5Oq7Bq138BaVk19agcsPZePcidSgTTw4NqS1nUAw==} 2136 - dev: false 2137 - 2138 - /lodash.merge/4.6.2: 2139 - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 2140 - dev: true 2141 - 2142 - /lodash/4.17.20: 2143 - resolution: {integrity: sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==} 2144 - dev: true 2145 - 2146 - /lodash/4.17.21: 2147 - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 2148 - dev: false 2149 - 2150 - /log-symbols/4.1.0: 2151 - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 2152 - engines: {node: '>=10'} 2153 - dependencies: 2154 - chalk: 4.1.2 2155 - is-unicode-supported: 0.1.0 2156 - dev: true 2157 - 2158 - /long/4.0.0: 2159 - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} 2160 - dev: false 2161 - 2162 - /long/5.2.0: 2163 - resolution: {integrity: sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==} 2164 - dev: false 2165 - 2166 - /lowercase-keys/2.0.0: 2167 - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} 2168 - engines: {node: '>=8'} 2169 - dev: true 2170 - 2171 - /lunr/2.3.9: 2172 - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} 2173 - dev: false 2174 - 2175 - /media-typer/1.1.0: 2176 - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 2177 - engines: {node: '>= 0.8'} 2178 - dev: false 2179 - 2180 - /merge-options/3.0.4: 2181 - resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} 2182 - engines: {node: '>=10'} 2183 - dependencies: 2184 - is-plain-obj: 2.1.0 2185 - dev: false 2186 - 2187 - /merge2/1.4.1: 2188 - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 2189 - engines: {node: '>= 8'} 2190 - dev: true 2191 - 2192 - /micromatch/4.0.4: 2193 - resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} 2194 - engines: {node: '>=8.6'} 2195 - dependencies: 2196 - braces: 3.0.2 2197 - picomatch: 2.3.0 2198 - dev: true 2199 - 2200 - /mimic-fn/2.1.0: 2201 - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 2202 - engines: {node: '>=6'} 2203 - dev: true 2204 - 2205 - /mimic-response/1.0.1: 2206 - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} 2207 - engines: {node: '>=4'} 2208 - dev: true 2209 - 2210 - /mimic-response/2.1.0: 2211 - resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} 2212 - engines: {node: '>=8'} 2213 - dev: true 2214 - 2215 - /minimatch/3.0.4: 2216 - resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} 2217 - dependencies: 2218 - brace-expansion: 1.1.11 2219 - dev: true 2220 - 2221 - /minimatch/3.1.2: 2222 - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2223 - dependencies: 2224 - brace-expansion: 1.1.11 2225 - dev: true 2226 - 2227 - /minimist/1.2.5: 2228 - resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} 2229 - dev: true 2230 - 2231 - /mkdirp/0.5.5: 2232 - resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} 2233 - hasBin: true 2234 - dependencies: 2235 - minimist: 1.2.5 2236 - dev: true 2237 - 2238 - /module-error/1.0.2: 2239 - resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} 2240 - engines: {node: '>=10'} 2241 - dev: false 2242 - 2243 - /mortice/3.0.1: 2244 - resolution: {integrity: sha512-eyDUsl1nCR9+JtNksKnaESLP9MgAXCA4w1LTtsmOSQNsThnv++f36rrBu5fC/fdGIwTJZmbiaR/QewptH93pYA==} 2245 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 2246 - dependencies: 2247 - nanoid: 4.0.0 2248 - observable-webworkers: 2.0.1 2249 - p-queue: 7.3.0 2250 - p-timeout: 6.0.0 2251 - dev: false 2252 - 2253 - /ms/2.1.2: 2254 - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2255 - 2256 - /ms/2.1.3: 2257 - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2258 - dev: false 2259 - 2260 - /multiaddr/10.0.1: 2261 - resolution: {integrity: sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg==} 2262 - dependencies: 2263 - dns-over-http-resolver: 1.2.3 2264 - err-code: 3.0.1 2265 - is-ip: 3.1.0 2266 - multiformats: 9.6.3 2267 - uint8arrays: 3.0.0 2268 - varint: 6.0.0 2269 - transitivePeerDependencies: 2270 - - node-fetch 2271 - - supports-color 2272 - dev: false 2273 - 2274 - /multibase/3.1.2: 2275 - resolution: {integrity: sha512-bpklWHs70LO3smJUHOjcnzGceJJvn9ui0Vau6Za0B/GBepaXswmW8Ufea0uD9pROf/qCQ4N4lZ3sf3U+SNf0tw==} 2276 - engines: {node: '>=10.0.0', npm: '>=6.0.0'} 2277 - deprecated: This module has been superseded by the multiformats module 2278 - dependencies: 2279 - '@multiformats/base-x': 4.0.1 2280 - web-encoding: 1.1.5 2281 - dev: false 2282 - 2283 - /multibase/4.0.6: 2284 - resolution: {integrity: sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==} 2285 - engines: {node: '>=12.0.0', npm: '>=6.0.0'} 2286 - deprecated: This module has been superseded by the multiformats module 2287 - dependencies: 2288 - '@multiformats/base-x': 4.0.1 2289 - dev: false 2290 - 2291 - /multicodec/3.2.1: 2292 - resolution: {integrity: sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw==} 2293 - deprecated: This module has been superseded by the multiformats module 2294 - dependencies: 2295 - uint8arrays: 3.0.0 2296 - varint: 6.0.0 2297 - dev: false 2298 - 2299 - /multiformats/9.6.3: 2300 - resolution: {integrity: sha512-yfXKI66fL0nFzt0nJl26i4wV1qAqbAEIBvfFbkbsne9GrLz6IHvHUoRyxUtlJcdP181ssOgjama6E/VSk4pbrA==} 2301 - dev: false 2302 - 2303 - /multihashes/3.1.0: 2304 - resolution: {integrity: sha512-snU+w6aZy5bTrrqIHW3wkT0MfHmxcpOsaVNJt0NzUnseksbjFDVUZjSmhDMAVOVnIdLMS7xHjo55pKlBIGmC3g==} 2305 - engines: {node: '>=10.0.0', npm: '>=6.0.0'} 2306 - dependencies: 2307 - multibase: 3.1.2 2308 - uint8arrays: 1.1.0 2309 - varint: 6.0.0 2310 - dev: false 2311 - 2312 - /multihashes/4.0.3: 2313 - resolution: {integrity: sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==} 2314 - engines: {node: '>=12.0.0', npm: '>=6.0.0'} 2315 - dependencies: 2316 - multibase: 4.0.6 2317 - uint8arrays: 3.0.0 2318 - varint: 5.0.2 2319 - dev: false 2320 - 2321 - /multihashing-async/2.0.1: 2322 - resolution: {integrity: sha512-LZcH8PqW4iEKymaJ3RpsgpSJhXF29kAvO02ccqbysiXkQhZpVce8rrg+vzRKWO89hhyIBnQHI2e/ZoRVxmiJ2Q==} 2323 - engines: {node: '>=10.0.0', npm: '>=6.0.0'} 2324 - deprecated: This module has been superseded by the multiformats module 2325 - dependencies: 2326 - blakejs: 1.1.0 2327 - err-code: 2.0.3 2328 - js-sha3: 0.8.0 2329 - multihashes: 3.1.0 2330 - murmurhash3js-revisited: 3.0.0 2331 - uint8arrays: 1.1.0 2332 - dev: false 2333 - 2334 - /murmurhash3js-revisited/3.0.0: 2335 - resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} 2336 - engines: {node: '>=8.0.0'} 2337 - dev: false 2338 - 2339 - /music-metadata-browser/2.5.6: 2340 - resolution: {integrity: sha512-tzv2pJh6Cr/Rnqz59KqLmzszbRy8EJtORpxYaGPk0GwTGUoOn68oqfq5QiwaJAwEbEz5WIzlEOGke2f6i0EfwQ==} 2341 - dependencies: 2342 - buffer: 6.0.3 2343 - debug: 4.3.4 2344 - music-metadata: 7.12.3 2345 - readable-stream: 3.6.0 2346 - readable-web-to-node-stream: 3.0.2 2347 - transitivePeerDependencies: 2348 - - supports-color 2349 - dev: false 2350 - 2351 - /music-metadata/7.12.3: 2352 - resolution: {integrity: sha512-6pZngaroNxGBf8KZjE8reGZJiS533eJq7dBFsyoiEAZIORQAxmVVx20ABh9W2tsLT+5mKYyDzcNi5GuHf3jitg==} 2353 - engines: {node: '>=10'} 2354 - dependencies: 2355 - '@tokenizer/token': 0.3.0 2356 - content-type: 1.0.4 2357 - debug: 4.3.4 2358 - file-type: 16.5.3 2359 - media-typer: 1.1.0 2360 - strtok3: 6.3.0 2361 - token-types: 4.2.0 2362 - transitivePeerDependencies: 2363 - - supports-color 2364 - dev: false 2365 - 2366 - /nanoid/3.3.4: 2367 - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 2368 - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2369 - hasBin: true 2370 - 2371 - /nanoid/4.0.0: 2372 - resolution: {integrity: sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg==} 2373 - engines: {node: ^14 || ^16 || >=18} 2374 - hasBin: true 2375 - dev: false 2376 - 2377 - /napi-macros/2.0.0: 2378 - resolution: {integrity: sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==} 2379 - dev: false 2380 - 2381 - /native-fetch/3.0.0: 2382 - resolution: {integrity: sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==} 2383 - peerDependencies: 2384 - node-fetch: '*' 2385 - dev: false 2386 - 2387 - /native-fetch/4.0.2: 2388 - resolution: {integrity: sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==} 2389 - peerDependencies: 2390 - undici: '*' 2391 - dev: false 2392 - 2393 - /natural-compare/1.4.0: 2394 - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2395 - dev: true 2396 - 2397 - /node-fetch/2.6.7: 2398 - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} 2399 - engines: {node: 4.x || >=6.0.0} 2400 - peerDependencies: 2401 - encoding: ^0.1.0 2402 - peerDependenciesMeta: 2403 - encoding: 2404 - optional: true 2405 - dependencies: 2406 - whatwg-url: 5.0.0 2407 - dev: false 2408 - 2409 - /node-gyp-build/4.5.0: 2410 - resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} 2411 - hasBin: true 2412 - dev: false 2413 - 2414 - /node-releases/2.0.5: 2415 - resolution: {integrity: sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==} 2416 - dev: true 2417 - 2418 - /normalize-path/3.0.0: 2419 - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2420 - engines: {node: '>=0.10.0'} 2421 - dev: true 2422 - 2423 - /normalize-range/0.1.2: 2424 - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 2425 - engines: {node: '>=0.10.0'} 2426 - dev: true 2427 - 2428 - /normalize-url/4.5.0: 2429 - resolution: {integrity: sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==} 2430 - engines: {node: '>=8'} 2431 - dev: true 2432 - 2433 - /object-hash/3.0.0: 2434 - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 2435 - engines: {node: '>= 6'} 2436 - dev: true 2437 - 2438 - /object-inspect/1.11.0: 2439 - resolution: {integrity: sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==} 2440 - 2441 - /object-is/1.1.5: 2442 - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} 2443 - engines: {node: '>= 0.4'} 2444 - dependencies: 2445 - call-bind: 1.0.2 2446 - define-properties: 1.1.3 2447 - dev: true 2448 - 2449 - /object-keys/1.1.1: 2450 - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 2451 - engines: {node: '>= 0.4'} 2452 - 2453 - /object.assign/4.1.2: 2454 - resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} 2455 - engines: {node: '>= 0.4'} 2456 - dependencies: 2457 - call-bind: 1.0.2 2458 - define-properties: 1.1.3 2459 - has-symbols: 1.0.2 2460 - object-keys: 1.1.1 2461 - 2462 - /observable-webworkers/2.0.1: 2463 - resolution: {integrity: sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw==} 2464 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 2465 - dev: false 2466 - 2467 - /once/1.4.0: 2468 - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2469 - dependencies: 2470 - wrappy: 1.0.2 2471 - dev: true 2472 - 2473 - /one-webcrypto/1.0.3: 2474 - resolution: {integrity: sha512-fu9ywBVBPx0gS9K0etIROTiCkvI5S1TDjFsYFb3rC1ewFxeOqsbzq7aIMBHsYfrTHBcGXJaONXXjTl8B01cW1Q==} 2475 - dev: false 2476 - 2477 - /onetime/5.1.2: 2478 - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 2479 - engines: {node: '>=6'} 2480 - dependencies: 2481 - mimic-fn: 2.1.0 2482 - dev: true 2483 - 2484 - /optionator/0.9.1: 2485 - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 2486 - engines: {node: '>= 0.8.0'} 2487 - dependencies: 2488 - deep-is: 0.1.3 2489 - fast-levenshtein: 2.0.6 2490 - levn: 0.4.1 2491 - prelude-ls: 1.2.1 2492 - type-check: 0.4.0 2493 - word-wrap: 1.2.3 2494 - dev: true 2495 - 2496 - /ora/5.4.1: 2497 - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} 2498 - engines: {node: '>=10'} 2499 - dependencies: 2500 - bl: 4.1.0 2501 - chalk: 4.1.2 2502 - cli-cursor: 3.1.0 2503 - cli-spinners: 2.5.0 2504 - is-interactive: 1.0.0 2505 - is-unicode-supported: 0.1.0 2506 - log-symbols: 4.1.0 2507 - strip-ansi: 6.0.1 2508 - wcwidth: 1.0.1 2509 - dev: true 2510 - 2511 - /p-cancelable/2.0.0: 2512 - resolution: {integrity: sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==} 2513 - engines: {node: '>=8'} 2514 - dev: true 2515 - 2516 - /p-event/4.2.0: 2517 - resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} 2518 - engines: {node: '>=8'} 2519 - dependencies: 2520 - p-timeout: 3.2.0 2521 - dev: true 2522 - 2523 - /p-finally/1.0.0: 2524 - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} 2525 - engines: {node: '>=4'} 2526 - dev: true 2527 - 2528 - /p-limit/2.3.0: 2529 - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 2530 - engines: {node: '>=6'} 2531 - dependencies: 2532 - p-try: 2.2.0 2533 - dev: true 2534 - 2535 - /p-locate/4.1.0: 2536 - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 2537 - engines: {node: '>=8'} 2538 - dependencies: 2539 - p-limit: 2.3.0 2540 - dev: true 2541 - 2542 - /p-queue/7.3.0: 2543 - resolution: {integrity: sha512-5fP+yVQ0qp0rEfZoDTlP2c3RYBgxvRsw30qO+VtPPc95lyvSG+x6USSh1TuLB4n96IO6I8/oXQGsTgtna4q2nQ==} 2544 - engines: {node: '>=12'} 2545 - dependencies: 2546 - eventemitter3: 4.0.7 2547 - p-timeout: 5.1.0 2548 - dev: false 2549 - 2550 - /p-retry/4.6.1: 2551 - resolution: {integrity: sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==} 2552 - engines: {node: '>=8'} 2553 - dependencies: 2554 - '@types/retry': 0.12.0 2555 - retry: 0.13.1 2556 - dev: false 2557 - 2558 - /p-timeout/3.2.0: 2559 - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} 2560 - engines: {node: '>=8'} 2561 - dependencies: 2562 - p-finally: 1.0.0 2563 - dev: true 2564 - 2565 - /p-timeout/5.1.0: 2566 - resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} 2567 - engines: {node: '>=12'} 2568 - dev: false 2569 - 2570 - /p-timeout/6.0.0: 2571 - resolution: {integrity: sha512-5iS61MOdUMemWH9CORQRxVXTp9g5K8rPnI9uQpo97aWgsH3vVXKjkIhDi+OgIDmN3Ly9+AZ2fZV01Wut1yzfKA==} 2572 - engines: {node: '>=14.16'} 2573 - dev: false 2574 - 2575 - /p-try/2.2.0: 2576 - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 2577 - engines: {node: '>=6'} 2578 - dev: true 2579 - 2580 - /pako/1.0.11: 2581 - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} 2582 - dev: false 2583 - 2584 - /parent-module/1.0.1: 2585 - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2586 - engines: {node: '>=6'} 2587 - dependencies: 2588 - callsites: 3.1.0 2589 - dev: true 2590 - 2591 - /path-exists/4.0.0: 2592 - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2593 - engines: {node: '>=8'} 2594 - dev: true 2595 - 2596 - /path-is-absolute/1.0.1: 2597 - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2598 - engines: {node: '>=0.10.0'} 2599 - dev: true 2600 - 2601 - /path-key/3.1.1: 2602 - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2603 - engines: {node: '>=8'} 2604 - dev: true 2605 - 2606 - /path-parse/1.0.7: 2607 - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2608 - dev: true 2609 - 2610 - /peek-readable/4.1.0: 2611 - resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} 2612 - engines: {node: '>=8'} 2613 - dev: false 2614 - 2615 - /picocolors/1.0.0: 2616 - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2617 - dev: true 2618 - 2619 - /picomatch/2.3.0: 2620 - resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} 2621 - engines: {node: '>=8.6'} 2622 - dev: true 2623 - 2624 - /pify/2.3.0: 2625 - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 2626 - engines: {node: '>=0.10.0'} 2627 - dev: true 2628 - 2629 - /postcss-custom-properties/12.1.7_postcss@8.4.14: 2630 - resolution: {integrity: sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==} 2631 - engines: {node: ^12 || ^14 || >=16} 2632 - peerDependencies: 2633 - postcss: ^8.4 2634 - dependencies: 2635 - postcss: 8.4.14 2636 - postcss-value-parser: 4.2.0 2637 - dev: true 2638 - 2639 - /postcss-import/14.1.0_postcss@8.4.14: 2640 - resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} 2641 - engines: {node: '>=10.0.0'} 2642 - peerDependencies: 2643 - postcss: ^8.0.0 2644 - dependencies: 2645 - postcss: 8.4.14 2646 - postcss-value-parser: 4.2.0 2647 - read-cache: 1.0.0 2648 - resolve: 1.22.0 2649 - dev: true 2650 - 2651 - /postcss-js/4.0.0_postcss@8.4.14: 2652 - resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} 2653 - engines: {node: ^12 || ^14 || >= 16} 2654 - peerDependencies: 2655 - postcss: ^8.3.3 2656 - dependencies: 2657 - camelcase-css: 2.0.1 2658 - postcss: 8.4.14 2659 - dev: true 2660 - 2661 - /postcss-load-config/3.1.4_postcss@8.4.14: 2662 - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 2663 - engines: {node: '>= 10'} 2664 - peerDependencies: 2665 - postcss: '>=8.0.9' 2666 - ts-node: '>=9.0.0' 2667 - peerDependenciesMeta: 2668 - postcss: 2669 - optional: true 2670 - ts-node: 2671 - optional: true 2672 - dependencies: 2673 - lilconfig: 2.0.5 2674 - postcss: 8.4.14 2675 - yaml: 1.10.2 2676 - dev: true 2677 - 2678 - /postcss-nested/5.0.6_postcss@8.4.14: 2679 - resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} 2680 - engines: {node: '>=12.0'} 2681 - peerDependencies: 2682 - postcss: ^8.2.14 2683 - dependencies: 2684 - postcss: 8.4.14 2685 - postcss-selector-parser: 6.0.10 2686 - dev: true 2687 - 2688 - /postcss-selector-parser/6.0.10: 2689 - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} 2690 - engines: {node: '>=4'} 2691 - dependencies: 2692 - cssesc: 3.0.0 2693 - util-deprecate: 1.0.2 2694 - dev: true 2695 - 2696 - /postcss-selector-parser/6.0.4: 2697 - resolution: {integrity: sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==} 2698 - engines: {node: '>=4'} 2699 - dependencies: 2700 - cssesc: 3.0.0 2701 - indexes-of: 1.0.1 2702 - uniq: 1.0.1 2703 - util-deprecate: 1.0.2 2704 - dev: true 2705 - 2706 - /postcss-value-parser/4.2.0: 2707 - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 2708 - dev: true 2709 - 2710 - /postcss/8.4.14: 2711 - resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} 2712 - engines: {node: ^10 || ^12 || >=14} 2713 - dependencies: 2714 - nanoid: 3.3.4 2715 - picocolors: 1.0.0 2716 - source-map-js: 1.0.2 2717 - dev: true 2718 - 2719 - /prelude-ls/1.2.1: 2720 - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2721 - engines: {node: '>= 0.8.0'} 2722 - dev: true 2723 - 2724 - /process-nextick-args/2.0.1: 2725 - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 2726 - dev: false 2727 - 2728 - /prompts/2.4.0: 2729 - resolution: {integrity: sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==} 2730 - engines: {node: '>= 6'} 2731 - dependencies: 2732 - kleur: 3.0.3 2733 - sisteransi: 1.0.5 2734 - dev: true 2735 - 2736 - /proper-lockfile/4.1.2: 2737 - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} 2738 - dependencies: 2739 - graceful-fs: 4.2.4 2740 - retry: 0.12.0 2741 - signal-exit: 3.0.3 2742 - dev: false 2743 - 2744 - /protobufjs/6.11.2: 2745 - resolution: {integrity: sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==} 2746 - hasBin: true 2747 - requiresBuild: true 2748 - dependencies: 2749 - '@protobufjs/aspromise': 1.1.2 2750 - '@protobufjs/base64': 1.1.2 2751 - '@protobufjs/codegen': 2.0.4 2752 - '@protobufjs/eventemitter': 1.1.0 2753 - '@protobufjs/fetch': 1.1.0 2754 - '@protobufjs/float': 1.0.2 2755 - '@protobufjs/inquire': 1.1.0 2756 - '@protobufjs/path': 1.1.2 2757 - '@protobufjs/pool': 1.1.0 2758 - '@protobufjs/utf8': 1.1.0 2759 - '@types/long': 4.0.1 2760 - '@types/node': 18.7.15 2761 - long: 4.0.0 2762 - dev: false 2763 - 2764 - /protobufjs/7.1.0: 2765 - resolution: {integrity: sha512-rCuxKlh0UQKSMjrpIcTLbR5TtGQ52cgs1a5nUoPBAKOccdPblN67BJtjrbtudUJK6HmBvUdsmymyYOzO7lxZEA==} 2766 - engines: {node: '>=12.0.0'} 2767 - requiresBuild: true 2768 - dependencies: 2769 - '@protobufjs/aspromise': 1.1.2 2770 - '@protobufjs/base64': 1.1.2 2771 - '@protobufjs/codegen': 2.0.4 2772 - '@protobufjs/eventemitter': 1.1.0 2773 - '@protobufjs/fetch': 1.1.0 2774 - '@protobufjs/float': 1.0.2 2775 - '@protobufjs/inquire': 1.1.0 2776 - '@protobufjs/path': 1.1.2 2777 - '@protobufjs/pool': 1.1.0 2778 - '@protobufjs/utf8': 1.1.0 2779 - '@types/node': 18.7.15 2780 - long: 5.2.0 2781 - dev: false 2782 - 2783 - /pump/3.0.0: 2784 - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 2785 - dependencies: 2786 - end-of-stream: 1.4.4 2787 - once: 1.4.0 2788 - dev: true 2789 - 2790 - /punycode/2.1.1: 2791 - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 2792 - engines: {node: '>=6'} 2793 - dev: true 2794 - 2795 - /queue-microtask/1.2.3: 2796 - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2797 - 2798 - /quick-lru/5.1.1: 2799 - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 2800 - engines: {node: '>=10'} 2801 - dev: true 2802 - 2803 - /read-cache/1.0.0: 2804 - resolution: {integrity: sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=} 2805 - dependencies: 2806 - pify: 2.3.0 2807 - dev: true 2808 - 2809 - /readable-stream/2.3.7: 2810 - resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 2811 - dependencies: 2812 - core-util-is: 1.0.2 2813 - inherits: 2.0.4 2814 - isarray: 1.0.0 2815 - process-nextick-args: 2.0.1 2816 - safe-buffer: 5.1.2 2817 - string_decoder: 1.1.1 2818 - util-deprecate: 1.0.2 2819 - dev: false 2820 - 2821 - /readable-stream/3.6.0: 2822 - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} 2823 - engines: {node: '>= 6'} 2824 - dependencies: 2825 - inherits: 2.0.4 2826 - string_decoder: 1.3.0 2827 - util-deprecate: 1.0.2 2828 - 2829 - /readable-web-to-node-stream/3.0.2: 2830 - resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} 2831 - engines: {node: '>=8'} 2832 - dependencies: 2833 - readable-stream: 3.6.0 2834 - dev: false 2835 - 2836 - /readdirp/3.6.0: 2837 - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2838 - engines: {node: '>=8.10.0'} 2839 - dependencies: 2840 - picomatch: 2.3.0 2841 - dev: true 2842 - 2843 - /receptacle/1.3.2: 2844 - resolution: {integrity: sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==} 2845 - dependencies: 2846 - ms: 2.1.3 2847 - dev: false 2848 - 2849 - /reflect-metadata/0.1.13: 2850 - resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} 2851 - dev: false 2852 - 2853 - /regexpp/3.2.0: 2854 - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 2855 - engines: {node: '>=8'} 2856 - dev: true 2857 - 2858 - /remotestoragejs/1.2.3: 2859 - resolution: {integrity: sha512-uXmWjBC3OoPR7q4v5MHAkYCLzNMvCe7afUeDQSoqdQ53Zw4BjhlF8ARGRVhe+5nbCBuJspaA2O5lTiqp4GVdeA==} 2860 - dependencies: 2861 - tv4: 1.3.0 2862 - webfinger.js: 2.7.0 2863 - xhr2: 0.2.0 2864 - dev: false 2865 - 2866 - /resolve-from/4.0.0: 2867 - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2868 - engines: {node: '>=4'} 2869 - dev: true 2870 - 2871 - /resolve/1.22.0: 2872 - resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} 2873 - hasBin: true 2874 - dependencies: 2875 - is-core-module: 2.8.1 2876 - path-parse: 1.0.7 2877 - supports-preserve-symlinks-flag: 1.0.0 2878 - dev: true 2879 - 2880 - /responselike/2.0.0: 2881 - resolution: {integrity: sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==} 2882 - dependencies: 2883 - lowercase-keys: 2.0.0 2884 - dev: true 2885 - 2886 - /restore-cursor/3.1.0: 2887 - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} 2888 - engines: {node: '>=8'} 2889 - dependencies: 2890 - onetime: 5.1.2 2891 - signal-exit: 3.0.3 2892 - dev: true 2893 - 2894 - /retry/0.12.0: 2895 - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} 2896 - engines: {node: '>= 4'} 2897 - dev: false 2898 - 2899 - /retry/0.13.1: 2900 - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} 2901 - engines: {node: '>= 4'} 2902 - dev: false 2903 - 2904 - /reusify/1.0.4: 2905 - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2906 - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2907 - dev: true 2908 - 2909 - /rimraf/2.6.3: 2910 - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} 2911 - hasBin: true 2912 - dependencies: 2913 - glob: 7.1.7 2914 - dev: true 2915 - 2916 - /rimraf/3.0.2: 2917 - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2918 - hasBin: true 2919 - dependencies: 2920 - glob: 7.1.7 2921 - dev: true 2922 - 2923 - /run-parallel-limit/1.1.0: 2924 - resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} 2925 - dependencies: 2926 - queue-microtask: 1.2.3 2927 - dev: false 2928 - 2929 - /run-parallel/1.2.0: 2930 - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2931 - dependencies: 2932 - queue-microtask: 1.2.3 2933 - dev: true 2934 - 2935 - /safe-buffer/5.1.2: 2936 - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 2937 - dev: false 2938 - 2939 - /safe-buffer/5.2.1: 2940 - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 2941 - 2942 - /seedrandom/3.0.5: 2943 - resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} 2944 - dev: false 2945 - 2946 - /set-immediate-shim/1.0.1: 2947 - resolution: {integrity: sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=} 2948 - engines: {node: '>=0.10.0'} 2949 - dev: false 2950 - 2951 - /shebang-command/2.0.0: 2952 - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2953 - engines: {node: '>=8'} 2954 - dependencies: 2955 - shebang-regex: 3.0.0 2956 - dev: true 2957 - 2958 - /shebang-regex/3.0.0: 2959 - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2960 - engines: {node: '>=8'} 2961 - dev: true 2962 - 2963 - /signal-exit/3.0.3: 2964 - resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==} 2965 - 2966 - /sisteransi/1.0.5: 2967 - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 2968 - dev: true 2969 - 2970 - /sort-keys/5.0.0: 2971 - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} 2972 - engines: {node: '>=12'} 2973 - dependencies: 2974 - is-plain-obj: 4.1.0 2975 - dev: false 2976 - 2977 - /source-map-js/1.0.2: 2978 - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2979 - engines: {node: '>=0.10.0'} 2980 - dev: true 2981 - 2982 - /stable/0.1.8: 2983 - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} 2984 - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' 2985 - dev: false 2986 - 2987 - /string-width/4.2.2: 2988 - resolution: {integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==} 2989 - engines: {node: '>=8'} 2990 - dependencies: 2991 - emoji-regex: 8.0.0 2992 - is-fullwidth-code-point: 3.0.0 2993 - strip-ansi: 6.0.1 2994 - dev: true 2995 - 2996 - /string.prototype.trimend/1.0.4: 2997 - resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==} 2998 - dependencies: 2999 - call-bind: 1.0.2 3000 - define-properties: 1.1.3 3001 - 3002 - /string.prototype.trimstart/1.0.4: 3003 - resolution: {integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==} 3004 - dependencies: 3005 - call-bind: 1.0.2 3006 - define-properties: 1.1.3 3007 - 3008 - /string_decoder/1.1.1: 3009 - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 3010 - dependencies: 3011 - safe-buffer: 5.1.2 3012 - dev: false 3013 - 3014 - /string_decoder/1.3.0: 3015 - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 3016 - dependencies: 3017 - safe-buffer: 5.2.1 3018 - 3019 - /strip-ansi/6.0.1: 3020 - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 3021 - engines: {node: '>=8'} 3022 - dependencies: 3023 - ansi-regex: 5.0.1 3024 - dev: true 3025 - 3026 - /strip-json-comments/3.1.1: 3027 - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 3028 - engines: {node: '>=8'} 3029 - dev: true 3030 - 3031 - /strtok3/6.3.0: 3032 - resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} 3033 - engines: {node: '>=10'} 3034 - dependencies: 3035 - '@tokenizer/token': 0.3.0 3036 - peek-readable: 4.1.0 3037 - dev: false 3038 - 3039 - /subworkers/1.0.1: 3040 - resolution: {integrity: sha512-5R3HH7AMvvuWozRqgOCe/zJic3Hn/mdVHpg7ILuo2BV8qosTiDDngLpsvNernPnUnH57fP3IWU8Eux354E2WcQ==} 3041 - dev: false 3042 - 3043 - /super-regex/0.2.0: 3044 - resolution: {integrity: sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==} 3045 - engines: {node: '>=14.16'} 3046 - dependencies: 3047 - clone-regexp: 3.0.0 3048 - function-timeout: 0.1.1 3049 - time-span: 5.1.0 3050 - dev: false 3051 - 3052 - /supports-color/7.2.0: 3053 - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 3054 - engines: {node: '>=8'} 3055 - dependencies: 3056 - has-flag: 4.0.0 3057 - dev: true 3058 - 3059 - /supports-hyperlinks/2.1.0: 3060 - resolution: {integrity: sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==} 3061 - engines: {node: '>=8'} 3062 - dependencies: 3063 - has-flag: 4.0.0 3064 - supports-color: 7.2.0 3065 - dev: true 3066 - 3067 - /supports-preserve-symlinks-flag/1.0.0: 3068 - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 3069 - engines: {node: '>= 0.4'} 3070 - dev: true 3071 - 3072 - /tailwindcss-animations/2.0.0: 3073 - resolution: {integrity: sha512-YLdhPiQeDtpnqWd0J70rvy08MDbsq+BBLrzMmPR1Pe6MJDFYDuk4CYGI14GVgj7xRBGkByzp/rAfBcUWD7zpng==} 3074 - deprecated: Use Tailwind 1.6's animation utilities 3075 - dependencies: 3076 - lodash: 4.17.20 3077 - dev: true 3078 - 3079 - /tailwindcss-interaction-variants/5.0.0: 3080 - resolution: {integrity: sha512-Tmx9HjwuNA3G7cLUcebGkNchKkNVIZXBroxa0LBoq/KUb/xEKEM8qugUG7QczSNPhaZzpXmo3IzPkRhf4tDaOQ==} 3081 - dependencies: 3082 - lodash: 4.17.20 3083 - postcss-selector-parser: 6.0.4 3084 - dev: true 3085 - 3086 - /tailwindcss/3.0.24_postcss@8.4.14: 3087 - resolution: {integrity: sha512-H3uMmZNWzG6aqmg9q07ZIRNIawoiEcNFKDfL+YzOPuPsXuDXxJxB9icqzLgdzKNwjG3SAro2h9SYav8ewXNgig==} 3088 - engines: {node: '>=12.13.0'} 3089 - hasBin: true 3090 - peerDependencies: 3091 - postcss: ^8.0.9 3092 - dependencies: 3093 - arg: 5.0.1 3094 - chokidar: 3.5.3 3095 - color-name: 1.1.4 3096 - detective: 5.2.0 3097 - didyoumean: 1.2.2 3098 - dlv: 1.1.3 3099 - fast-glob: 3.2.11 3100 - glob-parent: 6.0.2 3101 - is-glob: 4.0.3 3102 - lilconfig: 2.0.5 3103 - normalize-path: 3.0.0 3104 - object-hash: 3.0.0 3105 - picocolors: 1.0.0 3106 - postcss: 8.4.14 3107 - postcss-js: 4.0.0_postcss@8.4.14 3108 - postcss-load-config: 3.1.4_postcss@8.4.14 3109 - postcss-nested: 5.0.6_postcss@8.4.14 3110 - postcss-selector-parser: 6.0.10 3111 - postcss-value-parser: 4.2.0 3112 - quick-lru: 5.1.1 3113 - resolve: 1.22.0 3114 - transitivePeerDependencies: 3115 - - ts-node 3116 - dev: true 3117 - 3118 - /temp/0.9.4: 3119 - resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} 3120 - engines: {node: '>=6.0.0'} 3121 - dependencies: 3122 - mkdirp: 0.5.5 3123 - rimraf: 2.6.3 3124 - dev: true 3125 - 3126 - /terminal-link/2.1.1: 3127 - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} 3128 - engines: {node: '>=8'} 3129 - dependencies: 3130 - ansi-escapes: 4.3.1 3131 - supports-hyperlinks: 2.1.0 3132 - dev: true 3133 - 3134 - /text-table/0.2.0: 3135 - resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} 3136 - dev: true 3137 - 3138 - /throttle-debounce/3.0.1: 3139 - resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} 3140 - engines: {node: '>=10'} 3141 - dev: false 3142 - 3143 - /time-span/5.1.0: 3144 - resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} 3145 - engines: {node: '>=12'} 3146 - dependencies: 3147 - convert-hrtime: 5.0.0 3148 - dev: false 3149 - 3150 - /timer.js/1.0.4: 3151 - resolution: {integrity: sha1-GNctxczMQKTrOTaUsvSN4qKgKBk=} 3152 - dev: false 3153 - 3154 - /to-readable-stream/2.1.0: 3155 - resolution: {integrity: sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==} 3156 - engines: {node: '>=8'} 3157 - dev: true 3158 - 3159 - /to-regex-range/5.0.1: 3160 - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 3161 - engines: {node: '>=8.0'} 3162 - dependencies: 3163 - is-number: 7.0.0 3164 - dev: true 3165 - 3166 - /tocca/2.0.9: 3167 - resolution: {integrity: sha512-FXofUGAFcgEIEOS3m9Dk9URaY3x+JeerPfVFc8K820PjV0JcCsH98BFxrVOTANC8YvM4QTrmKMol2/818gFmCw==} 3168 - dev: false 3169 - 3170 - /token-types/4.2.0: 3171 - resolution: {integrity: sha512-P0rrp4wUpefLncNamWIef62J0v0kQR/GfDVji9WKY7GDCWy5YbVSrKUTam07iWPZQGy0zWNOfstYTykMmPNR7w==} 3172 - engines: {node: '>=10'} 3173 - dependencies: 3174 - '@tokenizer/token': 0.3.0 3175 - ieee754: 1.2.1 3176 - dev: false 3177 - 3178 - /tr46/0.0.3: 3179 - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 3180 - dev: false 3181 - 3182 - /tv4/1.3.0: 3183 - resolution: {integrity: sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=} 3184 - engines: {node: '>= 0.8.0'} 3185 - dev: false 3186 - 3187 - /tweetnacl/1.0.3: 3188 - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} 3189 - dev: false 3190 - 3191 - /type-check/0.4.0: 3192 - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 3193 - engines: {node: '>= 0.8.0'} 3194 - dependencies: 3195 - prelude-ls: 1.2.1 3196 - dev: true 3197 - 3198 - /type-fest/0.10.0: 3199 - resolution: {integrity: sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==} 3200 - engines: {node: '>=8'} 3201 - dev: true 3202 - 3203 - /type-fest/0.11.0: 3204 - resolution: {integrity: sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==} 3205 - engines: {node: '>=8'} 3206 - dev: true 3207 - 3208 - /type-fest/0.20.2: 3209 - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 3210 - engines: {node: '>=10'} 3211 - dev: true 3212 - 3213 - /uint8arraylist/2.3.2: 3214 - resolution: {integrity: sha512-4ybc/jixmtGhUrebJ0bzB95TjEbskWxBKBRrAozw7P6WcAcZdPMYSLdDuNoEEGo/Cwe+0TNic9CXzWUWzy1quw==} 3215 - engines: {node: '>=16.0.0', npm: '>=7.0.0'} 3216 - dependencies: 3217 - uint8arrays: 3.1.0 3218 - dev: false 3219 - 3220 - /uint8arrays/1.1.0: 3221 - resolution: {integrity: sha512-cLdlZ6jnFczsKf5IH1gPHTtcHtPGho5r4CvctohmQjw8K7Q3gFdfIGHxSTdTaCKrL4w09SsPRJTqRS0drYeszA==} 3222 - dependencies: 3223 - multibase: 3.1.2 3224 - web-encoding: 1.1.5 3225 - dev: false 3226 - 3227 - /uint8arrays/2.1.7: 3228 - resolution: {integrity: sha512-k+yuEWEHQG/TuRaxL+JVEe8IBqyU5dhDkw+CISCDccOcW90dIju0A6i0Iwav0MK7kg73FZpowqOByS5e/B6GYA==} 3229 - dependencies: 3230 - multiformats: 9.6.3 3231 - dev: false 3232 - 3233 - /uint8arrays/3.0.0: 3234 - resolution: {integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==} 3235 - dependencies: 3236 - multiformats: 9.6.3 3237 - dev: false 3238 - 3239 - /uint8arrays/3.1.0: 3240 - resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} 3241 - dependencies: 3242 - multiformats: 9.6.3 3243 - dev: false 3244 - 3245 - /unbox-primitive/1.0.1: 3246 - resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} 3247 - dependencies: 3248 - function-bind: 1.1.1 3249 - has-bigints: 1.0.1 3250 - has-symbols: 1.0.2 3251 - which-boxed-primitive: 1.0.2 3252 - 3253 - /uniq/1.0.1: 3254 - resolution: {integrity: sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=} 3255 - dev: true 3256 - 3257 - /universalify/1.0.0: 3258 - resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==} 3259 - engines: {node: '>= 10.0.0'} 3260 - dev: true 3261 - 3262 - /universalify/2.0.0: 3263 - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} 3264 - engines: {node: '>= 10.0.0'} 3265 - dev: true 3266 - 3267 - /uri-js/4.4.1: 3268 - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 3269 - dependencies: 3270 - punycode: 2.1.1 3271 - dev: true 3272 - 3273 - /util-deprecate/1.0.2: 3274 - resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 3275 - 3276 - /util/0.12.4: 3277 - resolution: {integrity: sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==} 3278 - dependencies: 3279 - inherits: 2.0.4 3280 - is-arguments: 1.1.0 3281 - is-generator-function: 1.0.9 3282 - is-typed-array: 1.1.5 3283 - safe-buffer: 5.2.1 3284 - which-typed-array: 1.1.4 3285 - 3286 - /v8-compile-cache/2.3.0: 3287 - resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} 3288 - dev: true 3289 - 3290 - /varint/5.0.2: 3291 - resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} 3292 - dev: false 3293 - 3294 - /varint/6.0.0: 3295 - resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} 3296 - dev: false 3297 - 3298 - /wcwidth/1.0.1: 3299 - resolution: {integrity: sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=} 3300 - dependencies: 3301 - defaults: 1.0.3 3302 - dev: true 3303 - 3304 - /web-encoding/1.1.5: 3305 - resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} 3306 - dependencies: 3307 - util: 0.12.4 3308 - optionalDependencies: 3309 - '@zxing/text-encoding': 0.9.0 3310 - dev: false 3311 - 3312 - /webfinger.js/2.7.0: 3313 - resolution: {integrity: sha512-l+UtsuV4zrBKyVAj9VCtwWgscTgadCsdGgL1OvbV102cvydWwJCGXlFIXauzWLzfheIDHfPNRWfgMuwyC6ZfIA==} 3314 - dependencies: 3315 - xhr2: 0.1.4 3316 - dev: false 3317 - 3318 - /webidl-conversions/3.0.1: 3319 - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 3320 - dev: false 3321 - 3322 - /webnative-elm/7.0.0_webnative@0.34.1: 3323 - resolution: {integrity: sha512-i52PkbknlbPAXPrW9ygPMhM8GK5TOHdLsGK0HmzB7qPdPbP2hzL3td574KKiWcF3esf/thuKCc6L+Qx2j2nwFw==} 3324 - peerDependencies: 3325 - webnative: '> 0.24.0' 3326 - dependencies: 3327 - webnative: 0.34.1 3328 - dev: false 3329 - 3330 - /webnative/0.34.1: 3331 - resolution: {integrity: sha512-FCY00dBUUHWEdabkLV3INTxnkNVlRQfmiNfe4M+Pg85rppLTHP0WU/MAbPHan5NMdH2j09KPeFmxLD2qbqszHQ==} 3332 - engines: {node: '>=15'} 3333 - dependencies: 3334 - '@ipld/dag-cbor': 7.0.3 3335 - '@ipld/dag-pb': 2.1.18 3336 - '@libp2p/interface-keys': 1.0.3 3337 - '@libp2p/peer-id': 1.1.15 3338 - '@multiformats/multiaddr': 10.4.0 3339 - blockstore-core: 2.0.1 3340 - blockstore-datastore-adapter: 3.0.1 3341 - datastore-core: 8.0.1 3342 - datastore-level: 9.0.1 3343 - fission-bloom-filters: 1.7.1 3344 - ipfs-core-types: 0.11.2-8f351a89.0 3345 - ipfs-repo: 15.0.2 3346 - ipfs-unixfs: 6.0.9 3347 - ipld-dag-pb: 0.22.3 3348 - keystore-idb: 0.15.5 3349 - localforage: 1.10.0 3350 - multiformats: 9.6.3 3351 - one-webcrypto: 1.0.3 3352 - throttle-debounce: 3.0.1 3353 - tweetnacl: 1.0.3 3354 - uint8arrays: 3.0.0 3355 - wnfs: 0.1.7 3356 - transitivePeerDependencies: 3357 - - node-fetch 3358 - - supports-color 3359 - - undici 3360 - dev: false 3361 - 3362 - /whatwg-url/5.0.0: 3363 - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 3364 - dependencies: 3365 - tr46: 0.0.3 3366 - webidl-conversions: 3.0.1 3367 - dev: false 3368 - 3369 - /which-boxed-primitive/1.0.2: 3370 - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 3371 - dependencies: 3372 - is-bigint: 1.0.2 3373 - is-boolean-object: 1.1.1 3374 - is-number-object: 1.0.5 3375 - is-string: 1.0.6 3376 - is-symbol: 1.0.4 3377 - 3378 - /which-typed-array/1.1.4: 3379 - resolution: {integrity: sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==} 3380 - engines: {node: '>= 0.4'} 3381 - dependencies: 3382 - available-typed-arrays: 1.0.4 3383 - call-bind: 1.0.2 3384 - es-abstract: 1.18.3 3385 - foreach: 2.0.5 3386 - function-bind: 1.1.1 3387 - has-symbols: 1.0.2 3388 - is-typed-array: 1.1.5 3389 - 3390 - /which/2.0.2: 3391 - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 3392 - engines: {node: '>= 8'} 3393 - hasBin: true 3394 - dependencies: 3395 - isexe: 2.0.0 3396 - dev: true 3397 - 3398 - /wnfs/0.1.7: 3399 - resolution: {integrity: sha512-WTadILZSNX7Ti+jy1QgqGtWp0pLHvPAG+ERsNWge2DuR8P8x+U/CM9QjYqJb7wqBkbSoboZgeBspetybIzNQgw==} 3400 - dev: false 3401 - 3402 - /word-wrap/1.2.3: 3403 - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 3404 - engines: {node: '>=0.10.0'} 3405 - dev: true 3406 - 3407 - /wrap-ansi/6.2.0: 3408 - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 3409 - engines: {node: '>=8'} 3410 - dependencies: 3411 - ansi-styles: 4.3.0 3412 - string-width: 4.2.2 3413 - strip-ansi: 6.0.1 3414 - dev: true 3415 - 3416 - /wrappy/1.0.2: 3417 - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 3418 - dev: true 3419 - 3420 - /xhr2/0.1.4: 3421 - resolution: {integrity: sha1-f4dliEdxbbUCYyOBL4GMras4el8=} 3422 - engines: {node: '>= 0.6'} 3423 - dev: false 3424 - 3425 - /xhr2/0.2.0: 3426 - resolution: {integrity: sha512-BDtiD0i2iKPK/S8OAZfpk6tyzEDnKKSjxWHcMBVmh+LuqJ8A32qXTyOx+TVOg2dKvq6zGBq2sgKPkEeRs1qTRA==} 3427 - engines: {node: '>= 6'} 3428 - dev: false 3429 - 3430 - /xtend/4.0.2: 3431 - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 3432 - engines: {node: '>=0.4'} 3433 - dev: true 3434 - 3435 - /xxhashjs/0.2.2: 3436 - resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==} 3437 - dependencies: 3438 - cuint: 0.2.2 3439 - dev: false 3440 - 3441 - /yaml/1.10.2: 3442 - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 3443 - engines: {node: '>= 6'} 3444 - dev: true
+13 -79
src/Applications/Brain.elm
··· 1 1 module Brain exposing (main) 2 2 3 3 import Alien 4 + import Brain.Common.State as Common 4 5 import Brain.Other.State as Other 5 6 import Brain.Ports as Ports 6 7 import Brain.Sources.Processing.State as Processing ··· 64 65 ( ----------------------------------------- 65 66 -- Initial model 66 67 ----------------------------------------- 67 - { authMethod = Nothing 68 - , currentTime = Time.default 68 + { currentTime = Time.default 69 69 , hypaethralDebouncer = hypDebouncer 70 70 , hypaethralRetrieval = Nothing 71 71 , hypaethralStorage = [] 72 72 , hypaethralUserData = User.emptyHypaethralData 73 - , legacyMode = False 74 - , migratingData = False 75 73 , origin = "ORIGIN_UNKNOWN" 76 - , performingSignIn = False 77 74 , processingStatus = Processing.NotProcessing 75 + , userSyncMethod = Nothing 78 76 } 79 77 ----------------------------------------- 80 78 -- Initial command ··· 167 165 , Ports.receiveSearchResults GotSearchResults 168 166 , Ports.receiveTags (ProcessingMsg << Processing.TagsStep) 169 167 , Ports.replaceTags ReplaceTrackTags 170 - , Ports.savedHypaethralBit (\_ -> UserMsg User.SaveNextHypaethralBit) 171 - , Ports.webnativeResponse (UserMsg << User.GotWebnativeResponse) 172 168 173 169 -- 174 170 , Time.every (60 * 1000) SetCurrentTime ··· 195 191 translateAlienData : Alien.Tag -> Json.Value -> Msg 196 192 translateAlienData tag data = 197 193 case tag of 198 - Alien.AuthAnonymous -> 199 - UserMsg (User.HypaethralDataRetrieved data) 200 - 201 - Alien.AuthDropbox -> 202 - UserMsg (User.HypaethralDataRetrieved data) 203 - 204 - Alien.AuthEnclosedData -> 194 + Alien.EnclosedData -> 205 195 UserMsg (User.EnclosedDataRetrieved data) 206 196 207 - Alien.AuthFission -> 208 - UserMsg (User.HypaethralDataRetrieved data) 209 - 210 - Alien.AuthIpfs -> 211 - UserMsg (User.HypaethralDataRetrieved data) 212 - 213 - Alien.AuthMethod -> 214 - UserMsg (User.MethodRetrieved data) 215 - 216 - Alien.AuthRemoteStorage -> 217 - UserMsg (User.HypaethralDataRetrieved data) 218 - 219 - Alien.FabricateSecretKey -> 220 - UserMsg User.SecretKeyFabricated 221 - 222 197 Alien.SearchTracks -> 223 198 Search data 224 199 ··· 228 203 Alien.DownloadTracks -> 229 204 DownloadTracks data 230 205 231 - Alien.ImportLegacyData -> 232 - UserMsg User.RetrieveLegacyHypaethralData 233 - 234 206 Alien.ProcessSources -> 235 207 ProcessingMsg (Processing.Process data) 236 208 ··· 267 239 Alien.SaveTracks -> 268 240 UserMsg (User.SaveTracks data) 269 241 270 - Alien.SignIn -> 271 - UserMsg (User.SignIn data) 272 - 273 - Alien.SignOut -> 274 - UserMsg User.SignOut 242 + Alien.SetSyncMethod -> 243 + UserMsg (User.SetSyncMethod data) 275 244 276 245 Alien.StopProcessing -> 277 246 ProcessingMsg Processing.StopProcessing ··· 284 253 285 254 Alien.ToCache -> 286 255 ToCache data 256 + 257 + Alien.UnsetSyncMethod -> 258 + UserMsg User.UnsetSyncMethod 287 259 288 260 Alien.UpdateEncryptionKey -> 289 261 UserMsg (User.UpdateEncryptionKey data) ··· 294 266 295 267 translateAlienError : Alien.Tag -> Json.Value -> String -> Msg 296 268 translateAlienError tag _ err = 297 - case tag of 298 - Alien.AuthAnonymous -> 299 - reportAuthError Alien.AuthAnonymous err "I found some encrypted data, but I couldn't decrypt it. Maybe you used the wrong passphrase?" 300 - 301 - Alien.AuthDropbox -> 302 - reportAuthError Alien.AuthDropbox err "I found some encrypted data, but I couldn't decrypt it. Maybe you used the wrong passphrase?" 303 - 304 - Alien.AuthIpfs -> 305 - reportAuthError Alien.AuthIpfs err "Something went wrong regarding the IPFS storage. Maybe you used the wrong passphrase, or your IPFS node is offline?" 306 - 307 - Alien.AuthRemoteStorage -> 308 - reportAuthError Alien.AuthRemoteStorage err "I found some encrypted data, but I couldn't decrypt it. Maybe you used the wrong passphrase?" 309 - 310 - _ -> 311 - case err of 312 - "db is undefined" -> 313 - report tag "Can't connect to the browser's IndexedDB. FYI, this is __not supported in Firefox's private mode__." 314 - 315 - _ -> 316 - report tag err 317 - 318 - 319 - reportAuthError : Alien.Tag -> String -> String -> Msg 320 - reportAuthError tag originalError fallbackError = 321 - case originalError of 322 - "MISSING_SECRET_KEY" -> 323 - [ ( "alienMethodTag", Alien.tagToJson tag ) 324 - , ( "fallbackError", Json.Encode.string fallbackError ) 325 - ] 326 - |> Json.Encode.object 327 - |> Alien.broadcast Alien.MissingSecretKey 328 - |> Ports.toUI 329 - |> Cmd 269 + case err of 270 + "db is undefined" -> 271 + Common.reportUICmdMsg tag "Can't connect to the browser's IndexedDB. FYI, this is __not supported in Firefox's private mode__." 330 272 331 273 _ -> 332 - report tag fallbackError 333 - 334 - 335 - report : Alien.Tag -> String -> Msg 336 - report tag err = 337 - err 338 - |> Alien.report tag 339 - |> Ports.toUI 340 - |> Cmd 274 + Common.reportUICmdMsg tag err
+80 -5
src/Applications/Brain/Common/State.elm
··· 5 5 import Brain.Types exposing (..) 6 6 import Json.Decode as Json 7 7 import Return.Ext as Return 8 + import Task 9 + import TaskPort 10 + import TaskPort.Extra as TaskPort 8 11 9 12 10 13 11 - -- 🔱 14 + -- 🛠 15 + 16 + 17 + attemptPortTask : (a -> Msg) -> Task.Task TaskPort.Error a -> Cmd Msg 18 + attemptPortTask mapFn = 19 + Task.attempt (reportPortErrorToUI mapFn) 20 + 21 + 22 + attemptTask : (a -> Msg) -> Task.Task String a -> Cmd Msg 23 + attemptTask mapFn = 24 + Task.attempt (reportErrorToUI mapFn) 25 + 26 + 27 + 28 + -- GIVE 12 29 13 30 14 31 giveUI : Alien.Tag -> Json.Value -> Manager 15 32 giveUI tag data = 16 33 data 34 + |> giveUICmd tag 35 + |> Return.communicate 36 + 37 + 38 + giveUICmd : Alien.Tag -> Json.Value -> Cmd Msg 39 + giveUICmd tag data = 40 + data 17 41 |> Alien.broadcast tag 18 42 |> Ports.toUI 19 - |> Return.communicate 43 + 44 + 45 + giveUICmdMsg : Alien.Tag -> Json.Value -> Msg 46 + giveUICmdMsg tag data = 47 + data 48 + |> giveUICmd tag 49 + |> Cmd 50 + 51 + 52 + 53 + -- NUDGE 20 54 21 55 22 56 nudgeUI : Alien.Tag -> Manager 23 - nudgeUI tag = 57 + nudgeUI = 58 + nudgeUICmd >> Return.communicate 59 + 60 + 61 + nudgeUICmd : Alien.Tag -> Cmd Msg 62 + nudgeUICmd tag = 24 63 tag 25 64 |> Alien.trigger 26 65 |> Ports.toUI 27 - |> Return.communicate 66 + 67 + 68 + nudgeUICmdMsg : Alien.Tag -> Msg 69 + nudgeUICmdMsg = 70 + nudgeUICmd >> Cmd 71 + 72 + 73 + 74 + -- REPORT 75 + 76 + 77 + reportErrorToUI : (a -> Msg) -> Result String a -> Msg 78 + reportErrorToUI mapFn result = 79 + case result of 80 + Ok value -> 81 + mapFn value 82 + 83 + Err error -> 84 + reportUICmdMsg Alien.ReportError error 85 + 86 + 87 + reportPortErrorToUI : (a -> Msg) -> Result TaskPort.Error a -> Msg 88 + reportPortErrorToUI mapFn = 89 + Result.mapError TaskPort.errorToStringCustom >> reportErrorToUI mapFn 28 90 29 91 30 92 reportUI : Alien.Tag -> String -> Manager 31 93 reportUI tag error = 32 94 error 95 + |> reportUICmd tag 96 + |> Return.communicate 97 + 98 + 99 + reportUICmd : Alien.Tag -> String -> Cmd Msg 100 + reportUICmd tag error = 101 + error 33 102 |> Alien.report tag 34 103 |> Ports.toUI 35 - |> Return.communicate 104 + 105 + 106 + reportUICmdMsg : Alien.Tag -> String -> Msg 107 + reportUICmdMsg tag error = 108 + error 109 + |> reportUICmd tag 110 + |> Cmd
-16
src/Applications/Brain/Ports.elm
··· 3 3 import Alien 4 4 import Json.Encode as Json 5 5 import Sources.Processing exposing (ContextForTags, ContextForTagsSync) 6 - import Webnative 7 6 8 7 9 8 ··· 11 10 12 11 13 12 port downloadTracks : Json.Value -> Cmd msg 14 - 15 - 16 - port fabricateSecretKey : Alien.Event -> Cmd msg 17 13 18 14 19 15 port removeCache : Alien.Event -> Cmd msg ··· 68 64 port requestIpfs : Alien.Event -> Cmd msg 69 65 70 66 71 - port requestLegacyLocalData : Alien.Event -> Cmd msg 72 - 73 - 74 67 port requestRemoteStorage : Alien.Event -> Cmd msg 75 68 76 69 ··· 83 76 port toRemoteStorage : Alien.Event -> Cmd msg 84 77 85 78 86 - port webnativeRequest : Webnative.Request -> Cmd msg 87 - 88 - 89 79 90 80 -- 📰 91 81 ··· 106 96 107 97 108 98 port replaceTags : (ContextForTagsSync -> msg) -> Sub msg 109 - 110 - 111 - port savedHypaethralBit : (Json.Value -> msg) -> Sub msg 112 - 113 - 114 - port webnativeResponse : (Webnative.Response -> msg) -> Sub msg
+79
src/Applications/Brain/Task/Ports.elm
··· 1 + module Brain.Task.Ports exposing (..) 2 + 3 + import Alien 4 + import Json.Decode 5 + import Json.Encode 6 + import TaskPort 7 + 8 + 9 + 10 + -- CACHE 11 + 12 + 13 + fromCache : Alien.Tag -> Json.Decode.Decoder value -> TaskPort.Task (Maybe value) 14 + fromCache tag decoder = 15 + TaskPort.call 16 + { function = "fromCache" 17 + , valueDecoder = Json.Decode.maybe decoder 18 + , argsEncoder = Json.Encode.string 19 + } 20 + (Alien.tagToString tag) 21 + 22 + 23 + fromCacheWithSuffix : Alien.Tag -> String -> Json.Decode.Decoder value -> TaskPort.Task (Maybe value) 24 + fromCacheWithSuffix tag suffix decoder = 25 + TaskPort.call 26 + { function = "fromCache" 27 + , valueDecoder = Json.Decode.maybe decoder 28 + , argsEncoder = Json.Encode.string 29 + } 30 + (Alien.tagToString tag ++ "_" ++ suffix) 31 + 32 + 33 + removeCache : Alien.Tag -> TaskPort.Task () 34 + removeCache tag = 35 + TaskPort.call 36 + { function = "removeCache" 37 + , valueDecoder = TaskPort.ignoreValue 38 + , argsEncoder = Json.Encode.string 39 + } 40 + (Alien.tagToString tag) 41 + 42 + 43 + toCache : Alien.Tag -> Json.Encode.Value -> TaskPort.Task () 44 + toCache tag = 45 + let 46 + key = 47 + Alien.tagToString tag 48 + in 49 + TaskPort.call 50 + { function = "toCache" 51 + , valueDecoder = TaskPort.ignoreValue 52 + , argsEncoder = \v -> Json.Encode.object [ ( "key", Json.Encode.string key ), ( "value", v ) ] 53 + } 54 + 55 + 56 + toCacheWithSuffix : Alien.Tag -> String -> Json.Encode.Value -> TaskPort.Task () 57 + toCacheWithSuffix tag suffix = 58 + let 59 + key = 60 + Alien.tagToString tag ++ "_" ++ suffix 61 + in 62 + TaskPort.call 63 + { function = "toCache" 64 + , valueDecoder = TaskPort.ignoreValue 65 + , argsEncoder = \v -> Json.Encode.object [ ( "key", Json.Encode.string key ), ( "value", v ) ] 66 + } 67 + 68 + 69 + 70 + -- CRYPTO 71 + 72 + 73 + fabricateSecretKey : String -> TaskPort.Task () 74 + fabricateSecretKey = 75 + TaskPort.call 76 + { function = "fabricateSecretKey" 77 + , valueDecoder = Json.Decode.succeed () 78 + , argsEncoder = Json.Encode.string 79 + }
+2 -5
src/Applications/Brain/Types.elm
··· 24 24 25 25 26 26 type alias Model = 27 - { authMethod : Maybe User.Method 28 - , currentTime : Time.Posix 27 + { currentTime : Time.Posix 29 28 , hypaethralDebouncer : Debouncer HypaethralBit (List HypaethralBit) 30 29 , hypaethralRetrieval : Maybe (Zipper ( HypaethralBit, Json.Value, HypaethralBaggage )) 31 30 , hypaethralStorage : List { bit : HypaethralBit, saving : Bool } 32 31 , hypaethralUserData : User.HypaethralData 33 - , legacyMode : Bool 34 - , migratingData : Bool 35 32 , origin : String 36 - , performingSignIn : Bool 37 33 , processingStatus : Processing.Status 34 + , userSyncMethod : Maybe User.Method 38 35 } 39 36 40 37
+153
src/Applications/Brain/User/Hypaethral.elm
··· 1 + module Brain.User.Hypaethral exposing (..) 2 + 3 + import Alien 4 + import Brain.Task.Ports 5 + import Json.Decode 6 + import Json.Encode 7 + import Task exposing (Task) 8 + import TaskPort 9 + import TaskPort.Extra as TaskPort 10 + import User.Layer as User exposing (..) 11 + 12 + 13 + 14 + -- RETRIEVAL 15 + 16 + 17 + retrieveDropbox : String -> HypaethralBit -> Task String (Maybe Json.Decode.Value) 18 + retrieveDropbox accessToken bit = 19 + [ ( "fileName", fileName bit ) 20 + , ( "token", Json.Encode.string accessToken ) 21 + ] 22 + |> TaskPort.call 23 + { function = "fromDropbox" 24 + , valueDecoder = Json.Decode.maybe Json.Decode.value 25 + , argsEncoder = Json.Encode.object 26 + } 27 + |> Task.mapError TaskPort.errorToStringCustom 28 + 29 + 30 + retrieveFission : HypaethralBit -> Task String (Maybe Json.Decode.Value) 31 + retrieveFission bit = 32 + [ ( "fileName", fileName bit ) 33 + ] 34 + |> TaskPort.call 35 + { function = "fromFission" 36 + , valueDecoder = Json.Decode.maybe Json.Decode.value 37 + , argsEncoder = Json.Encode.object 38 + } 39 + |> Task.mapError TaskPort.errorToStringCustom 40 + 41 + 42 + retrieveIpfs : String -> HypaethralBit -> Task String (Maybe Json.Decode.Value) 43 + retrieveIpfs apiOrigin bit = 44 + [ ( "fileName", fileName bit ) 45 + , ( "apiOrigin", Json.Encode.string apiOrigin ) 46 + ] 47 + |> TaskPort.call 48 + { function = "fromIpfs" 49 + , valueDecoder = Json.Decode.maybe Json.Decode.value 50 + , argsEncoder = Json.Encode.object 51 + } 52 + |> Task.mapError TaskPort.errorToStringCustom 53 + 54 + 55 + retrieveRemoteStorage : { token : String, userAddress : String } -> HypaethralBit -> Task String (Maybe Json.Decode.Value) 56 + retrieveRemoteStorage { token, userAddress } bit = 57 + [ ( "fileName", fileName bit ) 58 + , ( "token", Json.Encode.string token ) 59 + , ( "userAddress", Json.Encode.string userAddress ) 60 + ] 61 + |> TaskPort.call 62 + { function = "fromRemoteStorage" 63 + , valueDecoder = Json.Decode.maybe Json.Decode.value 64 + , argsEncoder = Json.Encode.object 65 + } 66 + |> Task.mapError TaskPort.errorToStringCustom 67 + 68 + 69 + retrieveLocal : HypaethralBit -> Task String (Maybe Json.Decode.Value) 70 + retrieveLocal bit = 71 + Json.Decode.value 72 + |> Brain.Task.Ports.fromCacheWithSuffix 73 + Alien.SyncLocal 74 + (hypaethralBitFileName bit) 75 + |> Task.mapError TaskPort.errorToStringCustom 76 + 77 + 78 + 79 + -- STORAGE 80 + 81 + 82 + saveDropbox : String -> HypaethralBit -> Json.Decode.Value -> Task String () 83 + saveDropbox accessToken bit data = 84 + [ ( "fileName", fileName bit ) 85 + , ( "data", data ) 86 + , ( "token", Json.Encode.string accessToken ) 87 + ] 88 + |> TaskPort.call 89 + { function = "toDropbox" 90 + , valueDecoder = TaskPort.ignoreValue 91 + , argsEncoder = Json.Encode.object 92 + } 93 + |> Task.mapError TaskPort.errorToStringCustom 94 + 95 + 96 + saveFission : HypaethralBit -> Json.Decode.Value -> Task String () 97 + saveFission bit data = 98 + [ ( "fileName", fileName bit ) 99 + , ( "data", data ) 100 + ] 101 + |> TaskPort.call 102 + { function = "toFission" 103 + , valueDecoder = TaskPort.ignoreValue 104 + , argsEncoder = Json.Encode.object 105 + } 106 + |> Task.mapError TaskPort.errorToStringCustom 107 + 108 + 109 + saveIpfs : String -> HypaethralBit -> Json.Decode.Value -> Task String () 110 + saveIpfs apiOrigin bit data = 111 + [ ( "apiOrigin", Json.Encode.string apiOrigin ) 112 + , ( "fileName", fileName bit ) 113 + , ( "data", data ) 114 + ] 115 + |> TaskPort.call 116 + { function = "toIpfs" 117 + , valueDecoder = TaskPort.ignoreValue 118 + , argsEncoder = Json.Encode.object 119 + } 120 + |> Task.mapError TaskPort.errorToStringCustom 121 + 122 + 123 + saveRemoteStorage : { token : String, userAddress : String } -> HypaethralBit -> Json.Decode.Value -> Task String () 124 + saveRemoteStorage { token, userAddress } bit data = 125 + [ ( "fileName", fileName bit ) 126 + , ( "data", data ) 127 + , ( "token", Json.Encode.string token ) 128 + , ( "userAddress", Json.Encode.string userAddress ) 129 + ] 130 + |> TaskPort.call 131 + { function = "toRemoteStorage" 132 + , valueDecoder = TaskPort.ignoreValue 133 + , argsEncoder = Json.Encode.object 134 + } 135 + |> Task.mapError TaskPort.errorToStringCustom 136 + 137 + 138 + saveLocal : HypaethralBit -> Json.Decode.Value -> Task String () 139 + saveLocal bit data = 140 + data 141 + |> Brain.Task.Ports.toCacheWithSuffix 142 + Alien.SyncLocal 143 + (hypaethralBitFileName bit) 144 + |> Task.mapError TaskPort.errorToStringCustom 145 + 146 + 147 + 148 + -- 🛠 149 + 150 + 151 + fileName : HypaethralBit -> Json.Decode.Value 152 + fileName = 153 + Json.Encode.string << hypaethralBitFileName
+325 -562
src/Applications/Brain/User/State.elm
··· 3 3 import Alien 4 4 import Brain.Common.State as Common 5 5 import Brain.Ports as Ports 6 + import Brain.Task.Ports 6 7 import Brain.Types as Brain exposing (..) 8 + import Brain.User.Hypaethral as Hypaethral 7 9 import Brain.User.Types as User exposing (..) 8 10 import Debouncer.Basic as Debouncer 9 11 import EverySet 10 12 import Json.Decode as Decode 11 13 import Json.Encode as Json 12 - import List.Zipper as Zipper 13 14 import Playlists.Encoding as Playlists 14 15 import Return exposing (andThen, return) 15 16 import Return.Ext as Return 16 17 import Settings 17 18 import Sources.Encoding as Sources 18 - import Task 19 - import Task.Extra exposing (do) 19 + import Syncing 20 + import Syncing.Services.Dropbox.Token 21 + import Task exposing (Task) 22 + import Task.Extra as Task exposing (do) 23 + import TaskPort.Extra as TaskPort 20 24 import Time 21 25 import Tracks exposing (Track) 22 26 import Tracks.Encoding as Tracks 23 - import Tuple3 24 27 import Url exposing (Url) 25 28 import Url.Ext as Url 26 29 import User.Layer as User exposing (..) 27 30 import User.Layer.Methods.Dropbox as Dropbox 28 - import User.Layer.Methods.Fission as Fission 29 - import Webnative 30 31 31 32 32 33 ··· 37 38 initialCommand uiUrl = 38 39 case Url.action uiUrl of 39 40 [ "authenticate", "fission" ] -> 40 - Cmd.none 41 + loadEnclosedData 41 42 42 43 _ -> 43 44 Cmd.batch 44 - [ do (UserMsg RetrieveMethod) 45 - , do (UserMsg RetrieveEnclosedData) 45 + [ loadEnclosedData 46 + , loadSyncMethodAndLocalHypaethralData 46 47 ] 47 48 49 + 50 + {-| Loads the "enclosed" data from cache and sends it to the UI. 51 + -} 52 + loadEnclosedData : Cmd Brain.Msg 53 + loadEnclosedData = 54 + Decode.value 55 + |> Brain.Task.Ports.fromCache Alien.EnclosedData 56 + |> Task.map (Maybe.withDefault Json.null) 57 + |> Common.attemptPortTask (Common.giveUICmdMsg Alien.LoadEnclosedUserData) 58 + 59 + 60 + {-| Loads the "sync method" and "hypaethral" data, 61 + see `Commence` Msg what happens next. 62 + -} 63 + loadSyncMethodAndLocalHypaethralData : Cmd Brain.Msg 64 + loadSyncMethodAndLocalHypaethralData = 65 + Decode.value 66 + |> Brain.Task.Ports.fromCache Alien.SyncMethod 67 + |> Task.mapError TaskPort.errorToStringCustom 68 + |> Task.andThen 69 + (\json -> 70 + let 71 + maybeMethod = 72 + Maybe.andThen decodeMethod json 73 + in 74 + Hypaethral.retrieveLocal 75 + |> User.retrieveHypaethralData 76 + |> Task.map 77 + (\bits -> 78 + bits 79 + |> List.map (\( a, b ) -> ( hypaethralBitKey a, Maybe.withDefault Json.null b )) 80 + |> Json.object 81 + ) 82 + |> Task.map (Tuple.pair maybeMethod) 83 + ) 84 + |> Common.attemptTask 85 + (\( maybeMethod, hypaethralJson ) -> 86 + hypaethralJson 87 + |> User.decodeHypaethralData 88 + |> Result.map 89 + (\hypaethralData -> 90 + ( hypaethralJson 91 + , hypaethralData 92 + ) 93 + ) 94 + |> Result.withDefault 95 + ( User.encodeHypaethralData User.emptyHypaethralData 96 + , User.emptyHypaethralData 97 + ) 98 + |> Commence maybeMethod 99 + |> UserMsg 100 + ) 101 + 48 102 49 103 50 104 -- 📣 ··· 53 107 update : User.Msg -> Manager 54 108 update msg = 55 109 case msg of 56 - SignIn a -> 57 - signIn a 110 + Commence a b -> 111 + commence a b 58 112 59 - SignOut -> 60 - signOut 113 + SetSyncMethod a -> 114 + setSyncMethod a 61 115 62 - ----------------------------------------- 63 - -- 0. Secret Key 64 - ----------------------------------------- 65 - FabricateSecretKey a -> 66 - fabricateSecretKey a 116 + Sync -> 117 + sync { initialTask = Nothing } 67 118 68 - SecretKeyFabricated -> 69 - secretKeyFabricated 70 - 71 - ----------------------------------------- 72 - -- 1. Method 73 - ----------------------------------------- 74 - RetrieveMethod -> 75 - retrieveMethod 76 - 77 - MethodRetrieved a -> 78 - methodRetrieved a 79 - 80 - ----------------------------------------- 81 - -- 2. Data 82 - ----------------------------------------- 83 - RetrieveHypaethralData a -> 84 - retrieveHypaethralData a 85 - 86 - HypaethralDataRetrieved a -> 87 - hypaethralDataRetrieved a 88 - 89 - ----------------------------------------- 90 - -- 2. Data (Legacy) 91 - ----------------------------------------- 92 - RetrieveLegacyHypaethralData -> 93 - retrieveLegacyHypaethralData 119 + UnsetSyncMethod -> 120 + unsetSyncMethod 94 121 95 122 ----------------------------------------- 96 123 -- x. Data ··· 137 164 ----------------------------------------- 138 165 -- z. Data 139 166 ----------------------------------------- 140 - GotWebnativeResponse a -> 141 - gotWebnativeResponse a 142 - 143 - SaveAllHypaethralData -> 144 - saveAllHypaethralData 167 + FinishedSyncing -> 168 + finishedSyncing 145 169 146 - SaveHypaethralDataBit a -> 147 - saveHypaethralData a 170 + GotHypaethralData a -> 171 + gotHypaethralData a 148 172 149 173 SaveHypaethralDataBits a -> 150 174 saveHypaethralDataBits a 151 175 152 176 SaveHypaethralDataSlowly a -> 153 177 saveHypaethralDataSlowly a 154 - 155 - SaveNextHypaethralBit -> 156 - saveNextHypaethralBit 157 178 158 179 ----------------------------------------- 159 180 -- z. Secret Key ··· 175 196 -- 🔱 176 197 177 198 178 - gotWebnativeResponse : Webnative.Response -> Manager 179 - gotWebnativeResponse response model = 180 - let 181 - baggage = 182 - model.hypaethralRetrieval 183 - |> Maybe.map (Zipper.current >> Tuple3.third) 184 - |> Maybe.withDefault BaggageClaimed 185 - in 186 - case Fission.proceed response baggage of 187 - Fission.Error err -> 188 - Common.reportUI Alien.ReportError err model 199 + commence : Maybe Method -> ( Json.Value, HypaethralData ) -> Manager 200 + commence maybeMethod ( hypaethralJson, hypaethralData ) model = 201 + -- 🚀 202 + -- Initiated from `initialCommand`. 203 + -- Loaded the used-sync method and the local hypaethral data. 204 + { model | userSyncMethod = maybeMethod } 205 + |> sendHypaethralDataToUI hypaethralJson hypaethralData 206 + -- Next load the hypaethral data from the syncing service. 207 + |> andThen (sync { initialTask = Nothing }) 189 208 190 - Fission.Hypaethral data -> 191 - hypaethralDataRetrieved data model 192 209 193 - Fission.LoadedFileSystem -> 194 - -- Had to load the filesystem first, please continue. 210 + setSyncMethod : Json.Value -> Manager 211 + setSyncMethod json model = 212 + -- 🐤 213 + -- Set & store method, 214 + -- and retrieve data. 215 + let 216 + decoder = 217 + Decode.map2 218 + (\a b -> ( a, b )) 219 + (Decode.field "method" <| Decode.map methodFromString Decode.string) 220 + (Decode.field "passphrase" <| Decode.maybe Decode.string) 221 + in 222 + case Decode.decodeValue decoder json of 223 + Ok ( Just method, Just passphrase ) -> 195 224 let 196 - authMethod = 197 - Fission { initialised = True } 225 + initialTask = 226 + passphrase 227 + |> Brain.Task.Ports.fabricateSecretKey 228 + |> Task.mapError TaskPort.errorToStringCustom 198 229 in 199 - model.authMethod 200 - |> Maybe.map (\_ -> authMethod) 201 - |> (\a -> { model | authMethod = a }) 202 - |> retrieveAllHypaethralData 230 + { model | userSyncMethod = Just method } 231 + |> sync { initialTask = Just initialTask } 232 + |> andThen (saveMethod method) 203 233 204 - Fission.Ongoing newBaggage request -> 205 - model.hypaethralRetrieval 206 - |> Maybe.map 207 - (newBaggage 208 - |> always 209 - |> Tuple3.mapThird 210 - |> Zipper.map 211 - ) 212 - |> (\h -> { model | hypaethralRetrieval = h }) 213 - |> Return.communicate (Ports.webnativeRequest request) 234 + Ok ( Just method, Nothing ) -> 235 + { model | userSyncMethod = Just method } 236 + |> sync { initialTask = Nothing } 237 + |> andThen (saveMethod method) 214 238 215 - Fission.OtherRequest request -> 216 - request 217 - |> Ports.webnativeRequest 218 - |> return model 219 - 220 - Fission.SaveNextHypaethralBit -> 221 - saveNextHypaethralBit model 239 + Ok ( Nothing, _ ) -> 240 + Return.singleton { model | userSyncMethod = Nothing } 222 241 223 - Fission.Stopping -> 242 + Err _ -> 224 243 Return.singleton model 225 244 226 245 227 - signIn : Json.Value -> Manager 228 - signIn json model = 229 - -- 🐤 230 - -- Set & store method, 231 - -- and retrieve data. 246 + sync : { initialTask : Maybe (Task.Task String ()) } -> Manager 247 + sync { initialTask } model = 248 + model 249 + |> syncCommand (Maybe.withDefault (Task.succeed ()) initialTask) 250 + |> return model 251 + |> andThen 252 + (case model.userSyncMethod of 253 + Just method -> 254 + Common.giveUI Alien.StartedSyncing (encodeMethod method) 255 + 256 + Nothing -> 257 + Return.singleton 258 + ) 259 + 260 + 261 + syncCommand : Task.Task String a -> Model -> Cmd Brain.Msg 262 + syncCommand initialTask model = 232 263 let 233 - decoder = 234 - Decode.map3 235 - (\a b c -> ( a, Maybe.withDefault False b, c )) 236 - (Decode.field "method" <| Decode.map methodFromString Decode.string) 237 - (Decode.field "migratingData" <| Decode.maybe Decode.bool) 238 - (Decode.field "passphrase" <| Decode.maybe Decode.string) 264 + localData = 265 + model.hypaethralUserData 266 + 267 + attemptSync args = 268 + args 269 + |> Syncing.task 270 + initialTask 271 + { localData = localData 272 + , saveLocal = Hypaethral.saveLocal 273 + } 274 + |> Common.attemptTask 275 + (\maybe -> 276 + case maybe of 277 + Just data -> 278 + UserMsg (GotHypaethralData data) 279 + 280 + Nothing -> 281 + UserMsg FinishedSyncing 282 + ) 239 283 in 240 - case Decode.decodeValue decoder json of 241 - Ok ( maybeMethod, migratingData, Just passphrase ) -> 242 - fabricateSecretKey 243 - passphrase 244 - { model 245 - | authMethod = maybeMethod 246 - , migratingData = migratingData 247 - , performingSignIn = True 284 + case model.userSyncMethod of 285 + Just (Dropbox { accessToken, expiresAt, refreshToken }) -> 286 + if 287 + Syncing.Services.Dropbox.Token.isExpired 288 + { currentTime = model.currentTime 289 + , expiresAt = expiresAt 290 + } 291 + then 292 + refreshDropboxTokens 293 + model.currentTime 294 + Sync 295 + initialTask 296 + refreshToken 297 + 298 + else 299 + attemptSync 300 + { retrieve = Hypaethral.retrieveDropbox accessToken 301 + , save = Hypaethral.saveDropbox accessToken 302 + } 303 + 304 + Just (Fission _) -> 305 + attemptSync 306 + { retrieve = Hypaethral.retrieveFission 307 + , save = Hypaethral.saveFission 248 308 } 249 309 250 - Ok ( maybeMethod, migratingData, Nothing ) -> 251 - { model 252 - | authMethod = maybeMethod 253 - , migratingData = migratingData 254 - , performingSignIn = True 255 - } 256 - |> (if migratingData then 257 - hypaethralDataRetrieved Json.null 310 + Just (Ipfs { apiOrigin }) -> 311 + attemptSync 312 + { retrieve = Hypaethral.retrieveIpfs apiOrigin 313 + , save = Hypaethral.saveIpfs apiOrigin 314 + } 258 315 259 - else 260 - retrieveAllHypaethralData 261 - ) 262 - |> (case maybeMethod of 263 - Just method -> 264 - andThen (Common.giveUI Alien.AuthMethod <| encodeMethod method) 316 + Just (RemoteStorage args) -> 317 + attemptSync 318 + { retrieve = Hypaethral.retrieveRemoteStorage args 319 + , save = Hypaethral.saveRemoteStorage args 320 + } 265 321 266 - Nothing -> 267 - identity 268 - ) 269 - 270 - _ -> 271 - Return.singleton model 322 + Nothing -> 323 + Cmd.none 272 324 273 325 274 - signOut : Manager 275 - signOut model = 326 + unsetSyncMethod : Manager 327 + unsetSyncMethod model = 276 328 -- 💀 277 329 -- Unset & remove stored method. 278 - [ Ports.removeCache (Alien.trigger Alien.AuthMethod) 279 - , Ports.removeCache (Alien.trigger Alien.AuthSecretKey) 330 + [ Ports.removeCache (Alien.trigger Alien.SyncMethod) 331 + , Ports.removeCache (Alien.trigger Alien.SecretKey) 280 332 281 333 -- 282 - , case model.authMethod of 334 + , case model.userSyncMethod of 283 335 Just (Dropbox _) -> 284 336 Cmd.none 285 337 ··· 289 341 Just (Ipfs _) -> 290 342 Cmd.none 291 343 292 - Just Local -> 293 - Cmd.none 294 - 295 344 Just (RemoteStorage _) -> 296 345 Ports.deconstructRemoteStorage () 297 346 ··· 299 348 Cmd.none 300 349 ] 301 350 |> Cmd.batch 302 - |> return 303 - { model 304 - | authMethod = Nothing 305 - , hypaethralUserData = emptyHypaethralData 306 - } 351 + |> return { model | userSyncMethod = Nothing } 307 352 308 353 309 354 ··· 317 362 318 363 retrieveEnclosedData : Manager 319 364 retrieveEnclosedData = 320 - Alien.AuthEnclosedData 365 + Alien.EnclosedData 321 366 |> Alien.trigger 322 367 |> Ports.requestCache 323 368 |> Return.communicate ··· 326 371 saveEnclosedData : Json.Value -> Manager 327 372 saveEnclosedData json = 328 373 json 329 - |> Alien.broadcast Alien.AuthEnclosedData 374 + |> Alien.broadcast Alien.EnclosedData 330 375 |> Ports.toCache 331 376 |> Return.communicate 332 377 ··· 335 380 -- 🔱 ░░ DATA - HYPAETHRAL 336 381 337 382 338 - hypaethralDataRetrieved : Json.Value -> Manager 339 - hypaethralDataRetrieved encodedData model = 340 - if model.legacyMode then 341 - -------------- 342 - -- Legacy Data 343 - -------------- 344 - case Decode.decodeValue hypaethralDataDecoder encodedData of 345 - Ok decodedData -> 346 - { model | legacyMode = False } 347 - |> sendHypaethralDataToUI encodedData decodedData 348 - -- Save again in the new format 349 - |> andThen saveAllHypaethralData 350 - -- Show notification in UI thread 351 - |> andThen (Common.nudgeUI Alien.ImportLegacyData) 383 + finishedSyncing : Manager 384 + finishedSyncing model = 385 + case model.userSyncMethod of 386 + Just userSyncMethod -> 387 + Common.giveUI Alien.SyncMethod (encodeMethod userSyncMethod) model 352 388 353 - Err _ -> 354 - Return.singleton model 389 + Nothing -> 390 + Return.singleton model 355 391 356 - else 357 - --------------- 358 - -- Default Flow 359 - --------------- 360 - let 361 - retrieval = 362 - Maybe.map 363 - (Zipper.mapCurrent <| Tuple3.mapSecond <| always encodedData) 364 - model.hypaethralRetrieval 365 - in 366 - case Maybe.andThen Zipper.next retrieval of 367 - Just nextRetrieval -> 368 - retrieveHypaethralData 369 - (Tuple3.first <| Zipper.current nextRetrieval) 370 - { model | hypaethralRetrieval = Just nextRetrieval } 371 392 372 - Nothing -> 373 - -- 🚀 374 - let 375 - allJson = 376 - retrieval 377 - |> Maybe.map Zipper.toList 378 - |> Maybe.withDefault [] 379 - |> putHypaethralJsonBitsTogether 380 - in 381 - { model 382 - | hypaethralRetrieval = Nothing 383 - , performingSignIn = False 384 - } 385 - |> Return.singleton 386 - |> Return.command 387 - (case ( model.performingSignIn, model.authMethod ) of 388 - ( True, Just method ) -> 389 - method 390 - |> encodeMethod 391 - |> Alien.broadcast Alien.AuthMethod 392 - |> Ports.toCache 393 + gotHypaethralData : HypaethralData -> Manager 394 + gotHypaethralData hypaethralData model = 395 + model 396 + |> sendHypaethralDataToUI (User.encodeHypaethralData hypaethralData) hypaethralData 397 + |> andThen finishedSyncing 393 398 394 - _ -> 395 - Cmd.none 396 - ) 397 - |> andThen 398 - (model.authMethod 399 - |> Maybe.map (\method -> Authenticated method allJson) 400 - |> Maybe.map terminate 401 - |> Maybe.withDefault Return.singleton 402 - ) 403 399 404 - 405 - retrieveAllHypaethralData : Manager 406 - retrieveAllHypaethralData model = 400 + saveAllHypaethralDataTask : HypaethralData -> Method -> Task String () 401 + saveAllHypaethralDataTask userData method = 407 402 let 408 - maybeZipper = 409 - hypaethralBit.list 410 - |> List.map (\( _, b ) -> ( b, Json.null, BaggageClaimed )) 411 - |> Zipper.fromList 403 + save = 404 + saveHypaethralDataBitsTask User.allHypaethralBits userData 412 405 in 413 - case maybeZipper of 414 - Just zipper -> 415 - retrieveHypaethralData 416 - (Tuple3.first <| Zipper.current zipper) 417 - { model | hypaethralRetrieval = Just zipper } 406 + case method of 407 + Dropbox { accessToken } -> 408 + save (Hypaethral.saveDropbox accessToken) 418 409 419 - Nothing -> 420 - Return.singleton 421 - { model | hypaethralRetrieval = Nothing } 410 + Fission _ -> 411 + save Hypaethral.saveFission 422 412 413 + Ipfs { apiOrigin } -> 414 + save (Hypaethral.saveIpfs apiOrigin) 423 415 424 - retrieveHypaethralData : HypaethralBit -> Manager 425 - retrieveHypaethralData bit model = 426 - let 427 - filename = 428 - hypaethralBitFileName bit 416 + RemoteStorage a -> 417 + save (Hypaethral.saveRemoteStorage a) 429 418 430 - file = 431 - Json.string filename 432 - in 433 - case model.authMethod of 434 - -- 🚀 435 - Just (Dropbox { accessToken, expiresAt, refreshToken }) -> 436 - let 437 - currentTime = 438 - Time.posixToMillis model.currentTime // 1000 439 419 440 - currentTimeWithOffset = 441 - -- We add 60 seconds here because we only get the current time every minute, 442 - -- so there's always the chance the "current time" is 1-60 seconds behind. 443 - currentTime + 60 444 - in 445 - -- If the access token is expired 446 - if currentTimeWithOffset >= expiresAt then 447 - refreshToken 448 - |> Dropbox.refreshAccessToken 449 - |> Task.attempt 450 - (\result -> 451 - case result of 452 - Ok tokens -> 453 - bit 454 - |> RetrieveHypaethralData 455 - |> RefreshedDropboxTokens 456 - { currentTime = currentTime 457 - , refreshToken = refreshToken 458 - } 459 - tokens 460 - |> UserMsg 420 + saveHypaethralDataBitsTask : List HypaethralBit -> HypaethralData -> (HypaethralBit -> Json.Value -> Task String ()) -> Task String () 421 + saveHypaethralDataBitsTask bits userData saveFn = 422 + bits 423 + |> List.map 424 + (\bit -> 425 + let 426 + value = 427 + encodeHypaethralBit bit userData 428 + in 429 + Task.andThen 430 + (\_ -> saveFn bit value) 431 + (Hypaethral.saveLocal bit value) 432 + ) 433 + |> Task.sequence 434 + |> Task.map (always ()) 461 435 462 - Err err -> 463 - err 464 - |> Alien.report Alien.ReportError 465 - |> Ports.toUI 466 - |> Cmd 467 - ) 468 - |> return model 469 436 470 - else 471 - [ ( "file", file ) 472 - , ( "token", Json.string accessToken ) 473 - ] 474 - |> Json.object 475 - |> Alien.broadcast Alien.AuthDropbox 476 - |> Ports.requestDropbox 477 - |> return model 478 - 479 - Just (Fission params) -> 480 - filename 481 - |> Fission.retrieve params bit 482 - |> Ports.webnativeRequest 483 - |> return model 484 - 485 - Just (Ipfs { apiOrigin }) -> 486 - [ ( "apiOrigin", Json.string apiOrigin ) 487 - , ( "file", file ) 488 - ] 489 - |> Json.object 490 - |> Alien.broadcast Alien.AuthIpfs 491 - |> Ports.requestIpfs 492 - |> return model 493 - 494 - Just Local -> 495 - [ ( "file", file ) ] 496 - |> Json.object 497 - |> Alien.broadcast Alien.AuthAnonymous 498 - |> Ports.requestCache 499 - |> return model 500 - 501 - Just (RemoteStorage { userAddress, token }) -> 502 - [ ( "file", file ) 503 - , ( "token", Json.string token ) 504 - , ( "userAddress", Json.string userAddress ) 505 - ] 506 - |> Json.object 507 - |> Alien.broadcast Alien.AuthRemoteStorage 508 - |> Ports.requestRemoteStorage 509 - |> return model 510 - 511 - -- ✋ 512 - Nothing -> 513 - Return.singleton model 514 - 515 - 516 - retrieveLegacyHypaethralData : Manager 517 - retrieveLegacyHypaethralData model = 437 + {-| Save different parts of hypaethral data, 438 + one part at a time. 439 + -} 440 + saveHypaethralDataBits : List HypaethralBit -> Manager 441 + saveHypaethralDataBits bits model = 518 442 let 519 - file = 520 - Json.string "diffuse.json" 521 - in 522 - case model.authMethod of 523 - -- 🚀 524 - Just Local -> 525 - Alien.AuthAnonymous 526 - |> Alien.trigger 527 - |> Ports.requestLegacyLocalData 528 - |> return { model | legacyMode = True } 529 - 530 - Just (RemoteStorage { userAddress, token }) -> 531 - [ ( "file", file ) 532 - , ( "token", Json.string token ) 533 - , ( "userAddress", Json.string userAddress ) 534 - ] 535 - |> Json.object 536 - |> Alien.broadcast Alien.AuthRemoteStorage 537 - |> Ports.requestRemoteStorage 538 - |> return { model | legacyMode = True } 539 - 540 - -- ✋ 541 - _ -> 542 - Return.singleton model 543 - 544 - 545 - saveAllHypaethralData : Manager 546 - saveAllHypaethralData = 547 - User.hypaethralBit.list 548 - |> List.map Tuple.second 549 - |> saveHypaethralDataBits 550 - 443 + userData = 444 + model.hypaethralUserData 551 445 552 - saveHypaethralData : HypaethralBit -> Manager 553 - saveHypaethralData bit model = 554 - let 555 - filename = 556 - hypaethralBitFileName bit 446 + updatedUserData = 447 + { userData | modifiedAt = Just model.currentTime } 557 448 558 - file = 559 - Json.string filename 449 + updatedModel = 450 + { model | hypaethralUserData = updatedUserData } 560 451 561 - json = 562 - encodeHypaethralBit bit model.hypaethralUserData 452 + save saveFn = 453 + saveFn 454 + |> saveHypaethralDataBitsTask bits updatedUserData 455 + |> Common.attemptTask (always Brain.Bypass) 456 + |> return updatedModel 563 457 in 564 - case model.authMethod of 565 - -- 🚀 458 + case model.userSyncMethod of 566 459 Just (Dropbox { accessToken, expiresAt, refreshToken }) -> 567 - let 568 - currentTime = 569 - Time.posixToMillis model.currentTime // 1000 570 - 571 - currentTimeWithOffset = 572 - -- We add 60 seconds here because we only get the current time every minute, 573 - -- so there's always the chance the "current time" is 1-60 seconds behind. 574 - currentTime + 60 575 - in 576 - -- If the access token is expired 577 - if currentTimeWithOffset >= expiresAt then 460 + if 461 + Syncing.Services.Dropbox.Token.isExpired 462 + { currentTime = model.currentTime 463 + , expiresAt = expiresAt 464 + } 465 + then 578 466 refreshToken 579 - |> Dropbox.refreshAccessToken 580 - |> Task.attempt 581 - (\result -> 582 - case result of 583 - Ok tokens -> 584 - bit 585 - |> SaveHypaethralDataBit 586 - |> RefreshedDropboxTokens 587 - { currentTime = currentTime 588 - , refreshToken = refreshToken 589 - } 590 - tokens 591 - |> UserMsg 592 - 593 - Err err -> 594 - err 595 - |> Alien.report Alien.ReportError 596 - |> Ports.toUI 597 - |> Cmd 598 - ) 599 - |> return model 467 + |> refreshDropboxTokens 468 + model.currentTime 469 + (SaveHypaethralDataBits bits) 470 + (Task.succeed ()) 471 + |> return updatedModel 600 472 601 473 else 602 - [ ( "data", json ) 603 - , ( "file", file ) 604 - , ( "token", Json.string accessToken ) 605 - ] 606 - |> Json.object 607 - |> Alien.broadcast Alien.AuthDropbox 608 - |> Ports.toDropbox 609 - |> return model 474 + save (Hypaethral.saveDropbox accessToken) 610 475 611 - Just (Fission params) -> 612 - json 613 - |> Fission.save params bit filename 614 - |> List.map Ports.webnativeRequest 615 - |> Cmd.batch 616 - |> return model 476 + Just (Fission _) -> 477 + save Hypaethral.saveFission 617 478 618 479 Just (Ipfs { apiOrigin }) -> 619 - [ ( "apiOrigin", Json.string apiOrigin ) 620 - , ( "data", json ) 621 - , ( "file", file ) 622 - ] 623 - |> Json.object 624 - |> Alien.broadcast Alien.AuthIpfs 625 - |> Ports.toIpfs 626 - |> return model 480 + save (Hypaethral.saveIpfs apiOrigin) 627 481 628 - Just Local -> 629 - [ ( "data", json ) 630 - , ( "file", file ) 631 - ] 632 - |> Json.object 633 - |> Alien.broadcast Alien.AuthAnonymous 634 - |> Ports.toCache 635 - |> return model 636 - 637 - Just (RemoteStorage { userAddress, token }) -> 638 - [ ( "data", json ) 639 - , ( "file", file ) 640 - , ( "token", Json.string token ) 641 - , ( "userAddress", Json.string userAddress ) 642 - ] 643 - |> Json.object 644 - |> Alien.broadcast Alien.AuthRemoteStorage 645 - |> Ports.toRemoteStorage 646 - |> return model 482 + Just (RemoteStorage args) -> 483 + save (Hypaethral.saveRemoteStorage args) 647 484 648 - -- ✋ 649 485 Nothing -> 650 - Return.singleton model 651 - 652 - 653 - {-| Save different parts of hypaethral data, 654 - one part at a time. 655 - -} 656 - saveHypaethralDataBits : List HypaethralBit -> Manager 657 - saveHypaethralDataBits bits model = 658 - let 659 - newItems = 660 - List.map (\b -> { bit = b, saving = False }) bits 661 - in 662 - case model.hypaethralStorage ++ newItems of 663 - item :: rest -> 664 - if item.saving then 665 - Return.singleton model 666 - 667 - else 668 - saveHypaethralData 669 - item.bit 670 - { model | hypaethralStorage = { item | saving = True } :: rest } 671 - 672 - _ -> 673 - Return.singleton model 486 + -- Only save locally 487 + save (\_ _ -> Task.succeed ()) 674 488 675 489 676 490 saveHypaethralDataBitWithDebounce : HypaethralBit -> Manager ··· 695 509 c 696 510 |> Cmd.map (SaveHypaethralDataSlowly >> UserMsg) 697 511 |> return { model | hypaethralDebouncer = m } 698 - |> andThen (saveHypaethralDataBits bits) 512 + |> (if not (List.isEmpty bits) then 513 + andThen (saveHypaethralDataBits bits) 699 514 700 - 701 - {-| Saves some hypaethral data, 702 - depending on what's in the queue saving queue 703 - (ie. `hypaethralStorage`) 704 - -} 705 - saveNextHypaethralBit : Manager 706 - saveNextHypaethralBit model = 707 - case model.hypaethralStorage of 708 - _ :: item :: rest -> 709 - saveHypaethralData 710 - item.bit 711 - { model | hypaethralStorage = { item | saving = True } :: rest } 712 - 713 - _ -> 714 - Return.singleton { model | hypaethralStorage = [] } 515 + else 516 + identity 517 + ) 715 518 716 519 717 520 sendHypaethralDataToUI : Json.Value -> HypaethralData -> Manager ··· 826 629 -- 🔱 ░░ METHOD 827 630 828 631 829 - methodRetrieved : Json.Value -> Manager 830 - methodRetrieved json model = 831 - case decodeMethod json of 832 - -- 🚀 833 - Just method -> 834 - { model | authMethod = Just method } 835 - |> retrieveAllHypaethralData 836 - |> andThen (Common.giveUI Alien.AuthMethod <| encodeMethod method) 837 - 838 - -- ✋ 839 - _ -> 840 - terminate NotAuthenticated model 841 - 842 - 843 - retrieveMethod : Manager 844 - retrieveMethod = 845 - Alien.AuthMethod 846 - |> Alien.trigger 847 - |> Ports.requestCache 848 - |> Return.communicate 849 - 850 - 851 632 saveMethod : Method -> Manager 852 633 saveMethod method model = 853 634 method 854 635 |> encodeMethod 855 - |> Alien.broadcast Alien.AuthMethod 636 + |> Alien.broadcast Alien.SyncMethod 856 637 |> Ports.toCache 857 - |> return { model | authMethod = Just method } 638 + |> return { model | userSyncMethod = Just method } 858 639 859 640 860 641 861 642 -- 🔱 ░░ SECRET KEY 862 643 863 644 864 - fabricateSecretKey : String -> Manager 865 - fabricateSecretKey passphrase = 866 - passphrase 867 - |> Json.string 868 - |> Alien.broadcast Alien.FabricateSecretKey 869 - |> Ports.fabricateSecretKey 870 - |> Return.communicate 871 - 872 - 873 645 removeEncryptionKey : Manager 874 - removeEncryptionKey = 875 - [ Alien.AuthSecretKey 876 - |> Alien.trigger 877 - |> Ports.removeCache 646 + removeEncryptionKey model = 647 + Alien.SecretKey 648 + |> Brain.Task.Ports.removeCache 649 + |> Task.mapError TaskPort.errorToStringCustom 650 + |> Task.andThen 651 + (\_ -> 652 + case model.userSyncMethod of 653 + Just method -> 654 + saveAllHypaethralDataTask model.hypaethralUserData method 878 655 879 - -- 880 - , SaveAllHypaethralData 881 - |> UserMsg 882 - |> do 883 - ] 884 - |> Cmd.batch 885 - |> Return.communicate 886 - 887 - 888 - secretKeyFabricated : Manager 889 - secretKeyFabricated model = 890 - if model.performingSignIn then 891 - if model.migratingData then 892 - hypaethralDataRetrieved Json.null model 893 - 894 - else 895 - retrieveAllHypaethralData model 896 - 897 - else 898 - saveAllHypaethralData model 656 + Nothing -> 657 + Task.succeed () 658 + ) 659 + |> Common.attemptTask (always Brain.Bypass) 660 + |> return model 899 661 900 662 901 663 updateEncryptionKey : Json.Value -> Manager 902 - updateEncryptionKey json = 664 + updateEncryptionKey json model = 903 665 case Decode.decodeValue Decode.string json of 904 666 Ok passphrase -> 905 - fabricateSecretKey passphrase 906 - 907 - Err _ -> 908 - Return.singleton 909 - 910 - 911 - 912 - -- TERMINATION 913 - 667 + passphrase 668 + |> Brain.Task.Ports.fabricateSecretKey 669 + |> Task.mapError TaskPort.errorToStringCustom 670 + |> Task.andThen 671 + (\_ -> 672 + case model.userSyncMethod of 673 + Just method -> 674 + saveAllHypaethralDataTask model.hypaethralUserData method 914 675 915 - type Termination 916 - = Authenticated Method Json.Value 917 - | NotAuthenticated 676 + Nothing -> 677 + Task.succeed () 678 + ) 679 + |> Common.attemptTask (always Brain.Bypass) 680 + |> return model 918 681 682 + Err _ -> 683 + Return.singleton model 919 684 920 - terminate : Termination -> Manager 921 - terminate t model = 922 - case t of 923 - Authenticated method encodedData -> 924 - { model | migratingData = False } 925 - |> (if model.migratingData then 926 - Return.singleton 927 685 928 - else 929 - encodedData 930 - |> User.decodeHypaethralData 931 - |> Result.withDefault model.hypaethralUserData 932 - |> sendHypaethralDataToUI encodedData 933 - ) 934 - |> (encodeMethod method 935 - |> Common.giveUI Alien.AuthMethod 936 - |> andThen 937 - ) 938 686 939 - NotAuthenticated -> 940 - model 941 - |> Common.nudgeUI Alien.NotAuthenticated 942 - |> andThen (Common.nudgeUI Alien.HideLoadingScreen) 687 + -- 📭 ░░ OTHER 943 688 944 689 690 + refreshDropboxTokens : Time.Posix -> User.Msg -> Task.Task String a -> String -> Cmd Brain.Msg 691 + refreshDropboxTokens currentTime msg initialTask refreshToken = 692 + initialTask 693 + |> Task.andThen 694 + (\_ -> Dropbox.refreshAccessToken refreshToken) 695 + |> Task.attempt 696 + (\result -> 697 + case result of 698 + Ok tokens -> 699 + msg 700 + |> RefreshedDropboxTokens 701 + { currentTime = Time.posixToMillis currentTime // 1000 702 + , refreshToken = refreshToken 703 + } 704 + tokens 705 + |> UserMsg 945 706 946 - -- 📭 ░░ OTHER 707 + Err err -> 708 + Common.reportUICmdMsg Alien.ReportError err 709 + ) 947 710 948 711 949 712 refreshedDropboxTokens :
+13 -29
src/Applications/Brain/User/Types.elm
··· 1 1 module Brain.User.Types exposing (..) 2 2 3 + import Alien exposing (Tag(..)) 3 4 import Debouncer.Basic as Debouncer 4 5 import Json.Decode as Json 5 - import User.Layer exposing (HypaethralBit) 6 + import User.Layer as User exposing (HypaethralBit, HypaethralData) 6 7 import User.Layer.Methods.Dropbox as Dropbox 7 - import Webnative 8 8 9 9 10 10 ··· 12 12 13 13 14 14 type Msg 15 - = SignIn Json.Value 16 - | SignOut 17 - ----------------------------------------- 18 - -- 0. Secret Key 19 - ----------------------------------------- 20 - | FabricateSecretKey String 21 - | SecretKeyFabricated 22 - ----------------------------------------- 23 - -- 1. Method 24 - ----------------------------------------- 25 - | RetrieveMethod 26 - | MethodRetrieved Json.Value 27 - ----------------------------------------- 28 - -- 2. Data 29 - ----------------------------------------- 30 - | RetrieveHypaethralData HypaethralBit 31 - | HypaethralDataRetrieved Json.Value 15 + = Commence (Maybe User.Method) ( Json.Value, HypaethralData ) 32 16 ----------------------------------------- 33 - -- 2. Data (Legacy) 17 + -- Method 34 18 ----------------------------------------- 35 - | RetrieveLegacyHypaethralData 19 + | SetSyncMethod Json.Value 20 + | Sync 21 + | UnsetSyncMethod 36 22 ----------------------------------------- 37 - -- x. Data 23 + -- Enclosed Data 38 24 ----------------------------------------- 39 25 | RetrieveEnclosedData 40 26 | EnclosedDataRetrieved Json.Value 41 27 | SaveEnclosedData Json.Value 42 28 ----------------------------------------- 43 - -- y. Data 29 + -- Hypaethral Data, pt. 1 44 30 ----------------------------------------- 45 31 | SaveFavourites Json.Value 46 32 | SavePlaylists Json.Value ··· 49 35 | SaveSources Json.Value 50 36 | SaveTracks Json.Value 51 37 ----------------------------------------- 52 - -- z. Data 38 + -- Hypaethral Data, pt. 2 53 39 ----------------------------------------- 54 - | GotWebnativeResponse Webnative.Response 55 - | SaveAllHypaethralData 56 - | SaveHypaethralDataBit HypaethralBit 40 + | FinishedSyncing 41 + | GotHypaethralData HypaethralData 57 42 | SaveHypaethralDataBits (List HypaethralBit) 58 43 | SaveHypaethralDataSlowly (Debouncer.Msg HypaethralBit) 59 - | SaveNextHypaethralBit 60 44 ----------------------------------------- 61 - -- z. Secret Key 45 + -- Encryption 62 46 ----------------------------------------- 63 47 | RemoveEncryptionKey 64 48 | UpdateEncryptionKey Json.Value
+20 -44
src/Applications/UI.elm
··· 22 22 import UI.Adjunct as Adjunct 23 23 import UI.Alfred.State as Alfred 24 24 import UI.Audio.State as Audio 25 - import UI.Authentication.State as Authentication 26 - import UI.Authentication.Types as Authentication 27 25 import UI.Backdrop as Backdrop 28 26 import UI.Common.State as Common 29 27 import UI.DnD as DnD ··· 40 38 import UI.Sources.Form 41 39 import UI.Sources.State as Sources 42 40 import UI.Sources.Types as Sources 41 + import UI.Syncing.State as Syncing 42 + import UI.Syncing.Types as Syncing 43 43 import UI.Tracks.State as Tracks 44 44 import UI.Tracks.Types as Tracks 45 45 import UI.Types exposing (..) 46 - import UI.User.State as User 47 46 import UI.User.State.Export as User 48 47 import UI.User.State.Import as User 49 48 import UI.View exposing (view) 50 49 import Url exposing (Url) 51 50 import Url.Ext as Url 51 + import User.Layer as User 52 52 53 53 54 54 ··· 104 104 , isTouchDevice = False 105 105 , isUpgrading = flags.upgrade 106 106 , lastFm = LastFm.initialModel 107 - , migratingData = False 108 107 , navKey = key 109 108 , page = page 110 109 , pressedKeys = [] ··· 217 216 ----------------------------------------- 218 217 -- 🦉 Nested 219 218 ----------------------------------------- 220 - , authentication = Authentication.initialModel url 219 + , syncing = Syncing.initialModel url 221 220 } 222 221 |> Routing.transition 223 222 page 224 223 |> Return.command 225 224 (url 226 - |> Authentication.initialCommand 227 - |> Cmd.map AuthenticationMsg 225 + |> Syncing.initialCommand 226 + |> Cmd.map SyncingMsg 228 227 ) 229 228 |> Return.command 230 229 (if Maybe.isNothing maybePage then ··· 472 471 ----------------------------------------- 473 472 Export -> 474 473 User.export 475 - 476 - GotWebnativeResponse a -> 477 - User.gotWebnativeResponse a 478 474 479 475 ImportFile a -> 480 476 User.importFile a ··· 482 478 ImportJson a -> 483 479 User.importJson a 484 480 485 - ImportLegacyData -> 486 - User.importLegacyData 487 - 488 481 InsertDemo -> 489 482 User.insertDemo 490 483 ··· 493 486 494 487 LoadHypaethralUserData a -> 495 488 User.loadHypaethralUserData a 496 - 497 - MigrateHypaethralUserData -> 498 - User.migrateHypaethralUserData 499 489 500 490 RequestImport -> 501 491 User.requestImport ··· 512 502 ----------------------------------------- 513 503 -- 🦉 Nested 514 504 ----------------------------------------- 515 - AuthenticationMsg a -> 516 - Authentication.update a 505 + SyncingMsg a -> 506 + Syncing.update a 517 507 518 508 QueueMsg a -> 519 509 Queue.update a ··· 608 598 ----------------------------------------- 609 599 -- 📭 Other 610 600 ----------------------------------------- 601 + , Ports.collectedFissionCapabilities (\_ -> SyncingMsg <| Syncing.ActivateSync <| User.Fission {}) 611 602 , Ports.installedNewServiceWorker (\_ -> InstalledServiceWorker) 612 603 , Ports.installingNewServiceWorker (\_ -> InstallingServiceWorker) 613 604 , Ports.refreshedAccessToken (Alien.broadcast Alien.RefreshedAccessToken >> RedirectToBrain) 614 605 , Ports.setIsOnline SetIsOnline 615 - , Ports.webnativeResponse GotWebnativeResponse 616 606 , Sub.map KeyboardMsg Keyboard.subscriptions 617 607 , Time.every (60 * 1000) SetCurrentTime 618 608 ] ··· 641 631 Alien.AddTracks -> 642 632 TracksMsg (Tracks.Add data) 643 633 644 - Alien.AuthMethod -> 645 - AuthenticationMsg (Authentication.SignedIn data) 646 - 647 634 Alien.FinishedProcessingSource -> 648 635 SourcesMsg (Sources.FinishedProcessingSource data) 649 636 ··· 656 643 Alien.HideLoadingScreen -> 657 644 ToggleLoadingScreen Off 658 645 659 - Alien.ImportLegacyData -> 660 - ShowNotification (Notifications.success "Imported data successfully!") 661 - 662 646 Alien.LoadEnclosedUserData -> 663 647 LoadEnclosedUserData data 664 648 665 649 Alien.LoadHypaethralUserData -> 666 650 LoadHypaethralUserData data 667 - 668 - Alien.MissingSecretKey -> 669 - AuthenticationMsg (Authentication.MissingSecretKey data) 670 - 671 - Alien.NotAuthenticated -> 672 - AuthenticationMsg Authentication.NotAuthenticated 673 651 674 652 Alien.ReloadTracks -> 675 653 TracksMsg (Tracks.Reload data) ··· 686 664 Alien.SearchTracks -> 687 665 TracksMsg (Tracks.SetSearchResults data) 688 666 667 + Alien.StartedSyncing -> 668 + SyncingMsg (Syncing.StartedSyncing data) 669 + 689 670 Alien.StoreTracksInCache -> 690 671 TracksMsg (Tracks.StoredInCache data Nothing) 672 + 673 + Alien.SyncMethod -> 674 + SyncingMsg (Syncing.GotSyncMethod data) 691 675 692 676 Alien.UpdateSourceData -> 693 677 SourcesMsg (Sources.UpdateSourceData data) ··· 699 683 translateAlienError : Alien.Tag -> Json.Value -> String -> Msg 700 684 translateAlienError tag data err = 701 685 case tag of 702 - Alien.AuthAnonymous -> 703 - AuthenticationMsg (Authentication.BootFailure err) 704 - 705 - Alien.AuthDropbox -> 706 - AuthenticationMsg (Authentication.BootFailure err) 707 - 708 - Alien.AuthIpfs -> 709 - AuthenticationMsg (Authentication.BootFailure err) 710 - 711 - Alien.AuthRemoteStorage -> 712 - AuthenticationMsg (Authentication.BootFailure err) 713 - 714 686 Alien.StoreTracksInCache -> 715 687 TracksMsg (Tracks.StoredInCache data <| Just err) 716 688 717 689 _ -> 718 - ShowNotification (Notifications.stickyError err) 690 + if String.startsWith "There seems to be existing data that's encrypted, I will need the passphrase" err then 691 + SyncingMsg (Syncing.NeedEncryptionKey { error = err }) 692 + 693 + else 694 + ShowNotification (Notifications.stickyError err)
+1 -5
src/Applications/UI/Adjunct.elm
··· 5 5 import Return 6 6 import UI.Alfred.State as Alfred 7 7 import UI.Audio.State as Audio 8 - import UI.Authentication.Common as Authentication 9 8 import UI.Commands.State as Commands 10 9 import UI.Common.State as Common 11 10 import UI.Interface.State exposing (hideOverlay) ··· 30 29 let 31 30 skip = 32 31 Return.singleton m 33 - 34 - authenticated = 35 - Authentication.isAuthenticated model.authentication 36 32 in 37 - if not authenticated || (m.focusedOnInput && Maybe.isNothing model.alfred) then 33 + if m.focusedOnInput && Maybe.isNothing model.alfred then 38 34 case m.pressedKeys of 39 35 [ Keyboard.Escape ] -> 40 36 hideOverlay m
-43
src/Applications/UI/Authentication/Common.elm
··· 1 - module UI.Authentication.Common exposing (..) 2 - 3 - import UI.Authentication.Types exposing (..) 4 - import User.Layer exposing (Method) 5 - 6 - 7 - 8 - -- 🛠 9 - 10 - 11 - isAuthenticated : State -> Bool 12 - isAuthenticated state = 13 - case state of 14 - Authenticated _ -> 15 - True 16 - 17 - _ -> 18 - False 19 - 20 - 21 - extractMethod : State -> Maybe Method 22 - extractMethod state = 23 - case state of 24 - Authenticated method -> 25 - Just method 26 - 27 - Authenticating -> 28 - Nothing 29 - 30 - InputScreen method _ -> 31 - Just method 32 - 33 - NewEncryptionKeyScreen method _ -> 34 - Just method 35 - 36 - UpdateEncryptionKeyScreen method _ -> 37 - Just method 38 - 39 - Unauthenticated -> 40 - Nothing 41 - 42 - Welcome -> 43 - Nothing
-24
src/Applications/UI/Authentication/ContextMenu.elm
··· 1 - module UI.Authentication.ContextMenu exposing (moreOptionsMenu) 2 - 3 - import ContextMenu exposing (..) 4 - import Coordinates exposing (Coordinates) 5 - import Svg 6 - import UI.Authentication.Types as Authentication 7 - import UI.Svg.Elements 8 - import UI.Types exposing (Msg(..)) 9 - 10 - 11 - 12 - -- 🔱 13 - 14 - 15 - moreOptionsMenu : Coordinates -> ContextMenu Msg 16 - moreOptionsMenu = 17 - ContextMenu 18 - [ Item 19 - { icon = \_ _ -> Svg.map never UI.Svg.Elements.ipfsLogo 20 - , label = "IPFS (using the Mutable File System)" 21 - , msg = AuthenticationMsg Authentication.PingIpfs 22 - , active = False 23 - } 24 - ]
+196 -277
src/Applications/UI/Authentication/State.elm src/Applications/UI/Syncing/State.elm
··· 1 - module UI.Authentication.State exposing (..) 1 + module UI.Syncing.State exposing (..) 2 2 3 3 import Alien 4 4 import Base64 5 5 import Binary 6 6 import Browser.Navigation as Nav 7 7 import Common exposing (Switch(..)) 8 + import Coordinates 8 9 import Dict 10 + import Html 11 + import Html.Attributes 9 12 import Html.Events.Extra.Mouse as Mouse 10 13 import Http 11 14 import Http.Ext as Http ··· 17 20 import Monocle.Lens exposing (Lens) 18 21 import Notifications 19 22 import Return exposing (andThen, return) 23 + import Return.Ext as Return 20 24 import SHA 21 25 import String.Ext as String 26 + import Svg exposing (Svg) 22 27 import Time 23 - import Tracks 24 - import UI.Authentication.ContextMenu as Authentication 25 - import UI.Authentication.Types as Authentication exposing (..) 26 28 import UI.Backdrop as Backdrop 27 29 import UI.Common.State as Common exposing (showNotification, showNotificationWithModel) 30 + import UI.Kit 28 31 import UI.Ports as Ports 29 - import UI.Sources.Query 30 32 import UI.Sources.State as Sources 33 + import UI.Svg.Elements 34 + import UI.Syncing.ContextMenu as Syncing 35 + import UI.Syncing.Types as Syncing exposing (..) 31 36 import UI.Types as UI exposing (..) 32 - import UI.User.State.Import as User 33 37 import Url exposing (Protocol(..), Url) 34 38 import Url.Ext as Url 39 + import UrlBase64 35 40 import User.Layer exposing (..) 36 41 import User.Layer.Methods.Dropbox as Dropbox 37 42 import User.Layer.Methods.RemoteStorage as RemoteStorage 38 - import Webnative 39 - import Webnative.Constants as Webnative 40 43 41 44 42 45 43 46 -- ⛩ 44 47 45 48 49 + minimumPassphraseLength : Int 46 50 minimumPassphraseLength = 47 51 16 48 52 49 53 54 + passphraseLengthErrorMessage : String 50 55 passphraseLengthErrorMessage = 51 56 "Your passphrase should be atleast *16 characters* long." 52 57 ··· 55 60 -- 🌳 56 61 57 62 58 - initialModel : Url -> Authentication.State 63 + initialModel : Url -> Syncing.State 59 64 initialModel url = 60 65 case Url.action url of 61 - [ "authenticate", "dropbox" ] -> 62 - case Dict.get "code" (Url.queryDictionary url) of 63 - Just _ -> 64 - Authenticating 65 - 66 - _ -> 67 - Unauthenticated 68 - 69 66 [ "authenticate", "remotestorage", encodedUserAddress ] -> 70 67 let 71 68 dict = 72 - Url.queryDictionary url 69 + Url.queryDictionary { url | query = url.fragment } 73 70 74 71 userAddress = 75 72 encodedUserAddress 76 73 |> Url.percentDecode 77 - |> Maybe.andThen (Base64.decode >> Result.toMaybe) 74 + |> Maybe.andThen (UrlBase64.decode Base64.decode >> Result.toMaybe) 78 75 |> Maybe.withDefault encodedUserAddress 79 76 in 80 77 case Dict.get "access_token" dict of ··· 88 85 Nothing 89 86 90 87 Nothing -> 91 - Unauthenticated 88 + NotSynced 92 89 93 90 _ -> 94 - Welcome 91 + NotSynced 95 92 96 93 97 - initialCommand : Url -> Cmd Authentication.Msg 94 + initialCommand : Url -> Cmd Syncing.Msg 98 95 initialCommand url = 99 96 case Url.action url of 100 97 [ "authenticate", "dropbox" ] -> ··· 109 106 Cmd.none 110 107 111 108 [ "authenticate", "fission" ] -> 112 - Webnative.permissions 113 - |> Webnative.initWithOptions 114 - { autoRemoveUrlParams = True 115 - , loadFileSystem = False 116 - } 117 - |> Ports.webnativeRequest 109 + Ports.collectFissionCapabilities () 118 110 119 111 _ -> 120 112 Cmd.none 121 113 122 114 123 - lens : Lens UI.Model Authentication.State 115 + lens : Lens UI.Model Syncing.State 124 116 lens = 125 - { get = .authentication 126 - , set = \a m -> { m | authentication = a } 117 + { get = .syncing 118 + , set = \a m -> { m | syncing = a } 127 119 } 128 120 129 121 ··· 131 123 -- 📣 132 124 133 125 134 - update : Authentication.Msg -> Manager 126 + update : Syncing.Msg -> Manager 135 127 update msg = 136 128 case msg of 137 - Authentication.Bypass -> 129 + Syncing.Bypass -> 138 130 Return.singleton 139 131 132 + ActivateSync a -> 133 + activateSync a 134 + 135 + ActivateSyncWithPassphrase a b -> 136 + activateSyncWithPassphrase a b 137 + 140 138 BootFailure a -> 141 139 bootFailure a 142 140 143 - CancelFlow -> 144 - cancelFlow 145 - 146 141 ExchangeDropboxAuthCode a -> 147 142 exchangeDropboxAuthCode a 148 143 149 - GetStarted -> 150 - startFlow 151 - 152 - NotAuthenticated -> 153 - notAuthenticated 144 + GotSyncMethod a -> 145 + gotSyncMethod a 154 146 155 147 RemoteStorageWebfinger a b -> 156 148 remoteStorageWebfinger a b 157 149 158 - ShowMoreOptions a -> 159 - showMoreOptions a 150 + ShowSyncDataMenu a -> 151 + showSyncDataMenu a 160 152 161 - SignIn a -> 162 - signIn a 153 + StartedSyncing a -> 154 + startedSyncing a 163 155 164 - SignInWithPassphrase a b -> 165 - signInWithPassphrase a b 166 - 167 - SignedIn a -> 168 - signedIn a 169 - 170 - SignOut -> 171 - signOut 156 + StopSync -> 157 + stopSync 172 158 173 159 TriggerExternalAuth a b -> 174 160 externalAuth a b ··· 179 165 KeepPassphraseInMemory a -> 180 166 keepPassphraseInMemory a 181 167 182 - MissingSecretKey a -> 183 - missingSecretKey a 168 + NeedEncryptionKey a -> 169 + needEncryptionKey a 184 170 185 171 RemoveEncryptionKey a -> 186 172 removeEncryptionKey a ··· 215 201 AskForInput a b -> 216 202 askForInput a b 217 203 218 - Input a -> 219 - input a 204 + CancelInput -> 205 + cancelInput 220 206 221 207 ConfirmInput -> 222 208 confirmInput 223 209 210 + Input a -> 211 + input a 224 212 225 - organize : Organizer Authentication.State -> Manager 213 + 214 + organize : Organizer Syncing.State -> Manager 226 215 organize = 227 216 Management.organize lens 228 217 229 218 230 - replaceState : Authentication.State -> Manager 219 + replaceState : Syncing.State -> Manager 231 220 replaceState state = 232 221 lens.set state >> Return.singleton 233 222 ··· 236 225 -- 🔱 237 226 238 227 228 + activateSync : Method -> Manager 229 + activateSync method model = 230 + [ ( "method", encodeMethod method ) 231 + , ( "passphrase", Json.Encode.null ) 232 + ] 233 + |> Json.Encode.object 234 + |> Alien.broadcast Alien.SetSyncMethod 235 + |> Ports.toBrain 236 + -- 237 + |> return model 238 + 239 + 240 + activateSyncWithPassphrase : Method -> String -> Manager 241 + activateSyncWithPassphrase method passphrase model = 242 + if String.length passphrase < minimumPassphraseLength then 243 + passphraseLengthErrorMessage 244 + |> Notifications.error 245 + |> Common.showNotificationWithModel model 246 + 247 + else 248 + [ ( "method", encodeMethod method ) 249 + , ( "passphrase", Json.Encode.string <| hashPassphrase passphrase ) 250 + ] 251 + |> Json.Encode.object 252 + |> Alien.broadcast Alien.SetSyncMethod 253 + |> Ports.toBrain 254 + -- 255 + |> return model 256 + 257 + 239 258 bootFailure : String -> Manager 240 259 bootFailure err model = 241 260 model ··· 243 262 |> andThen Backdrop.setDefault 244 263 245 264 246 - cancelFlow : Manager 247 - cancelFlow model = 248 - (\state -> 249 - case state of 250 - Authenticated method -> 251 - Authenticated method 252 - 253 - Authenticating -> 254 - Unauthenticated 255 - 256 - InputScreen _ _ -> 257 - Unauthenticated 258 - 259 - NewEncryptionKeyScreen _ _ -> 260 - Unauthenticated 261 - 262 - UpdateEncryptionKeyScreen method _ -> 263 - Authenticated method 264 - 265 - Unauthenticated -> 266 - Welcome 267 - 268 - Welcome -> 269 - Welcome 270 - ) 271 - |> Lens.adjust lens model 272 - |> Return.singleton 273 - |> andThen Common.forceTracksRerender 274 - 275 - 276 265 externalAuth : Method -> String -> Manager 277 266 externalAuth method string model = 278 267 case method of ··· 291 280 let 292 281 url = 293 282 model.url 294 - 295 - redirectTo = 296 - { url | query = Just "action=authenticate/fission" } 297 283 in 298 284 "Just a moment, loading necessary components ..." 299 285 |> Notifications.stickyCasual 300 286 |> Common.showNotificationWithModel model 301 - |> Return.command 302 - (Webnative.permissions 303 - |> Webnative.redirectToLobby (Webnative.RedirectTo redirectTo) 304 - |> Ports.webnativeRequest 305 - ) 287 + |> Return.command (Ports.authenticateWithFission ()) 306 288 307 289 RemoteStorage _ -> 308 290 string 309 291 |> RemoteStorage.parseUserAddress 310 - |> Maybe.map (RemoteStorage.webfingerRequest RemoteStorageWebfinger) 311 - |> Maybe.map (Cmd.map AuthenticationMsg) 292 + |> Maybe.map (RemoteStorage.webfingerRequest RemoteStorageWebfinger model.url.protocol) 293 + |> Maybe.map (Cmd.map SyncingMsg) 312 294 |> Maybe.unwrap 313 295 (RemoteStorage.userAddressError 314 296 |> Notifications.error ··· 341 323 "Missing refresh token in Dropbox code exchange flow." 342 324 |> Notifications.stickyError 343 325 |> showNotificationWithModel 344 - (Lens.replace lens model Unauthenticated) 326 + (Lens.replace lens model NotSynced) 345 327 346 328 Err err -> 347 329 [] ··· 349 331 "Failed to authenticate with Dropbox" 350 332 (Http.errorToString err) 351 333 |> showNotificationWithModel 352 - (Lens.replace lens model Unauthenticated) 334 + (Lens.replace lens model NotSynced) 353 335 354 336 355 - missingSecretKey : Json.Value -> Manager 356 - missingSecretKey _ model = 357 - "There seems to be existing data that's encrypted, I will need the passphrase (ie. encryption key) to continue." 358 - |> Notifications.error 359 - |> showNotificationWithModel model 360 - |> andThen Backdrop.setDefault 361 - |> andThen (Common.toggleLoadingScreen Off) 337 + gotSyncMethod : Json.Value -> Manager 338 + gotSyncMethod json model = 339 + let 340 + afterwards a = 341 + andThen 342 + (\m -> 343 + if m.processAutomatically then 344 + Sources.process m 362 345 346 + else 347 + Return.singleton m 348 + ) 349 + (case model.syncing of 350 + Syncing { notificationId } -> 351 + Common.dismissNotification { id = notificationId } a 363 352 364 - notAuthenticated : Manager 365 - notAuthenticated model = 366 - -- This is the message we get when the app initially 367 - -- finds out we're not authenticated. 368 - (if model.isUpgrading then 369 - """ 370 - Thank you for using Diffuse V1! 371 - If you want to import your old data, 372 - please pick the storage method you used before and 373 - go to the [import page](#/settings/import-export). 374 - """ 375 - |> Notifications.stickySuccess 376 - |> showNotificationWithModel { model | isUpgrading = False } 353 + _ -> 354 + Return.singleton a 355 + ) 356 + in 357 + -- 🧠 told me which auth method we're using, 358 + -- so we can tell the user in the UI. 359 + case decodeMethod json of 360 + Just method -> 361 + model 362 + |> replaceState (Synced method) 363 + |> andThen afterwards 377 364 378 - else 379 - Return.singleton model 380 - ) 381 - |> andThen Backdrop.setDefault 382 - -- When the user wants to create a source (by passing the info through the url) 383 - -- and the user isn't signed in yet, sign in using the "Local" method. 384 - |> (if UI.Sources.Query.requestedAddition model.url then 385 - andThen (signIn Local) 386 - 387 - else 388 - identity 389 - ) 365 + Nothing -> 366 + afterwards model 390 367 391 368 392 369 remoteStorageWebfinger : RemoteStorage.Attributes -> Result Http.Error String -> Manager ··· 411 388 |> showNotificationWithModel model 412 389 413 390 414 - showMoreOptions : Mouse.Event -> Manager 415 - showMoreOptions mouseEvent model = 416 - ( mouseEvent.clientPos 417 - , mouseEvent.offsetPos 418 - ) 419 - |> (\( ( a, b ), ( c, d ) ) -> 420 - { x = a - c + 15 421 - , y = b - d + 12 422 - } 423 - ) 424 - |> Authentication.moreOptionsMenu 391 + showSyncDataMenu : Mouse.Event -> Manager 392 + showSyncDataMenu mouseEvent model = 393 + mouseEvent.clientPos 394 + |> Coordinates.fromTuple 395 + |> Syncing.syncDataMenu 425 396 |> Common.showContextMenuWithModel model 426 397 427 398 428 - signedIn : Json.Value -> Manager 429 - signedIn json model = 430 - -- 🧠 told me which auth method we're using, 431 - -- so we can tell the user in the UI. 399 + startedSyncing : Json.Value -> Manager 400 + startedSyncing json = 401 + -- 🧠 started syncing 432 402 case decodeMethod json of 433 403 Just method -> 434 - model 435 - |> replaceState 436 - (Authenticated method) 437 - |> andThen 438 - (\m -> 439 - if m.migratingData then 440 - "Migrated data successfully" 441 - |> Notifications.success 442 - |> showNotificationWithModel 443 - { m 444 - | isLoading = False 445 - , migratingData = False 446 - } 447 - |> User.saveAllHypaethralData 448 - 449 - else 450 - Return.singleton m 451 - ) 404 + Common.showSyncingNotification method 452 405 453 406 Nothing -> 454 - Return.singleton model 407 + Return.singleton 455 408 456 409 457 - signIn : Method -> Manager 458 - signIn method model = 459 - [ ( "method", encodeMethod method ) 460 - , ( "migratingData", Json.Encode.bool model.migratingData ) 461 - , ( "passphrase", Json.Encode.null ) 462 - ] 463 - |> Json.Encode.object 464 - |> Alien.broadcast Alien.SignIn 410 + stopSync : Manager 411 + stopSync model = 412 + Alien.UnsetSyncMethod 413 + |> Alien.trigger 465 414 |> Ports.toBrain 466 - -- 467 415 |> return model 468 - |> andThen (Common.toggleLoadingScreen On) 469 - 470 - 471 - signInWithPassphrase : Method -> String -> Manager 472 - signInWithPassphrase method passphrase model = 473 - if String.length passphrase < minimumPassphraseLength then 474 - passphraseLengthErrorMessage 475 - |> Notifications.error 476 - |> Common.showNotificationWithModel model 477 - 478 - else 479 - [ ( "method", encodeMethod method ) 480 - , ( "migratingData", Json.Encode.bool model.migratingData ) 481 - , ( "passphrase", Json.Encode.string <| hashPassphrase passphrase ) 482 - ] 483 - |> Json.Encode.object 484 - |> Alien.broadcast Alien.SignIn 485 - |> Ports.toBrain 486 - -- 487 - |> return model 488 - |> andThen (Common.toggleLoadingScreen On) 489 - 490 - 491 - signOut : Manager 492 - signOut model = 493 - if model.migratingData then 494 - return 495 - { model | authentication = Authentication.Unauthenticated } 496 - (Ports.toBrain <| Alien.trigger Alien.SignOut) 497 - 498 - else 499 - { model 500 - | authentication = Authentication.Unauthenticated 501 - , playlists = [] 502 - , playlistToActivate = Nothing 503 - 504 - -- Queue 505 - -------- 506 - , dontPlay = [] 507 - , nowPlaying = Nothing 508 - , playedPreviously = [] 509 - , playingNext = [] 510 - , selectedQueueItem = Nothing 511 - 512 - -- 513 - , repeat = False 514 - , shuffle = False 515 - 516 - -- Sources 517 - ---------- 518 - , processingContext = [] 519 - , sources = [] 520 - 521 - -- Tracks 522 - --------- 523 - , coverSelectionReducesPool = True 524 - , favourites = [] 525 - , hideDuplicates = False 526 - , searchResults = Nothing 527 - , tracks = Tracks.emptyCollection 528 - } 529 - |> Backdrop.setDefault 530 - |> Return.andThen Sources.stopProcessing 531 - |> Return.command (Ports.toBrain <| Alien.trigger Alien.SignOut) 532 - |> Return.command (Ports.activeQueueItemChanged Nothing) 533 - |> Return.command (Nav.pushUrl model.navKey "#/") 534 - 535 - 536 - startFlow : Manager 537 - startFlow = 538 - replaceState Unauthenticated 416 + |> andThen (replaceState NotSynced) 539 417 540 418 541 419 ··· 559 437 |> Return.singleton 560 438 561 439 440 + needEncryptionKey : { error : String } -> Manager 441 + needEncryptionKey { error } model = 442 + (case lens.get model of 443 + Syncing { notificationId } -> 444 + Common.dismissNotification { id = notificationId } model 445 + 446 + m -> 447 + replaceState m model 448 + ) 449 + |> andThen 450 + (error 451 + |> Notifications.stickyError 452 + |> Common.showNotification 453 + ) 454 + |> andThen 455 + stopSync 456 + 457 + 562 458 removeEncryptionKey : Method -> Manager 563 459 removeEncryptionKey method model = 564 460 Alien.RemoveEncryptionKey ··· 566 462 |> Ports.toBrain 567 463 -- 568 464 |> return 569 - (lens.set (Authenticated method) model) 465 + (lens.set (Synced method) model) 570 466 |> andThen 571 467 ("Saving data without encryption ..." 572 468 |> Notifications.success ··· 601 497 |> Ports.toBrain 602 498 -- 603 499 |> return 604 - (lens.set (Authenticated method) model) 500 + (lens.set (Synced method) model) 605 501 |> andThen 606 502 ("Encrypting data with new passphrase ..." 607 503 |> Notifications.success ··· 629 525 630 526 Http -> 631 527 { url = "//localhost:5001/api/v0/id" 632 - , expect = Http.expectWhatever (AuthenticationMsg << PingIpfsCallback) 528 + , expect = Http.expectWhatever (SyncingMsg << PingIpfsCallback) 633 529 , body = Http.emptyBody 634 530 } 635 531 |> Http.post ··· 647 543 Err _ -> 648 544 askForInput 649 545 (Ipfs { apiOrigin = "" }) 650 - { placeholder = "//localhost:5001" 651 - , question = """ 652 - Where's your IPFS API located?<br /> 653 - <span class="font-normal text-white-60"> 654 - You can find this address on the IPFS Web UI.<br /> 655 - Most likely you'll also need to setup CORS.<br /> 656 - You can find the instructions for that 657 - <a href="about/cors/#CORS__IPFS" target="_blank" class="border-b border-current-color font-semibold inline-block leading-tight">here</a>. 658 - </span> 659 - """ 546 + { icon = \size _ -> Svg.map never (UI.Svg.Elements.ipfsLogo size) 547 + , placeholder = "//localhost:5001" 548 + , question = 549 + UI.Kit.askForInput 550 + { question = 551 + "Where's your IPFS API located?" 552 + , info = 553 + [ Html.text "You can find this address on the IPFS Web UI." 554 + , Html.br [] [] 555 + , Html.text "Most likely you'll also need to setup CORS." 556 + , Html.br [] [] 557 + , Html.text "You can find the instructions for that " 558 + , Html.a 559 + [ Html.Attributes.class "border-b border-current-color font-semibold inline-block leading-tight" 560 + , Html.Attributes.href "about/cors/#CORS__IPFS" 561 + , Html.Attributes.target "_blank" 562 + ] 563 + [ Html.text "here" ] 564 + ] 565 + } 660 566 , value = "//localhost:5001" 661 567 } 662 568 ··· 664 570 pingOtherIpfs : String -> Manager 665 571 pingOtherIpfs origin model = 666 572 { url = origin ++ "/api/v0/id" 667 - , expect = Http.expectWhatever (AuthenticationMsg << PingOtherIpfsCallback origin) 573 + , expect = Http.expectWhatever (SyncingMsg << PingOtherIpfsCallback origin) 668 574 , body = Http.emptyBody 669 575 } 670 576 |> Http.post ··· 690 596 691 597 692 598 askForInput : Method -> Question -> Manager 693 - askForInput method q = 694 - { placeholder = q.placeholder 695 - , question = q.question 696 - , value = q.value 697 - } 599 + askForInput method question = 600 + question 698 601 |> InputScreen method 699 602 |> replaceState 700 603 701 604 702 - input : String -> Manager 703 - input string model = 704 - (\state -> 705 - case state of 706 - InputScreen method opts -> 707 - InputScreen method { opts | value = string } 605 + cancelInput : Manager 606 + cancelInput model = 607 + case lens.get model of 608 + InputScreen _ _ -> 609 + replaceState NotSynced model 610 + 611 + NewEncryptionKeyScreen _ _ -> 612 + replaceState NotSynced model 613 + 614 + UpdateEncryptionKeyScreen method _ -> 615 + replaceState (Synced method) model 708 616 709 - s -> 710 - s 711 - ) 712 - |> Lens.adjust lens model 713 - |> Return.singleton 617 + m -> 618 + replaceState m model 714 619 715 620 716 621 confirmInput : Manager ··· 724 629 725 630 _ -> 726 631 Return.singleton model 632 + 633 + 634 + input : String -> Manager 635 + input string model = 636 + (\state -> 637 + case state of 638 + InputScreen method opts -> 639 + InputScreen method { opts | value = string } 640 + 641 + s -> 642 + s 643 + ) 644 + |> Lens.adjust lens model 645 + |> Return.singleton 727 646 728 647 729 648
+19 -17
src/Applications/UI/Authentication/Types.elm src/Applications/UI/Syncing/Types.elm
··· 1 - module UI.Authentication.Types exposing (Msg(..), Question, State(..)) 1 + module UI.Syncing.Types exposing (Msg(..), Question, State(..)) 2 2 3 + import Html exposing (Html) 3 4 import Html.Events.Extra.Mouse as Mouse 4 5 import Http 5 6 import Json.Decode as Json 7 + import Material.Icons.Types exposing (Coloring) 8 + import Svg exposing (Svg) 6 9 import User.Layer exposing (Method) 7 10 import User.Layer.Methods.Dropbox as Dropbox 8 11 import User.Layer.Methods.RemoteStorage as RemoteStorage ··· 13 16 14 17 15 18 type State 16 - = Authenticated Method 17 - | Authenticating 19 + = NotSynced 20 + | Synced Method 21 + | Syncing { method : Method, notificationId : Int } 18 22 | InputScreen Method Question 19 23 | NewEncryptionKeyScreen Method (Maybe String) 20 24 | UpdateEncryptionKeyScreen Method (Maybe String) 21 - | Unauthenticated 22 - | Welcome 23 25 24 26 25 27 type alias Question = 26 - { placeholder : String 27 - , question : String 28 + { icon : Int -> Coloring -> Svg Msg 29 + , placeholder : String 30 + , question : Html Msg 28 31 , value : String 29 32 } 30 33 ··· 36 39 type Msg 37 40 = Bypass 38 41 -- 42 + | ActivateSync Method 43 + | ActivateSyncWithPassphrase Method String 39 44 | BootFailure String 40 - | CancelFlow 41 45 | ExchangeDropboxAuthCode (Result Http.Error Dropbox.Tokens) 42 - | GetStarted 43 - | NotAuthenticated 46 + | GotSyncMethod Json.Value 44 47 | RemoteStorageWebfinger RemoteStorage.Attributes (Result Http.Error String) 45 - | ShowMoreOptions Mouse.Event 46 - | SignIn Method 47 - | SignInWithPassphrase Method String 48 - | SignedIn Json.Value 49 - | SignOut 48 + | ShowSyncDataMenu Mouse.Event 49 + | StartedSyncing Json.Value 50 + | StopSync 50 51 | TriggerExternalAuth Method String 51 52 ----------------------------------------- 52 53 -- Encryption 53 54 ----------------------------------------- 54 55 | KeepPassphraseInMemory String 55 - | MissingSecretKey Json.Value 56 + | NeedEncryptionKey { error : String } 56 57 | RemoveEncryptionKey Method 57 58 | ShowNewEncryptionKeyScreen Method 58 59 | ShowUpdateEncryptionKeyScreen Method ··· 68 69 -- More Input 69 70 ----------------------------------------- 70 71 | AskForInput Method Question 72 + | CancelInput 73 + | ConfirmInput 71 74 | Input String 72 - | ConfirmInput
-580
src/Applications/UI/Authentication/View.elm
··· 1 - module UI.Authentication.View exposing (view) 2 - 3 - import Chunky exposing (..) 4 - import Conditional exposing (..) 5 - import Html exposing (Html, a, button, text) 6 - import Html.Attributes exposing (attribute, href, placeholder, src, style, target, title, value, width) 7 - import Html.Events exposing (onClick, onSubmit) 8 - import Html.Events.Extra exposing (onClickStopPropagation) 9 - import Html.Events.Extra.Mouse as Mouse 10 - import Html.Extra as Html 11 - import Html.Lazy as Lazy 12 - import Markdown 13 - import Material.Icons.Round as Icons 14 - import Material.Icons.Types exposing (Coloring(..)) 15 - import Svg exposing (Svg) 16 - import UI.Authentication.Types as Authentication exposing (..) 17 - import UI.Kit 18 - import UI.Svg.Elements 19 - import UI.Types as UI exposing (..) 20 - import User.Layer exposing (..) 21 - 22 - 23 - 24 - -- 🗺 25 - 26 - 27 - view : Model -> Html UI.Msg 28 - view = 29 - Html.map AuthenticationMsg << Lazy.lazy view_ << .authentication 30 - 31 - 32 - view_ : State -> Html Authentication.Msg 33 - view_ state = 34 - chunk 35 - [ "flex" 36 - , "flex-col" 37 - , "h-full" 38 - , "items-center" 39 - ] 40 - [ brick 41 - [ style "height" "42%" ] 42 - [ "flex" 43 - , "items-center" 44 - , "pb-8" 45 - 46 - -- 47 - , "md:pb-0" 48 - ] 49 - [ -- Logo 50 - ------- 51 - chunk 52 - [ "py-5", "relative" ] 53 - [ slab 54 - Html.img 55 - [ onClick CancelFlow 56 - , src "images/diffuse-light.svg" 57 - , width 190 58 - 59 - -- 60 - , case state of 61 - Welcome -> 62 - title "Diffuse" 63 - 64 - _ -> 65 - title "Go back" 66 - ] 67 - [ case state of 68 - Welcome -> 69 - "cursor-default" 70 - 71 - _ -> 72 - "cursor-pointer" 73 - ] 74 - [] 75 - 76 - -- Speech bubble 77 - ---------------- 78 - , case state of 79 - Authenticating -> 80 - speechBubble negotiating 81 - 82 - InputScreen _ { question } -> 83 - question 84 - |> String.lines 85 - |> List.map String.trimLeft 86 - |> String.join "\n" 87 - |> Markdown.toHtmlWith 88 - { githubFlavored = Nothing 89 - , defaultHighlighting = Nothing 90 - , sanitize = False 91 - , smartypants = True 92 - } 93 - [] 94 - |> speechBubble 95 - 96 - NewEncryptionKeyScreen _ _ -> 97 - [ text "I need a passphrase to encrypt your personal data." 98 - , lineBreak 99 - , inline 100 - [ "font-normal", "text-white-60" ] 101 - [ text "This'll prevent other people from reading your data." ] 102 - ] 103 - |> chunk [] 104 - |> speechBubble 105 - 106 - UpdateEncryptionKeyScreen _ _ -> 107 - [ text "I need a new passphrase to encrypt your personal data." 108 - , lineBreak 109 - , inline 110 - [ "font-normal", "text-white-60" ] 111 - [ text "This'll prevent other people from reading your data." ] 112 - ] 113 - |> chunk [] 114 - |> speechBubble 115 - 116 - Welcome -> 117 - [ text "Diffuse plays music" 118 - , inline [ "not-italic", "font-normal", "mr-px" ] [ text " ♫ " ] 119 - , inline [ "font-normal", "text-white-60" ] 120 - [ text "from your Dropbox," 121 - , lineBreak 122 - , text "IPFS node, Amazon S3 bucket, or any other" 123 - , lineBreak 124 - , text "cloud/distributed storage service you use." 125 - ] 126 - ] 127 - |> chunk [] 128 - |> speechBubble 129 - 130 - _ -> 131 - [ text "Where would you like to keep your personal data?" 132 - , lineBreak 133 - , inline 134 - [ "font-normal", "text-white-60" ] 135 - [ text "That's things like your favourites, your playlists, etc." 136 - , lineBreak 137 - , text "After this you'll be able add some music ♫" 138 - ] 139 - ] 140 - |> chunk [] 141 - |> speechBubble 142 - ] 143 - ] 144 - 145 - ----------------------------------------- 146 - -- Content 147 - ----------------------------------------- 148 - , case state of 149 - InputScreen _ opts -> 150 - inputScreen opts 151 - 152 - NewEncryptionKeyScreen method pass -> 153 - encryptionKeyScreen 154 - { withEncryption = SignInWithPassphrase method (Maybe.withDefault "" pass) 155 - , withoutEncryption = SignIn method 156 - } 157 - 158 - UpdateEncryptionKeyScreen method pass -> 159 - encryptionKeyScreen 160 - { withEncryption = UpdateEncryptionKey method (Maybe.withDefault "" pass) 161 - , withoutEncryption = RemoveEncryptionKey method 162 - } 163 - 164 - Unauthenticated -> 165 - choicesScreen 166 - 167 - Authenticated _ -> 168 - choicesScreen 169 - 170 - Authenticating -> 171 - Html.nothing 172 - 173 - Welcome -> 174 - welcomeScreen 175 - 176 - ----------------------------------------- 177 - -- Link to about page 178 - ----------------------------------------- 179 - , chunk 180 - [ "antialiased" 181 - , "font-semibold" 182 - , "flex" 183 - , "flex-grow" 184 - , "items-end" 185 - , "leading-snug" 186 - , "pb-8" 187 - , "pt-3" 188 - , "text-sm" 189 - ] 190 - [ slab 191 - a 192 - [ href "about/" ] 193 - [ "border-b" 194 - , "border-white-60" 195 - , "italic" 196 - , "no-underline" 197 - , "text-white-60" 198 - ] 199 - [ text "More info" ] 200 - ] 201 - ] 202 - 203 - 204 - 205 - -- WELCOME 206 - 207 - 208 - welcomeScreen : Html Authentication.Msg 209 - welcomeScreen = 210 - chunk 211 - [ "mt-3" 212 - , "relative" 213 - , "z-10" 214 - ] 215 - [ UI.Kit.buttonWithColor 216 - UI.Kit.Blank 217 - UI.Kit.Filled 218 - GetStarted 219 - (slab 220 - Html.span 221 - [ style "letter-spacing" "0.25em" 222 - ] 223 - [ "align-middle" 224 - , "font-bold" 225 - , "inline-block" 226 - , "text-nearly-sm" 227 - ] 228 - [ text "SIGN IN" ] 229 - ) 230 - ] 231 - 232 - 233 - 234 - -- LOADING 235 - 236 - 237 - negotiating : Html Authentication.Msg 238 - negotiating = 239 - chunk 240 - [ "flex" 241 - , "items-center" 242 - ] 243 - [ chunk 244 - [ "transform", "-translate-y-px" ] 245 - [ Html.map never (UI.Svg.Elements.loadingWithSize 14) ] 246 - , chunk 247 - [ "italic" 248 - , "ml-2" 249 - , "text-opacity-80" 250 - , "text-sm" 251 - , "text-white" 252 - ] 253 - [ Html.text "Negotiating with service" ] 254 - ] 255 - 256 - 257 - 258 - -- CHOICES 259 - 260 - 261 - choicesScreen : Html Authentication.Msg 262 - choicesScreen = 263 - chunk 264 - [ "bg-white" 265 - , "rounded" 266 - , "px-4" 267 - , "py-2" 268 - , "relative" 269 - , "z-10" 270 - 271 - -- Dark mode 272 - ------------ 273 - , "dark:bg-darkest-hour" 274 - ] 275 - [ choiceButton 276 - { action = ShowNewEncryptionKeyScreen Local 277 - , icon = Icons.web 278 - , infoLink = Nothing 279 - , label = "My Browser" 280 - , outOfOrder = False 281 - } 282 - , choiceButton 283 - { action = TriggerExternalAuth (Fission { initialised = False }) "" 284 - , icon = \_ _ -> Svg.map never UI.Svg.Elements.fissionLogo 285 - , infoLink = Just "https://fission.codes/" 286 - , label = "Fission" 287 - , outOfOrder = False 288 - } 289 - , choiceButton 290 - { action = TriggerExternalAuth (Dropbox { accessToken = "", expiresAt = 0, refreshToken = "" }) "" 291 - , icon = \_ _ -> Svg.map never UI.Svg.Elements.dropboxLogo 292 - , infoLink = Just "https://dropbox.com/" 293 - , label = "Dropbox" 294 - , outOfOrder = False 295 - } 296 - , choiceButton 297 - { action = 298 - AskForInput 299 - (RemoteStorage { userAddress = "", token = "" }) 300 - { placeholder = "example@5apps.com" 301 - , question = """ 302 - What's your user address? 303 - <span class="font-normal text-white-60"> 304 - <br />The format's 305 - <span class="font-semibold">username@server.domain</span> 306 - </span> 307 - """ 308 - , value = "" 309 - } 310 - , icon = \_ _ -> Svg.map never UI.Svg.Elements.remoteStorageLogo 311 - , infoLink = Just "https://remotestorage.io/" 312 - , label = "RemoteStorage" 313 - , outOfOrder = False 314 - } 315 - 316 - -- More options 317 - --------------- 318 - , chunk 319 - [ "pb-px", "pt-4", "text-center" ] 320 - [ slab 321 - Html.span 322 - [ title "More options" 323 - , Mouse.onClick ShowMoreOptions 324 - ] 325 - [ "inline-block", "px-1", "cursor-pointer", "leading-none" ] 326 - [ chunk 327 - [ "pointer-events-none" ] 328 - [ Icons.more_horiz 22 Inherit ] 329 - ] 330 - ] 331 - ] 332 - 333 - 334 - choiceButton : 335 - { action : msg 336 - , icon : Int -> Coloring -> Svg msg 337 - , infoLink : Maybe String 338 - , label : String 339 - , outOfOrder : Bool 340 - } 341 - -> Html msg 342 - choiceButton { action, icon, infoLink, label, outOfOrder } = 343 - chunk 344 - [ "border-b" 345 - , "border-gray-300" 346 - , "relative" 347 - 348 - -- 349 - , "last:border-b-0" 350 - 351 - -- Dark mode 352 - ------------ 353 - , "dark:border-base01" 354 - ] 355 - [ ----------------------------------------- 356 - -- Button 357 - ----------------------------------------- 358 - slab 359 - button 360 - [ onClick action ] 361 - [ "bg-transparent" 362 - , "cursor-pointer" 363 - , "flex" 364 - , "items-center" 365 - , "leading-none" 366 - , "min-w-tiny" 367 - , "outline-none" 368 - , "px-2" 369 - , "py-4" 370 - , "text-left" 371 - , "text-sm" 372 - ] 373 - [ chunk 374 - [ "flex" 375 - , "items-center" 376 - 377 - -- 378 - , ifThenElse outOfOrder "opacity-20" "opacity-100" 379 - ] 380 - [ inline 381 - [ "inline-flex", "mr-4" ] 382 - [ icon 16 Inherit ] 383 - , text label 384 - ] 385 - ] 386 - 387 - ----------------------------------------- 388 - -- Info icon 389 - ----------------------------------------- 390 - , case infoLink of 391 - Just link -> 392 - slab 393 - Html.a 394 - [ style "left" "100%" 395 - , style "top" "50%" 396 - , style "transform" "translateY(-50%)" 397 - 398 - -- 399 - , href link 400 - , target "_blank" 401 - , title ("Learn more about " ++ label) 402 - ] 403 - [ "absolute" 404 - , "cursor-pointer" 405 - , "duration-100" 406 - , "leading-none" 407 - , "ml-4" 408 - , "opacity-40" 409 - , "pl-4" 410 - , "text-white" 411 - , "transition-opacity" 412 - , "transform" 413 - , "-translate-y-1/2" 414 - 415 - -- 416 - , "hocus:opacity-100" 417 - ] 418 - [ Icons.help 17 Inherit ] 419 - 420 - Nothing -> 421 - nothing 422 - ] 423 - 424 - 425 - 426 - -- ENCRYPTION KEY 427 - 428 - 429 - encryptionKeyScreen : { withEncryption : Authentication.Msg, withoutEncryption : Authentication.Msg } -> Html Authentication.Msg 430 - encryptionKeyScreen { withEncryption, withoutEncryption } = 431 - slab 432 - Html.form 433 - [ onSubmit withEncryption ] 434 - [ "flex" 435 - , "flex-col" 436 - , "max-w-xs" 437 - , "px-3" 438 - , "w-screen" 439 - 440 - -- 441 - , "sm:px-0" 442 - ] 443 - [ UI.Kit.textArea 444 - [ attribute "autocapitalize" "none" 445 - , attribute "autocomplete" "off" 446 - , attribute "autocorrect" "off" 447 - , attribute "rows" "4" 448 - , attribute "spellcheck" "false" 449 - 450 - -- 451 - , placeholder "anQLS9Usw24gxUi11IgVBg76z8SCWZgLKkoWIeJ1ClVmBHLRlaiA0CtvONVAMGritbgd3U45cPTxrhFU0WXaOAa8pVt186KyEccfUNyAq97" 452 - 453 - -- 454 - , style "-webkit-text-security" "disc" 455 - 456 - -- 457 - , Html.Events.onInput KeepPassphraseInMemory 458 - ] 459 - , UI.Kit.button 460 - UI.Kit.Filled 461 - Authentication.Bypass 462 - (text "Continue") 463 - , brick 464 - [ onClickStopPropagation withoutEncryption ] 465 - [ "cursor-pointer" 466 - , "flex" 467 - , "items-center" 468 - , "justify-center" 469 - , "leading-snug" 470 - , "mt-3" 471 - , "opacity-50" 472 - , "text-white" 473 - , "text-xs" 474 - ] 475 - [ inline [ "inline-block", "leading-none", "mr-2" ] [ Icons.warning 13 Inherit ] 476 - , text "Continue without encryption" 477 - ] 478 - ] 479 - 480 - 481 - 482 - -- INPUT SCREEN 483 - 484 - 485 - inputScreen : Question -> Html Authentication.Msg 486 - inputScreen question = 487 - slab 488 - Html.form 489 - [ onSubmit ConfirmInput ] 490 - [ "flex" 491 - , "flex-col" 492 - , "max-w-xs" 493 - , "px-3" 494 - , "w-screen" 495 - 496 - -- 497 - , "sm:px-0" 498 - ] 499 - [ UI.Kit.textFieldAlt 500 - [ attribute "autocapitalize" "off" 501 - , placeholder question.placeholder 502 - , Html.Events.onInput Input 503 - , value question.value 504 - ] 505 - , UI.Kit.button 506 - UI.Kit.Filled 507 - Authentication.Bypass 508 - (text "Continue") 509 - ] 510 - 511 - 512 - 513 - -- SPEECH BUBBLE 514 - 515 - 516 - speechBubble : Html msg -> Html msg 517 - speechBubble contents = 518 - chunk 519 - [ "absolute" 520 - , "antialiased" 521 - , "bg-background" 522 - , "border-b" 523 - , "border-transparent" 524 - , "font-semibold" 525 - , "italic" 526 - , "leading-snug" 527 - , "left-1/2" 528 - , "max-w-screen" 529 - , "-translate-x-1/2" 530 - , "px-4" 531 - , "py-1" 532 - , "rounded" 533 - , "text-center" 534 - , "text-sm" 535 - , "text-white" 536 - , "top-full" 537 - , "transform" 538 - , "whitespace-nowrap" 539 - 540 - -- Dark mode 541 - ------------ 542 - , "dark:bg-darkest-hour" 543 - , "dark:text-gray-600" 544 - ] 545 - [ chunk 546 - [ "mb-px", "pb-px", "pt-1" ] 547 - [ contents ] 548 - 549 - -- 550 - , brick 551 - speechBubbleArrowStyles 552 - [ "absolute" 553 - , "border-background" 554 - , "h-0" 555 - , "left-1/2" 556 - , "-translate-x-1/2" 557 - , "-translate-y-full" 558 - , "top-0" 559 - , "transform" 560 - , "w-0" 561 - 562 - -- Dark mode 563 - ------------ 564 - , "dark:border-darkest-hour" 565 - ] 566 - [] 567 - ] 568 - 569 - 570 - 571 - -- 🖼 572 - 573 - 574 - speechBubbleArrowStyles : List (Html.Attribute msg) 575 - speechBubbleArrowStyles = 576 - [ style "border-top-color" "transparent" 577 - , style "border-left-color" "transparent" 578 - , style "border-right-color" "transparent" 579 - , style "border-width" "0 6px 5px 6px" 580 - ]
-4
src/Applications/UI/Commands/Alfred.elm
··· 56 56 , title = "Import data (⚠️ will override current data)" 57 57 , value = Command UI.RequestImport 58 58 } 59 - , { icon = Just (Icons.save 16) 60 - , title = "Migrate user data to different storage" 61 - , value = Command UI.MigrateHypaethralUserData 62 - } 63 59 ] 64 60 65 61
+16
src/Applications/UI/Common/State.elm
··· 13 13 import UI.Notifications 14 14 import UI.Page as Page exposing (Page) 15 15 import UI.Playlists.Directory 16 + import UI.Syncing.Types as Syncing 16 17 import UI.Tracks.Scene.Covers 17 18 import UI.Tracks.Scene.List 18 19 import UI.Types as UI exposing (Manager, Msg) 20 + import User.Layer exposing (Method) 19 21 20 22 21 23 ··· 89 91 showNotificationWithModel : UI.Model -> Notification Msg -> ( UI.Model, Cmd UI.Msg ) 90 92 showNotificationWithModel model notification = 91 93 showNotification notification model 94 + 95 + 96 + showSyncingNotification : Method -> Manager 97 + showSyncingNotification method model = 98 + let 99 + notification = 100 + Notifications.stickyCasual "Syncing user data ..." 101 + 102 + syncing = 103 + Syncing.Syncing { method = method, notificationId = Notifications.id notification } 104 + in 105 + showNotification 106 + notification 107 + { model | syncing = syncing } 92 108 93 109 94 110 toggleLoadingScreen : Switch -> Manager
+98 -5
src/Applications/UI/Kit.elm
··· 6 6 import Html exposing (Html) 7 7 import Html.Attributes as A exposing (href, style) 8 8 import Html.Events exposing (onClick, onInput) 9 + import Icons exposing (Icon) 9 10 import Material.Icons.Round as Icons 10 11 import Material.Icons.Types exposing (Coloring(..)) 11 12 import Svg ··· 78 79 79 80 button : ButtonType -> msg -> Html msg -> Html msg 80 81 button = 81 - buttonWithColor Accent 82 + buttonWithColor Gray 82 83 83 84 84 85 buttonLink : String -> ButtonType -> Html msg -> Html msg ··· 161 162 case buttonColor of 162 163 Accent -> 163 164 [ "bg-transparent" 164 - , "border-base04" 165 - , "text-base04" 165 + , "border-accent-btn" 166 + , "text-accent-btn" 166 167 ] 167 168 168 169 Blank -> ··· 221 222 -- 🍱 ░░ OTHER 222 223 223 224 225 + askForInput : { question : String, info : List (Html msg) } -> Html msg 226 + askForInput { question, info } = 227 + Html.span 228 + [] 229 + [ chunk 230 + [ "font-semibold", "pt-1" ] 231 + [ Html.text question ] 232 + , case info of 233 + [] -> 234 + Html.text "" 235 + 236 + _ -> 237 + chunk 238 + [ "italic", "mt-2", "text-sm" ] 239 + info 240 + ] 241 + 242 + 224 243 canister : List (Html msg) -> Html msg 225 244 canister children = 226 245 chunk ··· 240 259 chunk 241 260 [ "flex" 242 261 , "flex-grow" 262 + , "items-stretch" 243 263 , "overflow-hidden" 244 264 , "relative" 245 265 ] ··· 272 292 ] 273 293 274 294 295 + focusScreen : { icon : Icon msg, iconHref : Maybe String, text : List (Html msg), textHref : Maybe String } -> List (Html msg) -> Html msg 296 + focusScreen { icon, iconHref, text, textHref } nodes = 297 + [ slab 298 + (case iconHref of 299 + Just _ -> 300 + Html.a 301 + 302 + Nothing -> 303 + Html.div 304 + ) 305 + (case iconHref of 306 + Just h -> 307 + [ href h ] 308 + 309 + Nothing -> 310 + [] 311 + ) 312 + [ "block" 313 + , "opacity-30" 314 + , "text-inherit" 315 + ] 316 + [ icon 64 Inherit ] 317 + , slab 318 + (case iconHref of 319 + Just _ -> 320 + Html.a 321 + 322 + Nothing -> 323 + Html.div 324 + ) 325 + (case textHref of 326 + Just h -> 327 + [ href h ] 328 + 329 + Nothing -> 330 + [] 331 + ) 332 + [ "block" 333 + , "leading-normal" 334 + , "mt-2" 335 + , "opacity-40" 336 + , "text-center" 337 + , "text-inherit" 338 + ] 339 + text 340 + , chunk 341 + [ "mt-4" ] 342 + nodes 343 + ] 344 + |> chunk 345 + [ "flex" 346 + , "flex-col" 347 + , "items-center" 348 + , "max-h-full" 349 + , "overflow-y-auto" 350 + , "py-8" 351 + , "w-full" 352 + ] 353 + |> List.singleton 354 + |> centeredContent 355 + 356 + 275 357 h1 : String -> Html msg 276 358 h1 text = 277 359 slab ··· 308 390 slab 309 391 Html.h2 310 392 [] 311 - [ "antialiased" 312 - , "font-bold" 393 + [ "font-bold" 313 394 , "font-display" 314 395 , "leading-tight" 315 396 , "mb-8" ··· 521 602 , "text-sm" 522 603 , "w-full" 523 604 605 + -- 606 + , "placeholder:text-base01" 607 + , "placeholder:text-opacity-40" 608 + 524 609 -- Dark mode 525 610 ------------ 526 611 , "dark:bg-darkest-hour" 527 612 , "dark:text-gray-600" 613 + 614 + -- 615 + , "dark:placeholder:text-gray-600" 616 + , "dark:placeholder:text-opacity-30" 528 617 ] 529 618 [] 530 619 ··· 571 660 -- 572 661 , "focus:border-black" 573 662 , "focus:outline-none" 663 + , "placeholder:text-base01" 664 + , "placeholder:text-opacity-40" 574 665 575 666 -- Dark mode 576 667 ------------ ··· 579 670 580 671 -- 581 672 , "dark:focus:border-base07" 673 + , "dark:placeholder:text-gray-600" 674 + , "dark:placeholder:text-opacity-30" 582 675 ] 583 676 [] 584 677
+2 -27
src/Applications/UI/Other/State.elm
··· 5 5 import Notifications 6 6 import Return exposing (return) 7 7 import Time 8 - import UI.Authentication.Types as Authentication 9 8 import UI.Common.State as Common 10 9 import UI.Ports as Ports 11 10 import UI.Types exposing (..) ··· 44 43 setIsOnline : Bool -> Manager 45 44 setIsOnline bool model = 46 45 if bool then 47 - -- We're caching the user's data in the browser while offline. 48 - -- If we're back online again, sync all the user's data. 49 - (case model.authentication of 50 - Authentication.Authenticated (Dropbox _) -> 51 - syncHypaethralData 52 - 53 - Authentication.Authenticated (RemoteStorage _) -> 54 - syncHypaethralData 55 - 56 - _ -> 57 - Return.singleton 58 - ) 59 - { model | isOnline = True } 46 + syncHypaethralData { model | isOnline = bool } 60 47 61 48 else 62 - -- The app went offline, cache everything 63 - -- (if caching is supported). 64 - ( { model | isOnline = False } 65 - , case model.authentication of 66 - Authentication.Authenticated (Dropbox _) -> 67 - Ports.toBrain (Alien.trigger Alien.SyncHypaethralData) 68 - 69 - Authentication.Authenticated (RemoteStorage _) -> 70 - Ports.toBrain (Alien.trigger Alien.SyncHypaethralData) 71 - 72 - _ -> 73 - Cmd.none 74 - ) 49 + Return.singleton { model | isOnline = bool } 75 50 76 51 77 52 setCurrentTime : Time.Posix -> Manager
+7 -3
src/Applications/UI/Page.elm
··· 96 96 ----------------------------------------- 97 97 -- Settings 98 98 ----------------------------------------- 99 - Settings Settings.ImportExport -> 100 - "settings/import-export" 99 + Settings Settings.Data -> 100 + "settings/data" 101 101 102 102 Settings Settings.Index -> 103 103 "settings" 104 + 105 + Settings Settings.Sync -> 106 + "settings/sync" 104 107 105 108 ----------------------------------------- 106 109 -- Sources ··· 196 199 ----------------------------------------- 197 200 -- Settings 198 201 ----------------------------------------- 202 + , map (Settings Settings.Data) (s "settings" </> s "data") 203 + , map (Settings Settings.Sync) (s "settings" </> s "sync") 199 204 , map (Settings Settings.Index) (s "settings") 200 - , map (Settings Settings.ImportExport) (s "settings" </> s "import-export") 201 205 202 206 ----------------------------------------- 203 207 -- Sources
+9 -7
src/Applications/UI/Ports.elm
··· 3 3 import Alien 4 4 import Json.Encode as Json 5 5 import Queue 6 - import Webnative 7 6 8 7 9 8 ··· 14 13 15 14 16 15 port adjustEqualizerSetting : { knob : String, value : Float } -> Cmd msg 16 + 17 + 18 + port authenticateWithFission : () -> Cmd msg 19 + 20 + 21 + port collectFissionCapabilities : () -> Cmd msg 17 22 18 23 19 24 port copyToClipboard : String -> Cmd msg ··· 49 54 port toBrain : Alien.Event -> Cmd msg 50 55 51 56 52 - port webnativeRequest : Webnative.Request -> Cmd msg 53 - 54 - 55 57 56 58 -- 📰 57 59 58 60 59 61 port activeQueueItemEnded : (() -> msg) -> Sub msg 62 + 63 + 64 + port collectedFissionCapabilities : (() -> msg) -> Sub msg 60 65 61 66 62 67 port downloadTracksFinished : (() -> msg) -> Sub msg ··· 135 140 136 141 137 142 port showStickyErrorNotification : (String -> msg) -> Sub msg 138 - 139 - 140 - port webnativeResponse : (Webnative.Response -> msg) -> Sub msg 141 143 142 144 143 145
+113 -180
src/Applications/UI/Settings.elm
··· 6 6 import Conditional exposing (ifThenElse) 7 7 import DateFormat as Date 8 8 import Html exposing (Html, text) 9 - import Html.Attributes exposing (..) 9 + import Html.Attributes as A exposing (..) 10 10 import Html.Events as E exposing (onClick) 11 11 import Html.Lazy 12 12 import LastFm ··· 14 14 import Material.Icons.Types exposing (Coloring(..)) 15 15 import Maybe.Extra as Maybe 16 16 import Time 17 - import UI.Authentication.Types as Authentication 18 17 import UI.Backdrop as Backdrop exposing (backgroundPositioning) 19 18 import UI.Kit 20 19 import UI.Navigation exposing (..) 21 20 import UI.Page as Page 22 - import UI.Settings.ImportExport 21 + import UI.Settings.Data 23 22 import UI.Settings.Page as Settings exposing (..) 23 + import UI.Settings.Sync 24 24 import UI.Sources.Types as Sources 25 25 import UI.Tracks.Types as Tracks 26 26 import UI.Types exposing (Msg(..)) ··· 32 32 33 33 34 34 type alias Dependencies = 35 - { authenticationMethod : Maybe User.Layer.Method 35 + { syncMethod : Maybe User.Layer.Method 36 36 , buildTimestamp : Int 37 37 , chosenBackgroundImage : Maybe String 38 38 , coverSelectionReducesPool : Bool ··· 50 50 view : Settings.Page -> Dependencies -> Html Msg 51 51 view page deps = 52 52 case page of 53 - ImportExport -> 54 - UI.Settings.ImportExport.view deps.authenticationMethod 53 + Data -> 54 + UI.Settings.Data.view deps.syncMethod 55 55 56 56 Index -> 57 57 UI.Kit.receptacle { scrolling = True } (index deps) 58 + 59 + Sync -> 60 + UI.Settings.Sync.view deps.syncMethod 58 61 59 62 60 63 ··· 67 70 -- Navigation 68 71 ----------------------------------------- 69 72 UI.Navigation.local 70 - [ ( Icon Icons.import_export 71 - , Label "Import & Export" Shown 72 - , NavigateToPage (Page.Settings ImportExport) 73 + [ ( Icon Icons.account_circle 74 + , Label "Data & Sync" Shown 75 + , NavigateToPage (Page.Settings Sync) 73 76 ) 74 77 , ( Icon Icons.help_outline 75 78 , Label "Help" Shown 76 - , OpenLinkInNewPage "about/#UI" 77 - ) 78 - , ( Icon Icons.exit_to_app 79 - , Label "Sign out" Shown 80 - , PerformMsg (AuthenticationMsg Authentication.SignOut) 79 + , OpenLinkInNewPage "about/" 81 80 ) 82 81 ] 83 82 ··· 100 99 UI.Kit.h1 "Settings" 101 100 102 101 ----------------------------------------- 103 - -- Intro 102 + -- Version 104 103 ----------------------------------------- 105 - , [ text "Changes are saved automatically." 106 - , lineBreak 107 - , text "You're storing the data for this application " 108 - , case deps.authenticationMethod of 109 - Just (Dropbox _) -> 110 - text "on Dropbox." 104 + , chunk 105 + [ "mt-6" ] 106 + [ chunk 107 + [ "flex" 108 + , "flex-col" 109 + , "items-center" 110 + , "justify-center" 111 + , "text-base05" 112 + , "text-xs" 111 113 112 - Just (Fission _) -> 113 - text "on Fission." 114 + -- Dark mode 115 + ------------ 116 + , "dark:text-base03" 117 + ] 118 + [ slab 119 + Html.img 120 + [ A.src "images/diffuse-dark.svg" 121 + , A.width 160 122 + ] 123 + [ "dark:hidden" ] 124 + [] 114 125 115 - Just (Ipfs _) -> 116 - text "on IPFS." 126 + -- 127 + , slab 128 + Html.img 129 + [ A.src "images/diffuse-light.svg" 130 + , A.width 160 131 + ] 132 + [ "hidden dark:block" ] 133 + [] 117 134 118 - Just Local -> 119 - text "in this browser." 135 + -- 136 + , chunk 137 + [ "italic", "mt-3", "text-center" ] 138 + [ text "Version " 139 + , text deps.version 140 + , lineBreak 141 + , text "Built on " 142 + , deps.buildTimestamp 143 + |> (*) 1000 144 + |> Time.millisToPosix 145 + |> Date.format 146 + [ Date.monthNameAbbreviated 147 + , Date.text " " 148 + , Date.dayOfMonthSuffix 149 + , Date.text " " 150 + , Date.yearNumber 151 + , Date.text ", " 152 + , Date.hourMilitaryFixed 153 + , Date.text ":" 154 + , Date.minuteFixed 155 + , Date.text ":" 156 + , Date.secondFixed 157 + ] 158 + deps.currentTimeZone 159 + |> text 120 160 121 - Just (RemoteStorage _) -> 122 - text "on a RemoteStorage server." 161 + -- 162 + , chunk 163 + [ "not-italic", "mt-3" ] 164 + [ case deps.serviceWorkerStatus of 165 + InstallingInitial -> 166 + inline 167 + [ "inline-flex", "items-center" ] 168 + [ text "Setting up service worker" 169 + , inline [ "ml-1" ] [ Icons.downloading 12 Inherit ] 170 + ] 123 171 124 - Nothing -> 125 - text "on nothing, wtf?" 172 + InstallingNew -> 173 + inline 174 + [ "inline-flex", "items-center" ] 175 + [ text "Installing new version" 176 + , inline [ "ml-1" ] [ Icons.downloading 12 Inherit ] 177 + ] 126 178 127 - -- Change passphrase (if applicable) 128 - , case deps.authenticationMethod of 129 - Just (Dropbox d) -> 130 - changePassphrase (Dropbox d) 179 + WaitingForActivation -> 180 + inline 181 + [] 182 + [ text "Update available" 183 + , brick 184 + [ Maybe.unwrap 185 + (class "bg-white-20") 186 + (style "background-color" << Color.toCssString) 187 + deps.extractedBackdropColor 131 188 132 - Just (Fission _) -> 133 - nothing 189 + -- 190 + , E.onClick ReloadApp 191 + ] 192 + [ "bg-base06" 193 + , "cursor-pointer" 194 + , "inline-block" 195 + , "leading-none" 196 + , "ml-1" 197 + , "p-1" 198 + , "rounded" 199 + , "text-white" 134 200 135 - Just (Ipfs i) -> 136 - changePassphrase (Ipfs i) 201 + -- Dark mode 202 + ------------ 203 + , "dark:bg-base01" 204 + ] 205 + [ text "Reload app" ] 206 + ] 137 207 138 - Just Local -> 139 - changePassphrase Local 140 - 141 - Just (RemoteStorage r) -> 142 - changePassphrase (RemoteStorage r) 143 - 144 - Nothing -> 145 - nothing 146 - ] 147 - |> raw 148 - |> UI.Kit.intro 149 - 150 - ----------------------------------------- 151 - -- Version 152 - ----------------------------------------- 153 - , let 154 - tag children = 155 - chunk 156 - [ "bg-base06" 157 - , "inline-block" 158 - , "leading-none" 159 - , "mb-1" 160 - , "ml-1" 161 - , "mr-3" 162 - , "p-1" 163 - , "rounded" 164 - , "text-white" 165 - 166 - -- Dark mode 167 - ------------ 168 - , "dark:bg-base01" 169 - , "dark:text-base05" 170 - ] 171 - [ chunk 172 - [ "inline-block" 173 - , "pt-px" 208 + Activated -> 209 + nothing 174 210 ] 175 - children 176 211 ] 177 - in 178 - chunk 179 - [ "text-base05" 180 - , "text-xs" 181 - 182 - -- Dark mode 183 - ------------ 184 - , "dark:text-base03" 185 - ] 186 - [ text "Version" 187 - , tag [ text deps.version ] 188 - , text "Built on" 189 - , deps.buildTimestamp 190 - |> (*) 1000 191 - |> Time.millisToPosix 192 - |> Date.format 193 - [ Date.monthNameAbbreviated 194 - , Date.text " " 195 - , Date.dayOfMonthSuffix 196 - , Date.text " " 197 - , Date.yearNumber 198 - , Date.text ", " 199 - , Date.hourMilitaryFixed 200 - , Date.text ":" 201 - , Date.minuteFixed 202 - , Date.text ":" 203 - , Date.secondFixed 204 - ] 205 - deps.currentTimeZone 206 - |> text 207 - |> List.singleton 208 - |> tag 209 - 210 - -- 211 - , case deps.serviceWorkerStatus of 212 - InstallingInitial -> 213 - inline 214 - [ "inline-flex", "items-center" ] 215 - [ text "Setting up service worker" 216 - , inline [ "ml-1" ] [ Icons.downloading 12 Inherit ] 217 - ] 218 - 219 - InstallingNew -> 220 - inline 221 - [ "inline-flex", "items-center" ] 222 - [ text "Installing new version" 223 - , inline [ "ml-1" ] [ Icons.downloading 12 Inherit ] 224 - ] 225 - 226 - WaitingForActivation -> 227 - inline 228 - [] 229 - [ text "Update available" 230 - , brick 231 - [ Maybe.unwrap 232 - (class "bg-white-20") 233 - (style "background-color" << Color.toCssString) 234 - deps.extractedBackdropColor 235 - 236 - -- 237 - , E.onClick ReloadApp 238 - ] 239 - [ "bg-base06" 240 - , "cursor-pointer" 241 - , "inline-block" 242 - , "leading-none" 243 - , "ml-1" 244 - , "mr-3" 245 - , "p-1" 246 - , "rounded" 247 - , "text-white" 248 - 249 - -- Dark mode 250 - ------------ 251 - , "dark:bg-base01" 252 - , "dark:text-base05" 253 - ] 254 - [ text "Reload app" ] 255 - ] 256 - 257 - Activated -> 258 - nothing 212 + ] 259 213 ] 260 214 261 215 ----------------------------------------- 262 216 -- Background 263 217 ----------------------------------------- 264 218 , chunk 265 - [ "mt-8" ] 219 + [ "mt-6" ] 266 220 [ label "Background Image" 267 221 , Html.Lazy.lazy backgroundImage deps.chosenBackgroundImage 268 222 ] ··· 365 319 chunk 366 320 [ "mb-3", "mt-6", "pb-px" ] 367 321 [ UI.Kit.label [] l ] 368 - 369 - 370 - 371 - -- AUTHENTICATION 372 - 373 - 374 - changePassphrase : User.Layer.Method -> Html Msg 375 - changePassphrase method = 376 - inline 377 - [] 378 - [ lineBreak 379 - , text "If you want to, you can " 380 - , UI.Kit.textButton 381 - { label = "change your passphrase" 382 - , onClick = 383 - method 384 - |> Authentication.ShowUpdateEncryptionKeyScreen 385 - |> AuthenticationMsg 386 - } 387 - , text "." 388 - ] 389 322 390 323 391 324
+20
src/Applications/UI/Settings/Common.elm
··· 1 + module UI.Settings.Common exposing (..) 2 + 3 + import Material.Icons.Round as Icons 4 + import UI.Navigation exposing (..) 5 + import UI.Syncing.Types as Syncing 6 + import UI.Types 7 + 8 + 9 + 10 + -- SYNCING 11 + 12 + 13 + changePassphrase method = 14 + ( Icon Icons.lock 15 + , Label "Change Passphrase" Shown 16 + , method 17 + |> Syncing.ShowUpdateEncryptionKeyScreen 18 + |> UI.Types.SyncingMsg 19 + |> PerformMsg 20 + )
+93
src/Applications/UI/Settings/Data.elm
··· 1 + module UI.Settings.Data exposing (view) 2 + 3 + import Chunky exposing (..) 4 + import Html exposing (Html, text) 5 + import Html.Attributes exposing (href) 6 + import Material.Icons.Round as Icons 7 + import Material.Icons.Types exposing (Coloring(..)) 8 + import UI.Kit exposing (ButtonColor(..), ButtonType(..)) 9 + import UI.Navigation exposing (..) 10 + import UI.Page as Page 11 + import UI.Settings.Common exposing (changePassphrase) 12 + import UI.Settings.Page exposing (Page(..)) 13 + import UI.Types exposing (Msg(..)) 14 + import User.Layer exposing (Method(..)) 15 + 16 + 17 + 18 + -- 🗺 19 + 20 + 21 + view : Maybe Method -> Html Msg 22 + view activeMethod = 23 + UI.Kit.receptacle 24 + { scrolling = True } 25 + [ ----------------------------------------- 26 + -- Navigation 27 + ----------------------------------------- 28 + (case activeMethod of 29 + Just (Dropbox d) -> 30 + [ changePassphrase (Dropbox d) ] 31 + 32 + Just (Fission _) -> 33 + [] 34 + 35 + Just (Ipfs i) -> 36 + [ changePassphrase (Ipfs i) ] 37 + 38 + Just (RemoteStorage r) -> 39 + [ changePassphrase (RemoteStorage r) ] 40 + 41 + Nothing -> 42 + [] 43 + ) 44 + |> List.append 45 + [ ( Icon Icons.arrow_back 46 + , Label "Settings" Hidden 47 + , NavigateToPage (Page.Settings Index) 48 + ) 49 + , ( Icon Icons.account_circle 50 + , Label "Storage Service" Shown 51 + , NavigateToPage (Page.Settings Sync) 52 + ) 53 + ] 54 + |> UI.Navigation.local 55 + 56 + ----------------------------------------- 57 + -- Content 58 + ----------------------------------------- 59 + , chunk 60 + [ "relative" ] 61 + [ chunk 62 + [ "absolute", "left-0", "top-0" ] 63 + [ UI.Kit.canister [ UI.Kit.h1 "Data Backup" ] ] 64 + ] 65 + 66 + -- 67 + , UI.Kit.focusScreen 68 + { icon = Icons.archive 69 + , iconHref = Nothing 70 + , text = 71 + "You can download a snapshot of your user data, or recover an account by uploading a snapshot." 72 + |> text 73 + |> List.singleton 74 + |> chunk [ "max-w-sm" ] 75 + |> List.singleton 76 + , textHref = Nothing 77 + } 78 + [ chunk 79 + [ "flex", "space-x-2.5" ] 80 + [ UI.Kit.button 81 + Normal 82 + RequestImport 83 + (text "Import snapshot") 84 + 85 + -- 86 + , UI.Kit.buttonWithColor 87 + Accent 88 + Filled 89 + Export 90 + (text "Download snapshot") 91 + ] 92 + ] 93 + ]
-116
src/Applications/UI/Settings/ImportExport.elm
··· 1 - module UI.Settings.ImportExport exposing (view) 2 - 3 - import Chunky exposing (..) 4 - import Html exposing (Html, text) 5 - import Material.Icons.Round as Icons 6 - import UI.Kit exposing (ButtonType(..)) 7 - import UI.Navigation exposing (..) 8 - import UI.Page 9 - import UI.Settings.Page 10 - import UI.Types exposing (Msg(..)) 11 - import User.Layer exposing (Method(..)) 12 - 13 - 14 - 15 - -- 🗺 16 - 17 - 18 - view : Maybe Method -> Html Msg 19 - view userLayerMethod = 20 - UI.Kit.receptacle 21 - { scrolling = True } 22 - [ ----------------------------------------- 23 - -- Navigation 24 - ----------------------------------------- 25 - UI.Navigation.local 26 - [ ( Icon Icons.arrow_back 27 - , Label "Settings" Hidden 28 - , NavigateToPage (UI.Page.Settings UI.Settings.Page.Index) 29 - ) 30 - ] 31 - 32 - ----------------------------------------- 33 - -- Content 34 - ----------------------------------------- 35 - , UI.Kit.canister 36 - [ UI.Kit.h1 "Import & Export" 37 - 38 - -- Intro 39 - -------- 40 - , [ UI.Kit.inlineIcon Icons.warning 41 - , inline 42 - [ "font-semibold" ] 43 - [ text "All your data will be replaced when you import something." ] 44 - ] 45 - |> raw 46 - |> UI.Kit.intro 47 - 48 - -- 49 - , chunk 50 - [ "sm:flex", "sm:neg-mt-6" ] 51 - [ -- Import 52 - --------- 53 - chunk 54 - [ "flex-auto", "pr-2" ] 55 - [ chunk [ "mb-2", "mt-8" ] [ UI.Kit.label [] "Import" ] 56 - , UI.Kit.buttonWithColor 57 - UI.Kit.Gray 58 - Normal 59 - RequestImport 60 - (text "Choose file") 61 - 62 - -- 63 - , case userLayerMethod of 64 - Just Local -> 65 - otherImportOptions 66 - 67 - Just (RemoteStorage _) -> 68 - otherImportOptions 69 - 70 - _ -> 71 - nothing 72 - ] 73 - 74 - -- Export 75 - --------- 76 - , chunk 77 - [ "flex-auto", "pl-2" ] 78 - [ chunk [ "mb-2", "mt-8" ] [ UI.Kit.label [] "Export" ] 79 - , UI.Kit.button 80 - Normal 81 - Export 82 - (text "Export data") 83 - 84 - -- 85 - , chunk 86 - [ "italic", "leading-normal", "mt-5", "text-xs" ] 87 - [ text "Other options:" ] 88 - , chunk 89 - [ "leading-normal", "mt-2", "text-sm" ] 90 - [ inline [ "mr-2" ] [ text "•" ] 91 - , UI.Kit.textButton 92 - { label = "Migrate to another storage" 93 - , onClick = MigrateHypaethralUserData 94 - } 95 - ] 96 - ] 97 - ] 98 - ] 99 - ] 100 - 101 - 102 - otherImportOptions : Html Msg 103 - otherImportOptions = 104 - raw 105 - [ chunk 106 - [ "italic", "leading-normal", "mt-5", "text-xs" ] 107 - [ text "Other options:" ] 108 - , chunk 109 - [ "leading-normal", "mt-2", "text-sm" ] 110 - [ inline [ "mr-2" ] [ text "•" ] 111 - , UI.Kit.textButton 112 - { label = "Import Diffuse V1 data" 113 - , onClick = ImportLegacyData 114 - } 115 - ] 116 - ]
+2 -1
src/Applications/UI/Settings/Page.elm
··· 4 4 5 5 6 6 type Page 7 - = ImportExport 7 + = Data 8 8 | Index 9 + | Sync
+209
src/Applications/UI/Settings/Sync.elm
··· 1 + module UI.Settings.Sync exposing (view) 2 + 3 + import Chunky exposing (..) 4 + import Html exposing (Html, text) 5 + import Html.Attributes exposing (href) 6 + import Material.Icons.Outlined as OutlinedIcons 7 + import Material.Icons.Round as Icons 8 + import Material.Icons.Types exposing (Coloring(..)) 9 + import Maybe.Extra as Maybe 10 + import Svg 11 + import UI.Kit exposing (ButtonColor(..), ButtonType(..)) 12 + import UI.List 13 + import UI.Navigation exposing (..) 14 + import UI.Page as Page 15 + import UI.Settings.Common exposing (changePassphrase) 16 + import UI.Settings.Page exposing (Page(..)) 17 + import UI.Svg.Elements 18 + import UI.Syncing.Common exposing (startDropbox, startFission, startIpfs, startRemoteStorage) 19 + import UI.Syncing.Types as Syncing 20 + import UI.Types exposing (Msg(..)) 21 + import User.Layer exposing (Method(..), dropboxMethod, fissionMethod, ipfsMethod, methodName, remoteStorageMethod) 22 + 23 + 24 + 25 + -- 🗺 26 + 27 + 28 + view : Maybe Method -> Html Msg 29 + view activeMethod = 30 + UI.Kit.receptacle 31 + { scrolling = True } 32 + [ ----------------------------------------- 33 + -- Navigation 34 + ----------------------------------------- 35 + (case activeMethod of 36 + Just (Dropbox d) -> 37 + [ changePassphrase (Dropbox d) ] 38 + 39 + Just (Fission _) -> 40 + [] 41 + 42 + Just (Ipfs i) -> 43 + [ changePassphrase (Ipfs i) ] 44 + 45 + Just (RemoteStorage r) -> 46 + [ changePassphrase (RemoteStorage r) ] 47 + 48 + Nothing -> 49 + [] 50 + ) 51 + |> List.append 52 + [ ( Icon Icons.arrow_back 53 + , Label "Settings" Hidden 54 + , NavigateToPage (Page.Settings Index) 55 + ) 56 + , ( Icon Icons.archive 57 + , Label "Data Backup" Shown 58 + , NavigateToPage (Page.Settings Data) 59 + ) 60 + ] 61 + |> UI.Navigation.local 62 + 63 + ----------------------------------------- 64 + -- Content 65 + ----------------------------------------- 66 + , chunk 67 + [ "relative" ] 68 + [ chunk 69 + [ "absolute", "left-0", "top-0" ] 70 + [ UI.Kit.canister [ UI.Kit.h1 "Storage Service" ] ] 71 + ] 72 + 73 + -- 74 + , UI.Kit.focusScreen 75 + { icon = Icons.account_circle 76 + , iconHref = Nothing 77 + , text = 78 + "By default, your playlists, favourites and other data are stored locally on your device. To ensure it is backed up, and to keep it in sync across all your connected devices, choose one of the following storage services. You can switch services at any point." 79 + |> text 80 + |> List.singleton 81 + |> chunk [ "max-w-md" ] 82 + |> List.singleton 83 + , textHref = Nothing 84 + } 85 + [ [ fissionMethod 86 + , dropboxMethod 87 + , remoteStorageMethod 88 + , ipfsMethod 89 + ] 90 + |> List.map (methodView activeMethod) 91 + |> UI.List.view UI.List.Normal 92 + |> List.singleton 93 + |> chunk [ "max-w-full", "w-96" ] 94 + ] 95 + ] 96 + 97 + 98 + methodInfoAction : Bool -> Maybe Method -> Method -> UI.List.Action Msg 99 + methodInfoAction isSelected activeMethod method = 100 + { icon = 101 + \a b -> 102 + inline 103 + [ opacity isSelected activeMethod ] 104 + [ Icons.help a b ] 105 + , msg = 106 + case method of 107 + Dropbox _ -> 108 + Just (\_ -> OpenUrlOnNewPage "https://dropbox.com") 109 + 110 + Fission _ -> 111 + Just (\_ -> OpenUrlOnNewPage "https://webnative.dev") 112 + 113 + RemoteStorage _ -> 114 + Just (\_ -> OpenUrlOnNewPage "https://remotestorage.io") 115 + 116 + Ipfs _ -> 117 + Just (\_ -> OpenUrlOnNewPage "https://ipfs.io") 118 + , title = 119 + "Learn more about " ++ methodName method 120 + } 121 + 122 + 123 + methodView activeMethod method = 124 + let 125 + isSelected = 126 + case ( activeMethod, method ) of 127 + ( Just (Dropbox _), Dropbox _ ) -> 128 + True 129 + 130 + ( Just (Fission _), Fission _ ) -> 131 + True 132 + 133 + ( Just (RemoteStorage _), RemoteStorage _ ) -> 134 + True 135 + 136 + ( Just (Ipfs _), Ipfs _ ) -> 137 + True 138 + 139 + _ -> 140 + False 141 + 142 + label = 143 + methodLabel activeMethod method isSelected 144 + in 145 + { label = 146 + case method of 147 + Dropbox _ -> 148 + label UI.Svg.Elements.dropboxLogo 149 + 150 + Fission _ -> 151 + label UI.Svg.Elements.webnativeLogo 152 + 153 + RemoteStorage _ -> 154 + label UI.Svg.Elements.remoteStorageLogo 155 + 156 + Ipfs _ -> 157 + label UI.Svg.Elements.ipfsLogo 158 + , actions = 159 + [ if isSelected then 160 + { icon = Icons.cancel 161 + , msg = Just (\_ -> SyncingMsg Syncing.StopSync) 162 + , title = "Stop syncing with " ++ methodName method 163 + } 164 + 165 + else 166 + methodInfoAction isSelected activeMethod method 167 + ] 168 + , msg = 169 + if isSelected then 170 + Just (SyncingMsg Syncing.StopSync) 171 + 172 + else if Maybe.isJust activeMethod then 173 + Nothing 174 + 175 + else 176 + case method of 177 + Dropbox _ -> 178 + Just startDropbox 179 + 180 + Fission _ -> 181 + Just startFission 182 + 183 + RemoteStorage _ -> 184 + Just startRemoteStorage 185 + 186 + Ipfs _ -> 187 + Just startIpfs 188 + , isSelected = 189 + isSelected 190 + } 191 + 192 + 193 + methodLabel activeMethod method isSelected icon = 194 + inline 195 + [ "flex", "items-center", opacity isSelected activeMethod ] 196 + [ inline [ "inline-block", "mr-3" ] [ Html.map never (icon 15) ] 197 + , Html.text (methodName method) 198 + ] 199 + 200 + 201 + opacity isSelected activeMethod = 202 + if isSelected then 203 + "opacity-100" 204 + 205 + else if Maybe.isJust activeMethod then 206 + "opacity-50" 207 + 208 + else 209 + "opacity-100"
+30 -30
src/Applications/UI/Svg/Elements.elm
··· 1 - module UI.Svg.Elements exposing (dropboxLogo, fissionLogo, ipfsLogo, loading, loadingWithSize, remoteStorageLogo) 1 + module UI.Svg.Elements exposing (dropboxLogo, ipfsLogo, loading, loadingWithSize, remoteStorageLogo, webnativeLogo) 2 2 3 3 import Svg exposing (..) 4 4 import Svg.Attributes exposing (..) ··· 8 8 -- LOGOS 9 9 10 10 11 - fissionLogo : Svg Never 12 - fissionLogo = 13 - svg 14 - [ height "16" 15 - , viewBox "0 0 78 75" 16 - , width "15" 17 - ] 18 - [ Svg.path 19 - [ d "m63.5742168 100.955694c1.5771036-3.0862122 4.7865419-5.1990337 8.4892831-5.1990337 5.262292 0 9.5282225 4.2674257 9.5282225 9.5315617s-4.2659305 9.531562-9.5282225 9.531562c-3.7027412 0-6.9121795-2.112822-8.4892831-5.199034h-8.8347577c-8.1326331 0-14.7254348-6.595112-14.7254348-14.7305953 0-8.1354832 6.5928017-14.7305954 14.7254348-14.7305954h20.7582159l-3.5055762-5.1990337h-17.2526397c-8.1326331 0-14.7254348-6.5951122-14.7254348-14.7305954 0-8.1354831 6.5928017-14.7305953 14.7254348-14.7305953 4.7155931 0 8.662299 1.8213797 11.5238372 5.5612233.1866331.2439174.903725 1.2845631 2.5931092 3.7540648l7.7408874 11.4808465h26.6494811c3.348731 0 6.063414-2.7156344 6.063414-6.0655393 0-3.3499048-2.714683-6.0655392-6.063414-6.0655392h-8.8347582c-1.5771036 3.0862121-4.7865418 5.1990336-8.4892831 5.1990336-5.262292 0-9.5282225-4.2674255-9.5282225-9.5315617s4.2659305-9.5315617 9.5282225-9.5315617c3.7027413 0 6.9121795 2.1128215 8.4892831 5.1990337h8.8347582c8.132633 0 14.725434 6.5951122 14.725434 14.7305953 0 8.1354832-6.592801 14.7305954-14.725434 14.7305954h-20.8071225l3.5054152 5.1990337h17.3017073c8.132633 0 14.725434 6.5951122 14.725434 14.7305954 0 8.1354833-6.592801 14.7305953-14.725434 14.7305953-4.5017474 0-8.6780769-2.039045-11.619773-5.691322l-2.14253-3.026397-8.1441689-12.0784156h-26.600843c-3.3487313 0-6.0634143 2.7156345-6.0634143 6.0655393s2.714683 6.0655393 6.0634143 6.0655393zm33.0344752-4.9804486 1.9194061 2.7245712c1.1480037 1.4198784 2.8602789 2.2558774 4.7186759 2.2558774 3.348731 0 6.063414-2.7156345 6.063414-6.0655393s-2.714683-6.0655393-6.063414-6.0655393h-11.4593486zm-34.9169674-36.2909507c-1.3624245-1.9914187-2.2731584-3.3130783-2.3068102-3.3570589-1.1682567-1.5268352-2.5464113-2.1628448-4.6454553-2.1628448-3.3487313 0-6.0634143 2.7156344-6.0634143 6.0655392 0 3.3499049 2.714683 6.0655393 6.0634143 6.0655393h11.4100126z" 20 - , fill "currentColor" 21 - , transform "translate(-40, -40)" 22 - ] 23 - [] 24 - ] 25 - 26 - 27 - ipfsLogo : Svg Never 28 - ipfsLogo = 11 + ipfsLogo : Int -> Svg Never 12 + ipfsLogo size = 29 13 svg 30 - [ height "16" 14 + [ height (String.fromInt size) 31 15 , viewBox "0 0 511.99999 511.99998" 32 - , width "16" 16 + , width (String.fromInt size) 33 17 ] 34 18 [ -- Group 1 35 19 ---------- ··· 67 51 ] 68 52 69 53 70 - dropboxLogo : Svg Never 71 - dropboxLogo = 54 + dropboxLogo : Int -> Svg Never 55 + dropboxLogo size = 72 56 svg 73 - [ height "16" 57 + [ height (String.fromInt size) 74 58 , viewBox "0 0 43 40" 75 - , width "16" 59 + , width (String.fromInt size) 76 60 ] 77 61 [ Svg.path 78 62 [ d "m12.5 0l-12.5 8.1 8.7 7 12.5-7.8-8.7-7.3zm-12.5 21.9l12.5 8.2 8.7-7.3-12.5-7.7-8.7 6.8zm21.2 0.9l8.8 7.3 12.4-8.1-8.6-6.9-12.6 7.7zm21.2-14.7l-12.4-8.1-8.8 7.3 12.6 7.8 8.6-7zm-21.1 16.3l-8.8 7.3-3.7-2.5v2.8l12.5 7.5 12.5-7.5v-2.8l-3.8 2.5-8.7-7.3z" ··· 84 68 ] 85 69 86 70 87 - remoteStorageLogo : Svg Never 88 - remoteStorageLogo = 71 + remoteStorageLogo : Int -> Svg Never 72 + remoteStorageLogo size = 89 73 svg 90 74 [ clipRule "evenodd" 91 75 , fillRule "evenodd" 92 - , height "16" 76 + , height (String.fromInt size) 93 77 , imageRendering "optimizeQuality" 94 78 , shapeRendering "geometricPrecision" 95 79 , textRendering "geometricPrecision" 96 80 , viewBox "0 0 739 853" 97 - , width "16" 81 + , width (String.fromInt size) 98 82 ] 99 83 [ polygon 100 84 [ points "370,754 0,542 0,640 185,747 370,853 554,747 739,640 739,525 739,525 739,476 739,427 739,378 653,427 370,589 86,427 86,427 86,361 185,418 370,524 554,418 653,361 739,311 739,213 739,213 554,107 370,0 185,107 58,180 144,230 228,181 370,100 511,181 652,263 370,425 87,263 87,263 0,213 0,213 0,311 0,378 0,427 0,476 86,525 185,582 370,689 554,582 653,525 653,590 653,592" 85 + , fill "currentColor" 86 + ] 87 + [] 88 + ] 101 89 102 - -- 90 + 91 + webnativeLogo : Int -> Svg Never 92 + webnativeLogo size = 93 + svg 94 + [ fill "none" 95 + , height (String.fromInt size) 96 + , viewBox "0 0 250 250" 97 + , width (String.fromInt size) 98 + ] 99 + [ Svg.path 100 + [ fillRule "evenodd" 101 + , clipRule "evenodd" 102 + , d "M33.3333 0C10.1347 0 0 9.99249 0 33.3333V216.667C0 239.091 10.4172 250 33.3333 250H216.667C239.765 250 250 239.51 250 216.667V125V33.3333C250 10.3955 239.574 0 216.667 0H33.3333ZM57.3911 164.984L68.5617 51.2427C69.5933 40.7383 61.393 31.631 50.9031 31.631C38.1496 31.631 28.537 45.3231 32.0648 58.3591C36.7876 75.8111 41.3556 98.9561 41.6476 123.919C41.8176 138.455 40.3539 152.52 38.1506 165.262C35.9358 178.071 39.4107 191.433 46.7165 201.576C54.005 211.695 64.908 218.369 77.4832 218.369H83.9689C99.8795 218.369 112.778 205.39 112.778 189.38V177.288C112.778 170.016 107.529 163.82 100.393 162.669L91.5656 161.246C87.9339 160.66 84.5681 163.29 84.2316 166.975L84.1788 167.554C83.5427 174.522 77.7345 179.854 70.7805 179.854C62.8267 179.854 56.6089 172.949 57.3911 164.984ZM112.778 128.877V81.8168C112.778 75.371 117.97 70.1457 124.376 70.1457C130.782 70.1457 135.975 75.371 135.975 81.8168V183.356C135.975 202.693 151.553 218.369 170.77 218.369H172.247C197.218 218.369 215.844 191.62 211.259 165.803C208.974 152.93 207.384 138.689 207.384 123.965C207.384 98.3245 212.206 74.6027 217.157 56.9885C220.619 44.6718 211.535 31.631 199.501 31.631C189.81 31.631 182.175 39.9419 182.936 49.6632L191.972 165.139C192.593 173.072 186.363 179.854 178.454 179.854C171.446 179.854 165.592 174.48 164.951 167.458L155.103 59.5792C153.657 43.7467 140.46 31.631 124.66 31.631C108.793 31.631 95.5628 43.8469 94.202 59.755L87.6689 127.792C87.0977 134.468 91.798 140.436 98.3885 141.401C105.976 142.513 112.778 136.592 112.778 128.877Z" 103 103 , fill "currentColor" 104 104 ] 105 105 []
+76
src/Applications/UI/Syncing/Common.elm
··· 1 + module UI.Syncing.Common exposing (..) 2 + 3 + import Chunky exposing (..) 4 + import Html 5 + import Svg 6 + import UI.Kit 7 + import UI.Svg.Elements 8 + import UI.Syncing.Types exposing (..) 9 + import UI.Types exposing (Msg(..)) 10 + import User.Layer exposing (Method, dropboxMethod, fissionMethod, remoteStorageMethod) 11 + 12 + 13 + 14 + -- 🚀 15 + 16 + 17 + startDropbox : Msg 18 + startDropbox = 19 + SyncingMsg (TriggerExternalAuth dropboxMethod "") 20 + 21 + 22 + startFission : Msg 23 + startFission = 24 + SyncingMsg (TriggerExternalAuth fissionMethod "") 25 + 26 + 27 + startIpfs : Msg 28 + startIpfs = 29 + SyncingMsg PingIpfs 30 + 31 + 32 + startRemoteStorage : Msg 33 + startRemoteStorage = 34 + { icon = \size _ -> Svg.map never (UI.Svg.Elements.remoteStorageLogo size) 35 + , placeholder = "example@5apps.com" 36 + , question = 37 + UI.Kit.askForInput 38 + { question = 39 + "What's your user address?" 40 + , info = 41 + [ Html.text "The format is " 42 + , inline 43 + [] 44 + [ Html.text "username@server.domain" ] 45 + ] 46 + } 47 + , value = "" 48 + } 49 + |> AskForInput remoteStorageMethod 50 + |> SyncingMsg 51 + 52 + 53 + 54 + -- 🛠 55 + 56 + 57 + extractMethod : State -> Maybe Method 58 + extractMethod state = 59 + case state of 60 + Synced method -> 61 + Just method 62 + 63 + Syncing { method } -> 64 + Just method 65 + 66 + InputScreen method _ -> 67 + Just method 68 + 69 + NewEncryptionKeyScreen method _ -> 70 + Just method 71 + 72 + UpdateEncryptionKeyScreen method _ -> 73 + Just method 74 + 75 + NotSynced -> 76 + Nothing
+43
src/Applications/UI/Syncing/ContextMenu.elm
··· 1 + module UI.Syncing.ContextMenu exposing (syncDataMenu) 2 + 3 + import ContextMenu exposing (..) 4 + import Coordinates exposing (Coordinates) 5 + import Svg 6 + import UI.Svg.Elements 7 + import UI.Syncing.Common exposing (startDropbox, startFission, startIpfs, startRemoteStorage) 8 + import UI.Types exposing (Msg(..)) 9 + import User.Layer exposing (dropboxMethod, fissionMethod, ipfsMethod, methodName, remoteStorageMethod) 10 + 11 + 12 + 13 + -- 🔱 14 + 15 + 16 + syncDataMenu : Coordinates -> ContextMenu Msg 17 + syncDataMenu = 18 + ContextMenu 19 + [ Item 20 + { icon = \_ _ -> Svg.map never (UI.Svg.Elements.webnativeLogo 16) 21 + , label = methodName fissionMethod 22 + , msg = startFission 23 + , active = False 24 + } 25 + , Item 26 + { icon = \_ _ -> Svg.map never (UI.Svg.Elements.dropboxLogo 16) 27 + , label = methodName dropboxMethod 28 + , msg = startDropbox 29 + , active = False 30 + } 31 + , Item 32 + { icon = \_ _ -> Svg.map never (UI.Svg.Elements.remoteStorageLogo 16) 33 + , label = methodName remoteStorageMethod 34 + , msg = startRemoteStorage 35 + , active = False 36 + } 37 + , Item 38 + { icon = \_ _ -> Svg.map never (UI.Svg.Elements.ipfsLogo 16) 39 + , label = methodName ipfsMethod 40 + , msg = startIpfs 41 + , active = False 42 + } 43 + ]
+257
src/Applications/UI/Syncing/View.elm
··· 1 + module UI.Syncing.View exposing (view) 2 + 3 + import Chunky exposing (..) 4 + import Conditional exposing (..) 5 + import Html exposing (Html, text) 6 + import Html.Attributes as A exposing (attribute, placeholder, style, value) 7 + import Html.Events as E exposing (onSubmit) 8 + import Html.Events.Extra exposing (onClickStopPropagation) 9 + import Html.Extra as Html 10 + import Html.Lazy as Lazy 11 + import Json.Decode 12 + import Material.Icons.Round as Icons 13 + import Material.Icons.Types exposing (Coloring(..)) 14 + import Svg 15 + import UI.Kit 16 + import UI.Svg.Elements 17 + import UI.Syncing.Types as Syncing exposing (..) 18 + import UI.Types as UI exposing (..) 19 + import User.Layer exposing (..) 20 + 21 + 22 + 23 + -- 🗺 24 + 25 + 26 + view : Model -> Html UI.Msg 27 + view = 28 + Html.map SyncingMsg << Lazy.lazy view_ << .syncing 29 + 30 + 31 + view_ : State -> Html Syncing.Msg 32 + view_ state = 33 + case state of 34 + InputScreen _ opts -> 35 + UI.Kit.receptacle 36 + { scrolling = False } 37 + [ inputScreen opts ] 38 + 39 + NewEncryptionKeyScreen method pass -> 40 + UI.Kit.receptacle 41 + { scrolling = False } 42 + [ encryptionKeyScreen 43 + { ableToCancel = False 44 + , withEncryption = ActivateSyncWithPassphrase method (Maybe.withDefault "" pass) 45 + , withoutEncryption = ActivateSync method 46 + } 47 + ] 48 + 49 + UpdateEncryptionKeyScreen method pass -> 50 + UI.Kit.receptacle 51 + { scrolling = False } 52 + [ encryptionKeyScreen 53 + { ableToCancel = True 54 + , withEncryption = UpdateEncryptionKey method (Maybe.withDefault "" pass) 55 + , withoutEncryption = RemoveEncryptionKey method 56 + } 57 + ] 58 + 59 + _ -> 60 + Html.nothing 61 + 62 + 63 + 64 + -- ENCRYPTION KEY 65 + 66 + 67 + encryptionKeyScreen : { ableToCancel : Bool, withEncryption : Syncing.Msg, withoutEncryption : Syncing.Msg } -> Html Syncing.Msg 68 + encryptionKeyScreen { ableToCancel, withEncryption, withoutEncryption } = 69 + UI.Kit.focusScreen 70 + { icon = Icons.lock 71 + , iconHref = Nothing 72 + , text = [ text "Optional passphrase to encrypt/decrypt your data" ] 73 + , textHref = Nothing 74 + } 75 + [ slab 76 + Html.form 77 + [ onSubmit withEncryption ] 78 + [ "flex" 79 + , "flex-col" 80 + , "max-w-xs" 81 + , "px-3" 82 + , "w-screen" 83 + 84 + -- 85 + , "sm:px-0" 86 + ] 87 + [ UI.Kit.textArea 88 + [ attribute "autocapitalize" "none" 89 + , attribute "autocomplete" "off" 90 + , attribute "autocorrect" "off" 91 + , attribute "rows" "4" 92 + , attribute "spellcheck" "false" 93 + 94 + -- 95 + , placeholder "anQLS9Usw24gxUi11IgVBg76z8SCWZgLKkoWIeJ1ClVmBHLRlaiA0CtvONVAMGritbgd3U45cPTxrhFU0WXaOAa8pVt186KyEccfUNyAq97" 96 + 97 + -- 98 + , style "-webkit-text-security" "disc" 99 + 100 + -- 101 + , A.class "shadow" 102 + , E.onInput KeepPassphraseInMemory 103 + ] 104 + , chunk 105 + [ "flex" 106 + , "items-stretch" 107 + , "space-x-2.5" 108 + ] 109 + [ UI.Kit.buttonWithOptions 110 + Html.button 111 + [ A.class "flex-1" ] 112 + UI.Kit.Gray 113 + UI.Kit.Filled 114 + (Just Syncing.Bypass) 115 + (text "Continue") 116 + 117 + -- 118 + , if ableToCancel then 119 + UI.Kit.buttonWithOptions 120 + Html.button 121 + [ A.class "flex-1" 122 + , E.stopPropagationOn "click" (Json.Decode.succeed ( CancelInput, True )) 123 + ] 124 + UI.Kit.Gray 125 + UI.Kit.Normal 126 + Nothing 127 + (text "Cancel") 128 + 129 + else 130 + nothing 131 + ] 132 + , brick 133 + [ onClickStopPropagation withoutEncryption ] 134 + [ "cursor-pointer" 135 + , "flex" 136 + , "items-center" 137 + , "justify-center" 138 + , "leading-snug" 139 + , "mt-3" 140 + , "opacity-50" 141 + , "text-xs" 142 + ] 143 + [ inline [ "inline-block", "leading-none", "mr-2" ] [ Icons.warning 13 Inherit ] 144 + , text "Continue without encryption" 145 + ] 146 + ] 147 + ] 148 + 149 + 150 + 151 + -- INPUT SCREEN 152 + 153 + 154 + inputScreen : Question -> Html Syncing.Msg 155 + inputScreen question = 156 + UI.Kit.focusScreen 157 + { icon = question.icon 158 + , iconHref = Nothing 159 + , text = [ question.question ] 160 + , textHref = Nothing 161 + } 162 + [ slab 163 + Html.form 164 + [ onSubmit ConfirmInput ] 165 + [ "flex" 166 + , "flex-col" 167 + , "max-w-xs" 168 + , "px-3" 169 + , "w-screen" 170 + 171 + -- 172 + , "sm:px-0" 173 + ] 174 + [ UI.Kit.textFieldAlt 175 + [ attribute "autocapitalize" "off" 176 + , placeholder question.placeholder 177 + , A.class "shadow" 178 + , E.onInput Input 179 + , value question.value 180 + ] 181 + , UI.Kit.button 182 + UI.Kit.Filled 183 + Syncing.Bypass 184 + (text "Continue") 185 + ] 186 + ] 187 + 188 + 189 + 190 + -- SPEECH BUBBLE 191 + 192 + 193 + speechBubble : Html msg -> Html msg 194 + speechBubble contents = 195 + chunk 196 + [ "absolute" 197 + , "antialiased" 198 + , "bg-background" 199 + , "border-b" 200 + , "border-transparent" 201 + , "font-semibold" 202 + , "italic" 203 + , "leading-snug" 204 + , "left-1/2" 205 + , "max-w-screen" 206 + , "-translate-x-1/2" 207 + , "px-4" 208 + , "py-1" 209 + , "rounded" 210 + , "text-center" 211 + , "text-sm" 212 + , "text-white" 213 + , "top-full" 214 + , "transform" 215 + , "whitespace-nowrap" 216 + 217 + -- Dark mode 218 + ------------ 219 + , "dark:bg-darkest-hour" 220 + , "dark:text-gray-600" 221 + ] 222 + [ chunk 223 + [ "mb-px", "pb-px", "pt-1" ] 224 + [ contents ] 225 + 226 + -- 227 + , brick 228 + speechBubbleArrowStyles 229 + [ "absolute" 230 + , "border-background" 231 + , "h-0" 232 + , "left-1/2" 233 + , "-translate-x-1/2" 234 + , "-translate-y-full" 235 + , "top-0" 236 + , "transform" 237 + , "w-0" 238 + 239 + -- Dark mode 240 + ------------ 241 + , "dark:border-darkest-hour" 242 + ] 243 + [] 244 + ] 245 + 246 + 247 + 248 + -- 🖼 249 + 250 + 251 + speechBubbleArrowStyles : List (Html.Attribute msg) 252 + speechBubbleArrowStyles = 253 + [ style "border-top-color" "transparent" 254 + , style "border-left-color" "transparent" 255 + , style "border-right-color" "transparent" 256 + , style "border-width" "0 6px 5px 6px" 257 + ]
+8 -2
src/Applications/UI/Tracks/State.elm
··· 29 29 import UI.Page 30 30 import UI.Ports as Ports 31 31 import UI.Queue.State as Queue 32 + import UI.Syncing.Types exposing (State(..)) 32 33 import UI.Tracks.ContextMenu as Tracks 33 34 import UI.Tracks.Covers as Covers 34 35 import UI.Tracks.Scene.Covers ··· 205 206 manageFavourites AddToFavourites 206 207 207 208 209 + afterInitialLoad : Manager 210 + afterInitialLoad model = 211 + Common.toggleLoadingScreen Off model 212 + 213 + 208 214 changeScene : Scene -> Manager 209 215 changeScene scene model = 210 216 (case scene of ··· 610 616 |> Result.withDefault [] 611 617 |> (\results -> { model | searchResults = Just results }) 612 618 |> reviseCollection Collection.harvest 613 - |> andThen (Common.toggleLoadingScreen Off) 619 + |> andThen afterInitialLoad 614 620 615 621 Nothing -> 616 622 Return.singleton model ··· 1074 1080 identity 1075 1081 1076 1082 Nothing -> 1077 - andThen (Common.toggleLoadingScreen Off) 1083 + andThen afterInitialLoad 1078 1084 ) 1079 1085 1080 1086
+89 -56
src/Applications/UI/Tracks/View.elm
··· 22 22 import UI.Playlists.Page 23 23 import UI.Queue.Page 24 24 import UI.Sources.Page as Sources 25 + import UI.Syncing.Common as Syncing 26 + import UI.Syncing.Types as Syncing 25 27 import UI.Tracks.Scene.Covers 26 28 import UI.Tracks.Scene.List 27 29 import UI.Tracks.Types exposing (..) 28 30 import UI.Types as UI exposing (..) 31 + import User.Layer as User 29 32 30 33 31 34 ··· 74 77 75 78 -- 76 79 , if List.isEmpty model.tracks.harvested then 77 - lazy4 80 + lazy5 78 81 noTracksView 79 82 (List.map Tuple.first model.processingContext) 80 83 (List.length model.sources) 81 84 (List.length model.tracks.harvested) 82 85 (List.length model.favourites) 86 + (Syncing.extractMethod model.syncing) 83 87 84 88 else 85 89 case model.scene of ··· 441 445 ] 442 446 443 447 444 - noTracksView : List String -> Int -> Int -> Int -> Html UI.Msg 445 - noTracksView processingContext amountOfSources amountOfTracks _ = 448 + noTracksView : List String -> Int -> Int -> Int -> Maybe User.Method -> Html UI.Msg 449 + noTracksView processingContext amountOfSources amountOfTracks _ userLayerMethod = 446 450 chunk 447 451 [ "no-tracks-view" 448 452 ··· 457 461 else if amountOfSources == 0 then 458 462 chunk 459 463 [ "flex" 460 - , "flex-wrap" 461 - , "items-start" 464 + , "flex-col" 465 + , "items-center" 462 466 , "justify-center" 463 467 , "px-3" 464 468 ] 465 - [ ----------------------------------------- 466 - -- Add 467 - ----------------------------------------- 468 - inline 469 - [ "mb-4" 470 - , "mx-2" 471 - , "whitespace-nowrap" 469 + [ slab 470 + Html.img 471 + [ A.src "images/diffuse-dark.svg" 472 + , A.width 190 472 473 ] 473 - [ UI.Kit.buttonLink 474 - (Sources.NewOnboarding 475 - |> Page.Sources 476 - |> Page.toString 477 - ) 478 - UI.Kit.Filled 479 - (buttonContents 480 - [ UI.Kit.inlineIcon Icons.add 481 - , text "Add some music" 482 - ] 483 - ) 474 + [ "dark:hidden" ] 475 + [] 476 + 477 + -- 478 + , slab 479 + Html.img 480 + [ A.src "images/diffuse-light.svg" 481 + , A.width 190 484 482 ] 483 + [ "hidden dark:block" ] 484 + [] 485 485 486 - ----------------------------------------- 487 - -- Demo 488 - ----------------------------------------- 489 - , inline 490 - [ "mb-4" 491 - , "mx-2" 492 - , "whitespace-nowrap" 486 + -- 487 + , chunk 488 + [ "italic" 489 + , "max-w-sm" 490 + , "mt-6" 491 + , "text-base05" 492 + , "text-center" 493 + , "text-sm" 494 + 495 + -- Dark mode 496 + ------------ 497 + , "dark:text-base03" 498 + ] 499 + [ Html.text "Play music" 500 + , inline [ "not-italic", "font-normal", "inline-block", "mx-1", "pr-px" ] [ Html.text " ♫ " ] 501 + , Html.text """from your Dropbox, 502 + IPFS node, Amazon S3 bucket, or any other 503 + cloud/distributed storage service you use. 504 + """ 493 505 ] 494 - [ UI.Kit.buttonWithColor 495 - UI.Kit.Gray 506 + 507 + -- 508 + , chunk 509 + [ "flex", "mt-5", "space-x-3" ] 510 + [ UI.Kit.button 496 511 UI.Kit.Normal 497 512 InsertDemo 498 - (buttonContents 499 - [ UI.Kit.inlineIcon Icons.music_note 500 - , text "Insert demo" 501 - ] 502 - ) 513 + (Html.text "Insert Demo") 514 + , UI.Kit.buttonWithColor 515 + UI.Kit.Accent 516 + UI.Kit.Filled 517 + (ChangeUrlUsingPage <| Page.Sources Sources.New) 518 + (Html.text "Add Music") 519 + , case userLayerMethod of 520 + Just method -> 521 + UI.Kit.buttonWithColor 522 + UI.Kit.Gray 523 + UI.Kit.Filled 524 + (SyncingMsg Syncing.StopSync) 525 + (text "Stop syncing") 526 + 527 + Nothing -> 528 + UI.Kit.buttonWithOptions 529 + Html.button 530 + [ Mouse.onClick (SyncingMsg << Syncing.ShowSyncDataMenu) ] 531 + UI.Kit.Gray 532 + UI.Kit.Filled 533 + Nothing 534 + (Html.text "Sync data") 503 535 ] 504 536 505 - ----------------------------------------- 506 - -- How 507 - ----------------------------------------- 508 - , inline 509 - [ "mb-4" 510 - , "mx-2" 511 - , "whitespace-nowrap" 512 - ] 513 - [ UI.Kit.buttonWithOptions 537 + -- 538 + , chunk 539 + [ "mt-4" ] 540 + [ slab 514 541 Html.a 515 - [ href "about/" 516 - , target "_blank" 542 + [ A.href "about/" 543 + , A.target "_blank" 517 544 ] 518 - UI.Kit.Gray 519 - UI.Kit.Normal 520 - Nothing 521 - (buttonContents 522 - [ UI.Kit.inlineIcon Icons.help 523 - , text "More info" 524 - ] 525 - ) 545 + [ "border-b" 546 + , "border-current" 547 + , "inline-block" 548 + , "leading-snug" 549 + , "text-base05" 550 + , "text-xxs" 551 + , "tracking-widest" 552 + , "uppercase" 553 + 554 + -- Dark mode 555 + ------------ 556 + , "dark:text-base03" 557 + ] 558 + [ Html.text "Learn more" ] 526 559 ] 527 560 ] 528 561
+3 -8
src/Applications/UI/Types.elm
··· 26 26 import Sources exposing (Source) 27 27 import Time 28 28 import Tracks exposing (..) 29 - import UI.Authentication.Types as Authentication 30 29 import UI.DnD as DnD 31 30 import UI.Page exposing (Page) 32 31 import UI.Queue.Types as Queue 33 32 import UI.Sources.Types as Sources 33 + import UI.Syncing.Types as Syncing 34 34 import UI.Tracks.Types as Tracks 35 35 import Url exposing (Url) 36 - import Webnative 37 36 38 37 39 38 ··· 71 70 , isTouchDevice : Bool 72 71 , isUpgrading : Bool 73 72 , lastFm : LastFm.Model 74 - , migratingData : Bool 75 73 , navKey : Nav.Key 76 74 , page : Page 77 75 , pressedKeys : List Keyboard.Key ··· 181 179 ----------------------------------------- 182 180 -- 🦉 Nested 183 181 ----------------------------------------- 184 - , authentication : Authentication.State 182 + , syncing : Syncing.State 185 183 } 186 184 187 185 ··· 282 280 -- User 283 281 ----------------------------------------- 284 282 | Export 285 - | GotWebnativeResponse Webnative.Response 286 283 | ImportFile File 287 284 | ImportJson String 288 - | ImportLegacyData 289 285 | InsertDemo 290 286 | LoadEnclosedUserData Json.Decode.Value 291 287 | LoadHypaethralUserData Json.Decode.Value 292 - | MigrateHypaethralUserData 293 288 | RequestImport 294 289 | SaveEnclosedUserData 295 290 ----------------------------------------- ··· 299 294 ----------------------------------------- 300 295 -- 🦉 Nested 301 296 ----------------------------------------- 302 - | AuthenticationMsg Authentication.Msg 297 + | SyncingMsg Syncing.Msg 303 298 | QueueMsg Queue.Msg 304 299 | SourcesMsg Sources.Msg 305 300 | TracksMsg Tracks.Msg
-33
src/Applications/UI/User/State.elm
··· 1 - module UI.User.State exposing (..) 2 - 3 - import Return 4 - import UI.Authentication.State as Authentication 5 - import UI.Types exposing (..) 6 - import User.Layer as User 7 - import Webnative exposing (Artifact(..), DecodedResponse(..)) 8 - import Webnative.Tag as Tag 9 - 10 - 11 - 12 - -- 🔱 13 - 14 - 15 - gotWebnativeResponse : Webnative.Response -> Manager 16 - gotWebnativeResponse response model = 17 - case Webnative.decodeResponse Tag.fromString response of 18 - Webnative (Initialisation state) -> 19 - if Webnative.isAuthenticated state then 20 - Authentication.signIn 21 - (User.Fission { initialised = False }) 22 - model 23 - 24 - else 25 - Return.singleton model 26 - 27 - _ -> 28 - Return.singleton model 29 - 30 - 31 - migrateHypaethralUserData : Manager 32 - migrateHypaethralUserData model = 33 - Authentication.signOut { model | migratingData = True }
+4
src/Applications/UI/User/State/Export.elm
··· 8 8 import Return exposing (return) 9 9 import Settings exposing (Settings) 10 10 import Sources.Encoding as Sources 11 + import Time 11 12 import Tracks.Encoding as Tracks 12 13 import UI.Ports as Ports 13 14 import UI.Types exposing (..) ··· 25 26 , settings = Just (gatherSettings model) 26 27 , sources = model.sources 27 28 , tracks = model.tracks.untouched 29 + 30 + -- 31 + , modifiedAt = Just model.currentTime 28 32 } 29 33 |> encodeHypaethralData 30 34 |> Json.Encode.encode 2
+1 -26
src/Applications/UI/User/State/Import.elm
··· 1 1 module UI.User.State.Import exposing (..) 2 2 3 - import Alien 4 3 import File exposing (File) 5 4 import File.Select 6 5 import Json.Decode ··· 65 64 |> saveAllHypaethralData 66 65 67 66 68 - importLegacyData : Manager 69 - importLegacyData model = 70 - Alien.ImportLegacyData 71 - |> Alien.trigger 72 - |> Ports.toBrain 73 - |> return model 74 - |> andThen 75 - (""" 76 - I'll try to import data from Diffuse version one. 77 - If this was successful, you'll get a notification. 78 - """ 79 - |> Notifications.casual 80 - |> Common.showNotification 81 - ) 82 - 83 - 84 67 insertDemo : Manager 85 68 insertDemo model = 86 69 model ··· 116 99 """ 117 100 Thank you for using Diffuse V1! 118 101 If you want to import your old data, 119 - please go to the [import page](#/settings/import-export). 102 + please go to the [import page](#/settings/data). 120 103 """ 121 104 |> Notifications.stickySuccess 122 105 |> Common.showNotificationWithModel m ··· 126 109 ) 127 110 |> andThen 128 111 Sources.addSourcesFromUrl 129 - |> andThen 130 - (\m -> 131 - if m.processAutomatically then 132 - Sources.process m 133 - 134 - else 135 - Return.singleton m 136 - ) 137 112 138 113 139 114 requestImport : Manager
+24 -30
src/Applications/UI/View.elm
··· 13 13 import Json.Decode 14 14 import Maybe.Extra as Maybe 15 15 import UI.Alfred.View as Alfred 16 - import UI.Authentication.Common as Authentication 17 - import UI.Authentication.Types as Authentication 18 - import UI.Authentication.View as Authentication 19 16 import UI.Backdrop as Backdrop 20 17 import UI.Console 21 18 import UI.ContextMenu ··· 29 26 import UI.Sources.Page 30 27 import UI.Sources.View as Sources 31 28 import UI.Svg.Elements 29 + import UI.Syncing.Common as Syncing 30 + import UI.Syncing.Types as Syncing 31 + import UI.Syncing.View as Syncing 32 32 import UI.Tracks.View as Tracks 33 33 import UI.Types exposing (..) 34 34 import User.Layer ··· 104 104 , scrolling = not model.isDragging 105 105 } 106 106 in 107 - case ( model.isLoading, model.authentication ) of 108 - ( True, _ ) -> 109 - content 110 - { opts | justifyCenter = True } 111 - [ loadingAnimation 112 - , chunk 113 - [ "italic" 114 - , "mt-5" 115 - , "text-white" 116 - , "text-opacity-30" 117 - ] 118 - [ case model.authentication of 119 - Authentication.Authenticated _ -> 120 - Html.text "Loading your data" 121 - 122 - _ -> 123 - Html.text "Transmitting particles" 124 - ] 107 + if model.isLoading then 108 + content 109 + { opts | justifyCenter = True } 110 + [ loadingAnimation 111 + , chunk 112 + [ "italic" 113 + , "mt-5" 114 + , "text-white" 115 + , "text-opacity-30" 125 116 ] 126 - 127 - ( False, Authentication.Authenticated _ ) -> 128 - content opts (defaultScreen model) 117 + [ Html.text "Transmitting particles" ] 118 + ] 129 119 130 - ( False, _ ) -> 131 - content opts [ Authentication.view model ] 120 + else 121 + content opts (defaultScreen model) 132 122 ] 133 123 134 124 ··· 164 154 model.selectedPlaylist 165 155 model.editPlaylistContext 166 156 model.extractedBackdropColor 167 - (model.authentication 168 - |> Authentication.extractMethod 157 + (model.syncing 158 + |> Syncing.extractMethod 169 159 |> Maybe.unwrap False User.Layer.methodSupportsPublicData 170 160 ) 171 161 ··· 175 165 Page.Settings subPage -> 176 166 Lazy.lazy2 Settings.view 177 167 subPage 178 - { authenticationMethod = Authentication.extractMethod model.authentication 179 - , buildTimestamp = model.buildTimestamp 168 + { buildTimestamp = model.buildTimestamp 180 169 , chosenBackgroundImage = model.chosenBackdrop 181 170 , coverSelectionReducesPool = model.coverSelectionReducesPool 182 171 , currentTimeZone = model.currentTimeZone ··· 186 175 , processAutomatically = model.processAutomatically 187 176 , rememberProgress = model.rememberProgress 188 177 , serviceWorkerStatus = model.serviceWorkerStatus 178 + , syncMethod = Syncing.extractMethod model.syncing 189 179 , version = model.version 190 180 } 191 181 192 182 Page.Sources subPage -> 193 183 Sources.view subPage model 184 + 185 + -- Syncing 186 + ---------- 187 + , Syncing.view model 194 188 ] 195 189 196 190 -----------------------------------------
-140
src/Javascript/Brain/common.js
··· 1 - // 2 - // Common stuff 3 - // ʕ•ᴥ•ʔ 4 - 5 - 6 - import * as crypto from "../crypto" 7 - import * as db from "../indexed-db" 8 - 9 - 10 - export const SECRET_KEY_LOCATION = "AUTH_SECRET_KEY" 11 - 12 - 13 - // 🔱 14 - 15 - 16 - export function isAuthMethodService(eventTag) { 17 - return ( 18 - eventTag.startsWith("AUTH_") && 19 - eventTag !== "AUTH_ENCLOSED_DATA" && 20 - eventTag !== "AUTH_METHOD" && 21 - eventTag !== "AUTH_SECRET_KEY" 22 - ) 23 - } 24 - 25 - 26 - export function isLocalHost(url) { 27 - return ( 28 - url.startsWith("localhost") || 29 - url.startsWith("localhost") || 30 - url.startsWith("127.0.0.1") || 31 - url.startsWith("127.0.0.1") 32 - ) 33 - } 34 - 35 - 36 - export function reportError(app, event) { 37 - return e => { 38 - const err = e ? e.message || e : null 39 - if (err) { 40 - console.error(err, e.stack) 41 - app.ports.fromAlien.send({ tag: event.tag, data: null, error: err }) 42 - } 43 - } 44 - } 45 - 46 - 47 - export function sendData(app, event, opts) { 48 - return data => { 49 - app.ports.fromAlien.send({ 50 - tag: event.tag, 51 - data: (opts && opts.parseJSON && typeof data === "string") 52 - ? JSON.parse(data) 53 - : (data || null), 54 - error: null 55 - }) 56 - } 57 - } 58 - 59 - 60 - export function sendJsonData(app, event) { 61 - return sendData(app, event, { parseJSON: true }) 62 - } 63 - 64 - 65 - export function storageCallback(app, _) { 66 - return _ => { 67 - app.ports.savedHypaethralBit.send() 68 - } 69 - } 70 - 71 - 72 - 73 - // Cache 74 - // ----- 75 - 76 - export function removeCache(key) { 77 - return db.deleteFromIndex({ key: key }) 78 - } 79 - 80 - 81 - export function fromCache(key) { 82 - return isAuthMethodService(key) 83 - ? db.getFromIndex({ key: key }) 84 - .then(decryptIfNeeded) 85 - .then(d => typeof d === "string" ? JSON.parse(d) : d) 86 - .then(a => a === undefined ? null : a) 87 - : db.getFromIndex({ key: key }) 88 - } 89 - 90 - 91 - export function toCache(key, data) { 92 - if (isAuthMethodService(key)) { 93 - const json = JSON.stringify(data) 94 - 95 - return encryptWithSecretKey(json) 96 - .then(encryptedData => db.setInIndex({ key: key, data: encryptedData })) 97 - 98 - } else { 99 - return db.setInIndex({ key: key, data: data }) 100 - 101 - } 102 - } 103 - 104 - 105 - 106 - // Crypto 107 - // ------ 108 - 109 - export function decryptIfNeeded(data) { 110 - if (typeof data !== "string") { 111 - return Promise.resolve(data) 112 - 113 - } else if (data.startsWith("{") || data.startsWith("[")) { 114 - return Promise.resolve(data) 115 - 116 - } else { 117 - return data 118 - ? getSecretKey().then(secretKey => crypto.decrypt(secretKey, data)) 119 - : Promise.resolve(null) 120 - 121 - } 122 - } 123 - 124 - 125 - export function encryptWithSecretKey(unencryptedData) { 126 - return unencryptedData 127 - ? getSecretKey() 128 - .then(secretKey => crypto.encrypt(secretKey, unencryptedData)) 129 - .catch(_ => unencryptedData) 130 - : null 131 - } 132 - 133 - 134 - export function getSecretKey() { 135 - return db.getFromIndex({ 136 - key: SECRET_KEY_LOCATION 137 - }).then(key => { 138 - return key ? key : Promise.reject(new Error("MISSING_SECRET_KEY")) 139 - }) 140 - }
+112
src/Javascript/Brain/common.ts
··· 1 + // 2 + // Common stuff 3 + // ʕ•ᴥ•ʔ 4 + 5 + 6 + import * as crypto from "../crypto" 7 + import * as db from "../indexed-db" 8 + 9 + 10 + export const SECRET_KEY_LOCATION = "SECRET_KEY" 11 + 12 + 13 + // 🔱 14 + 15 + 16 + export function isLocalHost(url) { 17 + return ( 18 + url.startsWith("localhost") || 19 + url.startsWith("localhost") || 20 + url.startsWith("127.0.0.1") || 21 + url.startsWith("127.0.0.1") 22 + ) 23 + } 24 + 25 + 26 + export function parseJsonIfNeeded(a) { 27 + if (typeof a === "string") return JSON.parse(a) 28 + return a 29 + } 30 + 31 + 32 + export function reportError(app, event) { 33 + return e => { 34 + const err = e ? e.message || e : null 35 + if (err) { 36 + console.error(err, e.stack) 37 + app.ports.fromAlien.send({ tag: event.tag, data: null, error: err }) 38 + } 39 + } 40 + } 41 + 42 + 43 + export function sendData(app, event, opts) { 44 + return data => { 45 + app.ports.fromAlien.send({ 46 + tag: event.tag, 47 + data: (opts && opts.parseJSON && typeof data === "string") 48 + ? JSON.parse(data) 49 + : (data || null), 50 + error: null 51 + }) 52 + } 53 + } 54 + 55 + 56 + 57 + // Cache 58 + // ----- 59 + 60 + export function removeCache(key) { 61 + return db.deleteFromIndex({ key: key }) 62 + } 63 + 64 + 65 + export function fromCache(key) { 66 + return db.getFromIndex({ key: key }) 67 + } 68 + 69 + 70 + export function toCache(key, data) { 71 + return db.setInIndex({ key: key, data: data }) 72 + } 73 + 74 + 75 + 76 + // Crypto 77 + // ------ 78 + 79 + export function decryptIfNeeded(data) { 80 + if (typeof data !== "string") { 81 + return Promise.resolve(data) 82 + 83 + } else if (data.startsWith("{") || data.startsWith("[")) { 84 + return Promise.resolve(data) 85 + 86 + } else { 87 + return data 88 + ? getSecretKey().then(secretKey => { 89 + if (!secretKey) throw new Error("There seems to be existing data that's encrypted, I will need the passphrase (ie. encryption key) to continue.") 90 + return crypto.decrypt(secretKey, data) 91 + }) 92 + : Promise.resolve(null) 93 + 94 + } 95 + } 96 + 97 + 98 + export async function encryptIfPossible(unencryptedData: string): Promise<string> { 99 + return unencryptedData 100 + ? getSecretKey() 101 + .then(secretKey => crypto.encrypt(secretKey, unencryptedData)) 102 + .catch(_ => unencryptedData) 103 + : unencryptedData 104 + } 105 + 106 + 107 + export { encryptIfPossible as encryptWithSecretKey } 108 + 109 + 110 + export function getSecretKey() { 111 + return db.getFromIndex({ key: SECRET_KEY_LOCATION }) 112 + }
+129 -63
src/Javascript/Brain/index.js
··· 5 5 // This worker is responsible for everything non-UI. 6 6 7 7 8 + import * as TaskPort from "elm-taskport" 9 + 8 10 import * as artwork from "./artwork" 9 11 import * as db from "../indexed-db" 10 12 import * as processing from "../processing" 11 13 import * as user from "./user" 12 14 13 15 import { fromCache, removeCache, reportError } from "./common" 14 - import { sendData, storageCallback, toCache } from "./common" 15 - import { identity } from "../common" 16 + import { sendData, toCache } from "./common" 16 17 import { transformUrl } from "../urls" 17 18 18 19 importScripts("brain.elm.js") ··· 22 23 // 🍱 23 24 24 25 26 + let app 27 + let wire = {} 28 + 29 + 30 + TaskPort.install() 31 + 32 + 33 + TaskPort.register("fromCache", fromCache) 34 + TaskPort.register("removeCache", removeCache) 35 + TaskPort.register("toCache", ({ key, value }) => toCache(key, value)) 36 + 37 + 38 + user.setupTaskPorts() 39 + 40 + 25 41 const flags = location 26 42 .hash 27 43 .substr(1) ··· 32 48 }, {}) 33 49 34 50 35 - const app = Elm.Brain.init({ 36 - flags: { 37 - initialUrl: decodeURIComponent(flags.appHref) || "" 51 + forwardCompatibility().then(initialise) 52 + 53 + 54 + function initialise() { 55 + app = Elm.Brain.init({ 56 + flags: { 57 + initialUrl: decodeURIComponent(flags.appHref) || "" 58 + } 59 + }) 60 + 61 + user.setupPorts(app) 62 + 63 + wire.ui() 64 + wire.caching() 65 + wire.artworkCaching() 66 + wire.tracksCaching() 67 + wire.downloading() 68 + wire.search() 69 + wire.tags() 70 + } 71 + 72 + 73 + async function forwardCompatibility() { 74 + const secretKey = await fromCache("AUTH_SECRET_KEY") 75 + if (secretKey) { 76 + await toCache("SECRET_KEY", secretKey) 77 + await removeCache("AUTH_SECRET_KEY") 38 78 } 39 - }) 40 79 80 + const method = await fromCache("AUTH_METHOD") 81 + if (method) { 82 + await toCache("SYNC_METHOD", method) 83 + await removeCache("AUTH_METHOD") 84 + } 41 85 42 - user.setupPorts(app) 86 + const enclosedData = await fromCache("AUTH_ENCLOSED_DATA") 87 + if (enclosedData) { 88 + await toCache("ENCLOSED_DATA", enclosedData) 89 + await removeCache("AUTH_ENCLOSED_DATA") 90 + } 91 + } 43 92 44 93 45 94 46 95 // UI 47 96 // == 48 97 49 - app.ports.toUI.subscribe(event => { 50 - self.postMessage(event) 51 - }) 98 + wire.ui = () => { 99 + app.ports.toUI.subscribe(event => { 100 + self.postMessage(event) 101 + }) 52 102 53 103 54 - self.onmessage = event => { 55 - if (event.data.action) return handleAction(event.data.action, event.data.data) 56 - if (event.data.tag) return app.ports.fromAlien.send(event.data) 104 + self.onmessage = event => { 105 + if (event.data.action) return handleAction(event.data.action, event.data.data) 106 + if (event.data.tag) return app.ports.fromAlien.send(event.data) 107 + } 57 108 } 58 109 59 110 ··· 68 119 // Cache 69 120 // ----- 70 121 71 - app.ports.removeCache.subscribe(event => { 72 - removeCache(event.tag) 73 - .catch(reportError(app, event)) 74 - }) 75 - 76 - 77 - app.ports.requestCache.subscribe(event => { 78 - const key = event.data && event.data.file 79 - ? event.tag + "_" + event.data.file 80 - : event.tag 122 + wire.caching = () => { 123 + app.ports.removeCache.subscribe(event => { 124 + removeCache(event.tag) 125 + .catch(reportError(app, event)) 126 + }) 81 127 82 - fromCache(key) 83 - .then(sendData(app, event)) 84 - .catch(reportError(app, event)) 85 - }) 128 + app.ports.requestCache.subscribe(event => { 129 + const key = event.data && event.data.file 130 + ? event.tag + "_" + event.data.file 131 + : event.tag 86 132 133 + fromCache(key) 134 + .then(sendData(app, event)) 135 + .catch(reportError(app, event)) 136 + }) 87 137 88 - app.ports.toCache.subscribe(event => { 89 - const key = event.data && event.data.file 90 - ? event.tag + "_" + event.data.file 91 - : event.tag 138 + app.ports.toCache.subscribe(event => { 139 + const key = event.data && event.data.file 140 + ? event.tag + "_" + event.data.file 141 + : event.tag 92 142 93 - toCache(key, event.data.data || event.data) 94 - .then( 95 - event.tag === "AUTH_ANONYMOUS" 96 - ? storageCallback(app, event) 97 - : identity 98 - ) 99 - .catch(reportError(app, event)) 100 - }) 143 + toCache(key, event.data.data || event.data) 144 + .catch(reportError(app, event)) 145 + }) 146 + } 101 147 102 148 103 149 ··· 107 153 let artworkQueue = [] 108 154 109 155 156 + wire.artworkCaching = () => { 157 + app.ports.provideArtworkTrackUrls.subscribe(provideArtworkTrackUrls) 158 + } 159 + 160 + 110 161 function downloadArtwork(list) { 111 162 const exe = !artworkQueue[ 0 ] 112 163 artworkQueue = artworkQueue.concat(list) ··· 128 179 } 129 180 130 181 131 - app.ports.provideArtworkTrackUrls.subscribe(prep => { 182 + function provideArtworkTrackUrls(prep) { 132 183 artwork 133 184 .find(prep, app) 134 185 .then(blob => { ··· 155 206 } 156 207 }) 157 208 .finally(shiftArtworkQueue) 158 - }) 209 + } 159 210 160 211 161 212 162 213 // Cache (Tracks) 163 214 // -------------- 164 215 165 - app.ports.removeTracksFromCache.subscribe(trackIds => { 216 + wire.tracksCaching = () => { 217 + app.ports.removeTracksFromCache.subscribe(removeTracksFromCache) 218 + app.ports.storeTracksInCache.subscribe(storeTracksInCache) 219 + } 220 + 221 + 222 + function removeTracksFromCache(trackIds) { 166 223 trackIds.reduce( 167 224 (acc, id) => acc.then(_ => db.deleteFromIndex({ key: id, store: db.storeNames.tracks })), 168 225 Promise.resolve() ··· 173 230 ("Failed to remove tracks from cache") 174 231 175 232 ) 176 - }) 233 + } 177 234 178 235 179 - app.ports.storeTracksInCache.subscribe(list => { 236 + function storeTracksInCache(list) { 180 237 list.reduce( 181 238 (acc, item) => { 182 239 return acc ··· 205 262 } 206 263 207 264 ) 208 - }) 265 + } 209 266 210 267 211 268 212 269 // Downloading 213 270 // ----------- 214 271 215 - app.ports.downloadTracks.subscribe(group => { 216 - self.postMessage({ 217 - action: "DOWNLOAD_TRACKS", 218 - data: group 272 + wire.downloading = () => { 273 + app.ports.downloadTracks.subscribe(group => { 274 + self.postMessage({ 275 + action: "DOWNLOAD_TRACKS", 276 + data: group 277 + }) 219 278 }) 220 - }) 279 + } 221 280 222 281 223 282 ··· 227 286 const search = new Worker("search.js") 228 287 229 288 230 - app.ports.requestSearch.subscribe(searchTerm => { 289 + wire.search = () => { 290 + app.ports.requestSearch.subscribe(requestSearch) 291 + app.ports.updateSearchIndex.subscribe(updateSearchIndex) 292 + } 293 + 294 + 295 + function requestSearch(searchTerm) { 231 296 search.postMessage({ 232 297 action: "PERFORM_SEARCH", 233 298 data: searchTerm 234 299 }) 235 - }) 300 + } 236 301 237 302 238 - app.ports.updateSearchIndex.subscribe(tracksJson => { 303 + function updateSearchIndex(tracksJson) { 239 304 search.postMessage({ 240 305 action: "UPDATE_SEARCH_INDEX", 241 306 data: tracksJson 242 307 }) 243 - }) 308 + } 244 309 245 310 246 311 search.onmessage = event => { ··· 256 321 // Tags 257 322 // ---- 258 323 259 - app.ports.requestTags.subscribe(context => { 260 - processing.processContext(context, app).then(newContext => { 261 - app.ports.receiveTags.send(newContext) 324 + wire.tags = () => { 325 + app.ports.requestTags.subscribe(context => { 326 + processing.processContext(context, app).then(newContext => { 327 + app.ports.receiveTags.send(newContext) 328 + }) 262 329 }) 263 - }) 264 - 265 330 266 - app.ports.syncTags.subscribe(context => { 267 - processing.processContext(context, app).then(newContext => { 268 - app.ports.replaceTags.send(newContext) 331 + app.ports.syncTags.subscribe(context => { 332 + processing.processContext(context, app).then(newContext => { 333 + app.ports.replaceTags.send(newContext) 334 + }) 269 335 }) 270 - }) 336 + }
-414
src/Javascript/Brain/user.js
··· 1 - // 2 - // User 3 - // (づ。◕‿‿◕。)づ 4 - // 5 - // Related to the user layer. 6 - 7 - 8 - import * as crypto from "../crypto" 9 - import { WEBNATIVE_STAGING_ENV, WEBNATIVE_STAGING_MODE, identity } from "../common" 10 - 11 - import { SECRET_KEY_LOCATION } from "./common" 12 - import { decryptIfNeeded, encryptWithSecretKey } from "./common" 13 - import { fromCache, isLocalHost, reportError } from "./common" 14 - import { sendJsonData, storageCallback, toCache } from "./common" 15 - 16 - 17 - const ports = [] 18 - 19 - 20 - // Crypto 21 - // ====== 22 - 23 - ports.fabricateSecretKey = app => event => { 24 - crypto.keyFromPassphrase(event.data) 25 - .then(data => toCache(SECRET_KEY_LOCATION, data)) 26 - .then(_ => { 27 - app.ports.fromAlien.send({ 28 - tag: event.tag, 29 - data: null, 30 - error: null 31 - }) 32 - }) 33 - .catch(reportError(app, event)) 34 - } 35 - 36 - 37 - 38 - // Dropbox 39 - // ------- 40 - 41 - ports.requestDropbox = app => event => { 42 - const params = { 43 - path: "/" + event.data.file 44 - } 45 - 46 - const dataPromise = 47 - !navigator.onLine 48 - ? fromCache(event.tag + "_" + event.data.file) 49 - : fetch("https://content.dropboxapi.com/2/files/download", { 50 - method: "POST", 51 - headers: { 52 - "Authorization": "Bearer " + event.data.token, 53 - "Dropbox-API-Arg": JSON.stringify(params) 54 - } 55 - }) 56 - .then(r => r.ok ? r.text() : r.json()) 57 - .then(r => r.error ? null : r) 58 - .then(decryptIfNeeded) 59 - 60 - dataPromise 61 - .then( sendJsonData(app, event) ) 62 - .catch( reportError(app, event) ) 63 - } 64 - 65 - 66 - ports.toDropbox = app => event => { 67 - const json = JSON.stringify(event.data.data) 68 - const reporter = reportError(app, event) 69 - const params = { 70 - path: "/" + event.data.file, 71 - mode: "overwrite", 72 - mute: true 73 - } 74 - 75 - navigator.onLine && encryptWithSecretKey(json) 76 - .then(data => { 77 - return fetch("https://content.dropboxapi.com/2/files/upload", { 78 - method: "POST", 79 - headers: { 80 - "Authorization": "Bearer " + event.data.token, 81 - "Content-Type": "application/octet-stream", 82 - "Dropbox-API-Arg": JSON.stringify(params) 83 - }, 84 - body: data 85 - }) 86 - }) 87 - .then( storageCallback(app, event) ) 88 - .catch(reporter) 89 - 90 - toCache(event.tag + "_" + event.data.file, event.data.data) 91 - .then( !navigator.onLine ? storageCallback(app, event) : identity ) 92 - .catch(reporter) 93 - } 94 - 95 - 96 - 97 - // Fission 98 - // ------- 99 - 100 - let wn 101 - let wnfs 102 - 103 - 104 - ports.webnativeRequest = app => request => { 105 - const getFs = () => wnfs 106 - 107 - constructFission.call(self).then(() => { 108 - if (request.method === "loadFileSystem") { 109 - self.webnative.loadFileSystem(...request.arguments).then(fs => { 110 - wnfs = fs 111 - app.ports.webnativeResponse.send({ 112 - tag: request.tag, 113 - error: null, 114 - method: request.method, 115 - data: {}, 116 - context: request.context 117 - }) 118 - }) 119 - } else { 120 - self.webnativeElm.request({ app: app, getFs, request: request }) 121 - } 122 - }) 123 - } 124 - 125 - 126 - function constructFission() { 127 - if (wn) return Promise.resolve() 128 - 129 - importScripts("vendor/ipfs.min.js") 130 - importScripts("vendor/webnative.min.js") 131 - importScripts("vendor/webnative-elm.min.js") 132 - 133 - // Environment setup 134 - wn = self.webnative 135 - 136 - if ([ "localhost", "nightly.diffuse.sh" ].includes(location.hostname)) { 137 - wn.setup.debug({ enabled: true }) 138 - } 139 - 140 - let endpoints 141 - 142 - if (WEBNATIVE_STAGING_MODE) { 143 - endpoints = wn.setup.endpoints(WEBNATIVE_STAGING_ENV) 144 - } else { 145 - endpoints = wn.setup.endpoints({}) 146 - } 147 - 148 - // Connect IPFS 149 - const peersPromise = fetch( `${endpoints.api}/ipfs/peers` ) 150 - .then(r => r.json()) 151 - .then(r => r.filter(p => p.includes("/wss/"))) 152 - .catch(() => { throw new Error("💥 Couldn't start IPFS node, failed to fetch peer list") }) 153 - 154 - return peersPromise.then(peers => { 155 - return self.Ipfs.create({ 156 - config: { 157 - Addresses: { 158 - Delegates: [] 159 - }, 160 - Bootstrap: [], 161 - Discovery: { 162 - webRTCStar: { enabled: false } 163 - } 164 - }, 165 - preload: { 166 - enabled: false 167 - }, 168 - libp2p: { 169 - config: { 170 - peerDiscovery: { autoDial: false } 171 - } 172 - } 173 - }).then(ipfs => { 174 - peers.forEach(peer => tryConnectingToIpfsPeer(ipfs, peer)) 175 - wn.ipfs.set(ipfs) 176 - }) 177 - }) 178 - } 179 - 180 - 181 - ports.deconstructFission = _app => _ => { 182 - wn.leave({ withoutRedirect: true }) 183 - wn = null 184 - } 185 - 186 - 187 - // TODO: This stuff is going to be moved into webnative. 188 - // Remove when possible. 189 - 190 - 191 - const KEEP_ALIVE_INTERVAL = 192 - 1 * 60 * 1000 // 1 minute 193 - 194 - const BACKOFF_INIT = { 195 - retryNumber: 0, 196 - lastBackoff: 0, 197 - currentBackoff: 1000 198 - } 199 - 200 - const KEEP_TRYING_INTERVAL = 201 - 5 * 60 * 1000 // 5 minutes 202 - 203 - const latestPeerTimeoutIds = {} 204 - 205 - 206 - function tryConnectingToIpfsPeer(ipfs, peer) { 207 - ipfs.libp2p.ping(peer).then(() => { 208 - return ipfs.swarm.connect(peer, 1 * 1000) 209 - .then(() => { 210 - console.log(`🪐 Connected to ${peer}`) 211 - setTimeout(() => keepAlive(ipfs, peer, BACKOFF_INIT), KEEP_ALIVE_INTERVAL) 212 - }) 213 - .catch(() => { 214 - console.log(`🪓 Could not connect to ${peer}`) 215 - keepAlive(ipfs, peer, BACKOFF_INIT) 216 - }) 217 - }) 218 - } 219 - 220 - 221 - function keepAlive(ipfs, peer, backoff) { 222 - let timeoutId = null 223 - 224 - if (backoff.currentBackoff < KEEP_TRYING_INTERVAL) { 225 - timeoutId = setTimeout(() => reconnect(ipfs, peer, backoff), backoff.currentBackoff) 226 - } else { 227 - timeoutId = setTimeout(() => reconnect(ipfs, peer, backoff), KEEP_TRYING_INTERVAL) 228 - } 229 - 230 - latestPeerTimeoutIds[peer] = timeoutId 231 - 232 - ipfs.libp2p.ping(peer).then(_ => { 233 - clearTimeout(timeoutId) 234 - 235 - if (timeoutId === latestPeerTimeoutIds[peer]) { 236 - setTimeout(() => keepAlive(ipfs, peer, BACKOFF_INIT), KEEP_ALIVE_INTERVAL) 237 - } 238 - }).catch(() => {}) 239 - } 240 - 241 - 242 - function reconnect(ipfs, peer, backoff) { 243 - ipfs.swarm.disconnect(peer) 244 - .then(() => ipfs.swarm.connect(peer)) 245 - .catch(() => {}) 246 - 247 - if (backoff.currentBackoff < KEEP_TRYING_INTERVAL) { 248 - const nextBackoff = { 249 - retryNumber: backoff.retryNumber + 1, 250 - lastBackoff: backoff.currentBackoff, 251 - currentBackoff: backoff.lastBackoff + backoff.currentBackoff 252 - } 253 - 254 - keepAlive(ipfs, peer, nextBackoff) 255 - } else { 256 - keepAlive(ipfs, peer, backoff) 257 - } 258 - } 259 - 260 - 261 - 262 - // IPFS 263 - // ---- 264 - 265 - const IPFS_ROOT = "/Applications/Diffuse/" 266 - 267 - 268 - ports.requestIpfs = app => event => { 269 - const apiOrigin = event.data.apiOrigin 270 - const path = IPFS_ROOT + event.data.file 271 - 272 - fetch(apiOrigin + "/api/v0/files/read?arg=" + path, { method: "POST" }) 273 - .then(r => r.ok ? r.text() : r.json()) 274 - .then(r => r.Code === 0 ? null : r) 275 - .then(decryptIfNeeded) 276 - .then( sendJsonData(app, event) ) 277 - .catch( reportError(app, event) ) 278 - } 279 - 280 - 281 - ports.toIpfs = app => event => { 282 - const apiOrigin = event.data.apiOrigin 283 - const json = JSON.stringify(event.data.data) 284 - const params = new URLSearchParams({ 285 - arg: IPFS_ROOT + event.data.file, 286 - create: true, 287 - offset: 0, 288 - parents: true, 289 - truncate: true 290 - }).toString() 291 - 292 - encryptWithSecretKey(json) 293 - .then(data => { 294 - const formData = new FormData() 295 - 296 - formData.append("data", data) 297 - 298 - return fetch( 299 - apiOrigin + "/api/v0/files/write?" + params, 300 - { method: "POST", body: formData } 301 - ) 302 - }) 303 - .then( storageCallback(app, event) ) 304 - .catch( reportError(app, event) ) 305 - } 306 - 307 - 308 - 309 - // Legacy 310 - // ------ 311 - 312 - ports.requestLegacyLocalData = app => event => { 313 - let oldIdx 314 - let key = location.hostname + ".json" 315 - 316 - oldIdx = indexedDB.open(key, 1) 317 - oldIdx.onsuccess = _ => { 318 - const old = oldIdx.result 319 - const tra = old.transaction([key], "readwrite") 320 - const req = tra.objectStore(key).get(key) 321 - 322 - req.onsuccess = _ => { 323 - if (req.result) sendJsonData(app, event)(req.result) 324 - } 325 - } 326 - } 327 - 328 - 329 - 330 - // Remote Storage 331 - // -------------- 332 - 333 - let rs 334 - let rsClient 335 - 336 - 337 - function remoteStorage(event) { 338 - if (!rs) { 339 - importScripts("vendor/remotestorage.min.js") 340 - 341 - rs = new RemoteStorage({ cache: false }) 342 - rs.access.claim("diffuse", "rw") 343 - 344 - rsClient = rs.scope("/diffuse/") 345 - 346 - return new Promise(resolve => { 347 - rs.on("connected", resolve) 348 - rs.connect(event.data.userAddress, event.data.token) 349 - }) 350 - 351 - } else { 352 - return Promise.resolve() 353 - 354 - } 355 - } 356 - 357 - 358 - function remoteStorageIsUnavailable(event) { 359 - return !navigator.onLine && 360 - !isLocalHost(event.data.userAddress.replace(/^[^@]*@/, "")) 361 - } 362 - 363 - 364 - ports.deconstructRemoteStorage = _app => _ => { 365 - rs = null 366 - rsClient = null 367 - } 368 - 369 - 370 - ports.requestRemoteStorage = app => event => { 371 - const isOffline = 372 - remoteStorageIsUnavailable(event) 373 - 374 - const dataPromise = 375 - isOffline 376 - ? fromCache(event.tag + "_" + event.data.file) 377 - : remoteStorage(event) 378 - .then(_ => rsClient.getFile(event.data.file)) 379 - .then(r => r.data) 380 - .then(decryptIfNeeded) 381 - 382 - dataPromise 383 - .then( sendJsonData(app, event) ) 384 - .catch( reportError(app, event) ) 385 - } 386 - 387 - 388 - ports.toRemoteStorage = app => event => { 389 - const json = JSON.stringify(event.data.data) 390 - const doEncryption = _ => encryptWithSecretKey(json) 391 - const isOffline = remoteStorageIsUnavailable(event) 392 - 393 - !isOffline && remoteStorage(event) 394 - .then(doEncryption) 395 - .then(data => rsClient.storeFile("application/json", event.data.file, data)) 396 - .then( storageCallback(app, event) ) 397 - .catch( reportError(app, event) ) 398 - 399 - toCache(event.tag + "_" + event.data.file, event.data.data) 400 - .then( isOffline ? storageCallback(app, event) : identity ) 401 - .catch( reportError(app, event) ) 402 - } 403 - 404 - 405 - 406 - // EXPORT 407 - // ====== 408 - 409 - export function setupPorts(app) { 410 - Object.keys(ports).forEach(name => { 411 - const fn = ports[name](app) 412 - app.ports[name].subscribe(fn) 413 - }) 414 - }
+242
src/Javascript/Brain/user.ts
··· 1 + // 2 + // User 3 + // (づ。◕‿‿◕。)づ 4 + // 5 + // Related to the user layer. 6 + 7 + 8 + // @ts-ignore 9 + import * as TaskPort from "elm-taskport" 10 + import { APP_INFO, WEBNATIVE_CONFIG } from "../common" 11 + 12 + import * as crypto from "../crypto" 13 + 14 + import { decryptIfNeeded, encryptIfPossible, SECRET_KEY_LOCATION } from "./common" 15 + import { parseJsonIfNeeded, toCache } from "./common" 16 + 17 + 18 + const ports: Record<string, any> = {} 19 + const taskPorts: Record<string, any> = {} 20 + 21 + 22 + // Crypto 23 + // ====== 24 + 25 + taskPorts.fabricateSecretKey = async passphrase => { 26 + const data = await crypto.keyFromPassphrase(passphrase) 27 + return toCache(SECRET_KEY_LOCATION, data) 28 + } 29 + 30 + 31 + 32 + // Dropbox 33 + // ------- 34 + 35 + taskPorts.fromDropbox = ({ fileName, token }) => { 36 + return fetch("https://content.dropboxapi.com/2/files/download", { 37 + method: "POST", 38 + headers: { 39 + "Authorization": "Bearer " + token, 40 + "Dropbox-API-Arg": JSON.stringify({ path: "/" + fileName }) 41 + } 42 + }) 43 + .then(r => r.ok ? r.text() : r.json()) 44 + .then(r => r.error ? null : r) 45 + .then(decryptIfNeeded) 46 + .then(parseJsonIfNeeded) 47 + } 48 + 49 + 50 + taskPorts.toDropbox = async ({ fileName, data, token }) => { 51 + const json = JSON.stringify(data) 52 + const params = { 53 + path: "/" + fileName, 54 + mode: "overwrite", 55 + mute: true 56 + } 57 + 58 + return fetch("https://content.dropboxapi.com/2/files/upload", { 59 + method: "POST", 60 + headers: { 61 + "Authorization": "Bearer " + token, 62 + "Content-Type": "application/octet-stream", 63 + "Dropbox-API-Arg": JSON.stringify(params) 64 + }, 65 + body: await encryptIfPossible(json) 66 + }) 67 + } 68 + 69 + 70 + 71 + // Fission 72 + // ------- 73 + 74 + let session, wn 75 + 76 + 77 + taskPorts.fromFission = async ({ fileName }) => { 78 + await constructFission() 79 + 80 + const path = wn.path.appData(APP_INFO, wn.path.file(fileName)) 81 + 82 + return await session.fs.exists(path) 83 + ? session.fs.read(path) 84 + .then(bytes => new TextDecoder().decode(bytes)) 85 + .then(parseJsonIfNeeded) 86 + : null 87 + } 88 + 89 + 90 + taskPorts.toFission = async ({ data, fileName }) => { 91 + await constructFission() 92 + 93 + const json = JSON.stringify(data) 94 + 95 + await session.fs.write( 96 + wn.path.appData(APP_INFO, wn.path.file(fileName)), 97 + new TextEncoder().encode(json) 98 + ) 99 + 100 + await session.fs.publish() 101 + } 102 + 103 + 104 + async function constructFission() { 105 + if (session) return Promise.resolve() 106 + 107 + importScripts("vendor/webnative.min.js") 108 + 109 + wn = (self as any).webnative 110 + 111 + const program = await wn.program({ 112 + ...WEBNATIVE_CONFIG, 113 + fileSystem: { loadImmediately: false } 114 + }) 115 + 116 + session = program.session 117 + session.fs = await program.loadFileSystem(session.username) 118 + 119 + if (!session) throw new Error("Failed to load Webnative session") 120 + if (!session.fs) throw new Error("Did not load Webnative file system") 121 + } 122 + 123 + 124 + ports.deconstructFission = _app => _ => { 125 + if (!session) return 126 + session.destroy() 127 + session = undefined 128 + wn = undefined 129 + } 130 + 131 + 132 + 133 + // IPFS 134 + // ---- 135 + 136 + const IPFS_ROOT = "/Applications/Diffuse/" 137 + 138 + 139 + taskPorts.fromIpfs = ({ apiOrigin, fileName }) => { 140 + const path = IPFS_ROOT + fileName 141 + 142 + fetch(apiOrigin + "/api/v0/files/read?arg=" + encodeURIComponent(path), { method: "POST" }) 143 + .then(r => r.ok ? r.text() : r.json()) 144 + .then(r => r.Code === 0 ? null : r) 145 + .then(decryptIfNeeded) 146 + .then(parseJsonIfNeeded) 147 + } 148 + 149 + 150 + taskPorts.toIpfs = ({ apiOrigin, fileName, data }) => { 151 + const json = JSON.stringify(data) 152 + const params = new URLSearchParams({ 153 + arg: IPFS_ROOT + fileName, 154 + create: "true", 155 + offset: "0", 156 + parents: "true", 157 + truncate: "true" 158 + }).toString() 159 + 160 + return encryptIfPossible(json).then(possiblyEncryptedData => { 161 + const formData = new FormData() 162 + 163 + formData.append("data", possiblyEncryptedData) 164 + 165 + return fetch( 166 + apiOrigin + "/api/v0/files/write?" + params, 167 + { method: "POST", body: formData } 168 + ) 169 + }) 170 + } 171 + 172 + 173 + 174 + // Remote Storage 175 + // -------------- 176 + 177 + let rs 178 + let rsClient 179 + 180 + 181 + function remoteStorage(userAddress: string, token: string) { 182 + if (!rs) { 183 + importScripts("vendor/remotestorage.min.js") 184 + 185 + rs = new (self as any).RemoteStorage({ cache: false }) 186 + rs.access.claim("diffuse", "rw") 187 + 188 + rsClient = rs.scope("/diffuse/") 189 + 190 + return new Promise(resolve => { 191 + rs.on("connected", resolve) 192 + rs.connect(userAddress, token) 193 + }) 194 + 195 + } else { 196 + return Promise.resolve() 197 + 198 + } 199 + } 200 + 201 + 202 + ports.deconstructRemoteStorage = _app => _ => { 203 + rs = null 204 + rsClient = null 205 + } 206 + 207 + 208 + taskPorts.fromRemoteStorage = ({ fileName, userAddress, token }) => { 209 + return remoteStorage(userAddress, token) 210 + .then(_ => rsClient.getFile(fileName)) 211 + .then(r => r.data) 212 + .then(decryptIfNeeded) 213 + .then(parseJsonIfNeeded) 214 + } 215 + 216 + 217 + taskPorts.toRemoteStorage = ({ data, fileName, userAddress, token }) => { 218 + const json = JSON.stringify(data) 219 + 220 + return remoteStorage(userAddress, token) 221 + .then(_ => encryptIfPossible(json)) 222 + .then(data => rsClient.storeFile("application/json", fileName, data)) 223 + } 224 + 225 + 226 + 227 + // EXPORT 228 + // ====== 229 + 230 + export function setupPorts(app) { 231 + Object.keys(ports).forEach(name => { 232 + const fn = ports[ name ](app) 233 + app.ports[ name ].subscribe(fn) 234 + }) 235 + } 236 + 237 + export function setupTaskPorts() { 238 + Object.keys(taskPorts).forEach(name => { 239 + const fn = taskPorts[ name ] 240 + TaskPort.register(name, fn) 241 + }) 242 + }
+8 -7
src/Javascript/common.js
··· 3 3 // ʕ•ᴥ•ʔ 4 4 5 5 6 - export const WEBNATIVE_STAGING_MODE = ( 7 - location.host === "localhost:8000" 8 - ) 6 + export const APP_INFO = { 7 + creator: "icidasset", 8 + name: "Diffuse" 9 + } 9 10 10 11 11 - export const WEBNATIVE_STAGING_ENV = { 12 - api: "https://runfission.net", 13 - lobby: "https://auth.runfission.net", 14 - user: "fissionuser.net" 12 + export const WEBNATIVE_CONFIG = { 13 + namespace: APP_INFO, 14 + permissions: { app: APP_INFO }, 15 + debug: true, 15 16 } 16 17 17 18
+45 -37
src/Javascript/index.js
··· 15 15 import * as audioEngine from "./audio-engine" 16 16 import * as db from "./indexed-db" 17 17 import { version } from '../../package.json' 18 - import { WEBNATIVE_STAGING_ENV, WEBNATIVE_STAGING_MODE, debounce, fileExtension } from "./common" 18 + import { debounce, fileExtension, WEBNATIVE_CONFIG } from "./common" 19 19 import { transformUrl } from "./urls" 20 20 21 21 ··· 116 116 117 117 // Other ports 118 118 app.ports.openUrlOnNewPage.subscribe(url => { 119 - if (__TAURI__) { 119 + if (self.__TAURI__) { 120 120 __TAURI__.shell.open( 121 121 url.includes("://") ? url : `${location.origin}/${url.replace(/^\.\//, "")}` 122 122 ) ··· 331 331 332 332 function setRepeat(repeat) { 333 333 orchestrion.repeat = repeat 334 - } 335 - 336 - 337 - 338 - // Authentication 339 - // -------------- 340 - 341 - let wn 342 - 343 - 344 - wire.webnative = () => { 345 - app.ports.webnativeRequest.subscribe(request => { 346 - loadWebnative().then(() => { 347 - self.webnativeElm.request({ app: app, request: request }) 348 - }) 349 - }) 350 - } 351 - 352 - 353 - function loadWebnative() { 354 - if (wn) return Promise.resolve() 355 - 356 - return loadScript("vendor/webnative.min.js") 357 - .then(() => loadScript("vendor/webnative-elm.min.js")) 358 - .then(() => { 359 - wn = window.webnative 360 - 361 - if ([ "localhost", "nightly.diffuse.sh" ].includes(location.hostname)) { 362 - wn.setup.debug({ enabled: true }) 363 - } 364 - 365 - if (WEBNATIVE_STAGING_MODE) { 366 - wn.setup.endpoints(WEBNATIVE_STAGING_ENV) 367 - } 368 - }) 369 334 } 370 335 371 336 ··· 944 909 reg.update() 945 910 setInterval(() => reg.update(), 1 * 1000 * 60 * 60) 946 911 } 912 + } 913 + 914 + 915 + 916 + // Syncing 917 + // ------- 918 + 919 + let wn 920 + 921 + 922 + wire.webnative = () => { 923 + app.ports.authenticateWithFission.subscribe(async () => { 924 + const program = await webnativeProgram() 925 + await program.capabilities.request({ 926 + returnUrl: location.origin + "?action=authenticate/fission" 927 + }) 928 + }) 929 + 930 + app.ports.collectFissionCapabilities.subscribe(async () => { 931 + // Webnative should collect the capabilities for us, 932 + // if everything is valid, we'll receive a session. 933 + const program = await webnativeProgram() 934 + app.ports.collectedFissionCapabilities.send(null) 935 + }) 936 + } 937 + 938 + 939 + 940 + async function webnativeProgram() { 941 + await loadWebnative() 942 + 943 + return wn.program({ 944 + ...WEBNATIVE_CONFIG, 945 + fileSystem: { loadImmediately: false } 946 + }) 947 + } 948 + 949 + 950 + async function loadWebnative() { 951 + if (wn) return 952 + 953 + await loadScript("vendor/webnative.min.js") 954 + wn = window.webnative 947 955 } 948 956 949 957
+1 -1
src/Javascript/processing.js
··· 36 36 return col.concat(r) 37 37 38 38 }).catch(e => { 39 - console.error(e) 39 + console.warn(e) 40 40 return col.concat(null) 41 41 42 42 })
+15 -28
src/Library/Alien.elm
··· 24 24 25 25 26 26 type Tag 27 - = AuthAnonymous 28 - | AuthDropbox 29 - | AuthFission 30 - | AuthEnclosedData 31 - | AuthIpfs 32 - | AuthMethod 33 - | AuthRemoteStorage 34 - | AuthSecretKey 35 - | FabricateSecretKey 27 + = EnclosedData 36 28 | SearchTracks 29 + | SecretKey 30 + | SyncLocal 31 + | SyncMethod 37 32 ----------------------------------------- 38 33 -- from UI 39 34 ----------------------------------------- 40 35 | DownloadTracks 41 - | ImportLegacyData 42 36 | ProcessSources 43 37 | RefreshedAccessToken 44 38 | RemoveEncryptionKey ··· 51 45 | SaveSettings 52 46 | SaveSources 53 47 | SaveTracks 54 - | SignIn 55 - | SignOut 48 + | SetSyncMethod 56 49 | StopProcessing 57 50 | StoreTracksInCache 58 51 | SyncHypaethralData 59 52 | SyncTrackTags 60 53 | ToCache 54 + | UnsetSyncMethod 61 55 | UpdateEncryptionKey 62 56 ----------------------------------------- 63 57 -- to UI ··· 65 59 | AddTracks 66 60 | FinishedProcessingSource 67 61 | FinishedProcessingSources 62 + | FinishedSyncing 68 63 | GotCachedCover 69 64 | HideLoadingScreen 70 65 | LoadEnclosedUserData 71 66 | LoadHypaethralUserData 72 - | MissingSecretKey 73 - | NotAuthenticated 74 67 | ReloadTracks 75 68 | RemoveTracksByPath 76 69 | ReportError 77 70 | ReportProcessingError 78 71 | ReportProcessingProgress 72 + | StartedSyncing 79 73 | UpdateSourceData 80 74 81 75 82 76 enum : Enum Tag 83 77 enum = 84 78 Enum.create 85 - [ ( "AUTH_ANONYMOUS", AuthAnonymous ) 86 - , ( "AUTH_DROPBOX", AuthDropbox ) 87 - , ( "AUTH_ENCLOSED_DATA", AuthEnclosedData ) 88 - , ( "AUTH_FISSION", AuthFission ) 89 - , ( "AUTH_IPFS", AuthIpfs ) 90 - , ( "AUTH_METHOD", AuthMethod ) 91 - , ( "AUTH_REMOTE_STORAGE", AuthRemoteStorage ) 92 - , ( "AUTH_SECRET_KEY", AuthSecretKey ) 93 - , ( "FABRICATE_SECRET_KEY", FabricateSecretKey ) 79 + [ ( "ENCLOSED_DATA", EnclosedData ) 94 80 , ( "SEARCH_TRACKS", SearchTracks ) 81 + , ( "SECRET_KEY", SecretKey ) 82 + , ( "SYNC_LOCAL", SyncLocal ) 83 + , ( "SYNC_METHOD", SyncMethod ) 95 84 96 85 ----------------------------------------- 97 86 -- From UI 98 87 ----------------------------------------- 99 88 , ( "DOWNLOAD_TRACKS", DownloadTracks ) 100 - , ( "IMPORT_LEGACY_DATA", ImportLegacyData ) 101 89 , ( "PROCESS_SOURCES", ProcessSources ) 102 90 , ( "REFRESHED_ACCESS_TOKEN", RefreshedAccessToken ) 103 91 , ( "REMOVE_ENCRYPTION_KEY", RemoveEncryptionKey ) ··· 110 98 , ( "SAVE_SETTINGS", SaveSettings ) 111 99 , ( "SAVE_SOURCES", SaveSources ) 112 100 , ( "SAVE_TRACKS", SaveTracks ) 113 - , ( "SIGN_IN", SignIn ) 114 - , ( "SIGN_OUT", SignOut ) 101 + , ( "SET_SYNC_METHOD", SetSyncMethod ) 115 102 , ( "STOP_PROCESSING", StopProcessing ) 116 103 , ( "STORE_TRACKS_IN_CACHE", StoreTracksInCache ) 117 104 , ( "SYNC_HYPAETHRAL_DATA", SyncHypaethralData ) 118 105 , ( "SYNC_TRACK_TAGS", SyncTrackTags ) 119 106 , ( "TO_CACHE", ToCache ) 107 + , ( "UNSET_SYNC_METHOD", UnsetSyncMethod ) 120 108 , ( "UPDATE_ENCRYPTION_KEY", UpdateEncryptionKey ) 121 109 122 110 ----------------------------------------- ··· 129 117 , ( "HIDE_LOADING_SCREEN", HideLoadingScreen ) 130 118 , ( "LOAD_ENCLOSED_USER_DATA", LoadEnclosedUserData ) 131 119 , ( "LOAD_HYPAETHRAL_USER_DATA", LoadHypaethralUserData ) 132 - , ( "MISSING_SECRET_KEY", MissingSecretKey ) 133 - , ( "NOT_AUTHENTICATED", NotAuthenticated ) 134 120 , ( "RELOAD_TRACKS", ReloadTracks ) 135 121 , ( "REMOVE_TRACKS_BY_PATH", RemoveTracksByPath ) 136 122 , ( "REPORT_ERROR", ReportError ) 137 123 , ( "REPORT_PROCESSING_ERROR", ReportProcessingError ) 138 124 , ( "REPORT_PROCESSING_PROGRESS", ReportProcessingProgress ) 125 + , ( "STARTED_SYNCING", StartedSyncing ) 139 126 , ( "UPDATE_SOURCE_DATA", UpdateSourceData ) 140 127 ] 141 128
+122
src/Library/Syncing.elm
··· 1 + module Syncing exposing (..) 2 + 3 + import Json.Decode as Decode 4 + import Json.Encode as Json 5 + import Maybe.Extra as Maybe 6 + import Task exposing (Task) 7 + import Task.Extra as Task 8 + import Time 9 + import User.Layer as User exposing (..) 10 + 11 + 12 + {-| Syncs all hypaethral data. 13 + -} 14 + task : 15 + Task String a 16 + -> 17 + { localData : HypaethralData 18 + , saveLocal : HypaethralBit -> Decode.Value -> Task String () 19 + } 20 + -> 21 + { retrieve : HypaethralBit -> Task String (Maybe Decode.Value) 22 + , save : HypaethralBit -> Decode.Value -> Task String () 23 + } 24 + -> Task String (Maybe HypaethralData) 25 + task initialTask { localData, saveLocal } { retrieve, save } = 26 + -- 1. Check if any existing data is present on the service to sync with. 27 + -- 2. If not, copy over all current data (in memory) to that service. 28 + -- If so: 👇 29 + -- 3. If no data is present locally then just load the remote data (ie. service data) 30 + -- No data = no sources, favourites & playlists 31 + -- If so: 👇 32 + -- 4. Compare modifiedAt timestamps 33 + -- (if no remote timestamp is available try to calculate it based on the data, progress → favourites → playlists → tracks → sources) 34 + -- If remote is newer: Load remote data 35 + -- Otherwise: 👇 36 + -- 5. Load remote data and run merge function for each type of data (sources, tracks, etc.) 37 + -- 6. Store merged data into memory 38 + -- 7. Overwrite remote data 39 + -- 40 + -- 🏝️ LOCAL 41 + -- 🛰️ REMOTE 42 + let 43 + noLocalData = 44 + List.isEmpty localData.sources 45 + && List.isEmpty localData.favourites 46 + && List.isEmpty localData.playlists 47 + 48 + pushLocalToRemote { return } = 49 + localData 50 + |> User.encodedHypaethralDataList 51 + |> List.map (\( bit, data ) -> save bit data) 52 + |> Task.sequence 53 + |> Task.map (\_ -> return) 54 + 55 + saveLocally data = 56 + data 57 + |> User.saveHypaethralData saveLocal 58 + |> Task.map (\_ -> Just data) 59 + in 60 + initialTask 61 + |> Task.andThen 62 + (\_ -> 63 + User.retrieveHypaethralData retrieve 64 + ) 65 + |> Task.andThen 66 + (\list -> 67 + let 68 + remoteHasExistingData = 69 + List.any (Tuple.second >> Maybe.isJust) list 70 + in 71 + if remoteHasExistingData then 72 + -- 🛰️ 73 + Task.succeed list 74 + 75 + else 76 + -- 🏝️ → 🛰️ 77 + pushLocalToRemote { return = list } 78 + ) 79 + |> Task.andThen 80 + (\list -> 81 + -- Decode remote 82 + list 83 + |> List.map (\( a, b ) -> ( hypaethralBitKey a, Maybe.withDefault Json.null b )) 84 + |> Json.object 85 + |> User.decodeHypaethralData 86 + |> Task.fromResult 87 + |> Task.mapError Decode.errorToString 88 + ) 89 + |> Task.andThen 90 + (\remoteData -> 91 + -- Compare modifiedAt timestamps 92 + case ( remoteData.modifiedAt, localData.modifiedAt ) of 93 + ( Just remoteModifiedAt, Just localModifiedAt ) -> 94 + if Time.posixToMillis remoteModifiedAt == Time.posixToMillis localModifiedAt then 95 + -- 🏝️ 96 + Task.succeed Nothing 97 + 98 + else if Time.posixToMillis remoteModifiedAt > Time.posixToMillis localModifiedAt then 99 + -- 🛰️ 100 + saveLocally remoteData 101 + 102 + else 103 + -- 🏝️ 104 + pushLocalToRemote { return = Nothing } 105 + 106 + ( Just _, Nothing ) -> 107 + -- 🛰️ 108 + saveLocally remoteData 109 + 110 + ( Nothing, Just _ ) -> 111 + -- 🏝️ 112 + pushLocalToRemote { return = Nothing } 113 + 114 + _ -> 115 + if noLocalData then 116 + -- 🛰️ 117 + saveLocally remoteData 118 + 119 + else 120 + -- 🏝️ 121 + Task.succeed Nothing 122 + )
+11
src/Library/Syncing/Services/Dropbox.elm
··· 1 + module Syncing.Services.Dropbox exposing (..) 2 + 3 + import Syncing.Services.Dropbox.Token as Token 4 + 5 + 6 + 7 + -- PREPARATION 8 + 9 + 10 + prepare = 11 + Token.isExpired
+18
src/Library/Syncing/Services/Dropbox/Token.elm
··· 1 + module Syncing.Services.Dropbox.Token exposing (..) 2 + 3 + import Time 4 + 5 + 6 + isExpired : { currentTime : Time.Posix, expiresAt : Int } -> Bool 7 + isExpired { currentTime, expiresAt } = 8 + let 9 + currentTimeInSeconds = 10 + Time.posixToMillis currentTime // 1000 11 + 12 + currentTimeWithOffset = 13 + -- We add 60 seconds here because we only get the current time every minute, 14 + -- so there's always the chance the "current time" is 1-60 seconds behind. 15 + currentTimeInSeconds + 60 16 + in 17 + -- If the access token is expired 18 + currentTimeWithOffset >= expiresAt
+11 -1
src/Library/Task/Extra.elm
··· 1 - module Task.Extra exposing (do, doDelayed) 1 + module Task.Extra exposing (do, doDelayed, fromResult) 2 2 3 3 import Process 4 4 import Task ··· 16 16 doDelayed : Float -> msg -> Cmd msg 17 17 doDelayed delay msg = 18 18 Task.perform (always msg) (Process.sleep delay) 19 + 20 + 21 + fromResult : Result error value -> Task.Task error value 22 + fromResult result = 23 + case result of 24 + Ok v -> 25 + Task.succeed v 26 + 27 + Err e -> 28 + Task.fail e
+18
src/Library/TaskPort/Extra.elm
··· 1 + module TaskPort.Extra exposing (..) 2 + 3 + import TaskPort 4 + 5 + 6 + errorToStringCustom : TaskPort.Error -> String 7 + errorToStringCustom err = 8 + case err of 9 + TaskPort.JSError jsErr -> 10 + case jsErr of 11 + TaskPort.ErrorObject _ errRecord -> 12 + errRecord.message 13 + 14 + TaskPort.ErrorValue _ -> 15 + TaskPort.errorToString err 16 + 17 + TaskPort.InteropError _ -> 18 + TaskPort.errorToString err
+3
src/Library/Url/Ext.elm
··· 37 37 [ k, v ] -> 38 38 Just ( k, v ) 39 39 40 + k :: v -> 41 + Just ( k, String.join "=" v ) 42 + 40 43 _ -> 41 44 Nothing 42 45 )
+213 -61
src/Library/User/Layer.elm
··· 22 22 import Json.Decode.Ext as Json 23 23 import Json.Decode.Pipeline exposing (optional) 24 24 import Json.Encode 25 + import List.Extra as List 25 26 import Maybe.Extra as Maybe 26 27 import Playlists 27 28 import Playlists.Encoding as Playlists 28 29 import Settings 29 30 import Sources 30 31 import Sources.Encoding as Sources 32 + import Task exposing (Task) 33 + import Time 34 + import Time.Ext as Time 31 35 import Tracks 32 36 import Tracks.Encoding as Tracks 33 37 ··· 38 42 39 43 type Method 40 44 = Dropbox { accessToken : String, expiresAt : Int, refreshToken : String } 41 - | Fission { initialised : Bool } 45 + | Fission {} 42 46 | Ipfs { apiOrigin : String } 43 - | Local 44 47 | RemoteStorage { userAddress : String, token : String } 45 48 46 49 47 - methodSupportsPublicData : Method -> Bool 48 - methodSupportsPublicData method = 49 - case method of 50 - Dropbox _ -> 51 - False 50 + dropboxMethod : Method 51 + dropboxMethod = 52 + Dropbox { accessToken = "", expiresAt = 0, refreshToken = "" } 53 + 54 + 55 + fissionMethod : Method 56 + fissionMethod = 57 + Fission {} 52 58 53 - Fission _ -> 54 - -- NOTE: Temporarily disabled, 55 - -- since we don't actually support public playlists yet. 56 - False 57 59 58 - Ipfs _ -> 59 - False 60 + ipfsMethod : Method 61 + ipfsMethod = 62 + Ipfs { apiOrigin = "https://ipfs.io" } 60 63 61 - Local -> 62 - False 63 64 64 - RemoteStorage _ -> 65 - False 65 + remoteStorageMethod : Method 66 + remoteStorageMethod = 67 + RemoteStorage { userAddress = "", token = "" } 66 68 67 69 68 70 ··· 111 113 , settings : Maybe Settings.Settings 112 114 , sources : List Sources.Source 113 115 , tracks : List Tracks.Track 116 + 117 + -- 118 + , modifiedAt : Maybe Time.Posix 114 119 } 115 120 116 121 ··· 136 141 methodToString >> Json.Encode.string 137 142 138 143 144 + methodName : Method -> String 145 + methodName method = 146 + case method of 147 + Dropbox _ -> 148 + "Dropbox" 149 + 150 + Fission _ -> 151 + "Fission" 152 + 153 + Ipfs _ -> 154 + "IPFS (using MFS)" 155 + 156 + RemoteStorage _ -> 157 + "Remote Storage" 158 + 159 + 139 160 methodFromString : String -> Maybe Method 140 161 methodFromString string = 141 162 case String.split methodSeparator string of ··· 149 170 ) 150 171 151 172 [ "FISSION" ] -> 152 - Just (Fission { initialised = False }) 173 + Just (Fission {}) 153 174 154 175 [ "IPFS", a ] -> 155 176 Just (Ipfs { apiOrigin = a }) 156 - 157 - [ "LOCAL" ] -> 158 - Just Local 159 177 160 178 [ "REMOTE_STORAGE", u, t ] -> 161 179 Just (RemoteStorage { userAddress = u, token = t }) ··· 186 204 , apiOrigin 187 205 ] 188 206 189 - Local -> 190 - "LOCAL" 191 - 192 207 RemoteStorage { userAddress, token } -> 193 208 String.join 194 209 methodSeparator ··· 203 218 "___" 204 219 205 220 221 + methodSupportsPublicData : Method -> Bool 222 + methodSupportsPublicData method = 223 + case method of 224 + Dropbox _ -> 225 + False 226 + 227 + Fission _ -> 228 + -- NOTE: Temporarily disabled, 229 + -- since we don't actually support public playlists yet. 230 + False 231 + 232 + Ipfs _ -> 233 + False 234 + 235 + RemoteStorage _ -> 236 + False 237 + 238 + 206 239 207 240 -- 🔱 ░░ ENCLOSED 208 241 ··· 251 284 -- 🔱 ░░ HYPAETHRAL 252 285 253 286 287 + allHypaethralBits : List HypaethralBit 288 + allHypaethralBits = 289 + [ Favourites 290 + , Playlists 291 + , Progress 292 + , Settings 293 + , Sources 294 + , Tracks 295 + ] 296 + 297 + 254 298 decodeHypaethralData : Json.Value -> Result Json.Error HypaethralData 255 299 decodeHypaethralData = 256 300 Json.decodeValue hypaethralDataDecoder ··· 264 308 , settings = Nothing 265 309 , sources = [] 266 310 , tracks = [] 311 + 312 + -- 313 + , modifiedAt = Nothing 267 314 } 268 315 269 316 270 317 encodeHypaethralBit : HypaethralBit -> HypaethralData -> Json.Value 271 - encodeHypaethralBit bit { favourites, playlists, progress, settings, sources, tracks } = 272 - case bit of 273 - Favourites -> 274 - Json.Encode.list Tracks.encodeFavourite favourites 318 + encodeHypaethralBit bit { favourites, playlists, progress, settings, sources, tracks, modifiedAt } = 319 + Json.Encode.object 320 + [ ( "data" 321 + , case bit of 322 + Favourites -> 323 + Json.Encode.list Tracks.encodeFavourite favourites 275 324 276 - Playlists -> 277 - Json.Encode.list Playlists.encode playlists 325 + Playlists -> 326 + Json.Encode.list Playlists.encode playlists 278 327 279 - Progress -> 280 - Json.Encode.dict identity Json.Encode.float progress 328 + Progress -> 329 + Json.Encode.dict identity Json.Encode.float progress 281 330 282 - Settings -> 283 - Maybe.unwrap Json.Encode.null Settings.encode settings 331 + Settings -> 332 + Maybe.unwrap Json.Encode.null Settings.encode settings 284 333 285 - Sources -> 286 - Json.Encode.list Sources.encode sources 334 + Sources -> 335 + Json.Encode.list Sources.encode sources 287 336 288 - Tracks -> 289 - Json.Encode.list Tracks.encodeTrack tracks 337 + Tracks -> 338 + Json.Encode.list Tracks.encodeTrack tracks 339 + ) 340 + , ( "modifiedAt" 341 + , Maybe.unwrap Json.Encode.null Time.encode modifiedAt 342 + ) 343 + ] 290 344 291 345 292 346 encodeHypaethralData : HypaethralData -> Json.Value 293 347 encodeHypaethralData data = 294 - Json.Encode.object 295 - [ ( hypaethralBitKey Favourites, encodeHypaethralBit Favourites data ) 296 - , ( hypaethralBitKey Playlists, encodeHypaethralBit Playlists data ) 297 - , ( hypaethralBitKey Progress, encodeHypaethralBit Progress data ) 298 - , ( hypaethralBitKey Settings, encodeHypaethralBit Settings data ) 299 - , ( hypaethralBitKey Sources, encodeHypaethralBit Sources data ) 300 - , ( hypaethralBitKey Tracks, encodeHypaethralBit Tracks data ) 301 - ] 348 + data 349 + |> encodedHypaethralDataList 350 + |> List.map (Tuple.mapFirst hypaethralBitKey) 351 + |> Json.Encode.object 352 + 353 + 354 + encodedHypaethralDataList : HypaethralData -> List ( HypaethralBit, Json.Value ) 355 + encodedHypaethralDataList data = 356 + List.map 357 + (\bit -> ( bit, encodeHypaethralBit bit data )) 358 + allHypaethralBits 302 359 303 360 304 361 hypaethralBit : Enum HypaethralBit 305 362 hypaethralBit = 306 - Enum.create 307 - [ ( hypaethralBitKey Favourites, Favourites ) 308 - , ( hypaethralBitKey Playlists, Playlists ) 309 - , ( hypaethralBitKey Progress, Progress ) 310 - , ( hypaethralBitKey Settings, Settings ) 311 - , ( hypaethralBitKey Sources, Sources ) 312 - , ( hypaethralBitKey Tracks, Tracks ) 313 - ] 363 + allHypaethralBits 364 + |> List.map (\bit -> ( hypaethralBitKey bit, bit )) 365 + |> Enum.create 314 366 315 367 316 368 hypaethralBitFileName : HypaethralBit -> String ··· 342 394 343 395 hypaethralDataDecoder : Json.Decoder HypaethralData 344 396 hypaethralDataDecoder = 345 - Json.succeed HypaethralData 346 - |> optional (hypaethralBitKey Favourites) (Json.listIgnore Tracks.favouriteDecoder) [] 347 - |> optional (hypaethralBitKey Playlists) (Json.listIgnore Playlists.decoder) [] 348 - |> optional (hypaethralBitKey Progress) (Json.dict Json.float) Dict.empty 349 - |> optional (hypaethralBitKey Settings) (Json.maybe Settings.decoder) Nothing 350 - |> optional (hypaethralBitKey Sources) (Json.listIgnore Sources.decoder) [] 351 - |> optional (hypaethralBitKey Tracks) (Json.listIgnore Tracks.trackDecoder) [] 397 + let 398 + optionalWithPossiblyData key dec def a = 399 + optional 400 + (hypaethralBitKey key) 401 + (Json.oneOf [ modifiedAtDecoder dec, noModifiedAt dec ]) 402 + { data = def, modifiedAt = Nothing } 403 + a 404 + in 405 + (\fav pla pro set sor tra -> 406 + { favourites = fav.data 407 + , playlists = pla.data 408 + , progress = pro.data 409 + , settings = set.data 410 + , sources = sor.data 411 + , tracks = tra.data 412 + 413 + -- 414 + , modifiedAt = 415 + [ fav.modifiedAt 416 + , pla.modifiedAt 417 + , pro.modifiedAt 418 + , set.modifiedAt 419 + , sor.modifiedAt 420 + , tra.modifiedAt 421 + ] 422 + |> List.filterMap (Maybe.map Time.posixToMillis) 423 + |> List.sort 424 + |> List.last 425 + |> Maybe.map Time.millisToPosix 426 + } 427 + ) 428 + |> Json.succeed 429 + |> optionalWithPossiblyData Favourites (Json.listIgnore Tracks.favouriteDecoder) [] 430 + |> optionalWithPossiblyData Playlists (Json.listIgnore Playlists.decoder) [] 431 + |> optionalWithPossiblyData Progress (Json.dict Json.float) Dict.empty 432 + |> optionalWithPossiblyData Settings (Json.maybe Settings.decoder) Nothing 433 + |> optionalWithPossiblyData Sources (Json.listIgnore Sources.decoder) [] 434 + |> optionalWithPossiblyData Tracks (Json.listIgnore Tracks.trackDecoder) [] 435 + 436 + 437 + 438 + -- merge : HypaethralData -> HypaethralData -> HypaethralData 439 + -- merge a b = 440 + -- { favourites = List.unique (a.favourites ++ b.favourites) 441 + -- , playlists = List.unique (a.playlists ++ b.playlists) 442 + -- , progress = List.unique (a.progress ++ b.progress) 443 + -- , settings = List.unique (a.settings ++ b.settings) 444 + -- , sources = List.unique (a.sources ++ b.sources) 445 + -- , tracks = List.unique (a.tracks ++ b.tracks) 446 + -- -- 447 + -- , modifiedAt = 448 + -- case ( a.modifiedAt, b.modifiedAt ) of 449 + -- ( Just am, Just bm ) -> 450 + -- if Time.posixToMillis am > Time.posixToMillis bm then 451 + -- Just am 452 + -- else 453 + -- Just bm 454 + -- ( Just am, Nothing ) -> 455 + -- Just am 456 + -- ( Nothing, Just bm ) -> 457 + -- Just bm 458 + -- ( Nothing, Nothing ) -> 459 + -- Nothing 460 + -- } 461 + 462 + 463 + modifiedAtDecoder : Json.Decoder a -> Json.Decoder { data : a, modifiedAt : Maybe Time.Posix } 464 + modifiedAtDecoder decoder = 465 + Json.map2 466 + (\d m -> { data = d, modifiedAt = m }) 467 + (Json.field "data" decoder) 468 + (Json.maybe <| Json.field "modifiedAt" Time.decoder) 469 + 470 + 471 + noModifiedAt : Json.Decoder a -> Json.Decoder { data : a, modifiedAt : Maybe Time.Posix } 472 + noModifiedAt = 473 + Json.map 474 + (\data -> 475 + { data = data 476 + , modifiedAt = Nothing 477 + } 478 + ) 352 479 353 480 354 481 putHypaethralJsonBitsTogether : List ( HypaethralBit, Json.Value, HypaethralBaggage ) -> Json.Value ··· 356 483 bits 357 484 |> List.map (\( a, b, _ ) -> ( hypaethralBitKey a, b )) 358 485 |> Json.Encode.object 486 + 487 + 488 + retrieveHypaethralData : (HypaethralBit -> Task x (Maybe Json.Value)) -> Task x (List ( HypaethralBit, Maybe Json.Encode.Value )) 489 + retrieveHypaethralData retrievalFn = 490 + hypaethralBit.list 491 + |> List.map 492 + (\( _, bit ) -> 493 + bit 494 + |> retrievalFn 495 + |> Task.map (\value -> ( bit, value )) 496 + ) 497 + |> Task.sequence 498 + 499 + 500 + saveHypaethralData : (HypaethralBit -> Json.Value -> Task x ()) -> HypaethralData -> Task x () 501 + saveHypaethralData saveFn data = 502 + hypaethralBit.list 503 + |> List.map 504 + (\( _, bit ) -> 505 + data 506 + |> encodeHypaethralBit bit 507 + |> saveFn bit 508 + ) 509 + |> Task.sequence 510 + |> Task.map (always ()) 359 511 360 512 361 513
-339
src/Library/User/Layer/Methods/Fission.elm
··· 1 - module User.Layer.Methods.Fission exposing (..) 2 - 3 - import Json.Decode as Decode 4 - import Json.Encode as Json 5 - import User.Layer exposing (HypaethralBaggage(..), HypaethralBit, mapPlaylistsBaggage) 6 - import Webnative exposing (Artifact(..), DecodedResponse(..), NoArtifact(..)) 7 - import Webnative.Constants exposing (..) 8 - import Webnative.Path as Path exposing (File, Path) 9 - import Webnative.Tag as Tag exposing (Step(..), Tag(..)) 10 - import Wnfs exposing (Artifact(..)) 11 - 12 - 13 - 14 - -- 🌳 15 - 16 - 17 - type Proceedings 18 - = Error String 19 - | Hypaethral Json.Value 20 - | LoadedFileSystem 21 - | Ongoing HypaethralBaggage Webnative.Request 22 - | OtherRequest Webnative.Request 23 - | SaveNextHypaethralBit 24 - | Stopping 25 - 26 - 27 - 28 - -- ⛰ 29 - 30 - 31 - playlistPath : String -> Path File 32 - playlistPath name = 33 - playlistsPath 34 - |> Path.unwrap 35 - |> (\p -> p ++ [ name ++ ".json" ]) 36 - |> Path.file 37 - 38 - 39 - 40 - -- ⛵️ 41 - 42 - 43 - proceed : Webnative.Response -> HypaethralBaggage -> Proceedings 44 - proceed response baggage = 45 - case Webnative.decodeResponse Tag.fromString response of 46 - Webnative (Webnative.NoArtifact LoadedFileSystemManually) -> 47 - LoadedFileSystem 48 - 49 - ----------------------------------------- 50 - -- (1) Public Playlists 51 - ----------------------------------------- 52 - --------------------- 53 - -- Directory Exists - 54 - --------------------- 55 - Wnfs (LoadPlaylists PublicPlaylistsDirectoryExists) (Boolean True) -> 56 - { path = playlistsPath 57 - , tag = Tag.toString (LoadPlaylists PublicPlaylistsDirectoryListed) 58 - } 59 - |> Wnfs.ls Wnfs.Public 60 - |> Ongoing baggage 61 - 62 - Wnfs (LoadPlaylists PublicPlaylistsDirectoryExists) (Boolean False) -> 63 - { path = playlistsPath 64 - , tag = Tag.toString (LoadPlaylists PrivatePlaylistsDirectoryListed) 65 - } 66 - |> Wnfs.ls Wnfs.Private 67 - |> Ongoing baggage 68 - 69 - --------- 70 - -- List - 71 - --------- 72 - Wnfs (LoadPlaylists PublicPlaylistsDirectoryListed) (DirectoryContent listing) -> 73 - baggage 74 - |> ensurePlaylistsBaggage 75 - |> mapPlaylistsBaggage 76 - (\b -> { b | publicPlaylistsTodo = List.map .name listing }) 77 - |> readPublicPlaylistOrMoveOn 78 - 79 - --------- 80 - -- Read - 81 - --------- 82 - Wnfs (LoadPlaylists PublicPlaylistRead) (Utf8Content json) -> 83 - baggage 84 - |> mapPlaylistsBaggage 85 - (\b -> 86 - case Decode.decodeString Decode.value json of 87 - Ok value -> 88 - { b | publicPlaylistsRead = value :: b.publicPlaylistsRead } 89 - 90 - Err _ -> 91 - b 92 - ) 93 - |> readPublicPlaylistOrMoveOn 94 - 95 - ----------------------------------------- 96 - -- (2) Private Playlists 97 - ----------------------------------------- 98 - --------------------- 99 - -- Directory Exists - 100 - --------------------- 101 - Wnfs (LoadPlaylists PrivatePlaylistsDirectoryExists) (Boolean True) -> 102 - { path = playlistsPath 103 - , tag = Tag.toString (LoadPlaylists PrivatePlaylistsDirectoryListed) 104 - } 105 - |> Wnfs.ls Wnfs.Private 106 - |> Ongoing baggage 107 - 108 - Wnfs (LoadPlaylists PrivatePlaylistsDirectoryExists) (Boolean False) -> 109 - finalisePlaylists baggage 110 - 111 - --------- 112 - -- List - 113 - --------- 114 - Wnfs (LoadPlaylists PrivatePlaylistsDirectoryListed) (DirectoryContent listing) -> 115 - baggage 116 - |> ensurePlaylistsBaggage 117 - |> mapPlaylistsBaggage 118 - (\b -> { b | privatePlaylistsTodo = List.map .name listing }) 119 - |> readPrivatePlaylistOrMoveOn 120 - 121 - --------- 122 - -- Read - 123 - --------- 124 - Wnfs (LoadPlaylists PrivatePlaylistRead) (Utf8Content json) -> 125 - baggage 126 - |> mapPlaylistsBaggage 127 - (\b -> 128 - case Decode.decodeString Decode.value json of 129 - Ok value -> 130 - { b | privatePlaylistsRead = value :: b.privatePlaylistsRead } 131 - 132 - Err _ -> 133 - b 134 - ) 135 - |> readPrivatePlaylistOrMoveOn 136 - 137 - ----------------------------------------- 138 - -- Other 139 - ----------------------------------------- 140 - WnfsError (Wnfs.JavascriptError "Path does not exist") -> 141 - Hypaethral Json.null 142 - 143 - WnfsError err -> 144 - Error (Wnfs.error err) 145 - 146 - WebnativeError err -> 147 - Error (Webnative.error err) 148 - 149 - Wnfs GotHypaethralData (Utf8Content json) -> 150 - json 151 - |> Decode.decodeString Decode.value 152 - |> Result.map Hypaethral 153 - |> Result.withDefault Stopping 154 - 155 - Wnfs PublishedHypaethralData _ -> 156 - SaveNextHypaethralBit 157 - 158 - Wnfs WroteHypaethralData Wnfs.NoArtifact -> 159 - { tag = Tag.toString PublishedHypaethralData } 160 - |> Wnfs.publish 161 - |> OtherRequest 162 - 163 - _ -> 164 - Stopping 165 - 166 - 167 - 168 - -- 👀 169 - 170 - 171 - retrieve : { initialised : Bool } -> HypaethralBit -> String -> Webnative.Request 172 - retrieve { initialised } bit filename = 173 - if initialised then 174 - case bit of 175 - -- NOTE: Currently no custom logic for playlists, 176 - -- too many unsolved variables. 177 - -- 178 - -- Playlists -> 179 - -- Wnfs.exists 180 - -- Wnfs.Public 181 - -- { path = playlistsPath 182 - -- , tag = Tag.toString (LoadPlaylists PublicPlaylistsDirectoryExists) 183 - -- } 184 - _ -> 185 - Wnfs.readUtf8 186 - (Wnfs.AppData app) 187 - { path = Path.file [ filename ] 188 - , tag = Tag.toString GotHypaethralData 189 - } 190 - 191 - else 192 - Webnative.loadFileSystem permissions 193 - 194 - 195 - save : { initialised : Bool } -> HypaethralBit -> String -> Json.Value -> List Webnative.Request 196 - save { initialised } bit filename dataCollection = 197 - if initialised then 198 - case bit of 199 - -- TODO: Write each playlist to a file 200 - -- Not in use, because of concurrency issues with publish. 201 - -- https://github.com/fission-suite/webnative/issues/267 202 - -- Playlists -> 203 - -- dataCollection 204 - -- |> Decode.decodeValue (Decode.list Decode.value) 205 - -- |> Result.withDefault [] 206 - -- |> List.filterMap 207 - -- (\playlist -> 208 - -- playlist 209 - -- |> Decode.decodeValue 210 - -- (Decode.map2 211 - -- Tuple.pair 212 - -- (Decode.field "name" Decode.string) 213 - -- (Decode.field "public" Decode.bool) 214 - -- ) 215 - -- |> Result.toMaybe 216 - -- |> Maybe.map (Tuple.pair playlist) 217 - -- ) 218 - -- |> List.map 219 - -- (\( playlist, ( name, public ) ) -> 220 - -- Wnfs.writeUtf8 221 - -- (if public then 222 - -- Wnfs.Public 223 - -- 224 - -- else 225 - -- Wnfs.Private 226 - -- ) 227 - -- { path = playlistPath name 228 - -- , tag = Tag.toString WrotePlaylist 229 - -- } 230 - -- (Json.encode 0 playlist) 231 - -- ) 232 - -- |> (\list -> 233 - -- case list of 234 - -- [] -> 235 - -- [ Wnfs.publish { tag = Tag.toString PublishedHypaethralData } 236 - -- ] 237 - -- 238 - -- l -> 239 - -- l 240 - -- ) 241 - _ -> 242 - [ Wnfs.writeUtf8 243 - (Wnfs.AppData app) 244 - { path = Path.file [ filename ] 245 - , tag = Tag.toString WroteHypaethralData 246 - } 247 - (Json.encode 0 dataCollection) 248 - ] 249 - 250 - else 251 - [ Webnative.loadFileSystem permissions ] 252 - 253 - 254 - 255 - -- PLAYLISTS 256 - 257 - 258 - ensurePlaylistsBaggage : HypaethralBaggage -> HypaethralBaggage 259 - ensurePlaylistsBaggage baggage = 260 - case baggage of 261 - BaggageClaimed -> 262 - PlaylistsBaggage 263 - { publicPlaylistsRead = [] 264 - , publicPlaylistsTodo = [] 265 - , privatePlaylistsRead = [] 266 - , privatePlaylistsTodo = [] 267 - } 268 - 269 - b -> 270 - b 271 - 272 - 273 - finalisePlaylists : HypaethralBaggage -> Proceedings 274 - finalisePlaylists baggage = 275 - case baggage of 276 - PlaylistsBaggage { publicPlaylistsRead, privatePlaylistsRead } -> 277 - (publicPlaylistsRead ++ privatePlaylistsRead) 278 - |> Json.list identity 279 - |> Hypaethral 280 - 281 - _ -> 282 - Hypaethral Json.null 283 - 284 - 285 - 286 - -- PLAYLISTS ░░ PUBLIC 287 - 288 - 289 - readPublicPlaylistOrMoveOn : HypaethralBaggage -> Proceedings 290 - readPublicPlaylistOrMoveOn baggage = 291 - case baggage of 292 - PlaylistsBaggage b -> 293 - case b.publicPlaylistsTodo of 294 - [] -> 295 - checkPrivatePlaylistsDir baggage 296 - 297 - name :: rest -> 298 - { path = playlistPath (String.dropRight 5 name) 299 - , tag = Tag.toString (LoadPlaylists PublicPlaylistRead) 300 - } 301 - |> Wnfs.readUtf8 Wnfs.Public 302 - |> Ongoing 303 - (PlaylistsBaggage { b | publicPlaylistsTodo = rest }) 304 - 305 - _ -> 306 - checkPrivatePlaylistsDir baggage 307 - 308 - 309 - 310 - -- PLAYLISTS ░░ PRIVATE 311 - 312 - 313 - checkPrivatePlaylistsDir : HypaethralBaggage -> Proceedings 314 - checkPrivatePlaylistsDir baggage = 315 - { path = playlistsPath 316 - , tag = Tag.toString (LoadPlaylists PrivatePlaylistsDirectoryExists) 317 - } 318 - |> Wnfs.exists Wnfs.Private 319 - |> Ongoing baggage 320 - 321 - 322 - readPrivatePlaylistOrMoveOn : HypaethralBaggage -> Proceedings 323 - readPrivatePlaylistOrMoveOn baggage = 324 - case baggage of 325 - PlaylistsBaggage b -> 326 - case b.privatePlaylistsTodo of 327 - [] -> 328 - finalisePlaylists baggage 329 - 330 - name :: rest -> 331 - { path = playlistPath (String.dropRight 5 name) 332 - , tag = Tag.toString (LoadPlaylists PrivatePlaylistRead) 333 - } 334 - |> Wnfs.readUtf8 Wnfs.Private 335 - |> Ongoing 336 - (PlaylistsBaggage { b | privatePlaylistsTodo = rest }) 337 - 338 - _ -> 339 - finalisePlaylists baggage
+43 -9
src/Library/User/Layer/Methods/RemoteStorage.elm
··· 4 4 import Http 5 5 import Json.Decode as Decode exposing (Decoder) 6 6 import Url 7 + import UrlBase64 7 8 8 9 9 10 ··· 41 42 oauthAddress : { oauthOrigin : String, origin : String } -> Attributes -> String 42 43 oauthAddress { oauthOrigin, origin } { host, username } = 43 44 let 45 + hostWithoutProtocol = 46 + host 47 + |> String.split "://" 48 + |> List.drop 1 49 + |> List.head 50 + |> Maybe.withDefault host 51 + 44 52 ua = 45 - (username ++ "@" ++ host) 46 - |> Base64.encode 47 - |> Url.percentEncode 53 + (username ++ "@" ++ hostWithoutProtocol) 54 + |> UrlBase64.encode (Base64.encode >> Ok) 55 + |> Result.withDefault "BASE64_ENCODING_FAILED" 48 56 in 49 57 String.concat 50 58 [ oauthOrigin ··· 55 63 ] 56 64 57 65 58 - webfingerAddress : Attributes -> String 59 - webfingerAddress { host, username } = 60 - "https://" ++ host ++ "/.well-known/webfinger?resource=acct:" ++ username 66 + webfingerAddress : Url.Protocol -> Attributes -> String 67 + webfingerAddress originProtocol { host, username } = 68 + let 69 + fallbackProtocol = 70 + case originProtocol of 71 + Url.Http -> 72 + "http" 73 + 74 + Url.Https -> 75 + "https" 76 + 77 + protocol = 78 + if String.contains "://" host then 79 + host 80 + |> String.split "://" 81 + |> List.head 82 + |> Maybe.withDefault fallbackProtocol 83 + 84 + else 85 + fallbackProtocol 86 + 87 + hostWithoutProtocol = 88 + host 89 + |> String.split "://" 90 + |> List.drop 1 91 + |> List.head 92 + |> Maybe.withDefault host 93 + in 94 + protocol ++ "://" ++ hostWithoutProtocol ++ "/.well-known/webfinger?resource=acct:" ++ Url.percentEncode (username ++ "@" ++ hostWithoutProtocol) 61 95 62 96 63 97 webfingerDecoder : Decoder String ··· 71 105 Decode.string 72 106 73 107 74 - webfingerRequest : (Attributes -> Result Http.Error String -> msg) -> Attributes -> Cmd msg 75 - webfingerRequest toMsg rs = 108 + webfingerRequest : (Attributes -> Result Http.Error String -> msg) -> Url.Protocol -> Attributes -> Cmd msg 109 + webfingerRequest toMsg originProtocol rs = 76 110 Http.get 77 - { url = webfingerAddress rs 111 + { url = webfingerAddress originProtocol rs 78 112 , expect = Http.expectJson (toMsg rs) webfingerDecoder 79 113 }
-30
src/Library/Webnative/Constants.elm
··· 1 - module Webnative.Constants exposing (..) 2 - 3 - import Webnative 4 - import Webnative.Path as Path exposing (Directory, Path) 5 - 6 - 7 - permissions : Webnative.Permissions 8 - permissions = 9 - { app = Just app 10 - , fs = Just fs 11 - } 12 - 13 - 14 - app : Webnative.AppPermissions 15 - app = 16 - { creator = "icidasset" 17 - , name = "Diffuse" 18 - } 19 - 20 - 21 - fs : Webnative.FileSystemPermissions 22 - fs = 23 - { private = { directories = [ playlistsPath ], files = [] } 24 - , public = { directories = [ playlistsPath ], files = [] } 25 - } 26 - 27 - 28 - playlistsPath : Path Directory 29 - playlistsPath = 30 - Path.directory [ "Audio", "Music", "Playlists" ]
-109
src/Library/Webnative/Tag.elm
··· 1 - module Webnative.Tag exposing (..) 2 - 3 - import Enum 4 - 5 - 6 - 7 - -- 🌳 8 - 9 - 10 - type Tag 11 - = GotHypaethralData 12 - | PublishedHypaethralData 13 - | WroteHypaethralData 14 - ----------------------------------------- 15 - -- Flows 16 - ----------------------------------------- 17 - | LoadPlaylists Step 18 - 19 - 20 - type Step 21 - = ----------------------------------------- 22 - -- Playlists 23 - ----------------------------------------- 24 - PlaylistAdded 25 - | PlaylistRemoved 26 - | PrivatePlaylistsDirectoryCreated 27 - | PrivatePlaylistsDirectoryExists 28 - | PrivatePlaylistsDirectoryListed 29 - | PrivatePlaylistRead 30 - | PublicPlaylistsDirectoryCreated 31 - | PublicPlaylistsDirectoryExists 32 - | PublicPlaylistsDirectoryListed 33 - | PublicPlaylistRead 34 - 35 - 36 - 37 - -- 🛠 38 - 39 - 40 - fromString : String -> Result String Tag 41 - fromString = 42 - tagEnum.fromString >> Result.fromMaybe "Unknown tag" 43 - 44 - 45 - toString : Tag -> String 46 - toString = 47 - tagEnum.toString 48 - 49 - 50 - 51 - -- ENUMS 52 - 53 - 54 - tagEnum = 55 - [ GotHypaethralData 56 - , PublishedHypaethralData 57 - , WroteHypaethralData 58 - 59 - ----------------------------------------- 60 - -- Playlists 61 - ----------------------------------------- 62 - , LoadPlaylists PlaylistAdded 63 - , LoadPlaylists PlaylistRemoved 64 - , LoadPlaylists PrivatePlaylistsDirectoryCreated 65 - , LoadPlaylists PrivatePlaylistsDirectoryExists 66 - , LoadPlaylists PrivatePlaylistsDirectoryListed 67 - , LoadPlaylists PrivatePlaylistRead 68 - , LoadPlaylists PublicPlaylistsDirectoryCreated 69 - , LoadPlaylists PublicPlaylistsDirectoryExists 70 - , LoadPlaylists PublicPlaylistsDirectoryListed 71 - , LoadPlaylists PublicPlaylistRead 72 - ] 73 - |> List.map tagIterator 74 - |> Enum.create 75 - 76 - 77 - tagIterator tag = 78 - case tag of 79 - GotHypaethralData -> 80 - ( "GotHypaethralData", GotHypaethralData ) 81 - 82 - PublishedHypaethralData -> 83 - ( "PublishedHypaethralData", PublishedHypaethralData ) 84 - 85 - WroteHypaethralData -> 86 - ( "WroteHypaethralData", WroteHypaethralData ) 87 - 88 - ----------------------------------------- 89 - -- Flows 90 - ----------------------------------------- 91 - LoadPlaylists step -> 92 - ( "LoadPlaylists" ++ "_" ++ stepEnum.toString step 93 - , LoadPlaylists step 94 - ) 95 - 96 - 97 - stepEnum = 98 - Enum.create 99 - [ ( "PlaylistAdded", PlaylistAdded ) 100 - , ( "PlaylistRemoved", PlaylistRemoved ) 101 - , ( "PrivatePlaylistsDirectoryCreated", PrivatePlaylistsDirectoryCreated ) 102 - , ( "PrivatePlaylistsDirectoryExists", PrivatePlaylistsDirectoryExists ) 103 - , ( "PrivatePlaylistsDirectoryListed", PrivatePlaylistsDirectoryListed ) 104 - , ( "PrivatePlaylistRead", PrivatePlaylistRead ) 105 - , ( "PublicPlaylistsDirectoryCreated", PublicPlaylistsDirectoryCreated ) 106 - , ( "PublicPlaylistsDirectoryExists", PublicPlaylistsDirectoryExists ) 107 - , ( "PublicPlaylistsDirectoryListed", PublicPlaylistsDirectoryListed ) 108 - , ( "PublicPlaylistRead", PublicPlaylistRead ) 109 - ]