From 9cec2c639563092ed050716db1e7e4657f937bf5 Mon Sep 17 00:00:00 2001 From: xangelo Date: Mon, 14 Mar 2022 15:37:54 -0400 Subject: [PATCH 1/1] initial --- .gitignore | 4 + docker-compose.yml | 21 + nginx.conf | 11 + package-lock.json | 7043 ++++++++ package.json | 42 + .../migration.sql | 23 + .../20220312061111_init/migration.sql | 9 + .../20220314034840_auth_tokens/migration.sql | 13 + .../20220314040343_unsure/migration.sql | 30 + .../20220314042540_add_zones/migration.sql | 27 + .../migration.sql | 12 + .../20220314140620_remove_zones/migration.sql | 37 + .../migration.sql | 8 + .../migration.sql | 13 + .../20220314152915_max_steps/migration.sql | 9 + prisma/migrations/migration_lock.toml | 3 + prisma/schema.prisma | 60 + src/api.ts | 21 + src/formulas.ts | 11 + src/lib/cache.ts | 17 + src/lib/db.ts | 3 + src/lib/http-errors.ts | 27 + src/lib/logger.ts | 3 + src/lib/server.ts | 153 + src/lib/time.ts | 39 + src/public/app/api.ts | 103 + src/public/app/components.ts | 24 + src/public/app/events.ts | 25 + src/public/app/game.ts | 21 + src/public/app/sections/overview.ts | 41 + src/public/assets/biomes/fields.jpg | Bin 0 -> 81757 bytes src/public/assets/discord-avatar.png | Bin 0 -> 1559 bytes src/public/assets/discord-logo-purple.png | Bin 0 -> 1559 bytes src/public/assets/discord-logo.png | Bin 0 -> 1559 bytes src/public/assets/icons/exp.png | Bin 0 -> 9604 bytes src/public/assets/icons/fish.png | Bin 0 -> 2597 bytes src/public/assets/icons/fishing_rod.png | Bin 0 -> 1756 bytes src/public/assets/icons/hp.png | Bin 0 -> 6878 bytes src/public/assets/icons/luck.png | Bin 0 -> 13600 bytes src/public/assets/icons/money-bag.png | Bin 0 -> 11075 bytes src/public/assets/icons/pow.png | Bin 0 -> 14932 bytes src/public/assets/icons/quirk.png | Bin 0 -> 12722 bytes src/public/assets/icons/stamina.png | Bin 0 -> 7963 bytes src/public/assets/icons/woosh.png | Bin 0 -> 15695 bytes src/public/assets/icons/wow.png | Bin 0 -> 6891 bytes src/public/assets/icons/zest.png | Bin 0 -> 14080 bytes src/public/assets/logo.png | Bin 0 -> 9650 bytes src/public/assets/progress-bar-bg.png | Bin 0 -> 3267 bytes src/public/bundle.js | 13377 ++++++++++++++++ src/public/css/bootstrap.min.css | 14 + src/public/css/ui.css | 394 + src/public/index.html | 228 + src/routes/account/create.ts | 80 + src/routes/account/index.ts | 2 + src/routes/account/login.ts | 52 + src/routes/healthcheck.ts | 7 + src/routes/index.ts | 3 + src/routes/move.ts | 97 + tsconfig.json | 102 + webpack.config.js | 25 + 60 files changed, 22234 insertions(+) create mode 100644 .gitignore create mode 100644 docker-compose.yml create mode 100644 nginx.conf create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 prisma/migrations/20220312044658_create_player/migration.sql create mode 100644 prisma/migrations/20220312061111_init/migration.sql create mode 100644 prisma/migrations/20220314034840_auth_tokens/migration.sql create mode 100644 prisma/migrations/20220314040343_unsure/migration.sql create mode 100644 prisma/migrations/20220314042540_add_zones/migration.sql create mode 100644 prisma/migrations/20220314043022_multiple_biome_to_a_zone/migration.sql create mode 100644 prisma/migrations/20220314140620_remove_zones/migration.sql create mode 100644 prisma/migrations/20220314142325_create_biome_no_player/migration.sql create mode 100644 prisma/migrations/20220314142530_create_biome_no_player/migration.sql create mode 100644 prisma/migrations/20220314152915_max_steps/migration.sql create mode 100644 prisma/migrations/migration_lock.toml create mode 100644 prisma/schema.prisma create mode 100644 src/api.ts create mode 100644 src/formulas.ts create mode 100644 src/lib/cache.ts create mode 100644 src/lib/db.ts create mode 100644 src/lib/http-errors.ts create mode 100644 src/lib/logger.ts create mode 100644 src/lib/server.ts create mode 100644 src/lib/time.ts create mode 100644 src/public/app/api.ts create mode 100644 src/public/app/components.ts create mode 100644 src/public/app/events.ts create mode 100644 src/public/app/game.ts create mode 100644 src/public/app/sections/overview.ts create mode 100644 src/public/assets/biomes/fields.jpg create mode 100644 src/public/assets/discord-avatar.png create mode 100644 src/public/assets/discord-logo-purple.png create mode 100644 src/public/assets/discord-logo.png create mode 100644 src/public/assets/icons/exp.png create mode 100644 src/public/assets/icons/fish.png create mode 100644 src/public/assets/icons/fishing_rod.png create mode 100644 src/public/assets/icons/hp.png create mode 100644 src/public/assets/icons/luck.png create mode 100644 src/public/assets/icons/money-bag.png create mode 100644 src/public/assets/icons/pow.png create mode 100644 src/public/assets/icons/quirk.png create mode 100644 src/public/assets/icons/stamina.png create mode 100644 src/public/assets/icons/woosh.png create mode 100644 src/public/assets/icons/wow.png create mode 100644 src/public/assets/icons/zest.png create mode 100644 src/public/assets/logo.png create mode 100644 src/public/assets/progress-bar-bg.png create mode 100644 src/public/bundle.js create mode 100644 src/public/css/bootstrap.min.css create mode 100644 src/public/css/ui.css create mode 100644 src/public/index.html create mode 100644 src/routes/account/create.ts create mode 100644 src/routes/account/index.ts create mode 100644 src/routes/account/login.ts create mode 100644 src/routes/healthcheck.ts create mode 100644 src/routes/index.ts create mode 100644 src/routes/move.ts create mode 100644 tsconfig.json create mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3e7508b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules +# Keep environment variables out of version control +.env +db-data/ diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..d6e76f1 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3' + +services: + database: + image: 'postgres:latest' + ports: + - 5432:5432 + environment: + POSTGRES_USER: root + POSTGRES_PASSWORD: root + POSTGRES_DB: sketchy_heroes + volumes: + - ./db-data/:/var/lib/postgresql/data + web: + image: nginx:latest + ports: + - "1567:80" + volumes: + - .:/app + - ./nginx.conf:/etc/nginx/conf.d/default.conf + diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..4bbda4f --- /dev/null +++ b/nginx.conf @@ -0,0 +1,11 @@ +server { + index index.php index.html; + server_name local.sketchyheroes.net; + error_log /var/log/nginx/error.log; + access_log /var/log/nginx/access.log; + root /app/src/public; + + location / { + index index.html; + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e923e21 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7043 @@ +{ + "name": "sketchy_heroes", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "sketchy_heroes", + "dependencies": { + "@prisma/client": "^3.10.0", + "@sinclair/typebox": "^0.23.4", + "ajv": "^8.10.0", + "ajv-formats": "^2.1.1", + "axios": "^0.26.1", + "cors": "^2.8.5", + "dotenv": "^16.0.0", + "express": "^4.17.3", + "fastify": "^3.27.4", + "jquery": "^3.6.0", + "lodash": "^4.17.21", + "luxon": "^2.3.1", + "pino": "^7.8.1", + "prisma": "^3.10.0", + "ts-node": "^10.7.0", + "typescript": "^4.6.2", + "uuid": "^8.3.2" + }, + "devDependencies": { + "@types/axios": "^0.14.0", + "@types/cors": "^2.8.12", + "@types/express": "^4.17.13", + "@types/jquery": "^3.5.14", + "@types/lodash": "^4.14.179", + "@types/luxon": "^2.3.0", + "@types/node": "^17.0.21", + "@types/uuid": "^8.3.4", + "nodemon": "^2.0.15", + "ts-loader": "^9.2.8", + "webpack": "^5.70.0", + "webpack-cli": "^4.9.2" + } + }, + "node_modules/@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "dependencies": { + "@cspotcode/source-map-consumer": "0.8.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-1.1.0.tgz", + "integrity": "sha512-gvCOUNpXsWrIQ3A4aXCLIdblL0tDq42BG/2Xw7oxbil9h11uow10ztS2GuFazNBfjbrsZ5nl+nPl5jDSjj5TSg==", + "dependencies": { + "ajv": "^6.12.6" + } + }, + "node_modules/@fastify/ajv-compiler/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/@prisma/client": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.10.0.tgz", + "integrity": "sha512-6P4sV7WFuODSfSoSEzCH1qfmWMrCUBk1LIIuTbQf6m1LI/IOpLN4lnqGDmgiBGprEzuWobnGLfe9YsXLn0inrg==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "3.10.0-50.73e60b76d394f8d37d8ebd1f8918c79029f0db86" + }, + "engines": { + "node": ">=12.6" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "3.10.0-50.73e60b76d394f8d37d8ebd1f8918c79029f0db86", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.10.0-50.73e60b76d394f8d37d8ebd1f8918c79029f0db86.tgz", + "integrity": "sha512-LjRssaWu9w2SrXitofnutRIyURI7l0veQYIALz7uY4shygM9nMcK3omXcObRm7TAcw3Z+9ytfK1B+ySOsOesxQ==", + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "3.10.0-50.73e60b76d394f8d37d8ebd1f8918c79029f0db86", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.10.0-50.73e60b76d394f8d37d8ebd1f8918c79029f0db86.tgz", + "integrity": "sha512-cVYs5gyQH/qyut24hUvDznCfPrWiNMKNfPb9WmEoiU6ihlkscIbCfkmuKTtspVLWRdl0LqjYEC7vfnPv17HWhw==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.4.tgz", + "integrity": "sha512-0/WqSvpVbCBAV1yPeko7eAczKbs78dNVAaX14quVlwOb2wxfKuXCx91h4NrEfkYK9zEnyVSW4JVI/trP3iS+Qg==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==" + }, + "node_modules/@types/axios": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz", + "integrity": "sha1-7CMA++fX3d1+udOr+HmZlkyvzkY=", + "deprecated": "This is a stub types definition for axios (https://github.com/mzabriskie/axios). axios provides its own type definitions, so you don't need @types/axios installed!", + "dev": true, + "dependencies": { + "axios": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/jquery": { + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", + "integrity": "sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg==", + "dev": true, + "dependencies": { + "@types/sizzle": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.179", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.179.tgz", + "integrity": "sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==", + "dev": true + }, + "node_modules/@types/luxon": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.3.0.tgz", + "integrity": "sha512-mWXdRlg+5dWvxU+uaijB2RY5NrJtMEXR6j+D6W66hPuezSVXrQqQvWa/JNHntgEYgjzeoVRrQVmMWAbKjUJiFQ==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-7.2.5.tgz", + "integrity": "sha512-AOhBxyLVdpOad3TujtC9kL/9r3HnTkxwQ5ggOsYrvvZP1cCFvzHWJd5XxZDFuTn+IN8vkKSG5SEJrd27vCSbeA==", + "dependencies": { + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.1", + "queue-microtask": "^1.1.2" + } + }, + "node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", + "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001313", + "electron-to-chromium": "^1.4.76", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001316", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001316.tgz", + "integrity": "sha512-JgUdNoZKxPZFzbzJwy4hDSyGuH/gXz2rN51QmoR8cBQsVo58llD3A0vlRKKRt8FGf5u69P9eQyIH8/z9vN/S0Q==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.82", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.82.tgz", + "integrity": "sha512-Ks+ANzLoIrFDUOJdjxYMH6CMKB8UQo5modAwvSZTxgF+vEs/U7G5IbWFUp6dS4klPkTDVdxbORuk8xAXXhMsWw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", + "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-json-stringify": { + "version": "2.7.13", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.7.13.tgz", + "integrity": "sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA==", + "dependencies": { + "ajv": "^6.11.0", + "deepmerge": "^4.2.2", + "rfdc": "^1.2.0", + "string-similarity": "^4.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/fast-json-stringify/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fast-json-stringify/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/fast-redact": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.1.tgz", + "integrity": "sha512-odVmjC8x8jNeMZ3C+rPMESzXVSEU8tSWSHv9HFxP2mm89G/1WwqhrerJDQm9Zus8X6aoRgQDThKqptdNA6bt+A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "node_modules/fastify": { + "version": "3.27.4", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-3.27.4.tgz", + "integrity": "sha512-SOfnHBxG9zxCSIvt6aHoR/cao8QBddWmGP/mb5KQKRc+KI1kB7b79M2hCDOTSyHdLAF2OX+oI6X3weeLc+MqKg==", + "dependencies": { + "@fastify/ajv-compiler": "^1.0.0", + "abstract-logging": "^2.0.0", + "avvio": "^7.1.2", + "fast-json-stringify": "^2.5.2", + "fastify-error": "^0.3.0", + "find-my-way": "^4.5.0", + "flatstr": "^1.0.12", + "light-my-request": "^4.2.0", + "pino": "^6.13.0", + "process-warning": "^1.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.1.4", + "secure-json-parse": "^2.0.0", + "semver": "^7.3.2", + "tiny-lru": "^8.0.1" + } + }, + "node_modules/fastify-error": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fastify-error/-/fastify-error-0.3.1.tgz", + "integrity": "sha512-oCfpcsDndgnDVgiI7bwFKAun2dO+4h84vBlkWsWnz/OUK9Reff5UFoFl241xTiLeHWX/vU9zkDVXqYUxjOwHcQ==" + }, + "node_modules/fastify/node_modules/pino": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", + "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", + "dependencies": { + "fast-redact": "^3.0.0", + "fast-safe-stringify": "^2.0.8", + "flatstr": "^1.0.12", + "pino-std-serializers": "^3.1.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "sonic-boom": "^1.0.2" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/fastify/node_modules/pino-std-serializers": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", + "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" + }, + "node_modules/fastify/node_modules/sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/find-my-way": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-4.5.1.tgz", + "integrity": "sha512-kE0u7sGoUFbMXcOG/xpkmz4sRLCklERnBcg7Ftuu1iAxsfEt2S46RLJ3Sq7vshsEy2wJT2hZxE58XZK27qa8kg==", + "dependencies": { + "fast-decode-uri-component": "^1.0.1", + "fast-deep-equal": "^3.1.3", + "safe-regex2": "^2.0.0", + "semver-store": "^0.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatstr": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", + "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" + }, + "node_modules/follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/light-my-request": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-4.8.0.tgz", + "integrity": "sha512-C2XESrTRsZnI59NSQigOsS6IuTxpj8OhSBvZS9fhgBMsamBsAuWN1s4hj/nCi8EeZcyAA6xbROhsZy7wKdfckg==", + "dependencies": { + "ajv": "^8.1.0", + "cookie": "^0.4.0", + "process-warning": "^1.0.0", + "set-cookie-parser": "^2.4.1" + } + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/luxon": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.1.tgz", + "integrity": "sha512-I8vnjOmhXsMSlNMZlMkSOvgrxKJl0uOsEzdGgGNZuZPaS9KlefpE9KV95QFftlJSC+1UyCC9/I69R02cz/zcCA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, + "node_modules/nodemon": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-exit-leak-free": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-7.8.1.tgz", + "integrity": "sha512-G0AVnaJBBtbdOpZ3z0/QD3R57BWwjVo4K7e+c5mHKjNCYIY1FIKuNlWjVJfCVQ4Bq6iN/yAAh5OCeeTI7OXosA==", + "dependencies": { + "fast-redact": "^3.0.0", + "on-exit-leak-free": "^0.2.0", + "pino-abstract-transport": "v0.5.0", + "pino-std-serializers": "^4.0.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.1.0", + "safe-stable-stringify": "^2.1.0", + "sonic-boom": "^2.2.1", + "thread-stream": "^0.13.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", + "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "dependencies": { + "duplexify": "^4.1.2", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prisma": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-3.10.0.tgz", + "integrity": "sha512-dAld12vtwdz9Rz01nOjmnXe+vHana5PSog8t0XGgLemKsUVsaupYpr74AHaS3s78SaTS5s2HOghnJF+jn91ZrA==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "3.10.0-50.73e60b76d394f8d37d8ebd1f8918c79029f0db86" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=12.6" + } + }, + "node_modules/process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/real-require": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", + "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "dependencies": { + "ret": "~0.2.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", + "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/secure-json-parse": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz", + "integrity": "sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg==" + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-store": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", + "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==" + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", + "integrity": "sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sonic-boom": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.6.0.tgz", + "integrity": "sha512-6xYZFRmDEtxGqfOKcDQ4cPLrNa0SPEDI+wlzDAHowXE6YV42NeXqg9mP2KkiM8JVu3lHfZ2iQKYlGOz+kTpphg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.0.tgz", + "integrity": "sha512-R3AUhNBGWiFc77HXag+1fXpAxTAFRQTJemlJKjAgD9r8xXTpjNKqIXwHM/o7Rh+O0kUJtS3WQVdBeMKFk5sw9A==", + "dev": true, + "dependencies": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "dev": true, + "dependencies": { + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/thread-stream": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.13.2.tgz", + "integrity": "sha512-woZFt0cLFkPdhsa+IGpRo1jiSouaHxMIljzTgt30CMjBWoUYbbcHqnunW5Yv+BXko9H05MVIcxMipI3Jblallw==", + "dependencies": { + "real-require": "^0.1.0" + } + }, + "node_modules/tiny-lru": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-8.0.1.tgz", + "integrity": "sha512-eBIAYA0BzSjxBedCaO0CSjertD+u+IvNuFkyD7ESf+qjqHKBr5wFqvEYl91+ZQd7jjq2pO6/fBVwFgb6bxvorw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-loader": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.8.tgz", + "integrity": "sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-node": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "dependencies": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.0", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", + "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dev": true, + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", + "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==" + }, + "@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "requires": { + "@cspotcode/source-map-consumer": "0.8.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@fastify/ajv-compiler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-1.1.0.tgz", + "integrity": "sha512-gvCOUNpXsWrIQ3A4aXCLIdblL0tDq42BG/2Xw7oxbil9h11uow10ztS2GuFazNBfjbrsZ5nl+nPl5jDSjj5TSg==", + "requires": { + "ajv": "^6.12.6" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + } + } + }, + "@prisma/client": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.10.0.tgz", + "integrity": "sha512-6P4sV7WFuODSfSoSEzCH1qfmWMrCUBk1LIIuTbQf6m1LI/IOpLN4lnqGDmgiBGprEzuWobnGLfe9YsXLn0inrg==", + "requires": { + "@prisma/engines-version": "3.10.0-50.73e60b76d394f8d37d8ebd1f8918c79029f0db86" + } + }, + "@prisma/engines": { + "version": "3.10.0-50.73e60b76d394f8d37d8ebd1f8918c79029f0db86", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.10.0-50.73e60b76d394f8d37d8ebd1f8918c79029f0db86.tgz", + "integrity": "sha512-LjRssaWu9w2SrXitofnutRIyURI7l0veQYIALz7uY4shygM9nMcK3omXcObRm7TAcw3Z+9ytfK1B+ySOsOesxQ==" + }, + "@prisma/engines-version": { + "version": "3.10.0-50.73e60b76d394f8d37d8ebd1f8918c79029f0db86", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.10.0-50.73e60b76d394f8d37d8ebd1f8918c79029f0db86.tgz", + "integrity": "sha512-cVYs5gyQH/qyut24hUvDznCfPrWiNMKNfPb9WmEoiU6ihlkscIbCfkmuKTtspVLWRdl0LqjYEC7vfnPv17HWhw==" + }, + "@sinclair/typebox": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.4.tgz", + "integrity": "sha512-0/WqSvpVbCBAV1yPeko7eAczKbs78dNVAaX14quVlwOb2wxfKuXCx91h4NrEfkYK9zEnyVSW4JVI/trP3iS+Qg==" + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==" + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==" + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==" + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==" + }, + "@types/axios": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz", + "integrity": "sha1-7CMA++fX3d1+udOr+HmZlkyvzkY=", + "dev": true, + "requires": { + "axios": "*" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/eslint": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/jquery": { + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", + "integrity": "sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg==", + "dev": true, + "requires": { + "@types/sizzle": "*" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.179", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.179.tgz", + "integrity": "sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==", + "dev": true + }, + "@types/luxon": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.3.0.tgz", + "integrity": "sha512-mWXdRlg+5dWvxU+uaijB2RY5NrJtMEXR6j+D6W66hPuezSVXrQqQvWa/JNHntgEYgjzeoVRrQVmMWAbKjUJiFQ==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/node": { + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "ajv": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + } + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "requires": { + "string-width": "^4.1.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, + "avvio": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-7.2.5.tgz", + "integrity": "sha512-AOhBxyLVdpOad3TujtC9kL/9r3HnTkxwQ5ggOsYrvvZP1cCFvzHWJd5XxZDFuTn+IN8vkKSG5SEJrd27vCSbeA==", + "requires": { + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.1", + "queue-microtask": "^1.1.2" + } + }, + "axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "requires": { + "follow-redirects": "^1.14.8" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", + "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001313", + "electron-to-chromium": "^1.4.76", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001316", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001316.tgz", + "integrity": "sha512-JgUdNoZKxPZFzbzJwy4hDSyGuH/gXz2rN51QmoR8cBQsVo58llD3A0vlRKKRt8FGf5u69P9eQyIH8/z9vN/S0Q==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", + "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.4.82", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.82.tgz", + "integrity": "sha512-Ks+ANzLoIrFDUOJdjxYMH6CMKB8UQo5modAwvSZTxgF+vEs/U7G5IbWFUp6dS4klPkTDVdxbORuk8xAXXhMsWw==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", + "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + } + } + }, + "express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-json-stringify": { + "version": "2.7.13", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.7.13.tgz", + "integrity": "sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA==", + "requires": { + "ajv": "^6.11.0", + "deepmerge": "^4.2.2", + "rfdc": "^1.2.0", + "string-similarity": "^4.0.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + } + } + }, + "fast-redact": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.1.tgz", + "integrity": "sha512-odVmjC8x8jNeMZ3C+rPMESzXVSEU8tSWSHv9HFxP2mm89G/1WwqhrerJDQm9Zus8X6aoRgQDThKqptdNA6bt+A==" + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "fastify": { + "version": "3.27.4", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-3.27.4.tgz", + "integrity": "sha512-SOfnHBxG9zxCSIvt6aHoR/cao8QBddWmGP/mb5KQKRc+KI1kB7b79M2hCDOTSyHdLAF2OX+oI6X3weeLc+MqKg==", + "requires": { + "@fastify/ajv-compiler": "^1.0.0", + "abstract-logging": "^2.0.0", + "avvio": "^7.1.2", + "fast-json-stringify": "^2.5.2", + "fastify-error": "^0.3.0", + "find-my-way": "^4.5.0", + "flatstr": "^1.0.12", + "light-my-request": "^4.2.0", + "pino": "^6.13.0", + "process-warning": "^1.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.1.4", + "secure-json-parse": "^2.0.0", + "semver": "^7.3.2", + "tiny-lru": "^8.0.1" + }, + "dependencies": { + "pino": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", + "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", + "requires": { + "fast-redact": "^3.0.0", + "fast-safe-stringify": "^2.0.8", + "flatstr": "^1.0.12", + "pino-std-serializers": "^3.1.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "sonic-boom": "^1.0.2" + } + }, + "pino-std-serializers": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", + "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" + }, + "sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "requires": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + } + } + }, + "fastify-error": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fastify-error/-/fastify-error-0.3.1.tgz", + "integrity": "sha512-oCfpcsDndgnDVgiI7bwFKAun2dO+4h84vBlkWsWnz/OUK9Reff5UFoFl241xTiLeHWX/vU9zkDVXqYUxjOwHcQ==" + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-my-way": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-4.5.1.tgz", + "integrity": "sha512-kE0u7sGoUFbMXcOG/xpkmz4sRLCklERnBcg7Ftuu1iAxsfEt2S46RLJ3Sq7vshsEy2wJT2hZxE58XZK27qa8kg==", + "requires": { + "fast-decode-uri-component": "^1.0.1", + "fast-deep-equal": "^3.1.3", + "safe-regex2": "^2.0.0", + "semver-store": "^0.3.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flatstr": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", + "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" + }, + "follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "requires": { + "ini": "2.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "light-my-request": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-4.8.0.tgz", + "integrity": "sha512-C2XESrTRsZnI59NSQigOsS6IuTxpj8OhSBvZS9fhgBMsamBsAuWN1s4hj/nCi8EeZcyAA6xbROhsZy7wKdfckg==", + "requires": { + "ajv": "^8.1.0", + "cookie": "^0.4.0", + "process-warning": "^1.0.0", + "set-cookie-parser": "^2.4.1" + } + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "luxon": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.1.tgz", + "integrity": "sha512-I8vnjOmhXsMSlNMZlMkSOvgrxKJl0uOsEzdGgGNZuZPaS9KlefpE9KV95QFftlJSC+1UyCC9/I69R02cz/zcCA==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, + "nodemon": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-exit-leak-free": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pino": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-7.8.1.tgz", + "integrity": "sha512-G0AVnaJBBtbdOpZ3z0/QD3R57BWwjVo4K7e+c5mHKjNCYIY1FIKuNlWjVJfCVQ4Bq6iN/yAAh5OCeeTI7OXosA==", + "requires": { + "fast-redact": "^3.0.0", + "on-exit-leak-free": "^0.2.0", + "pino-abstract-transport": "v0.5.0", + "pino-std-serializers": "^4.0.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.1.0", + "safe-stable-stringify": "^2.1.0", + "sonic-boom": "^2.2.1", + "thread-stream": "^0.13.0" + } + }, + "pino-abstract-transport": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", + "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "requires": { + "duplexify": "^4.1.2", + "split2": "^4.0.0" + } + }, + "pino-std-serializers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "prisma": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-3.10.0.tgz", + "integrity": "sha512-dAld12vtwdz9Rz01nOjmnXe+vHana5PSog8t0XGgLemKsUVsaupYpr74AHaS3s78SaTS5s2HOghnJF+jn91ZrA==", + "requires": { + "@prisma/engines": "3.10.0-50.73e60b76d394f8d37d8ebd1f8918c79029f0db86" + } + }, + "process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "requires": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "real-require": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", + "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==" + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "requires": { + "ret": "~0.2.0" + } + }, + "safe-stable-stringify": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", + "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "secure-json-parse": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz", + "integrity": "sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "semver-store": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", + "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==" + }, + "send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + } + }, + "set-cookie-parser": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", + "integrity": "sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sonic-boom": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.6.0.tgz", + "integrity": "sha512-6xYZFRmDEtxGqfOKcDQ4cPLrNa0SPEDI+wlzDAHowXE6YV42NeXqg9mP2KkiM8JVu3lHfZ2iQKYlGOz+kTpphg==", + "requires": { + "atomic-sleep": "^1.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "terser": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.0.tgz", + "integrity": "sha512-R3AUhNBGWiFc77HXag+1fXpAxTAFRQTJemlJKjAgD9r8xXTpjNKqIXwHM/o7Rh+O0kUJtS3WQVdBeMKFk5sw9A==", + "dev": true, + "requires": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "dev": true, + "requires": { + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + } + }, + "thread-stream": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.13.2.tgz", + "integrity": "sha512-woZFt0cLFkPdhsa+IGpRo1jiSouaHxMIljzTgt30CMjBWoUYbbcHqnunW5Yv+BXko9H05MVIcxMipI3Jblallw==", + "requires": { + "real-require": "^0.1.0" + } + }, + "tiny-lru": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-8.0.1.tgz", + "integrity": "sha512-eBIAYA0BzSjxBedCaO0CSjertD+u+IvNuFkyD7ESf+qjqHKBr5wFqvEYl91+ZQd7jjq2pO6/fBVwFgb6bxvorw==" + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "ts-loader": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.8.tgz", + "integrity": "sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + } + }, + "ts-node": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", + "requires": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.0", + "yn": "3.1.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", + "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==" + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dev": true, + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache-lib": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", + "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + } + }, + "webpack-cli": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..2377281 --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "sketchy_heroes", + "scripts": { + "dev": "npx nodemon src/api.ts" + }, + "dependencies": { + "@prisma/client": "^3.10.0", + "@sinclair/typebox": "^0.23.4", + "ajv": "^8.10.0", + "ajv-formats": "^2.1.1", + "axios": "^0.26.1", + "cors": "^2.8.5", + "dotenv": "^16.0.0", + "express": "^4.17.3", + "fastify": "^3.27.4", + "jquery": "^3.6.0", + "lodash": "^4.17.21", + "luxon": "^2.3.1", + "pino": "^7.8.1", + "prisma": "^3.10.0", + "ts-node": "^10.7.0", + "typescript": "^4.6.2", + "uuid": "^8.3.2" + }, + "volta": { + "node": "16.14.0" + }, + "devDependencies": { + "@types/axios": "^0.14.0", + "@types/cors": "^2.8.12", + "@types/express": "^4.17.13", + "@types/jquery": "^3.5.14", + "@types/lodash": "^4.14.179", + "@types/luxon": "^2.3.0", + "@types/node": "^17.0.21", + "@types/uuid": "^8.3.4", + "nodemon": "^2.0.15", + "ts-loader": "^9.2.8", + "webpack": "^5.70.0", + "webpack-cli": "^4.9.2" + } +} diff --git a/prisma/migrations/20220312044658_create_player/migration.sql b/prisma/migrations/20220312044658_create_player/migration.sql new file mode 100644 index 0000000..9400241 --- /dev/null +++ b/prisma/migrations/20220312044658_create_player/migration.sql @@ -0,0 +1,23 @@ +-- CreateTable +CREATE TABLE "Player" ( + "id" UUID NOT NULL, + "username" TEXT NOT NULL, + "password" TEXT NOT NULL, + "level" INTEGER NOT NULL DEFAULT 1, + "currency" INTEGER NOT NULL DEFAULT 0, + "pow" INTEGER NOT NULL, + "zest" INTEGER NOT NULL, + "woosh" INTEGER NOT NULL, + "luck" INTEGER NOT NULL, + "aha" INTEGER NOT NULL, + "wow" INTEGER NOT NULL, + "current_exp" INTEGER NOT NULL DEFAULT 0, + "stamina" INTEGER NOT NULL, + "hp" INTEGER NOT NULL, + "stat_points" INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT "Player_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Player_username_key" ON "Player"("username"); diff --git a/prisma/migrations/20220312061111_init/migration.sql b/prisma/migrations/20220312061111_init/migration.sql new file mode 100644 index 0000000..539e7fd --- /dev/null +++ b/prisma/migrations/20220312061111_init/migration.sql @@ -0,0 +1,9 @@ +/* + Warnings: + + - You are about to drop the column `current_exp` on the `Player` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "Player" DROP COLUMN "current_exp", +ADD COLUMN "exp" INTEGER NOT NULL DEFAULT 0; diff --git a/prisma/migrations/20220314034840_auth_tokens/migration.sql b/prisma/migrations/20220314034840_auth_tokens/migration.sql new file mode 100644 index 0000000..89142d9 --- /dev/null +++ b/prisma/migrations/20220314034840_auth_tokens/migration.sql @@ -0,0 +1,13 @@ +-- CreateTable +CREATE TABLE "AuthToken" ( + "token" UUID NOT NULL, + "player_id" UUID NOT NULL, + + CONSTRAINT "AuthToken_pkey" PRIMARY KEY ("token") +); + +-- CreateIndex +CREATE UNIQUE INDEX "AuthToken_player_id_key" ON "AuthToken"("player_id"); + +-- AddForeignKey +ALTER TABLE "AuthToken" ADD CONSTRAINT "AuthToken_player_id_fkey" FOREIGN KEY ("player_id") REFERENCES "Player"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20220314040343_unsure/migration.sql b/prisma/migrations/20220314040343_unsure/migration.sql new file mode 100644 index 0000000..3d738ed --- /dev/null +++ b/prisma/migrations/20220314040343_unsure/migration.sql @@ -0,0 +1,30 @@ +/* + Warnings: + + - You are about to drop the column `player_id` on the `AuthToken` table. All the data in the column will be lost. + - You are about to drop the column `stat_points` on the `Player` table. All the data in the column will be lost. + - A unique constraint covering the columns `[playerId]` on the table `AuthToken` will be added. If there are existing duplicate values, this will fail. + - Added the required column `playerId` to the `AuthToken` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropForeignKey +ALTER TABLE "AuthToken" DROP CONSTRAINT "AuthToken_player_id_fkey"; + +-- DropIndex +DROP INDEX "AuthToken_player_id_key"; + +-- AlterTable +ALTER TABLE "AuthToken" DROP COLUMN "player_id", +ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, +ADD COLUMN "playerId" UUID NOT NULL, +ADD COLUMN "updatedAt" TIMESTAMP(3); + +-- AlterTable +ALTER TABLE "Player" DROP COLUMN "stat_points", +ADD COLUMN "statPoints" INTEGER NOT NULL DEFAULT 0; + +-- CreateIndex +CREATE UNIQUE INDEX "AuthToken_playerId_key" ON "AuthToken"("playerId"); + +-- AddForeignKey +ALTER TABLE "AuthToken" ADD CONSTRAINT "AuthToken_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20220314042540_add_zones/migration.sql b/prisma/migrations/20220314042540_add_zones/migration.sql new file mode 100644 index 0000000..baf2208 --- /dev/null +++ b/prisma/migrations/20220314042540_add_zones/migration.sql @@ -0,0 +1,27 @@ +-- CreateEnum +CREATE TYPE "Biome" AS ENUM ('PLAINS', 'FIELDS', 'WOODLAND', 'FOREST', 'SWAMP', 'TUNDRA', 'MOUNTAIN', 'CAVE', 'DESERT'); + +-- CreateTable +CREATE TABLE "Zone" ( + "id" UUID NOT NULL, + "start_x" INTEGER NOT NULL, + "start_y" INTEGER NOT NULL, + + CONSTRAINT "Zone_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ZoneBiomes" ( + "zoneId" UUID NOT NULL, + "biome" "Biome" NOT NULL, + "start_x" INTEGER NOT NULL, + "start_y" INTEGER NOT NULL, + "end_x" INTEGER NOT NULL, + "end_y" INTEGER NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "ZoneBiomes_zoneId_key" ON "ZoneBiomes"("zoneId"); + +-- AddForeignKey +ALTER TABLE "ZoneBiomes" ADD CONSTRAINT "ZoneBiomes_zoneId_fkey" FOREIGN KEY ("zoneId") REFERENCES "Zone"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20220314043022_multiple_biome_to_a_zone/migration.sql b/prisma/migrations/20220314043022_multiple_biome_to_a_zone/migration.sql new file mode 100644 index 0000000..864691d --- /dev/null +++ b/prisma/migrations/20220314043022_multiple_biome_to_a_zone/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - The required column `id` was added to the `ZoneBiomes` table with a prisma-level default value. This is not possible if the table is not empty. Please add this column as optional, then populate it before making it required. + +*/ +-- DropIndex +DROP INDEX "ZoneBiomes_zoneId_key"; + +-- AlterTable +ALTER TABLE "ZoneBiomes" ADD COLUMN "id" UUID NOT NULL, +ADD CONSTRAINT "ZoneBiomes_pkey" PRIMARY KEY ("id"); diff --git a/prisma/migrations/20220314140620_remove_zones/migration.sql b/prisma/migrations/20220314140620_remove_zones/migration.sql new file mode 100644 index 0000000..a21015b --- /dev/null +++ b/prisma/migrations/20220314140620_remove_zones/migration.sql @@ -0,0 +1,37 @@ +/* + Warnings: + + - You are about to drop the column `end_x` on the `ZoneBiomes` table. All the data in the column will be lost. + - You are about to drop the column `end_y` on the `ZoneBiomes` table. All the data in the column will be lost. + - You are about to drop the column `start_x` on the `ZoneBiomes` table. All the data in the column will be lost. + - You are about to drop the column `start_y` on the `ZoneBiomes` table. All the data in the column will be lost. + - You are about to drop the column `zoneId` on the `ZoneBiomes` table. All the data in the column will be lost. + - You are about to drop the `Zone` table. If the table is not empty, all the data it contains will be lost. + - Added the required column `zoneBiomeId` to the `Player` table without a default value. This is not possible if the table is not empty. + - Added the required column `playerId` to the `ZoneBiomes` table without a default value. This is not possible if the table is not empty. + - Added the required column `steps` to the `ZoneBiomes` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropForeignKey +ALTER TABLE "ZoneBiomes" DROP CONSTRAINT "ZoneBiomes_zoneId_fkey"; + +-- AlterTable +ALTER TABLE "Player" ADD COLUMN "location_x" INTEGER NOT NULL DEFAULT 500, +ADD COLUMN "location_y" INTEGER NOT NULL DEFAULT 500, +ADD COLUMN "steps" INTEGER NOT NULL DEFAULT 0, +ADD COLUMN "zoneBiomeId" UUID NOT NULL; + +-- AlterTable +ALTER TABLE "ZoneBiomes" DROP COLUMN "end_x", +DROP COLUMN "end_y", +DROP COLUMN "start_x", +DROP COLUMN "start_y", +DROP COLUMN "zoneId", +ADD COLUMN "playerId" UUID NOT NULL, +ADD COLUMN "steps" INTEGER NOT NULL; + +-- DropTable +DROP TABLE "Zone"; + +-- AddForeignKey +ALTER TABLE "Player" ADD CONSTRAINT "Player_zoneBiomeId_fkey" FOREIGN KEY ("zoneBiomeId") REFERENCES "ZoneBiomes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20220314142325_create_biome_no_player/migration.sql b/prisma/migrations/20220314142325_create_biome_no_player/migration.sql new file mode 100644 index 0000000..f78829d --- /dev/null +++ b/prisma/migrations/20220314142325_create_biome_no_player/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[zoneBiomeId]` on the table `Player` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "Player_zoneBiomeId_key" ON "Player"("zoneBiomeId"); diff --git a/prisma/migrations/20220314142530_create_biome_no_player/migration.sql b/prisma/migrations/20220314142530_create_biome_no_player/migration.sql new file mode 100644 index 0000000..7f792d9 --- /dev/null +++ b/prisma/migrations/20220314142530_create_biome_no_player/migration.sql @@ -0,0 +1,13 @@ +/* + Warnings: + + - You are about to drop the column `location_x` on the `Player` table. All the data in the column will be lost. + - You are about to drop the column `location_y` on the `Player` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "Player" DROP COLUMN "location_x", +DROP COLUMN "location_y"; + +-- AlterTable +ALTER TABLE "ZoneBiomes" ALTER COLUMN "playerId" DROP NOT NULL; diff --git a/prisma/migrations/20220314152915_max_steps/migration.sql b/prisma/migrations/20220314152915_max_steps/migration.sql new file mode 100644 index 0000000..bc9a7bc --- /dev/null +++ b/prisma/migrations/20220314152915_max_steps/migration.sql @@ -0,0 +1,9 @@ +/* + Warnings: + + - You are about to drop the column `steps` on the `ZoneBiomes` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "ZoneBiomes" DROP COLUMN "steps", +ADD COLUMN "maxSteps" INTEGER NOT NULL DEFAULT 500; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..e2b4ce0 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,60 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +enum Biome { + PLAINS + FIELDS + WOODLAND + FOREST + SWAMP + TUNDRA + MOUNTAIN + CAVE + DESERT +} + + +model ZoneBiomes { + id String @id @default(uuid()) @db.Uuid + players Player? + playerId String? @db.Uuid + biome Biome + maxSteps Int @default(500) +} + +model Player { + id String @id @default(uuid()) @db.Uuid + username String @unique + password String + level Int @default(1) + currency Int @default(0) + pow Int + zest Int + woosh Int + luck Int + aha Int + wow Int + stamina Int + hp Int + statPoints Int @default(0) + exp Int @default(0) + zoneBiome ZoneBiomes @relation(fields: [zoneBiomeId], references: [id]) + zoneBiomeId String @db.Uuid + authToken AuthToken? + steps Int @default(0) +} + +model AuthToken { + token String @id @default(uuid()) @db.Uuid + player Player @relation(fields: [playerId], references: [id]) + playerId String @db.Uuid + createdAt DateTime @default(now()) + updatedAt DateTime? @updatedAt +} + diff --git a/src/api.ts b/src/api.ts new file mode 100644 index 0000000..0af6dec --- /dev/null +++ b/src/api.ts @@ -0,0 +1,21 @@ +import { config as dotenv } from 'dotenv'; +import { server, WrappedApiEndpointHandler } from './lib/server'; +import { logger } from './lib/logger'; +import * as routes from './routes'; +import { each } from 'lodash'; + +dotenv(); + +each(routes, route => { + server.express[route.method](route.path, route.handler); +}); + + +server.start(process.env.PORT || '9090').catch(err => { + logger.error(err); + throw err; +}); + + + + diff --git a/src/formulas.ts b/src/formulas.ts new file mode 100644 index 0000000..2cd0007 --- /dev/null +++ b/src/formulas.ts @@ -0,0 +1,11 @@ +export function maxHp(level: number, zest: number): number { + return zest * 3 + 2 * level; +} + +export function maxStamina(level: number, woosh: number): number { + return woosh * level + 19; +} + +export function maxExp(level: number): number { + return level * 10; +} diff --git a/src/lib/cache.ts b/src/lib/cache.ts new file mode 100644 index 0000000..37e7855 --- /dev/null +++ b/src/lib/cache.ts @@ -0,0 +1,17 @@ +export class Cache { + items: Record; + constructor() { + this.items = {}; + } + + async put(key: string, item: any) { + this.items[key] = item; + } + + async get(key: string): Promise { + return this.items[key] as T; + } +} + + +export const cache = new Cache(); diff --git a/src/lib/db.ts b/src/lib/db.ts new file mode 100644 index 0000000..9b6c4ce --- /dev/null +++ b/src/lib/db.ts @@ -0,0 +1,3 @@ +import { PrismaClient } from '@prisma/client'; + +export const prisma = new PrismaClient(); diff --git a/src/lib/http-errors.ts b/src/lib/http-errors.ts new file mode 100644 index 0000000..64d113d --- /dev/null +++ b/src/lib/http-errors.ts @@ -0,0 +1,27 @@ +export class HttpError extends Error { + statusCode: number; + errorCode: string; + constructor(msg: string, statusCode: number, errorCode: string) { + super(msg); + this.statusCode = statusCode; + this.errorCode = errorCode; + } +} + +export class ForbiddenError extends HttpError { + constructor(msg: string = 'Forbidden') { + super(msg, 401, 'forbidden'); + } +} + +export class BadInputError extends HttpError { + constructor(msg: string = 'Bad Input') { + super(msg, 400, 'bad_input'); + } +} + +export class NotFoundError extends HttpError { + constructor(msg: string = 'Not Found') { + super(msg, 404, 'missing'); + } +} diff --git a/src/lib/logger.ts b/src/lib/logger.ts new file mode 100644 index 0000000..962ea6a --- /dev/null +++ b/src/lib/logger.ts @@ -0,0 +1,3 @@ +import pino from 'pino'; + +export const logger = pino(); diff --git a/src/lib/server.ts b/src/lib/server.ts new file mode 100644 index 0000000..cf0e1df --- /dev/null +++ b/src/lib/server.ts @@ -0,0 +1,153 @@ +import express, { Express } from 'express'; +import cors from 'cors'; +import { v4 as uuid } from 'uuid'; +import { logger } from './logger'; +import * as time from './time'; +import Ajv from 'ajv'; +import {BadInputError, ForbiddenError} from './http-errors'; +import addFormats from 'ajv-formats'; +import {prisma} from './db'; +import path from 'path'; + +export enum HTTP_METHOD { + GET = 'get', + POST = 'post', + DELETE = 'delete', + PATCH = 'patch' +}; + +export type ApiEndpointHandler = (input: Input, server: ApiServer) => Promise; + +export interface WrappedApiEndpointHandler { + method: HTTP_METHOD, + path: string, + handler: (req: express.Request, res: express.Response) => void; +} + +const ajv = addFormats(new Ajv({}), [ + 'date-time', + 'time', + 'date', + 'email', + 'hostname', + 'ipv4', + 'ipv6', + 'uri', + 'uri-reference', + 'uuid', + 'uri-template', + 'json-pointer', + 'relative-json-pointer', + 'regex' +]).addKeyword('kind').addKeyword('modifier') + +export interface EndpointOptions { + schema?: any; + authenicated?: boolean +} + + +export class ApiServer { + express: Express; + ajv: Ajv; + + constructor() { + this.express = express(); + + this.express.use(express.json()); + this.express.use(cors()); + this.express.use(express.static(path.join(__dirname, '..', 'public'))); + + this.ajv = ajv; + } + + APIEndpointWrapper(type: HTTP_METHOD, path: string, handler: ApiEndpointHandler, options: EndpointOptions = {}): WrappedApiEndpointHandler { + logger.info(`Register ${type} ${path}`); + const hasSchema = options.schema; + const self = this; + return { + method: type, + path: path, + handler: async (req: express.Request, res: express.Response) => { + const start = Date.now(); + let meta = { + id: uuid(), + processingTime: 0, + gameTime: time.now() + }; + + logger.info(`Req: ${req.method} ${req.path}`); + try { + const params = { + params: req.params, + body: req.body + } as unknown; + + if(hasSchema && !this.ajv.validate(options.schema, params)) { + if(this.ajv.errors) { + throw new BadInputError(this.ajv.errors.map(e => e.message).join('.')); + } + else { + throw new BadInputError(); + } + } + + if(options.authenicated) { + // lets use the token header and validate this request + const token = await prisma.authToken.findUnique({ + where: { + token: req.header('x-auth-token') + } + }); + + if(!token) { + throw new ForbiddenError('Invalid x-auth-token'); + } + } + + const output: Output = await handler(params as Input, self); + meta.processingTime = Date.now() - start; + + res.json({ + status: 'ok', + payload: output, + meta + }) + } + catch(e: any) { + logger.error(e); + meta.processingTime = Date.now() - start; + res.json({ + status: 'error', + payload: e.message, + statusCode: e.statusCode ? e.statusCode : 500, + meta + }); + } + } + }; + } + + get(path: string, schema: EndpointOptions, handler: ApiEndpointHandler) { + return this.APIEndpointWrapper(HTTP_METHOD.GET, path, handler, schema); + } + + post(path: string, schema: EndpointOptions, handler: ApiEndpointHandler) { + return this.APIEndpointWrapper(HTTP_METHOD.POST, path, handler, schema); + } + + patch(path: string, schema: EndpointOptions, handler: ApiEndpointHandler) { + return this.APIEndpointWrapper(HTTP_METHOD.PATCH, path, handler, schema); + } + + start(port: string) { + return new Promise(res => { + this.express.listen(port, () => { + logger.info(`Listening on port ${port}`); + res({port: port}); + }); + }); + } +} + +export const server = new ApiServer(); diff --git a/src/lib/time.ts b/src/lib/time.ts new file mode 100644 index 0000000..a5f3f1a --- /dev/null +++ b/src/lib/time.ts @@ -0,0 +1,39 @@ +import { DateTime } from 'luxon'; + + +/** +0-5 = night +6-10 = dawn +11 - 15 = morning +16 - 20 = afternoon +21 - 25 = dusk +26 - 29 = night +*/ + +export function now(): number { + return DateTime.now().minute % 30; +} + +export function isNight(): boolean { + const minute = now(); + return (minute >= 0 && minute <= 5) || (minute >= 26 && minute <= 29); +} + +export function isDawn(): boolean { + const minute = now(); + return minute >= 6 && minute <= 10; +} +export function isMorning():boolean { + const minute = now(); + return minute >= 11 && minute <= 15; +} + +export function isAfternoon():boolean { + const minute = now(); + return minute >= 16 && minute <= 20; +} + +export function isDusk():boolean { + const minute = now(); + return minute >= 21 && minute <= 25; +} diff --git a/src/public/app/api.ts b/src/public/app/api.ts new file mode 100644 index 0000000..cccdbe2 --- /dev/null +++ b/src/public/app/api.ts @@ -0,0 +1,103 @@ +import {Player} from '@prisma/client'; +import axios from 'axios'; +import { Events } from './events'; +import { LoginOutputType, AccountCreateType, MoveOutputType } from 'src/routes'; +import {actionLog} from './components'; + +type ApiResponse = { + status: 'ok' | 'error', + statusCode: number + meta: { + gameTime: number; + id: string; + processingTime: number + }, + payload: T +} + +export class Api extends Events { + base: string; + headers: Record; + player: Player | null; + + constructor(root: string) { + super(); + this.base = root; + + // we use the headers for auth data + this.headers = {}; + this.player = null; + } + + + async get(endpoint: string, params: Record = {}): Promise> { + const res = await axios({ + method: 'get', + url: endpoint, + baseURL: this.base, + params: params, + headers: this.headers + }); + + if(res.data.status !== 'ok') { + throw new Error(res.data.payload.toString()); + } + + return res.data; + } + + async post(endpoint: string, data: any = {}): Promise> { + const res = await axios({ + method: 'post', + url: endpoint, + baseURL: this.base, + data: data, + headers: this.headers + }); + + if(res.data.status !== 'ok') { + throw new Error(res.data.payload.toString()); + } + + return res.data; + } + + async signup(username: string, password: string, confirmation: string): Promise { + const res = await this.post('/v1/accounts', { + username: username, + password: password, + confirmation: confirmation + }); + + return res.payload; + } + + async login(username: string, password: string): Promise { + const res = await this.post('/v1/accounts/auth', { + username: username, + password: password + }); + + this.headers['x-auth-token'] = res.payload.token; + this.player = res.payload.player; + + this.emit('player', this.player); + + return res.payload; + } + + async move(): Promise { + if(this.player === null) { + throw new Error('Not authenicated'); + } + const res = await this.post(`/v1/accounts/${this.player.id}/move`); + + this.player = res.payload.player; + + this.emit('player', this.player); + + actionLog(res.payload.displayText, true); + + return res.payload; + } +} diff --git a/src/public/app/components.ts b/src/public/app/components.ts new file mode 100644 index 0000000..f358427 --- /dev/null +++ b/src/public/app/components.ts @@ -0,0 +1,24 @@ +type ProgressBarOptions = { + color: string; +} + +function calculatePercent(current: number, max: number): number { + return (current / max) * 100; +} + +export function progressBar(current: number, max: number, options: ProgressBarOptions): string { + const percent = calculatePercent(current, max) + return ` +
+
+ ${current}/${max} +
+
+ `; +} + +export function actionLog(text: string, replace: boolean = true) { + const str = `
${text}
`; + + replace ? $(`#action-log`).html(str): $(`#action-log`).prepend(str); +} diff --git a/src/public/app/events.ts b/src/public/app/events.ts new file mode 100644 index 0000000..4e15c99 --- /dev/null +++ b/src/public/app/events.ts @@ -0,0 +1,25 @@ + + +type EventHandler = (args: any) => void; + +export class Events { + events: Record; + + constructor() { + this.events = {}; + } + + on(eventName: string, fn: EventHandler) { + if(!this.events[eventName]) { + this.events[eventName] = []; + } + + this.events[eventName].push(fn); + } + + emit(eventName: string, args: any) { + if(this.events[eventName]) { + this.events[eventName].forEach(fn => fn(args)); + } + } +} diff --git a/src/public/app/game.ts b/src/public/app/game.ts new file mode 100644 index 0000000..4fe0293 --- /dev/null +++ b/src/public/app/game.ts @@ -0,0 +1,21 @@ +import { Api } from './api'; +import { playerOverview } from './sections/overview'; +import $ from 'jquery'; + +const api = new Api('http://localhost:9090'); + +api.on('player', playerOverview); + +async function main() { + await api.login('xangelo2', 'test'); +} + + +$('#explore-action').on('click', async e => { + e.preventDefault(); + e.stopPropagation(); + + await api.move(); +}); + +main(); diff --git a/src/public/app/sections/overview.ts b/src/public/app/sections/overview.ts new file mode 100644 index 0000000..fcfe240 --- /dev/null +++ b/src/public/app/sections/overview.ts @@ -0,0 +1,41 @@ +import {Player} from "@prisma/client"; +import $ from 'jquery'; +import {maxExp, maxHp, maxStamina} from "../../../formulas"; +import {progressBar} from "../components"; + +function renderStatText(id: string, value: number, incrementable: boolean) { + $(`#${id} .text`).html(value.toString()); + if(incrementable) { + $(`#${id} .stat-increase`).removeClass('hidden'); + } + else { + //$(`#${id} .stat-increase`).addClass('hidden'); + } +} + +export function playerOverview(player: Player) { + + const incrementable = player.statPoints > 0; + + $('#name').html(`${player.username}, Level ${player.level}`); + + renderStatText('pow', player.pow, incrementable); + renderStatText('zest', player.zest, incrementable); + renderStatText('woosh', player.woosh, incrementable); + renderStatText('aha', player.aha, incrementable); + renderStatText('luck', player.luck, incrementable); + renderStatText('wow', player.wow, incrementable); + renderStatText('stp', player.statPoints, incrementable); + + $('#hit .progress-bar-wrapper').html(progressBar(player.hp, maxHp(player.level, player.zest), { + color: 'danger' + })); + + $('#sta .progress-bar-wrapper').html(progressBar(player.stamina, maxStamina(player.level, player.woosh), { + color: 'success' + })); + + $('#exp .progress-bar-wrapper').html(progressBar(player.exp, maxExp(player.level), { + color: 'info' + })); +} diff --git a/src/public/assets/biomes/fields.jpg b/src/public/assets/biomes/fields.jpg new file mode 100644 index 0000000000000000000000000000000000000000..afe7267665d190450171aa22c0edf667646ab938 GIT binary patch literal 81757 zcmeD^2S8KT+Hv4Q!2t-$s3Lm_$TWmjMJfmgA?y$VAu__=vvq*7QW*(LQb9n17}*;N z2oWMg_68w@y#s+T!XIpFZD0HTxBmb6`n;UneD|D_%emh<_ndE^?e6V&fTJ2$uU!S~ z+6@5QV*CNNX8^~pcv#u{0CoZP0ssILM%EmF<*Qpxmeznjb~B*e zyBTN3>BnQw?mdiyaoW3c>|uI;?B6*Kd^mP~&Zy0_XAjeUroBubm3*l3*MaRH0LKpO zX=n1@v+EdO_px1jj_ulh1!!S3dl%Er%^5BI@nG7$XYaoKyAB*Y#K_#e=T~Kn%e_qd z_8&NS6tH{OPK)<5F&{X<29GTn0yEys!$C36&bBsPz__P4)rES3C24A1$=CWZEO{hCBgn}=4 zVD$XcYUPL4$k2k;wve+qfxcp6o6$4IwKP(14)Y}q@%!I@PMcW(n!*eN>iFqVS{B1pZt z)?a^^5` zxI8vk&(3WmmwUg#<7!lvrcI@Wv#>I4T4uEv2T#XmrQ!A4q3GG?_15BD3NyX9CF>=>XXr-BAMtg;JGILwS+rmvL(jaH75XhUJ^FXL8q z`tzcx8_BAYE}-tXjsC7@fvhX5S|prH$!LKS)q87ptU0YDO@Qp)LTMeD{CbueB<-2h zrW>n+^$ilj%vT!Bd!HRYjWqM12kn;$E;|(*Ng}rWQ1^R}{~tXXWTJ(LM~;fMyrsYk>Yl|4wi$_3col z1fGKN4a}txLT6M?MsMPq`n2=bUat67U`CQ*M3CXTxe-_V!jkV+;80cF!Vqv2NXSr1 zo{pwOq?u|_Tb~gguF8#K(fyP51#*J{It6pZv|i@D>Fgtl$Qy($q3F|m9QF7>wFR~^~E?$iLfb_}^5PI^v1*K{6iKHQ$`&YX- z*NSp!`-@)0lNa2QQ|Y|E8L^DH^7U%5Zy1Y`lOwvP=xCXr@C$5a5K@`HpvRw7-5{5w zEjy1~Tv3E>16~ghxnbP(E_0a0m15AeZE5$MEJC5oAyKPyFw1Q=x5WS$qhB5i*3**h zbXl@WGM9CcI@wT%;(MMa$bfdIF=r|pl>Fw+r@`&HM2IBp%}j|8Ho2PqM25b!@>pmC!cNj z;wY?lRgaZ;isp5-70kJ`rsML)s*|hKIHx_TF7ek=q^y%VJ7yo=qtU_hFT;|gdZblZ zIid+lEE{odbXZ%#JDhFR;G7ErTN@Sn498%%Qwh$$yHVZmtobKKxEE>lr*`l8C*56)NFAlyKvPi>bYqWyH^{Oh41n0 zE}xZ3UVoqS;W^XC*Q!*V&>U{Ty5PgY5(Ub?^u+IW&*#kFjMslLLY`OLp>O4Gy-+2p z`RA=MrppjMJa4Dm^VqE1PVwJO`9=Jr{`hAlF9^}DeBEaK=Vg1u93_I zG*ghy7~O|3VBM9@`(R_sbwf33v#Pd-)GDQVeQWTUdvxeL;L?1lR}@9kf>2UOL0b{t z(6qc}6sYxPj;F%V_RtDq9%0a7(JQIgLh%ZnyWAqPse92C&P6^}2s$yTb*kwX2^~m> zesbDPfluF}GS%$<;HBu!@@Ww~%U`D5E zEl$fK)w*dNC$H2Ge@*o}m9XmaHnZUot|l{W0=T~!I@4^ls2&o&4cOmGzp}IzE;EMV zn&iW82C$|RS=Qf^20u@&yBY!&5sTw%h~_1O^z3x4^y@%TzjE(Njh+dRVY5|5y^0rA z^UdZk{zSL6>;$fmf35Ne=*8Nfhdm*56vsyItJzrSN8eDQtXu}e|7IZS2Mod0GlfgF^ zha_$C9jOI9rTx-^4^8lGVH>;|CroG4v)yPg?8|TFL+^Lsm=Ij=?x|tL4 z5g5`jR9mHMnPt^fY6$we|K{t}#8alLIh~pKM^e?9LX$w&W|gE_q`0@Y&O(6Ds3TqI za521I8Nav<;M1JE`>JB?<593{k*|I(7vH|6j*MN}BuI%)PA|4SQp%7VOD{KxhEAGf z>fE)@!RXMe2pM-n9IE7D@Fz>EiRGOaBLk#2i~ZqktBTp-%VofLtJ6&34jj@ijq0mE zgP#H(WC|~+7S3z~c8Gcwv#P@z9L{uaYW9f^Be`AAj(lmi=fWPiyBQ@2y3@E*-Ls z3^&f~rj&}n97b2#V_ne*qw%5C&{=bRWGt;H%9UE;F^xI`L(52ukb<&9ehCp^Zt}E z)}g6d^x6JJ%b08~(Hpi0ve!ThS?RPdH6*G3P1tdg#Z8|HI; zjyYAy--RfrCP~XWw%Lpm14V;X#XWW3*CLEH(}P}AKHET5H9I|otqN@>*KSoyt#w&% zVYoJ0wgItT+kl}3{G949#XoEVB0OO|i`q!|WnZ37Mml4q(I zO}zEwZOH&<#$;PT?*PrHhda<{CM8I!K5%)7mRA|KIdotnK}c~*JE)x*QIn!w@XLA|S%m0uUckSrKT|(fHs|QG4WL>p`Q7*qVXE^hS-`)Tw|XyM_Huceh3+dx#?*r9lBCy2z4hW(ewkQ5DM+S}A!iRN*paiNmxwv=ljBIc zZ$4QI1y2~s6Z5{Y(MyfZQbgX4Fy8wE>?oD}U*=3GGa?RdIWBMQg8Q%#_WpD-3FY_|4}wp zg$fA!k=D@e{#kVVd20XPr}jUPx_=6&YwVGlFVp!+Q3UVK3s&X!GeG!q6)JO7Fg<2A zzteml_Z9q7*Y|l(?B5!{Etn9WFj?ksm+)o&T;Vew{v*aiOLT6=##me4x>->216SfO zLnL!*P$las!Q?R;?Ddr%1|_0 z!%vPO?N1%-J@r|kwWC)36ejq8W_2<)71*NKZoGeQ=*Cp>5o8^2N3jXl)Qi_9ENS26 z^Jt#At&F<#)`MZ>I%UlKReLVS-OO7O`}IB-e@4r{aX6R?*`WL6D=@9PwAVP)N^Fv9 zvP#x@=ReL5H7@AQ{SfrE_0?Sd%^}V2_YB zU3O;5uL}NEW4;N zfv!6;JCQ}55u{z1`JI;BuJ3aR=647THc6bpGJU@MjE#TKVCXr0f!<3rB#1o9gAG!vc5uM5 zg9C=X(BRtnPimd~r7>KmRTuqWy$sqdM2H-l1WRBuv5D13g^Fsbu?wVxMzyG2yPfhh zUsumWI8%b{bHQhnq&>>d*y!xrS%>)>_=3SB4|`RzoV9yC%cwso8AOLvW66HS@pxWI zFd=syt1X5N4YZc38aEh;owTWP8FX1x8<#$k+?PWhOQ;cq?uRcpVOQC(MO^Y_2Unjp zps>@h9$gb^QlL(}pZ7wE=US!yoa^GVb^4e&?9O9#E!nVmhg|*2Fq{eq*CJCMczbyH z)h1}A#6Oidkrb%vrZYCgT3QsXYXBt*8MMUEP=*DC0&ZwmGirmJ;`=UA6v`+RVK^eYD8CPtq+CQ4}CA3+betePMVEXzE#@32YniqHWN#qLaHDfxJ7eGGyCOog81M zajyG=;rhi8M+f>X($#i2+N9bN3uFC1qgeiD|b5ih}a8X z&Ha$2@VLw;;3j!HEX`(^s^-#nImqByNIlV>$R4K-6r%_AU3cxIIN zg^Q?xm*p(?YdK{pdiY7 zDATv-I@Habu?wCZvq&<6qOpjLfBRxIHYB==_>*UhWbl54L-sZ+ADXdUvzc&~t0 zOH0jeljyFClD&%FsRx!XnROy|#^ugoI{P}9ruuBNk@3Qmd z`|8~|KKcNG@1Q@Sc$PBK?A)kaySG5?W0&2uEi8Sd@I8OG6liRW=L_Ws|K@#j{%xm| z&NrJ%n!*r8^%OV}a>1fbBLR!eI4Dr}h#*`q>3>H2d{TPqbHe0Y*qRH0#=?DZ&OY?< zHb6O3^l<|O={SOT;+fvnx$@O;Ik7p9{Mcm@*}Hx+hEY+P3*M!gx9K|o9IiO9S3!1? zuG=g#t8jWNmaFKZc-#`ANZL`uT)D&6tPCpgqJ85?G7BX-QcyZMs(tRFq@?k~MrC}O zjJ^C1A5b#_<1As~@-zjd)Lw!2w!d^TF{g@>-wwU&=$TYeB|Pr02jf8}I(aq6k{g8% zkdd5|Qpw1h3-5lq0oQ4rMN_Ar7?qf{ZNLQy<5$hEIb2RNC0(tCAA4#1%Hi|Hp9Kdj z4GVsctokVus~3qH*{+QSDk=75lKNw5b$Y3-KE$}P68wQ06)DJ45uD3a=iD|xC!`Rj zmMk~-%XnjqnZjZWteo`{|AR@vE(L8{l=7_*7}Y1JvJLeu@Jpr^z=E zokr$%L%SfW`pG^+;ugK+Sr_Stt@MX$T;d_TZ1OG4*JaKpXhj@9qWJcrd^ecKZKrN~g-W>&L zb#1I~iP97yglssRH!^CaO3X`_ONV>ix3-G+tJyCXY*Ai7SuiAeLOm`(|NJFk=TA+ z&CCU9C9rfvZf3Vl)?lcjLf_08;L9ZE#`(GNExVPVr^so6^+R^#o|9!JSwyk<_(&U} zZzH0e(0mAY#dSh~-@$qpVIA(8H)p?YIlxv`pgH@|s*t*P*+TC0jDMMfv5jqLW$DbV z#b%4c#Ur}Lg+1phJ3M$bT0E6r6)e?QAXzWnHfH_ubNY|KfT@^uS^v`3;E-Sb>xDVb z0?~z0bB#wV=0LZ47tBH9Is%I8s!`K*P}(GKA$dTn2p`c|Sl$~NR6b+p;-*>n+-*pw zz{dl~8b`D7=ki@#*_u!BfhR7ma&`rq<4Vf7@gD`J+t;d9bkOUilB)6M*S)U&#wA{7 znzSkLosZ?_MM86KE-40dKvJM#geMcgyav~1&(TR_RwpIUe!SbIzTC~nck3vvOTb6= z7EaP6`Fe?ImY_zW2Lz&RidZf516rOH<>eE9;i!N4ZKM1O7;Jm4FW|N5`Ka0)bE@Nj zFw8we5~erfU1593Ha(WDHB<9-Xu9DQz0||s0Cqi0v_*=S8iv3+p@T8T$a6L2#VNYR z&ZD)Eg0`_tFPRzFhxX(M(cTQ|<0|+vLp&$lK(kI}ur0~K_6owmhj?TX?7;Jv8tP7# z^p?As%U$p>xZge2F*+PKeOU2Ud&{ppBmY(hykGlM{x|i!!+&h5BC?7#*~>@`5jdDB zN*DF8*0#ktMFc=X@|LjH(xWO>ZSycy=~b9|i4HBTqpIsBy&h8u-wG*O4;bGJD_vK? z|B|iR?H80W81%Xfm)akc05#q6WSz0yApN728>iPYJ3R6yvz$VKF%0g{B;68tw+IQV zh^HYL|F}`LNiv&Wwx4=oi=sNS(@-nA+CTs=X|r`|X!>Q4mCg{~`)t)wXjjYJFSQrx zwS8M4%3rIj&%lIL{WHkyWM+`Y%gyoWOq>Oh$~(C8GxY(()c#H%9AxFBa{6=s+JsR; zFwPI5X|yPpnsF*k^;$(Wc@qdj^S%gj8-wDd#u{y3)GD01aG6OomB&X^zcnpK_B!d_ zo3w@5$(n-f)plK!L4R#1dias{gPSRwj92B%ogF|#%UyKRz2kbu=rM6^jvrE;40t*R zHrjzPYOrP~IUep!FkQ~zej;WsQbvCF_JwL2;znfKx5IaOIO%~xcTqfnf5VIRAZcb~wSb@_{&4Iy3Ds zX(Tf60JBz>trRj1C%)88cyXaBmVJq+ z)-TI}5_Wj|aez$d4^=upj+l2SUa?zoJ0VlRr`>03_152_8+9TjAxq2mbaS%wcbxJ6 zg&p{dC#@**9D6cF>gv7>^kpm<;C*F|A6p&iQHM6Kvesr$9&v99i1R;}h-bv3 zKQJ)s2Du=W+PgVZ6?&?l;&xrwy72?)^BMS<5d0TngDpK_9$J4WhRhCAlMA?IcU`|| zG4Z|)Bl6_qJaSnRWow_{#1c6m2B#@HI)>+C@Av0|zw4E+kiK&dJ22*hU24&3%IF&0 z3PuIYte@TtxThZK#46c+6PD7edp$r%BXfNUWpCXSvqrGz<>s&9$~^Z(ShIvZTh|=u z!*&a=Wq&oAcKy{GY3bu({YxNdvCc9tlhY)LR@ppn;mOnN+(j&?2{_`Wsxwy@pL45* z-ge(m6Cs=}vV<#lv>LFA@tBkl-vH($M!xL&qOUOd=LODyw~HO3j7@k9-Kz4&OlefL z+?RsiU)2IJSe2DqTL-Le^%&|P*v<3jZY`4U`#4|sKHqDb-!3;8roZo3Ql@{`%Er`h zBxAj52uEe~Ult!Zfj@{sTogT7W$F}Sp-+*FWHlM@Ill$7=U>l7Ph6S0SM6Poc{t296{v^is9q6Jy7-f1D z7^YWF6LI2WU%7TJ>KfyPJVlXs7V~ynX4e%)t_Jsrv1NkuneS z{>!PS-3k|lJp?F|bEF?IydI)7>4*1}if*+3slrab?z_2|6*33z18>~-kH2!M8R!TW zJEd{_UfH88MCGsX($I?tY%8t4+kkqC^#@kgaL3mx_BM;lH=b!1Nds$LXiZ7b)6YJx z2$o#F#OM>oap>9V1O*rKYE2dy7R~$Z*bh6I0Kn0{a!p=?R$2iSSBh}4W=xj6&n;iw z{u3cK+SDPCS5)7Bs?2UVAt~Oh@O=G~@4oti@$A~}R5{rBvURLzrmrQY)NVD}NZ}%9 zd0$VX#}AC+-{7qF;=IytgRLE{zOFKNF$Y_oUlmgnCW)n4rAXFV*;MIO=d{0c@DM-E zqqz_N`QlH814C)6G66Q)X+10PQi1U6jjmkjy&ucia+Zl}6?jIdtwny#%FUM(KK_9s zjv3OO@5dBCG<7Joxl&iWHs-Pl6Oeqgj_op=?qS_4(rO=p;*Pdk`*hSBbq-90oO8eO zRSp8Grs;Sb{e2!}-LnL{E>GJy(CnP#a;vmZ30ROeeGC3b^)0%}0@q+dMYgM6GMMTa zgEm0Mg8Z8o!WTw!AnZ3run7NaSDq*~#>qN-c4YgNgRwd2Ri883kLj#}*+%rNfXx`^ z9CZ1{rbdO)Xb)*tNoFA!C*)HX5?-_4rHea{`}t}Avf#2Lu$mOZX85#`kAWLW`Uv+X zDH3?rnjMXEE8Ju;RbzfV-2j1|ecFw0v}%)ZD4&+PDy~sFov72)hiGkSi)Cymr1pqx z7FfcF!>5-?Nrvf*Fboxa@SE~|i!$4Qa=zIg%XH}!!W0rY*pP}-$XZD}48e_dKvgAP z2{pPbYq*RXuUiO&;N%O`dzAvOo0N)X2oWr_&B5ptQ%;{wP+UxBAGSnr>}2oeAxuky zmi~qX&NdrkK|rST`3G9pqSK?h^DO#r!*C;92bu%LE z9}>;IXe(-hdGI7u5@W*052|xFE_IUwR`ebA3Hk${Qp=Uyc zgN0K#Qy8F*JK119D{TwtAutXRwDXFibIe<{sb-cXH9>Fu6xD8ry~H8|k;=5|*WGQn zpDjxPe|#AM`2MQ5?NMm`a~0=u7B5FvhlSmq3VGC9iHnID!|_U)g2LUcbk#(T#zQ$@ ziJgB90I+pv$q8p_wA``m_VIKt@gBfURgSnMJTI=ee&`uC1fgGRe(80r?C}M{Ct^hb zuI~`(02fG7H;y0GgbsPAi}YxTDfBMkCKlB+7t1Qr$4^={px?e7qezOYD5zf68}z`P zCtR3W(9O?iFx?UeY)8MGaG}{8BXu;6Q6jHx=4hFER1P_rZkSU9-Rbus7X#Q<`Gb&Q zhyBlc-uoeTEJ=RE#X+JEJZR()}{$w+_7W|K*PMrk zmrst2$7eZpdjyFOm|h*3jWk@@xQ(fSdGIF^$UUUtj?Q-!b6~lzrY#=Ibvr{)v{OTL zHoeru_QjD?vL|>YlVwkwJoHBPBcqL9z+0AmhUkLLMo{5XxTp@dpdROf6}~?m_k5!< zLnL->_-MJs7XSco&uPIf9@j|&2zGAecsSYI%thS6D62L(3~d#IUGhwEQ#iC(Z*?vn zYyn|2j7rmDE1e2xf7(aojDKKr)>xQ`uicB0( ztWsf{J_%VpX0}?K9f=nhT89g5nry1CzTO68BlTbtLY)OLt+|*rp9vh%L)9fJa+M99 z(=didJ5eugRbG!fjhF9$O6!G2XA}ZS=)}Vdaf-#VwTcOj>T<2WMCfHKLmADLU@mXj zqhu7%K(bfn&F(29d1cg*$h5mwzrL_s@%o+I5B0G!H&f4sqT^}0am{gY`R33HBWy@7 zrpzEM=W%AEAV>C9#A%63gwN@ZFksa0DBpKoM}AyIQ5rl1)jFqh*tOA4`3Xjxv0cb1 zL+R=3oO5`BGjK&}tNvO#QcbL2{pREX?G|wiErw|tQMTe}Rp{@FbK{_Qm1GI zSerUnSriJZ(;8{6D=jBk2z(S{CfWO-*TCdH>VHkd>O2jx*J(77wq`^0*?wmf;+_Qj z4=8D4Q%6|wAjFYdJ0F8^%8i}0_Muz_iFvQN5o=D%cV&34jbwK?sRWwY=OQbcB(;~| z)h#14mZ}Q+RB=vcuno8VNQQ`WF443g+~ey{*N`%$=*4=>75@`C5=c){PPgVHyQ zFw{&>6N!Il>70MnLCzA}_5Rgpi7jv?#l=38{llo6e_p*;*2ReWBk4kkZV5@8ne#6) z4kUAGgKq@;T$Oga&{Bdn_UkS&m*lg1U6J3mx}^>dAyg^Mgyrwwj zK`{L55T!_FwJ~LH3(h)qb^d5zZeo0)T-FusjwzG;OHG;v4~#SITA1Y|OwQP(WnB?( zFSva_0hN6;Pp>0|!|rdaV!Xj?Q9&*NY9)Jx2CQG4$ZEz|iIPX~ic@7Fi6EtN>$fyR z$gBctcrY!mA5^DLkIbm9oY#3yqENZ4x_DpCc@A1dLS-f;3WW-kbV?Ff9v`**ogFlO zB(tLW5ZRgn_T#D^w+&JDYikwa-C_m3zoJzcVkB(1$0(NJLDL0=#S3TF(Y32V07zUg~%?C7&v#ya-l z*v$~d_%lQ?=xq|O>djAFRx6{Tlk2;`Vd3- zFNFF3pC!6l46&u0Aygw&1Psxtxn|cBSJNGz{r744P(HWoqHTxzqT>UP= z#+TgkW)9fMpRQs}Tup51+y;m>l{HfgN0Z58nmN8KReT(ZYF8AKlH%bCGIa$UVkzy1 zB)$>kd7tZOu~P|~{W+3h-W@f66eN*1OnJ5P}~)RsQJ%5{^K`;WX3Q^X6tvC<9e4b8c?W=&~3(yFmBekudGoOOsIe6vUtokf@ubq{!rgr|3HOAkY zUogYvb=oX{ypQbd+A`OfB%^f2nq9=AL9wYe)zvY*t~}4FDxz|d3PzWP4rP=i1&-$> z`I0($D!Z!ilJV}SzJ2#geSbAiUCGGt%CX6G@Sb6aBIoAi#>E`1jvd8zJqfefYH>W?iy{Q}$d zcS$jJG!Hrq&4WyGc)g^ZC$Hzn>crpdVJLzuNuQCk*Rf-09&e0BK1j93{`$rEr>-Py zn!=nSpO-9&8%?ZcW!A_>%F5oT_oJ9gZ+-k3bfTRNNGGD_q?y z$$b2cjjz?b?Hn5H0Rek}I*0t=SNn@l64$$p3OG0<)b5ArT3EIl{p&8Q>_!LF&~TeR z-@yRv{j1vRi@4GVmhrssQqstzXT>I|P4eZ0Q7(xX8D4B}EIkTVvu(UhB8R_fFN-5{ zsnrYze+d9o6{gR$-!6lFkBjmZCxyl2yy*Fv2@%P4RY{=rHFo9?(@t*$GxkQBaQBns zn{r4`{jF)po?ewH|A|*?M?05X0}5bS*ylP#v0en;B{~spAHH^$vQ*K`g}s+|qdb3g zJuGLu-h@W&QE!c8EL1nTd?oG6Wq#9Tx{tJ#yY??}Avt6g)J$Lq)2J5fhTFNL`Npm$ z;w22r3{;q;rW#rxh45cj@T4R|vDdX1dStB+Rp~eYny(4G48L1MP_+UV&r6f2C4-E( z>t$m~K&^V?v_RaUnG}r7Mg}}AjGI68KCzz>?p>T&5jFFD-h*!O5qW0Ch&#>vH~%j# zj+f&S9DQuA;SC?&$ykS$&G{Q3AF8V|IF{Dl*|O)w;}h-`krc$6^UpVY=V00)^Lop- zM_d=l_u4D=vjX8K4-+)95kGZ$LvI_`>ETsfmTMDvVRgy+DvtC*=`1o%|*sfX73dr43^JcAJ%7dHf zk|gW9u9X4DV9{r1tm9mpMN1UEJd6ByUWEhweeTuu`8KA*3JM$Hg1}cJmY0)Z4KYMtTaIo0D*|5oT zlgQp4h*aUr{$a>&q(FUt@oX*$^JJndaGdw+b-m!Sn|t`3=BpG2_%U~yRXH4F(%L`T zF-Opcm-U3_QUS#oEVh81fw_0hxo%$Qn<<{ZxFSzc`$=s73kLV}22AY`%b>%Wyd2+Z zeV5O~NagNrdhQ(>wp6)ig#tJy8vMRe;c_!*eUWBMah6{znSYw^Q|3E;z)v>^VJC5^ z@o!I7bCyXuCS}J!s%)~654zWviANxiQllOF z(s<-C*YVA^BuAw%@2&~YtbrO#&?!vJ40S8tV%B*ha#~U+t8_4rla?U$(GUBnlzUq&^Y;DtbB1Yh z`wEKWpg+tKE-xvtwsotk?tK}VX{wuz2>s27K$szqXCR{ap(Ua-6uqkTgn(u!l$Us_ zPJ#KdanUV_UH@PbVMzUS`A;40{jh1^8D=^AB!b1eBFv#JcJnP&NL4XnVQJ{v?Nx5M z&SU#(Z~QX!0f3v13D~sj8x?d9W6daj z>-MRAIt&z|+1*F$2iV_^C7`XeI1}PDd83_&O4Q|312k$e%YIlxuc-X;EaaX?j8Pq8 zwBWg6J|7r8^0?p>sy{z_#{kTJXk2bg)YPb{CXeCa1K8t1jxo;Z%LWI9_bF|*tvxnB z@cc}YLH@^MY6sqrLe{{9A4TrKJ`hnXR8A!QMSbysD9hf+RXb|QW1h9CS-c_ZG7k%o z8X}d5G`2vA>{R~oV3KQpme#%*Yx9>`Kkmi)4=L<^ z#k&13>q^J0Bvv%NRMfpgGr$Xf*n4^ur21D$yONuXQrDJjwFSE)IKDQ%N zGN~#3ZVwGnYS$K$yYaCboEPKf~SLyxOS`r1d}joSyLOk{sbo-h|Dm!Z;VM&T=}VlVx4O!4?7sj zCyzC2)0=0^Pcf-aOZN+o87VA3SDG|h&6iy1&eCj5C14e|y7mrt0(qL-io-`T>T)l= zZE-r9zl-_H_a}wts@S@<3!5QQQYYOGOcYy)?)pUs_!|&7Q;JlU79K6M_;DfZ^oeBM z?>wa;OrW4KjqZxF#JwlxGvgV8nPWu7 zdPx&?nX!0<4xqcXN^U@mj~&TyP}v`N3|WAmyZDfp@#Mt5x`L04O8?IlCD<*ta~X|q zOk6^XIhq;Nw_#-IqM`P64`s0@P3$k~6ZoZ1u#1yg9eG%zDZWaqjt2p< zs;%JGr+vcZ-5j-|9nKCC$%7OE0Q=_eH*@Ql*wR>R%q8o2nbUvEJOXxO($te)rJ_T7 z?ti&65AMDgKfEa4oHlRiC8gjd^{z1&(iAb$89{xpQ~L9<3t0@4N2k)R4GX(oKAiI_ z%I)Vmf5-Pe(6mR0?L%^tzEr9XDkDW8_(aUIVM7CF9YJkq-feyf`lv4y(_sN6%vTD5 z!y?az@F$|&lAp7(KJ;w7y|5M$3Iy?6B3U1Fr`9q|0Y0e=+0$%|c!EMtnTx~Hs189} zxtDsD%Zfh*{E3g6V)mNRBuTW2=*c~VB48zuRGq(_TdW0TBeEH zSTY7oEJai)n72E_B|_>n-+&oc{rGT_(1hnkU;t@SgH0X)aP-r7(K|b|B!angH?e`1 z)-{5uJsc(S&2PGK*LD9L4GzEX8xK=ijcJT`?%HyAlP*Vgo%At-D zwB@q3q+;X4F#CjrksR#)1hiFRQH1(5MfsYf!eXU02U_^qu-W2b<`{ywlyaytEMA)cf&Dx2#l(WxVp zxl|sp28vyf#1&FLe)5vv4E;Wus1!{{#cnoU3reeP4_R+k%V<_g)umRwuCE-%EO+}p z+6EXlOoKPN;;^t_Rw3SVl zU?pGP0`aD9846{)xV^9`TRntRVGDTmfQSgmjGI?dvCpT>S?KuTVaXw@r=(TV590k2 z&qk*7KdW+5GpQqx9qv(`le}oY@%kRTLhDW0`t&0jxY)BLj7QA9xVBuYzy~CE)b)tf zshWgr1A;Zi3z|7dgNu!qIVjeND}JS-P7{qf?Hd}dq-LN+Ah28KUhd3@VQ$U;ku>g) z1$~^R1A`K%i_>0)hEt1@tMog~Kp_!B0)ewuvwxgW_Ihc|l^y}oFnBOA9GuhAFxu#v zh+?R5HONO8DqOQ2jcv(}4%c-@Wjnf~#BJD7>qaxQxF-b}dR!84&l@ereTccoyO835;L!mLJHt=5W5wGyywcNY3a_Z7&PRP>p^gi(!e( zI2k+4t75wENN}57RNt)2FjC^e(=8XlbpH}ENoKJ2F1P=g*u&X2PtV(3-j~Hy=!YQM zkeseM%IPJpQW&sm7|Ssl>`I)o!OM3JG-oYW;0{j>k9%&FFgd%}> zP6cno%q#iP7ekhv2AXsbtZl2!7*?0aKo+c-o%yEB9|7bqXC62q#DvFw-5vcHP zXhBQ=%DdO&!7X|yu4Y;1iPJ|0CFo435QKf6q^g9}{B2hy@9~2fP9Z4SuwaiQjcgbA zF)Igh=qyTdu-97kvQ5YZx{yv0<_BWlLjwZgpArh|9)pU79!I7*GE12Mr7W!Dg;Nez z!T199)N-m@h*VAMSnZmCCGhdFQng2kw#Y@C5;@%N5ZQU)y0U02nbmHAbLhL zd4vOx5F^CkB!e0lA(8l24hE$mjc6K6@J-Aza)s|JI(pI=7dxIYfK6Dtu4*ehcZO>= zErb!r<>a(-ghGv0zz`PE8*j4W;`FSK0sx}=9foC^fwwGs9>g2GvO#pz|N7kYyL(;@W!p_z|-K8F0{jib0?lk)G z(hM|AwsHB1!mM-H;;d{emzU9{i&A=R10i;Uu@F7;I#rPzq{TENzh&Z{r+LsD8Lh}9 zG1>*fW~L-QuZGQf5UzSjRd5^Nhh9m19syc$(`*l09IjD0rAsuE_D{KWA@5|SO`Sn;62pZe!N_}Q&Td;&VPhVpNxELhbovp84WLkM zDx8JFumFv#ZZ|aYlB0g1=ZPZl=bnWbdR~B6t6d3{@(RP zLUn=u*pNVRzt?lZeMbzsgBF{lZ*zx_sfXsQd1JahE76S z^g=W3z~<4?7haJN7Za8Tu-SO2wEQyr-fckEY9z*K$XCYI4Mn% zo%k}(5E}y4Z+#4bbVto1a&Fxmr1A0N;Ly_*9op+?#}>sKo3V1MEb3kZ^-%u7St>Mq z_@Yip%S+uNcd!AserxhW4N8*3xY*SEaHL$zoK||Ds9pJmlBHLwCY(#whskx}>%0ih z_E}pT54-X+Y*uFSiilJ(JUZI8P;qS~^j7R&?DM&suw_X}ae0SKbBOw}U-l|U*Fk(1 zMMX-nllRd3>Cx~I(cmJGf>>W5RPC5S5XP{5NvcvEWQ*DRa`?gGwR4%*1P*$gyHPR0 z`2DVsM5`h~Z|1_(dOOvR*@YZuh-TB^2NC2CVx^u0$gS$;AjLIJK_bCicHjT_|Mtg% zwKPQazCB;la0hFr5en77c}R9@v=dKDv5FC+cwB;$RdDU0xnmEYA@;JQ7Jg(b;@RrB z*vPQop$v>*y-K?D$eUC|5q{1h&E>v;TTti5eu=sUOn;MllgpJ_()5vjbfEZdc~p=o8H(W1^>bQ3U#)WR~BJ^)cpoOjCa zv3mpj_Mfx$H_z0%F#KZd(AV$A5@(L0oQ}sXi_r*OL$e~py9Z$*AeYJO@1_oGbCC9= z(%ehTGxog*NLm*t3i08MyZ&wv;ia0{q=nex3a!w|?;wVW`9^3mqeAYh} z1np7Z?8<2q=mj;Op)#FEF4pB{U~~?S*u;s~;mCZ{fhx_t<%pefgIu3bSCT9=+IiCleJW^7_)A>dA1|gCIez3kVZ+pxW!^#KN9C<7nF&%QEQCPIds!Z^x z=Gz}%qmRzJdqW=ibT#U{eWeab`T7?Vi{wl3kppTm%OBgvNAxeP%V>EUhD1-%_y#3w z6Uz1B)qw{z7Q5866DHi-%UTM!t`rCgvemwAx~IbQoAi*UO0pqJl%P1#HmO<;##~Up zGovWzueU~B%K;-eNBo9j*R^b$tqUTL@iNQZm_(?@$3L{bu5vi%mdY+hviBh4kwe+w z+D3+T_QS?AA?DkFQ>!8#6@HIyxoDJ(1@rjzudM1nGZ9!N@JF&+H^k)FdFYQ}AL|(Q zYO}uq-j%Os&>`NFS{K?g2IF#_FVB^55L~2qRBc|7tQ|1RV0m~r8-`>y)U zYVjHIK>@J|Lkb#K)eFY#lj$bS$>Lk%tBL13m|Y@9f{gvit4$6Y#>)!l=PmugoNmMY zVlPLHPontjD5<96ft#9wIYf{_%#TEszU%+lMFtF`nF9=e@oBM9)VO_wOU;cZFL%Wj5{Jt~gJf`$ z;lW0|gTP5){SWpqzeiG-W~{`}kJGNLbKc+gTlM~~h~hro;&eW1`+?`lTyMliN5Y@% zismtzayLkMin!8;LCK!b*x9CoNnaP@A$mJ~3gap*d;Qh*^uj)6=Q@wg&C0qlIk(Zm z`ICp$kztD2-c0Omt|Mjlb7D-H1vR7ta|?7>rJm(++xW9t%Z=1DR6X&udeTuxJ=;AT zE88?>F**QmSe`WjcN=r-9vY9b4m;7iVJf6||GRv4fxq_o-fJ^#--s(huR4)%#lNuv zTHkfjEyjE8g3pF9;f0F8GwZ(5>Zs?&Icq*5^J$L{yA~I_=8}?Z(j4nj1Uh&$IUab( ziJP2hZ_l|M0@kZb;nDj4%Ibh9=;~oZtTjv1y0?M_CE|)TZjNn~pU;&`zCW5()fwTx zVFsUY815hERRQ}2A_|%gm6jhGih3~*8Sj*FoqBoZUqH65`?pfC zVj5U6Er{lvEtM;L$|$Zt(Q|qqw~?)zwy147YGWk!K(ldwA16sy6D4!;-23M|c;tm4 zGrLn+e~>dy(ZPAim#Yr(%||QIdr%zQ2bBt?X~L_`L}Y&WZ7FABMK1A5Yt=QK(v^2Q zNaa|wazFLfZ+^5NlkZ=6y$iwyiAqyDG=-hJDrg(`FoxcT&>qBON8tjiii=Ohk0a=k z5&_SnnDslL7sRqM^$IM%h)-wHwg^prV>{}*DrI}iC6kb>a`Ld9TNjb)QTe&53R#7Uwhe%{T> z`H0RoNupR?LR`Rddl}XwH6!Gl^+^_0A+}*TaZ9_2zs;>Xo>Re?I_EsyofEh4O> z(RY@Q<^QeD63+(aRxEUQg_K}^OJI7`oaDu6i9mCWNnVM7Ha8DQ?~uJie_<>z_wnH# zwU`ONFcIANB|)uk(H1HNJ0j`WAE*~x4pM_eed`C|L64_a#jw{IeGGV zKI8p)e;!#pU`Wtu{+-Hg&T{XlNB#kS&wB4)GqC>&3~4c9`zX?%tDeFcn|p>c3u@~d zh{S(!{a3?ukN!^}*0RR$F61lxTkzMPV@TF&1 za8d~Jwhi*RYgK$u%hl7J^)Dwl=I4)g7w2ioR8{%ZUBVf(8zU=B_X%Vr!`QN0Hz^4o2~MEFp+eJtH+v#Sd571d)S z4!)kIvl}t0l|y)bM8_&Ii?t(nMXX`aL@!Qu?@n%Kye75eOiye14*t_-6=CGHccFhr z?o0991aS5EBPyFAeBR2a*;ipUdDC-AhTF}dEkNa5H=u&97Ennyw|18!>B@~tfM#tR zU@Kb&DA!^E=Cc2j6P}m)cMMQ5A@`akRcVEy-K;#tjhaj|){8E26Ob|Teik?QxU5v( z&AW79*}o3Vgv~C}Z29M3eraFQ)g_gSrj-lb!>?FDO6VN!SW*y~;ST z&NSKu=EM{cBI$w-TjuJP!__3G+}eHiwOv2o_r#bjVsEdmj?WvVM%6$3>#fDPvog5s z)r(v|jmv(O*UFrG&R9C+S!V=1%Hf#r>q@vGJae)$8egR{9$TM6dY7JvmSOt_3U`4o67z= zm;z9OIUOj)d@22l@rQjsEIatVh&|nK-6Z>Jvx>DQFyQ{TPskj9PQ(}o5%VI8V`_+i+E zCwHV8VyP#yO)WkXViSUCpy)g>y@6}JI?s#^*P!!*Hnr!1aM+|`VN8S%LuiF@Zq=%z z?pls?NWTLF2m)F?3ZNOS+yx@&L+|e{X}rzxEGwpl;pZ(w^%>rSmm9D0{4w8^<|!B_ zJe7|fYd>ROTkEyY%QiM{Y=vXV0wJ>#nmdvSN|K(VczRG#h<6J1a1KI0#SqBwb`5>2pdt6^6@*2xjmr+vmfgR* zPig&R75&-h{9-D7>%5eBh%vAhdX+npmIfcOYyRq9S)^q)L(g!IsF+%D#i#Jk&=JS9 ziacH`#UL5`H;aP2i4UM(UbH&1joLA9g zHAC_0vDETpGpvJ@$S`PH$Pb6}=~;#c+?IclU0klP64jt~2~>l6NGaP#5No=b%a>H1m<*WENxw`kpliu{*@tV$K)``BhbGyLSA`AWJ^JEt(TM)>zWLmr z<=vm&b$Q`%zZ@gjro-v}uSoYkyO|Yx4?pOAt37^up#Ni>_T}6Yr(A<80O(Pf&f)zn z_vWzHLEwEj!QM3k+mIu{wQh>7*MWl%0mjqxE8h+RjHjpncC!p;dtU96{`#NYkiX%Z za)zF#YEoV9>R`X25q5PHskFxCBu>xF9j2qo9|Vm?wP<}%_QQDd(cBx3FM{3n*?duX z-Qa(^tEpAID*Vi7;RXJVr|cFC@cGNY9u0P1&-&0Vlu^AmBO101PLncyI#M*Rk#l z_DM78GaryOplq|=L?}l3J;^M-TH)*fjXk}{C??Z7ug*Js)wMUx`L9wJenC#}G+vNy zt(&y>_91sQP|Si?H|MkXMZus6{n1@zFEbw@G7&74rxk(w#o&(#ntd>RMo0x zhVLOp_TV$U)BlX3U%e`K@-QvnL|MhP!9Nn8|7`}1x}CGeQdL^^m|Jk!lP#s&mA>%y z>r=XBh%^0@Vf%1zBI9%i7ieY;`GpPB`#I`+kFCCXa80VEoHY3e z2R@B`Uy>}cN(Zf{#>OmTJ5s}~0~yZRcfb6z zh?95R`%FXk^0)sWar1OyQCWG{iwB=w3hs3B%68JV;TB!-`Sj11kh@A_$BE7H$XPzz zax$d#VNKEfVe6$*Rg=>Iq8jErdikVQqjGoqdcN4P?Xv)8 zh`mYa!-q@zi|bRGOG=6f>rxrVoxdY@%9=On<5m1~F~7OIH+i_*npXX6v|ioPLl?Zquh0+3 zl($FJx+Dv7?4H66tDgA#LKncG{wKvf25u!sTSsBS}GV#X9-m zYpas_wvurAX(Gs~E^y+&5|(SOOfck^%rz`X?E$l0Z{uR3cQ)u4I+a~5Y{MF9Om}W4 zJ%mr1qAV_;-=<7wwtIV z5su|WCkK8hG4rbTZkt?P7ki(_o=x~c{>|620>ZVQyD#?+#*3Mjq%PvTa#gf0?s#aX z2xHW%b&J9E-#6;s!n=}d3m$#(n-A!{-CAK4kp~mL{`q?E)JInxx&3XspfY5f#V(q8 zw2_O6r+;X3<1L419Q` zbFsLLzKm+WT!pYZJUkcZ&Q9ulgS-x(Y!ximM+Xr(+yA^GwMCh{3SUdi4S+If89z#9yALAa|B(FUL8QPd3Gp-;i7n2Y-S zROTP#WGP`*8~t+)%Qjy%K5E&c@ps?6+-~M*h8A$gG;StsDfnePFn(NJ_b1`~D)pwZ zN9}aL$p6$r`t(^-<=$_8Llyjvr9Y&onpw7D!#Rem5w@7tBwqMn_5((9v({_P7j1uN zx-k2@p*;zE^#8xwOqf>>_y=grLI&v={atx68Rx&uyT2lY_l<8E%dwVM86 zyat%wdd}v&^B3R1Uli+KYBEXFyRW^Nu<2@v&+#8A%89G}aO!Q{j6dNyelDZ&b~A%z zM$e8BXwF8LAjpxt64>JhlihQy=M8kC^~AV%F3NLl>$nqvzh8AS4S|Tth$Qw0J~9y3 zaWFSBqZjjuirfNJXmW(?tT6`SjxP|pczM|kR23Q_T^thxU4==7Pi)qDEw(8v!lDSR zEfI+)hG=uUd=lW>(d&aqEENQ0Zh_VKR%|OZ18!VfCTL~}8(0Mf6Q52@dbzC(+-u7^ zWw|_X4*()L(^{#VP@#gW?GTCKWcVl@5Ef_))<%!`#2>{*lUL&PRd18pkNP!u!vONa zdWD0;x;%G1@G(xa{0h0$CdR)nx2BmsU~l~x77!d1)On`GCCq`g@MvD7q#S*F9s8bd zSmZtDU&c=Vy5z!77EM`aHu!hTi^N0M8VFcr7^bKiaX!*qG> zqumDA=u_;dxUt*)^$kg1+Qawg&JVhRIt7q{&F`h5PJqRBFHID_oMWgV8B)shxLQIz z?K6>CrP4CGREaox%T)ztf2e%#*wOD#kAGtcT<%kc%HQ4j@=);aOC8_;Pj_0DwlrMQ zgc(49Y43uMU3t(Qn@dM?(+so@1-qRdZ+56+o8{2iQQgh>1-+ZNOsBmxL`8jrWV+ek z)#vOK@!rY1Aup<4#sDE16NR4l@9**YcKENc4ljU=)HeX7&)=MIY1^)jjuHxqkSid#|%PyPmb^FTVh29^bK>w}3!Ij~8 zx-4DutGU+E(`k42z8&oIgd;LYjMY<>vV@Mz`RGg>=@L~nmpTc>IM)|l3GTY0q1vL3 zx=6uFmc*D>2<@W`Q-0!E45$uWZr+1*&{5-qhE?kG{9IAmP)l72(n0n)C>wo9rngDx z8xGvUm(2-1nj)N%n{aXLD#IlI8I4=is-BR_Hs)7(i#kQ%IF5vs7oJSmo8YISi>V%i z*luojg5PBk&c%EA4YX-)U_QirxFe_9vAoE-8~L`!?{0%2Wt^!`fz@}yyPF*th0P}w zr}eTeKIv|moI2Zl>26x(p#Sy3PvyW6*aoKb(CkVn>c@Y$Yx3wCdCqc0&ecBV;)6b;3&f7W7Lo=xdN~ z(jVmH^uaYNv+kovi**4`kUdPV7v&;vy=!qFJ8gFFIV`kcGvgKdw_My z_+1MS3K;^jEZ+ZzOT8b->%8ZN^vVU_lV$-v1(=gcrl;PDmWxj%0VmPD*WzrPdj0(V z-r`by*zQqw8?DPWbhu{KqaJ=w<+3l%Wo}u6)ZVW^r;;D(@`?||y_|Jn-CR{Cbrg7G zA~F)1DyR#6+uboEecGdy!~Q^Su{^f0=CQwR}i?!IL zcDm0c++;@HY8pQuZcg5I_NV&2@mpYYaM`*h_o`J4PAx<2M-kD_7H*jxR8k8IC~K=} zN!MaHT+*&uc6Ndy?Vfry9W1`+(O`V>cyx3Lv=!dY6nl2%rwJ4*);Qa+FJ#=ZeCB0nU;8Vr4D*ErG=lRK)=`;uyq>ecOsfvdOh-nwycDLR6dLE@%7fVTze zlCZ6(?zF}(Nl)q*dSKg8E~-klJ96t3ZaLmte+#};uw8a6kB+vY3jk-mw1FSF;DyEJ zW~`!>9_`xl)}X@zo7~h%@rdDnUi`J1O+k?6tLR==&-qY0LV2>F63#83FC$ zp`Vyfje^PBI{y&3~?ldC^}m$ z6x}C`Z1fy*Dsv|~ZPuKgpa|Sem-;{g!ad+5(oZLyOHN?fV@IO2Y7d9N5Wx;i`z#lo z88EXGPUkv7jH45EG3lQWGJBk&5<0wf9_FvX{AlB>;U>ormiWOO^p;{0pviyIjfb<5 zigX}7d?Gn=MWZUr=hX{r?3oX~^y;q7hO)i$w;v0jv*oBTcF$EYj^m3imcn=B4zvNx z>`P)MVMlHwLT{7KcG;2BU`yd_za6<^a{ysI2&`~hcjT52qj%)K;6phWaf9Hq9XU0Q zIh=jVRM^ISA2^C8$~T4*XxS7BK5R#>az~DYq1DSS1LR2YPr;00>|qn}8T+~iwN|n1 zhRvve6Barp$uH4-u%h%ih3pBi!+Qg#5%`dL2wRgd^?FAx&O#Q(#BMjSF&!AuE`)SP zE|AugwE*>446f?TG6}L8T7TnJ6?6$9p)(OsQPaBkdlIEKFL_7j{A-rtqa?aYEvn4_< zZ@JQI!OKFSt`~){}e))!<{ER&mdI&u$b8G_@^ET#H zcjOkoCjz(gF7`-SaOpC&8GFyqaYR7SD{AV+M ztJ?+(^=+d|hU?OiwH`BsRhLMI$WjH_>#bk*6)ue)emc;=RP?a3TljJOO)YuuF|}7< z^cbrgji~}}3MF&Xlnj56Gjd7UTWR}<8ljW+^=f{7g!@J^>CP~O2GztWmxC*13ItGL zlJN!^dD+(caN@g0UE_yF#V1{E#9E=}=|D)C0*2+u0((!(_GO@aS8?02gMyQho19DG zN1bC0hYR3*{upKeGU^rqmy9u{5~ApvWUJ|^-eFT)LY?`Nhq=WVHD3%dpJJ6v1gyO8 z*oD7iJ4@%ICLyGO4DmTkPeV%5le}9F5Ra1$i+#C84cBld%_kkloZc95ht-}mWjqsV zkJ2C8>YZ)(z5Bl01JDqnUUM;-5IfW{ydx)nhEb&9nbado&R*!t%$YKPxnGVnNSfuR zw=R^}dz32catjJm9cTixFvlV6|~vJjuAeBxqIwiHd65~OeMLo z(f)njo!EPw<8QLoAo|H%@f`N#x(Gc_94i)5r1=|3f%PM*I(L#u;=J5=;&cp#jRjSi zt4^(KSiDwY^5en!f9s%oW13{HvYd3oBlfGrfL zzM^LyfULjADslDK(~H*h{UeFWt_>?6sn(SE%wM9yX=h?aIN%wxa=+?>*%n7@GVA*I z4(D&W28I~ce&p8qS7E*4CVITHcDnE~_uYy&^-pP`9RYOJUY*#k+EMYTU2g_*vq;Hn z%%&*>)JQ)j|7i%-{5btAU9=;IkYO7a7dQI#yrz~wN+_Qlx%ZGzF@}C+KQvFP3suh$ z58cPiARdpl3Fk`A!mRnkY)P;9I1~GT;Yw(`dCP`I%8V_{p9VLj8=T(`Q& zG5*v*+)TZyH7sVlU4Kzb0iE#A@IMIGL1#ScdkO?k;)WDz-_HheDjWd3$R)re|4%j@ z)0RA!5aeeK0K(JM;P1vx{Q{=Pu%}EKjZ2ThEo-xg_eviE^{@l0PdeVa9CwnI>X!KZ zuK*Sm_hkbHSCVa7;ucHUMapLQ+ab}B+dlFi47L2L(93`5bqD-X|K5G~Sh~GgEvg*3 zTO4KzQs!!8U%BCwhRtU1QOo{PWiJUK3!23;mKB2`1MjvA zS0-Fd&ql3f&ffPj+nkuI9?W|TWJ|N+$3*a_;7aVm7=HP zR?z@IzJNt1FZlZ!sWA zPT(Cmtd24dTj!t@9YAIe<<_(ygR5d8K@YH}ToZ;`c*B8xq2GS`3&ZPgH{O9Ap3E%s zGMP2Wi@n?|y#*ii4OhCIziz#@oq}CEzS_-4w6@Kx3ydo=pKlu+N2d>U)j)JkIjjz% zw)#~#hF~RIWKpRT^?>B_V+qMavsRnl6CbLU%CtJL zU;0(=7eqW}O8UV8Pcslf1G=wPsxn$fdk+3M!2$AOO-shs$v!1sRoILVbga&~by4`y`yK?`mcVZ+OmeRxY{rFG6~?`>05JeW zt}2|=2G5(v?DZ?xUB!5h89{8AUI;!Yo~g7(GC%(G_*3({lECUL)yq%+^f1vESsS%t zjXyXR7M9uBAISH;I>Cx)%g zHVLLcUrzHR5e6Y*H?H0S2rmoS_Hs#iFM$`hPOOmx9-%L!}u4@j0oH`fJ~ z)o+Ho-pHySmghnFS|uwc-ZuL+Hzw|344mzBhEcwvBr>a!BkTaO8O~#?)avn|<2*cP z!?f5K(&~#6Y?#}WcLvp^<-}acdf3d+7dzR3UOXQ>r47P8JpB7VRS)#0SaAqqYROn@p5Kv$_6D zsV~vOMD!jcEOlAlFgxd##h~vO7(_Ea&42}me!tW0>;6wnZGQgnKNP)Jg3CejpIx&#+WpPH%Ih_; zsMK_&r|ZdUW>8X2+z1n8flfDnP&q(!?E9AF^3R;q|AYdps?7e;xq-AK-_QIN{^h1U za<3biR_P7fD*c3P+j}l!12*Nx&WCAe2<)D*`oPcw~y6Gj~KO4V9@|ulJ zu?{`vjxU|^t&Lw0TWVBG+=3%sMI~YKO;vS<1~QOv6f;GqVCxkslq+blWA({yOw%d= zlA#u-IZG9M;4(t}L6SWP4g}?Meddeb%6EhP5jtdPE@T4rJh#3}xcOXna4O1kmT6jI zm9iV1e#Ii4B7QJUTM(ct~`u*W5wJrOp*Jhn1xafc#KXCj35 z=f%f4ZICP`p0D#!>Xy}9SV%ngV67mF9;>~4o3mbh6|!-77YNIoJGaPXkd^_4Zi_66 zX?J%twi@^9rNDz)7=c^sCc(Q)fa%fDHcPlxj6#XAd3=U(Qh@)10U9q*R31pxd>8f? zpvB)x=U?r44}Ff=-IcW#G8=6^bIiO)MRW#k_6aBATZ1G#KmCSEQ{gQ_^bCBR-WvUt zh+d7?;TX+o6UOjWbnev+x^@~#P>~(Mu-%3qqenE16TdF58L!()e;`?VM=OyT@ z+lvEPZxvy8AeLY-=@izw8Oo~%|M26VI`WS6kYQfPs?|oN*ub}YDb8Vf6DS$wP@Lal zI~^lCT_CtfZof|?%iQ}! z9glb9dJb;s-xqLCu1EW;$GXohdXK!Gim2v6yVu8{&3w;Ejt;5YTSSG9WI9RCEC7RG zK?DYg@>YpDorSr4VXM%mwIgiHgPLz(*q!9rbExg$ToK#?^Tm&B2wIXQPr{t?BKrv$ z`vJv+04N?xjMY?`-oC(CiC@gn!7c4Ob8OREZuHvvFrJkLM*w#F;VG-d*TcxB1A>lX zLf1?)%1aYR)deN)ik1XS@Rz2O&1~8>5K+;WSLt@9mqf%fMLTlvF{w%$Axjt}aWez_ z1k_#*2>`7eED}CvO*og#J&a4J$ea$DVb)Sg3Qvpn?T1SH1Wu5Yw*KQwgMmT|C&-K} zX{ir`N3r_7pGEZBM{}bqL|VxdzZ zak7{u5}Z=v(G@KZ=pHz-#4W)ScMXHDGx?W^X50+FV-+dGxOBL8>C6F%*Jj;VnMsJB z_ooc%HX>jwqJ`91%f1pi=imR>WI5!7MpdKtH5)dVI3<&c^1}Kshq&|EJ_nANdW^$_ zLQ2ERx^#?l{`2!2{eFt6_%?&hwhZrntFJW1hDO}Y@+Hk&nZFb(Djr9Ug1Ua+$ zy5CPWE*+gB3efHN?yF*kR;x@;L)6RxtEy4?JU`~$JvR-)yjjO25OF4UWvypwM{XY^ zJp?1Tg|1GS$pgG%$AO1?)GQ_Nx$!VJCX*jXHWb_SB^}KT!-s}MHUNfX)Pw2e+p8OT z_0%0XwtNdi0(p>YOi8(#Pq-wE+3ZBNv5C7h`ypl7{$LefUzrLhee>@J*hI=?GOc@c zhyaCr1Ia+DkEy6k%p94ZiI1GB4k2Hki%M*&S{tzBgg5vD^ODxdOYSjZHvy(WMwP6+ zLZHL)m)BTYBy0F=M>`>X!zFifNA3bY$>q!n*o9D6 z*O#uaBNqaTo>8b`Bw`+Kp$!qXha|G^{sn=kd;FdVMkwSa|SG$iC5(~4}sE!-4sC?6PkzxDH#uTJUatRCbbBiYcPG<6j zSMvh}&@(^wuwW6CJ+ENq!d9T7;HqN}9oB3>8lsGCqt=bzrx$Kt~h8zL5DWkW{ zlj{#kJ?&G7Eed`!&@!d@ul-*!`?N-oXO^6%y)kCi#qGRXC#x@zEdHh5|K{z%V(6Z0 zh*U?BIVAYsdeO)vYEp3Vsj9}C-j+u%Ps2dc4w~;79p2;9C7m2khv4wHKj89(^e{3w% z-N5$|8YVht32G^~ohpDs8~j+S)NS21}1A%>`{i}bW~S-e)kL4CH_DnpF`Ihrufm3<-MT^>7f zYZJTnw2PX^9cUwMZx?7|@vyfUo6j9a)nWav&^Yl$)129G9(!e56y4AmznZH5+2)}Mn7$J%cD&+Yj)61nL|#s-Z@}l;R|`_p^G+;N z(v_>T5{m3?E1BI-tPxJq_vMFsIA1I#Q4(dPc;+DU_1SV#REzx;C4gC-i%e1|ld;&*!C!p4vODB2g*D#Y5M$9w zT>;CbIFmD{f>F0vNu9Vu2=3Ro6FYL(QF(kF=`$|Tey*)xJ8BSr;NXtj__hEk?!%Qes>Q6-;TxoeYAD!w_Sr8&5?koHlGUIu8eu76Wea zswf0%MPM=1fj-rqq)U)hM}gs7YJEo!3C-PAuvlJ?-oLLu3~xj=Z(i#*@vh*S3n(QB z+KyZSEy`sio36SVtQyfFDjEXjT_bI@^W;V~rSQ zZH6Aj1!2Wx%9!B-56%lT%BG1&CSnh6AA{P|b3O+>%7~k@QLTG01Bu^nlDv!)IABM= zD{Z}5*uj(vV0PeOmzgXG?jtm=FNmM%3(WHeo;Y0)-$L6fNtLh6=`;6HrmMDe?(X{x zJ4zhK2{OepZ9;!Q>@74D?3pdiJZgO6$tIVwwRTI8D<`L_u0zR4%toYu` zHn3GU^O#-rkBu(3(t>0C%If;7oEQcj@Y{Kij$Y-)=4F<0ADXR3v6E*XMim#{{yPIZR1jhJoH$?lCy(7 zIP`I+M)~3@yl8MXbyZ{(=t=QjB6Ljh!uxgE=+!yeBC#pSa_xl&1*FBgThNk%Nb8P` zvo%mUD9Jxxf__4Hf4i(#bfayqt(|+jExNRjC%I28beXq<6yKf4eUxB4KX~kj`m#NI zu*%gK1g7z(#|opuj9ep|H;WC9$2alqS6Yh}D4J@r8Zt6nj1siJF6z~6*s>+QTB70T zbA7XR{-)urGvU|E50=K;?^_!{sJK_1gDn-9=lO^$`MV-S2p(1p1Lk&T+nysq{JEk? zVH8;$qSJb^COKYqvXfJdSLAGi?!SJ8EUJiJtE5Fl`V6H+a@U%ix>B}XE}ArqLG-tz zZEQjzqJF<;o0(6|Gh6b-XB+uTbnjgaJW7d}bC#&BdX?zbm70$Qg(V*XawtJ69iXS2 zZEAUE>3$AGn-v>oRNUHAtH?`GimX}>j2-igIbT=Uur;Q`6vS;M)@Sd?MJ9Ql=snH$ zQ|~oSEA~BwtDPYy5UV7r7!p3@HIE#)S*lJ{$Lw!`K(Fq|eJnLt^j1ZEviW}YS|TN^ zamd4d-||315aA@X>iUCijlh@5^#Uh`j8kqVq=RefL9!}LOizR#e=b`9%FF#6y@CR@ zmM$!JnX^gxUzf%{o>`a+s}>k3Mmgji<88q#t_zR^c;8Sa4Pkk8dm$Vw@6=04Ic4gj ztGkj}^KjekZ{Ru)=ojwh9C!W|R_D*aorfJJ56v6L;|T}1jRG}F{H|=Z z%vmZMYe=dl^un4{0yHj6x%7MB14mo+2N^VsHd13KH^XaC z0h-M>pJNmEqI3H6*77lpv{~=M$Fkx8WDj@?*DdTF7cs)(#GU}nVkPm4wG^Qd@(NM6 zBCsOsN$zGsoXL^^{9Ai>=9%!Kh0|;-#U+9f$fBmfJU139zjoM>`@X_#GM1lGz(<99 z;Ol$0obHpD(qWV_bZX0>SbV3S*_Ibw($jA>cdxUm4!2a<^vw_jdtx?P4`NHTFyjq| z2fR$X`{&2=udlpoyByxR=&7688Sj3xeYUd6=MD~-E7iBCy!G>_K$b+M4LX!p1;JE4 z2hc4kH*lF=6*4exs0YS9RGb=*>Y2_pS|DkgHnAwtC=y+~sH^x)6X3A;>2;KFegL)fRab*! z79T&?849g$O8HsDB&wWIk z+~5Dlq{`$q{=8wAi{E(f-kPK}rcQLUo6SIU$T->lYzCLEjhr-_gyUyI<2ra=t=TXa zUz@h$Hm&C!F%i7_Fhwo{TZf`-dyyEK(`V@<9S9RCANmm%Hj(>A7~T z{0N%&!y90XMr_}&^J-sV%j^Ij{2IZfWzbxAaz=u^;L8;6ecX-SM>u(TYz>)0Vr6>k zmMA}X%&Uthi|iv>qref^+;G$5vCXt=z21SrqF2GT)2ou+_O&Kzy4hpWWCj`f1U%Qt zd_5@S6$id4z%)!HqJ~qv7v7nU9l5*U=@WzX4h)k2#+~JOpVn{9$ z3NT2quPyE6mC$j^LExH)crfUQ{}d4i`q$N_M*&6H3P>E!Z|68^Gy08G4#|awJ{afODos^n#<#zG}s;s zg(}}vw>@9q{NeF`qczwiycqx-vrf?G0q634eP2-T)ZcLNEz}UWwh;%yJldD;1dk}V z0jAHtUQct=0esOnsuaesJ^f{Qfa`eklV9chWy}Exo53Bq9XTsNZt4u!d%Sv6Dax@k zydGZ?LIu=nCMy#>l^Vj2SN1>`oyLSV_W+&>`#Vz}4VG$mR5H zl6T}j6w~nDg$=S|ByTK!PGOr6A4O$6Aq634_aAn`faAaCN$1$m0v^hhD1QyP#f*{= zX^eRXK+B&F7guhl7eJ{UKm`yxPhm;$1n9Pnvshkt2KZqhDYC#*PMbqX-O9sWfP8=q zWm8_>Fy8kksq#nJ@~{8>-NE~@M@}zEe4?$;;DW(Lz{r+hkOZkU#5%#;yWG0Cu!VO5}N2nS#k)>eYA=r(RaVAxT$JlEQpSTPdPB8Ne+Cwi{dju}b z%1$$s8}nv)fkV&&fLp9ZwTLmR-QmA!u11o07wJ?!iYY-2%}x=j@7)yXuvH7a?z!K- zC1)~unzB{m+C)0H>O3wS;e(zhfX*(A6`kHjP2S+|*D`Lzl${9D|Izq}2@Q!WjEKVN zSIy|-4<%FDk&wXz2(+~yoG#cz9v>9OtZ^}=Ys;BLfU`=MQQBA&t5KQkl$DhAAxY`> zdM-P`@+uixHVxnu3^fr!f~e6d+>m3|A}!zE*cSSLH*2e=T(0(_=Ta;^-ogE0ty7SA z_tHn{U(Ped65Z_xg`ABLm!u@=BQ=0}t~aCX?B*w{u3NIi3UpLG{z5_yG;G;=o=M&N zA~!Y@w-F-3Pfo3UcHUN=%0jJbK4xv91+PqP9 z6?aWX#jtuc)h0n{knbcXH=wr3U%t_9bk;6huFcaQax09p(I9r*@!I?HnpYvT4xuyb z<-&yQ$UzK^DOD>v;wGncR;oM%jwn7V8ZX)}2_Qk~1QC^;y*N77#+uA?A8brHZwl zGez~85N$p1EH=rC2~sktj;R7l{)Lg$QEM^2+%sOq!&T@LydD-iBA*x2>tTL3n%gb} z0^oWAC6pV6yU~0Hh@izn^gALDY?jtx@vAFt4Rkb_7zXYg6kyNAONpZ54%@`K(is&X zB7cr;3^8<^bPsE#wapHnApIM$iC;;j_t3h`ZbJ6!q!Pc*(vaKnCfG2ChmLbUjI+gT z?Y(h}g}2&bXW@}_#E`|!O{;zr?Cs_y@)d0szD@;7?sDAPmX~Kj40(aV1i!1B6buic zEntFex8arzD;oeJaL*iHOQ1*bq9Z%%qjTE~U@*I_ZRqh_r)=5~xqE{)L~;H4?$^KS z(;qkAWyxn0_YzsjU3pHr|0ceTO09ix8W7?B?eYyD| zGt~o*6Gy+AY$3-e`RFy%0-hYIsw*W~us0MfeV*VyjRwt{+jWI(CYiur_cu3qI!b~I z)+9wK_OsxU`k+OLTcp+4#GbJ!$^M|5Mu%81zv|JlBuA5bOQf;`my#mB?HLZes!P0` zQ*}LWx2v~~rcVX~{BeEWy|evM*bigy7L7BjhB<43%ht6MnaW%GUFO%hB_T8}j~9li zq<4?C(;16YkYgyLBLg`b+d9oQlHWe6Q9YXdP)1GJG(HaUs9zJdEoLC27KU2iCgume z^i|&w{^8tmk8!)$N}Xy`_;}caP$)M4K6#FkpwEulPTY~h)bcr|^J5)YTva5!<5M{~ z&pxc-uJch7z%V@7d`jzfzgpj!loAg7=|FgFpT*|rg@pMlp7?Wly_Btj&jKFS$PY@F zks)obT+AFxwPziLMpvURB_%JnL4#u^rVFnCAONC)`@or(qKARJ@qod!1YhM7ZhlUJBXoUQRGzX?bh7z~1e zF-sBjGg@F()t05hchNRvM1YM)B$ZtiM39UlZwx>L^4ZSu#YP+R5NQW`0eJ+_krD!X z+v(d}>^vlCNjpclvffrLF-s;?t%t^Ue5UP*zn>d|9q}@6zOp0tyK-d8^BuWp35HNX zXJ$lUExm7{%+;0)kjDmP2|z5qT=}k2VxvTly99A2)j3YYjKQ>i^3~frL0g?wx6j>9 zPpQqU_bCWS{rcy!lnT!lcpv-zXB57vzb`jreNvZR%5vZ-_~cmEd1xQl(%RD+JmUKz z6kr?r%_W#%f6|)0hGaw+KJPn1MzD@EKEekM#fcU0w>-ujocNA3!Uf|QR?*fBLDT`5 z**>+D87>@^{1Dvw4HAR#=lDq= z2nz&u{SK_H2=ul6xO%n5IpY(2zvnwtHKSp&7Bl zc8Lr*6DWnPE=i`nSn*x6i`@94nxgJ{g0|c8fJF-oSdC|FGOHI2ik8MsQYng``b7v)wlxg zRW9ti5wQ@~@d4=I=Q&%Qqo}GR#|=t87wp4FIgQ;qvxJ=op*t9+l!7P{?vTqEXTDzAv5*+dF0XHA}tYX1FibXiEP=}6(& zSFn=$U>jzeetlP(eWd$zCN6KvpP83}=af;Hw(2)1&pzA-x*Mk6PiFnLGA;0o377$I zt#7hQQ%ZC6*Hcl8Vc$x^$DB7NNe z5_7v&n=?+E8azGqnL3k-C+Vj`Gj-?7s~TYs%WP0juhR7l_R=%R<6w^&Hb8;dX4;Ld zp)J;*L?tfALbA7wjwl24@QEM``cvKh&&_wAT}+7f9fJ0xRR!ZHHur)$HxG|_9-6c% z47ofiG&u2q*PuFtUwYp(6E-}bm>fZAxvsRICO>r!0s8Qe*LFl@;9lNkKI z%lu-1h9Zx0uHQHKs#t|Rm%ny4A}&W*gzPi&t%uQ|dFh(xiUa#UVbF`uRdT;Ga%P*U z!o2hsYKLN8bdM#8_ESjRrUIkoblHBw_mOKf?A(RLPQ)g>jWV9-bI?9n;%Ko zk((*P+-P8+0c{~qWLDs(THP*yLT@a2Wyy3qF@f{1SG0?${O&W2wX)&P)`HQA5%1fV zphH1hI>!Os@(6+`Ou}m-j!$CdvGG^2H{Qr#VghY`to^AT#v|sZT}zo+vg7!Jv2J}B z*$?5A z(npK*r?MX}(AJ_II;c$R8e{Hw^}|l@=<+IeJCOCCz(9ZvuPPr#98jVs3_Yux`Vs5A zog1lQUsk-!sft>z{7GZUg}o!c#o_jA5ah3T-VT3A%U`XnSIZ)Y`n)_^;N$r4fQe=5 zg|yFhpZ@Oj!;c>pa?ULe=QEDf`A`h0$=OM-%wS$H2{|6NdcKE4HcyEFY*bxvb%(&} z3Ik$Jrvi9pILZ!u-k?3xAGDHNZ8vtEi6J=-FPTwIP6__HuC<=@0}lUw6raD3k$G?i85;u^HmA z@=m!28bPeztNi%4Zs8JtXq%B-R2Z$4(nw_tSRGw@(CJe4)DVC%jWdXE)u#5J)Fxq0 zD>aOStR<*#x{Rv0&+j@bHgXI%G=Lq7*6ImPiygRKlgeBQ3rDUwdC3)l{18 zOLx82DodfOaR3?8RTdz#fXEb*Y6mEhp_q&)kU~TR1PlQ}AVYU)fr65jc}^=b3lWex zBrOOLLWnXL<_IAPV*&)o9N*EdzQgOjb#LFbdad_IufqbK;kSRgMvi}J zk3WHk?$u7N*naVD&dS9-KCI%+V(c!mZ&FUIH^_AvaBv)t3kzxVa>S9acz` zde~t??q)0#!qfiBej(j7}4^9f5uV7Zh&T;d5Ss`J{6t4Mmy6`(O(s*7_HxGI}nnG>mZ?& z7H#xE+th$$9+lQzsb9bRXQR$2#5?58&)TbQ)zV-UZo5wq3}%CMwO6YSL}M{NOC;$) zDdD&@o4N%MaB%4w*BD-{V58NvGj#H5*Setu32fSyaeCkv;)$DSZ^@0JFUCvqqsAo0 zKL(4Ai1kK;7*zG5M#yL0UM2D)4{`6+q=W;ZvmpetWX=Y6gN*yN%rzG$5R-!(HZ#B7 zq0JM!<~1s1UXoIY_ZZL%fMrLjXd4%=qw}Eq?iC=2I;4ZRL+3Xj^hG#%&UJ1qtYkB6 zW!MBNJjW3hU`+?9NN`=pa-J_Ozs`cF)h-@#nxkWzcvo&-nF}KKQ78GnX{a;Str%b|ey7opvF#+Su)_~|1tlxS0QWpBu+Qg?_`uW@X>5HlV#IA^; zI*9Ztw;GG76h&W2Kwk})Hqz5ltaB!)P6TOQ4)%&;i)JZcKqVfpzy6B69nwh(=@C+H zYyl{lVfU+8Z#&3R#|@Nz)bu9qX8F2YS6qmRSypzBZOsLB@cc&wEdOFm?1&J+f9cJs zmJ^fW7kbV3v!H&Qx)GF7qNTc2D8UnuL?rZqvu{^t8T@waAcC6Mc>~=<@(id@83S5z zMgY_;ROyD^NwL5=L)48BA{Zi{dzZ%9RSsi^I;*Os-Sk3a{qU+DZg+291!2=T9h;UZ zB+I)6_@PDm@g2Aq>UIW`2UbvvjdMO5i1__q7w`Y_{hY`GNq2C8Y8D8OPghpnk7gve zmE=V#CsF@aL+ zX@^2$1;4rEqrtfRyWGDUcKpk=IS~5FLUtiJbx{}6rInaVMO%|+(8W8i^PdP69ldP` z{PYop9_h=4=`y9af@lf)CgqyY9jP%JbY?&-sJk&Ou#$}9n``S#6?qIG>Y27Q0j~sc81o3}N^T?42apfbJ?mkHqeI*&1FQFa| zz_IAN85s9R=M4_@;d!1)x4B+z4(*eGm*Qj$|4Wpab6j}WA17TVN-D> zIEdj)gNP12#S<1@N^FKM>PIoqVg9G*=F2TkDq6m;{Spy%Z0E4z%?qI9a-~T8UhQ@M zP@vtNuoYrUn`oUjg>K#ID7sNQh#51*`6ZBxZ*R+QhO&+b6BOlXo@}k19r0uJ@+ZGQ z?YaEydT$vq<$&L~S6RLRW(HBFd0%!lcWbjhY1n2tE%I?^oVSac?&xLD{1-Kl3uQL< z$0WVn$xtg>$d6~e|9$!G2|lnZjMhJ#TvLJFJMC37aIfD$w|xOnqp2;QBmdw>Zh1W~ zBeG4)41hr6lVSCU#+lPqj*qK=&NHOx37Eb6aeBt_7(M7X)?=hAt#i2n-?dm+mzGuE zfGNmD>?}X3@Od}t7!2c=@r z-qE6CSx^C!;)nscZxc8DH`=Q6%zzvz@k!fwPf}ZZ=_Nh*0HckP)Bd&wLR%zu&z+wg zi*w)Leh8G}=Q0RbNG=!N84R0=9}Xv2Ryw9Es7}f>^N=zA!@C7yMR8%Yw3TMLA}+o; zAzG-TPhK?gfz(Wj6?#m4MSx2Zv(nJec|*20YIYMj-=^=K2Wc-R{P4~6&HsvCgJ@#ljF=fV5(r9+FjjXG0%e5_Fl~sN#d5s%O%Vge-_~4-qE%~ zKbn9HbQ{g0fo-zHm9)+f4+XFLg>E)I*{QP~Q=MPzV$T52scc0%?bF>rMKVTLozGLP zLJHnm3FSDTjX2h0OqVB|D*>9RKW@Mwm*8&6PwE%#_Grp)9zK zJ7>}px5J#^?5#;Yq4B&kya2betn#8J1O; zIzm@+mMh0Glbc5P-Qnt)s}&4gsy_H6^=n!NthKd!Z`+oqdD2%{Y%psespZ|hot+!5 z0dLi&lAVz6kmQqg2L;t6osp|M>rc37*5MgVNJ9gx1QGoLdZxwu{6d*SAH`63I5@g# zVuV+kr&Bv0e7Qny?Aj&`|0xi9Wl`6k=8()^iz?NlV5l`{mxa}cI+MODTQ1i&FNlJS zd>Ki2-?l*@Ba;vhre)yvmn-5?=3=9n=o73?Mp-(q!Z^r$Oi~V`D^>}`_PtsKOF$zS z93+sl|7yrSl-?gd!}$-0kYU9y7%p}{OxM&dqrBpc9??Z0TUu-V>>p)^Bzriqc4XZgq>?6EXow=@$3})4}=De(bYmj!UCfF@*{pmU< z$QE>I3(B^1SWk{yWe}7%YQ!A4R{m>poftMGag2j~jkWR>rb}K@3YWbWR_B?HNgF$d zS*Q`G+Q(~!$5R-!v9Fq$qk9!{g&VXuEY%WqvZK8le?Fi(74ny`-2YIZbQt-R zzlv3n>bE_687VQVdhJM>z0A-6l3+~v8yL}_4%%i$y)88wun1%l*IT8>#jUGf4dmjv z3xH|YFT{PnmVy^KSl!zRVs=^t3iu3p42W6c+K+wBBeOV6_h^gq+%-G!^jG4j$Wn@t zVntB51$dzL)A2L*KiMaup=mf#L#FuG%oLzeT-LCuOmyzm@att^GCkM9s!aEe7-o1Ja3ttfBgXY|7VaM!QMg;w*ApLR6)X6WsU z8UUID<{y3)UJ`o5=DW;*ekotaC#k8T2mHIkv6w3 zET?gZ<-Kh26()*ky@A;7-DJL*7s^X~t05+$%)E9h>fwWDeYZr9f-yFmFgOQ{Q^_oN3701X}h=wvD3Q(p6M{Th%MhdaWVHi>UmM& z<#N8wXgQyFW>Hl&*AOzMI~`v-=3i8c@UPbbkP==^*~@bQy)rDtUI~hYy>?PJw?_~j zedgis?Qi>fy*9Pf)?%9#(Pb6gk%4t$IOKwRbK`DG*bMg7@>|OzD+ev3z$E%?$vnM; zSzaZPfC04EZc$vg&C(K!aA`+P2YOxrwz$60CPJO`cY_aB@kv+1%cS|YW7x6l#Km`t z-rlx7b2Tc@oTR-!waNPTY5Ju~Zy4KE;!sO_0bzbua4*#CD$tkBLB+cpusK?ajZGwl zhd*mbdgKyBPS(_Nn4_7Q)FqjWR7|e=z`$`;7W*GLKjS%-mfgG}2%wOn+WV%{(6`O~ zU>8&#NmEg8y>7QJ&NFWsA^?bytr;SYPs^Ja;#e(bW(l256&{$&%LI+X!Duhvn@a=% znF*RQiAaQw`Ya8x%UZFP1JERexOo{&tRvLfQ$L`C5L|pmaP)M1$$K>)=YRysHZfy4 zI9FvYgQv{DTTvCxY=IjNU0JV)7oPCS9rw6!D86AI4~qv9G{2hM@^v6G${mq~GQ&Di^ zvgi3YUWq)aWx%z&ZPS=!87>C{;XMaEA#pc|DlI8^DI<|O9iKZ9ZPz7u2m%C$Ba4u5 zg0u1S&P-U-j0lr4+c1?VA&Qzj;C}=%o?_GH-YVTNz`WzI-n~OX?RO=rZ%Zg&06;q% z9#ucN3YDNs3T@$PvAcpuh+MqW*S^xd4~6)+t{EAk-`^9AC(0os}!znYCnKOiOo;z@J z@h_|g|GvWhSEK&}wc#tubA09iP>##dk=#ExH9>6;(ziEUm`GBMsRNdM6=Ky8)1*CB0E3WOc<{r$X$PKkY5 z27ai4XZyPrNr|bFP)k20bwMA`(>GnX-|f5GMI z$^!bR5UXu=2cO)Qfy0C@%R#1PQX%kP%P!=IxEb?1x(gp#<VdEPg3i~Bo;7ld_laX}3xD;-<%jnVoxa-HZMDI-ny z`gLcUaE*hZNd3arp3CGlos=9*XMq;P48d{#ma^QP{Mh>6ea87Q;8v(H zMi)Tf2AWN*{CP)QvzsX2$4~d;PBR}_r6t@3gSD6I8^$$SlAT`p^%VApymh?7f%U0p zZY(W!hjz&=?ESWsj0@;CKT^4ePQ^nX>K^Sia=ut&I7PiAa58Fz*r&hNK&efJ107a} ztgv9Uw=_Iutz@iq3AqGf&c0{nAmhKCm;=(voPjTdMV zk7ll>TFY(~Nj%sT(Ah2KoM&J%O4l3eX#@X^+6r>nrfr&U+^)%UgsynW@Cn)P)gp#A zyDKP|=3o#28J97$RYIu-dUOZxWqA=nqBTH|yjC=eL4!`j)e&sKISdA3G2g_#iO!tX z7v&4BVt3Jg3$q~uE`bRas=?}Lo26MQl15LJglUIDKF0XkH0(e>;k=)*I!HnBc!O@F z{^P0n0RsDl%ei6`5vLamAav(2w256H`0-cQvtmX{jp~y&6WZq0qZl|yJmsy-0d6si zyqP0!83UNX>ZIe2b&A`AC}KxYnV$V7-9hZi-nixT(H1kb$?t*E#&{)w4RSH-CVu42S{xaKIRg3$p@z&!wezVo21C2#2Y}F;TYz9R95Z&EMXy|G<_{ zbP~u@HxcA%#;|jPfzr@z`4P_d_)pcVUqN!gGZIAK$KqA>*iDA}BS-b&Z~WJ4iXh>=vQo+=B`EwNu>cX< zn}gM8M6S2WpW+U${z|9BhnSX?9#sj;Gw}df^@1CV?^Q9M4I_ZJJ(9<*PPh5xgt<`vsXqE$j{t8y6D8~HhxUz>BYDDUT zdN31_N!Y7*@^yXH_PBk8rTJ%2hl;IT?KqT^S5TEtHPe<+P!y?vxV;gpZp2 z#5%L3#&5U0J>87YQxQ{g>Sw=ZX6s(vD!RR6MeC0k(ciz?GGA{V9R^>u$9Fn!&}0pk z0s_W(17OX9!DEjs zOpu++vK9q*ef^mI**bcL_Jxp@BNJ^pcxOLo2aNqC7;rDU&))=3hZG%ir1{Eh73`?B zzxuSAa{cI`#Dj08C~HP@`N^aV^~lZ9%aiYmJuP&MoL0~?g>?64 z!4gesH&zvadCjkP=a5q(Tp(vn9yG^hbj85wIap%ktrbVhZ~m@?{-KSZYm1$*4R*x| zWe+GO*tM2%kAox+k3(^y5ZaNPm#!nE{CwT7whHdbF2k%PX|GP1)ZT)@tp>dCsrCKj z9o9bZ2zpq=n`03w?Q)d*`apVYMtzlsoBsG2l#(YRWpu6Ob0%Rfg9HP6AA0s^5Vq_I z0De|X&Teh@JR@M_d;y?D3%VM-=$Bk+3alq=$g#W-xj*;XKwfQK9rcu3Ej^nRz(-rt zvrUJuhc6?V`;o;T22oOLF2i3M2hNS0#v9+g^Z2X7KO3?7NiZ5jij7D|TvD9t3tO>T zWac6UU};{pv{h%~;LM@S0GZ4gPA5at%qUe~IERk>Ud?dS!#=7b6?Ah;KSa*T+G+^3 zxhUFWvURKebwhBP(O}9jXp~C_`B4zFh=>7uS%nC7Sx8MvaJ3t%?YtiV)=hRf*qDf( zH7{cgN}j*#hfq_d(BX$mv}i10WWOBqNyJjUSfHxnYL{MolW%!D``e*13${&-%^8M$ z+q*#s6?tYz@^KKC!m&HCiEcCD=8T_Qd*+|_oI*)nPh0Bm4g;BPu=E3fc-4Egit;Vt zA;d5M;?uphqjB~Z?eT}V9uWPv((?56-g-52E5x>C`45t7BTA@_^X%3^=OFAbs%SHI zn!BAKhCJj2k|5gjd*q2DQE)fnX`zT{+x8>vYul4j?AgLR|ATw9<9)eX7Vmnl#C9<5 znOxa4mXQW{*A4F7p@7G(i36dvL&q*uYW@9X_zTow%!KYd{i2;B?{&dd#Jx?o5PsLp zttLk#iF+K^`Td>Eo~K=yFw?Z^Q#+>_=}*1<4_USkezbbL9vNrgo0=;%=kkefL7N+_+S zZH@A^h(Y%4>Py4BiEHB}2~C)#W~Yl!$e+e%)=tk{aP#rK4?h(M!%If%bsGpL{pD`HvD~Tg&EJ>U|7@$)mEq85 z+-*2z?&_3}oD4KbqguxV)XxC;0V_23i}gGzG=bK4q~vAFWiKnq!&kfM70u;FRt>}_ z`9BgyFM6^Ez-*L=5S`}!RU9!MgX4eFA+2lc-8##KEPV(v6^ZZ}DT@3zEp$TI89~(n zh{d;WSb-!T*CGKWN+5L%1@7I2c`?Weg(2oO5(s@m4up$HJ(X(~IhRLjwYlE#v?X!b z@|j4{!5^>#%2G!-{LBCb-^QASjA_$Ja}fDw-^P|zOt@Ix4gU~%;r)E%<*!otWYOzx zAWfVPL*CEn0OF?6n;RR(msS){CbvljA44!eI;mTnv#~tQ+1?R9Z?0Vin1#2idOcB| zkhD2gUXAj_MGmiR+gyHnckInPSpJ+MFqPE_l7#l_q|S6zt-QqgZ@ihByVX^7cdLE0 z)oRmMX+hdn}vSKupjsJ-JZjhIrjry>l3iik5+` z(i>=PN{i!t4aJOSpBKa}zQ{j}@xPLPz>k$#Z&ERMEw10t#G9^FP=kH(Z1xRxVof|j zg^~LR=K42tOjv^$VsYlJVFdB)C=Xy=N%g%i({dX2C77ZUmqY2?@}+TcVNkjDmlsWz zYTg7{6y=kNf6Pi8d`z@_h}xs==M$0|bWohK{{-{V_yqArNPO>KMfo@HzsOEQb-n=7 zX4My#Dmj0N9S?tD3=Wi|U9Y>{7$Vo#!54Q^KJ_|iQpP@*XYr?L|IbgEG&=kFQ8>H5 zE;IJekA~bSvj}No$hsNUs*FUc|97Wv<@(Zcj1mJmMR5|KNQKc_kyv|tz~>Qg_k_qE zG_Z#pBveCR&}EgnxHtn~R^DmtCcX@QG<}+R(R|00`jQsy&40PPTi!LTV9(A=>nv|# z$JRD5Z)QU{0V$z^%F$-Yqvy4U0U-HeZ+%i-)mOOmHA2A5x(dZ1GVjouVg(5jNNmr? zCoUCvV=95_5&NaZ)z%&AqoSflT4hD-b3x*JHS66#;&|{JabV(|^!9V6tZsT#dMZ$- zzIBD58P!hfpzUn3Jfc_^!oxF&>fe&D8$vQ0+CZnY`#4rs+m?Ax|3;YqlMVY!8}7$< zZe6T?TsBn~{dKolX298VgFsR95%XB=TW5!79oKk%;R9aVm%>d;4ewnT8MaFh9SQH_ zODuYA)K!s;mkFqv{C^sk)RHC28zwFf+Gk~ zY&k(^SNTTVLA8~XGf=SaIv!kF#=nWK*~n7iyVt>hDm$|FIX}(|`Lvkppmth9(f#rh|rgwEQ*6Dyg@^&i|s%%ANd_TV8|%O?P*yQk}xS zSjB|4FDidmY=M1?^Xj6S`(I-`TyHk8we!V3C;Ieu%-_9xznrb{IAjKK)-Ozd+xYpU z+Ap$OCS&bd#tC81>0JY-i> zQdB`qIw-pSzQLDGdQT_C)n(P0RCxG}4TB0r8_{WBb3v)$y`=jN&SJYg621*66-zlD zIFnr%y~Rp{OwKbN^d+rCoKy_eDLHLB3T>cF@7<2#Ff~DluY*7EVuOUb`qbM{!Hhoj zhjnm%0c`dj&K8QnlM_|cKd9DUtV*<{M%L5oqL?@U0si8gKg)kx>{I1~36AJ3^SP1O$`LYoZx|Cmk<1C>!0Wezvw}6l^lY*ZTtE_68H*7l+E@| z65Mft)lRIc`%?+bAQZyZUnrQXTiX4*1ne4^JPJ+y61 zE6ms30`i^7i9i3`9R6zU%6$pmzvwCcwlDm*1@}HY;=f(srzj8!QP#n3HE{D20P@{$ zBh+|*(Alo$=yIT(UjY43Rm6;50S*kLe(ednM>X)H=DHmN$JHiT-^n{Lt6mX29Y+cp z_l8F*E{1B;wcD5ON8e}P4x37d^jz0w$?o?#x)DG2M@W|rY zvx}~EPv2b{(fa_!3UbR`4a1Za z%pb`a`;usA4;1UzcJl+a-wyg?hVSn*temKAVpiT+-Yvm#cn~^)W={-X`JzAAdmT#Uj{x>=N_k%q(EM1y7+zr`1SUa`av$24?(%kZ+Ytgb} zuELGW!8v zp|d->o$$d(%H{_;?TWS&u)!Ga{CA4!hg&LSI%DoQ-A#FzR}f&lErsoIGt9bQsY@)5 z2fA(NTuT_EylEyDc2?NK?~n--0os=p$a`1c_5E7={CHz;*Nfn31mR_Gu8W&NjW6U| zqdrESb~NF9YLYaLW=haP&b4s^t8&&maL#$dB{~ln3F8;f`A1J?=9Kg8=2n8sS<<~I z1|!e6Wai8$+73yl=M4KI)Z>y-m{0JM*k@c_Ry96R^q|yf$myvzgn7;%<{tLg+O3iF zxYm9S&7jj>v}*ePhKr_I8tOWQ*jiaucDNqn24<)S>Q-HEO+xzP0wZfzJgZxADY&yq z7W}S7Uh!~D2*)Xt4+$Vwj`TMNe$t=qVQVb@lhxd>E)=Caw`MfF@yZ|jRqx0C6hA*% z+Ly##WO&^S%MI?rW7QOtglP8|5D8_%>Woqc{JsLk#4+%#h7?S|gzO$FZ0fz5V-bY| zkH52NS~k5L9?CD?x3E&%C-DPlNxu%y^k>FqI{^-Acox`sTyqijwbJv`)f0C%xt}RX z5WbTih0bW^JVN<2y7e!=bBr%p-v7pbD&nJXcMVWW}-jx@UE2VF?aa z-dnG0aHD|EfTyHodP61%^Pc%fhPvk<#k)Nzv74?b?pRXpRR$?72tblMTyrdeI&IN- zJw}tZ;?6+0-Ign_|HHTnFgG+i&fRKr((B)&crHO7X|07nTR~t}r( z0$Qw1h_BpLCX8y&<2E-;@UDj79C>uqRJ??8W35?LyZf?J7jKnVi1$yq>U+t7Z#e5Z zDQ#ezV#mxT1Uv4f7M3>a&58~VG|*8O7y5#jiU8=WHT@0z&HaeTpz7Istur3o)~|kk zPCo4YWqaPd$m{)-TzPDYl%1~&J^AvtDCdyTD*>Ah6tf3t ztDqu$lmD??hDalf#wqb?CQSg$68wm?OvFxt{HS1cA>6RfH0n9Cvj%mlns#BkmHliH zsQ@f?>DBOgmGdy%j#2UjFn;&ej(y0k2HL#VDmQ_T(1QX%^ar{)d?~s~QSdS)2FJI| z=gr-u8d`xs9Zy6W_b@EyK}tf9u{d;kq>)xs`y1ToLndD-Hp)cm4->;-cKHnXoR@B; zb17uF-V!zLV0Wl;Z)>?MGK+0WIwFB`r(9pWvHjgES})D_eDmLn@jo2#$pcIn529hr4Q$Fk6pI|s zYf;=kcoypPs@t_%3jaZB%^U~CDmBh+2@h;}23O1Bj%Bl}zgG)evqPWKSuc|xSxrPE zxHQS7Re#bSNyV8qJqV(^4<*>1sojsYY}>d_Ywt}%+?&mCJ_-035jBAn-^EFeJ;Upf zC=jUg$Q?OOj_@nBHSo7=9FhCF1VmzbD>hjE0n+44QP`Gf%58-ncy=z-DhpAx=Rt$J zEg6j| z20r&Cul?RLo@u2V9n&Qi*hT9^_uBzs!k++;o&Xs7uK-8@3E4zrX*_4LRZM#sL;e3y&NUFd<^{E z2L%$JpsC7^;>VARk6OvT^@`qZTH?zcyH~8gQw)$okI8)Q>`JYdcrz5r`keJ`rcgf8PBHeK zXx_TmQhQ&t7H^ru=13QybsB`Nn0e8i^;_EWYd*r<8fYy`}52?TX%7v}bT^%ys zad(uH=`D~?Ct;?i0a|{2VYflXf`c3lDTE(U)Tb0;IZU4lr@D zKa8I=Cg44;XE^j5KrgR=v$sd=PDpPz(R=OXkhgF3QBz^_C0|=1DIP^&i|E!@Gl{-L zO)UA4%bb4rbl7~E%}#H)#))_IUNClpNh7Mm$FEnJ?JA~ngUW74sRzbw6yM|wWCm+S zRowgi-&+D!*230HP&m0SZDY&ZYjDuPslg0?${TdKM4k!8TtBvYj<-@)`a&ow?S}v1 z;WdCzt^M_)XqXAo z+{`8;$>@b_Ud$*6AmFZ&JQ69qxbe(MX(GpNo}8p|4H)K1r+@fRvAiUo0u$|S(YXCU zJBs8Z2;fQJgTKzb^lWMC8p(+FG~6klk2|kuKbvx0#Y;0{D6*xufRa8X1Bu#nDjf$Z z$wS&Ey|U7++LksgfrEJz`A<}=`d)=jLkbh;hvI4fxdegSdCm?z!y~5X9b%ocNb-$z zAX6gd;&3(R=k><$?IV}|L+ z2?L$LT;YL$jAIi}c??uu^|P{Md>dSC);91&=2G-hQd9sWFlrHec>~@MNZwYT0Nj`$ zg)uMlDou zYQpZIs)&f{r0}{8LkjZy0y$`TZ;?oE1?Ahp$RbB8U42`U4}vbP+vB}5bg|#bT%-E{ z{QJtCh-YNAy;IJXL-^!vu@O(bu5KoJ698yGuL$^vPaLv`dJ)aAK2l~%uMG16ptxB% z{`c17&u;VgNO&W-xGXwF`NrKkf-SruMg@R}D^{|J=% zd1r1%eT^t+Pd_ALHWbio(jYaaT%1Qi~WaT6g4 zvm9j{y}Y5b^6rHq$1Lo4$e;NmOIZqBxUgKN`a*0$<5_G$>*hg76T;mf5BFh?9 zm6TmPdIxjSm7$;j4OF_l`pie*(45ekm8P-$*1P}^IDEMWh@%YHOM9W7UkHQB7fK^z z7t`yH-D1%n2^|r89H|AQ>zPRb~rS=ijRhS*d{fe<;J83h=zbcgNnVRfnq(X}exjDM+** z-vlIC0i)w&>w7hYEq>Zp^(WxmkPqj&DtbX{MErj~70TDbUz5LA1K^A&XmTUAf*`s8 za1!>ylr7K|4QW4U5&|@U!2>@!06_K)4k>&e*@l0eU}+{e1T{Pb^b!hvL)%n+%N5;E zJ^?&K3~DLHZ&^c&k@LDpVx{ zhfT7*?!3f)S7lk4GO$r3dvv6DK?7Wi@%)qDM%ACoMaC|za4Xa#K2TmR@Xaq3ci{bi z(OLc~b_cnzb9kYGTUjz$PIWtQQ^D+_)4<(ZaVAj2KQ|XmqCYc_ZE)?bm`9f0} zfg&zby(|Hk z7Y|dgl)BkwP*I_RH{kkF>AFd)P7DZRYT>sJsv=$D?{G3ezP}-N#NnFF1EBjVRX%<> zXHQRD`&s4kU+&a7e`>~HZm3C8OhjtTkyndE+C`}1`z@ULGxby5`@Yx-W~OaR8foJi z<-6p|h<-@**<$k_e1vOO4rh}ZZGK(30!LJ?1V! zyO1=D$~L99D$7q^ny$D0nfStzI`URXZi2IeE!Sn_|x0tU=z*OLCO+vRk-RBOxV38L4o? zZG1RXQ_Mc0YQY&mlW--#H{}nbGw=(?e$2s+K|M8I_g&yA`oseGCu5K zQgR!twDo#n#s4d)fAF(e%ro=1(}>nOgG)6t9FktZjR=@qL%#dSRHWZ-q9%tK_!xVB zKCk1fj0jE8=uzm_boY;R_jA7QUK=JSz+C4|5Tl>pTPo+pptoIVLR6zj74cyZL8{ob z1k6L?W+R}LVfkfZ&E+$ecD!8ZHqo+1MRigofL4x*c$n-Je`i%3S^C4067Pq!`xn=Z9MRhdP zz_jgIIkAhLWfDPR%y3KmIyEeLI`vI{j^vvc8bj*_fYu8>A$2*YN+}}sdDEa4=?$#v z!M7uwVFllR;>RyFYUB-)B|eivV(bGqX$zHGu_eyFUjs%K#FdJT*l}dl9`Psr?3FEx zDbvd%bPE>8%Cy}IrKM>PycD{G*|hb}PV!H@tV&GpH1Q9u8DZsW{jPDI>3`mY75nz= zcVSxJ|ARC0&pZ5pVNs;7&?VpoSpIlJK$?xqX`Rlu=q4pPvbS(`yXbqIq9h(~{HAEV z8Fm|y{?wtdouub>)F^8G%QVm@`web!1Sjqc!qg$0UtUp%2zo!Qcous1#Qn-!LQ+ZtqvSGy`CN$o}8YEL5E`kuTMxBtZ-V?%j~9@<`FXjAyYBeesX-ZD~vJ$QASZ z>w338FNoC6^Zg*qbGEk+{_f6opNYmEqW2xx(20MZApYTRc0pSBHt`C^ol5Xes&)cc zVe!(klKn3$GW}lLkqJn;X%Q>q57ff;3(ceDMv1M~Z3PH%;xEk8Kr(mta_hVo8C}nM zf0NU9zsLBfaSLMq$4tQ&@`j+>akGgMH1%mP+;OY$dAZ@Qblf(^4~_C_P&Q^$UVxxK zZFc(o|3@nb$Uk}bjRskyFZ=t#!u(o{%gtJptgkDJ%7PyM$nC8vr2dgn(X4s+aEa{! zRMp&VmYPyKh#`F_9ecYf!5|9t0sUz$G#t*#1E1pol* z-d>(q1+OYbx^1&!FO>{S6a@1>ghMKrnl}Ew5KRfpQ^>TUv6w)BYl7CprQ*R*+bP4d z{&iWJtIY@iU~7`MryGu;wD|n@yeeDG-!&?T(Y5fuTrQ(iMeiG5Xp|7A#B%9-@XptnMd3^YRW!BRa-Md=M|NLpK{9eS{qY# z#+lk91@5qxyHYr42->07qd8BIROvpgNvj)4AUg^$YEEz|%VJ*CO|U5SgN2xu)j-5u|JfpgU@0am_iI zdX8qG;>=E*)BI$sROL*@AH`G2&ih_@2nik7S{_|F%j~gU;kxx;yspl4m86!d(c#p4 zG0^d34V2LXY?TkM+rG4%tu3Q}>NUWpHI5`OJHiNIwzOtX8Z@3g2Q7s+b{^pBUz0;b z3cq!qslOK{pZgLAR>o@fV1Fu{ZCk0UFc ze(I|Br?qji^DFL-@(lxhNBLG*@SP}3$$048byr&3yO@|a-?i#VDpVH8yME=Ib49Y9 zrV~)7!rPV9+eI)9^CwtSgJCltUxzZc8%&`a()-QjB%(=$iUDp{S*C-P4VrT9uv_N% z%RASB{H~Pbup0Q~a3QfkIX1PEcM=C1oETp64U3x%jSaZM^n|F&`yLv9KjrK+VT3H2 z=-TF^Zh5-8!PNW>mvV+x)V#3GJ9V6L6ULEZ$C^y7>_qgDhd>Y=#gPgOJ@!+G+v9rs z^p^zz$!zJ}r?%NE!dzjh|9S?3FhOl%9W)YYES+}b)(88|lx*QY=h3ahlRoxqi%x0M zgzME?_+t$F`%Q-aJzoBiU}YP){7d4&BMB|HhDRH2uLPsny0_^1n(U*!nEj=A#}KeR zM~|JHKB*y|{1l!}#DRXe{@j5mr3#!VAj*Dh$ECNInQO89Hs!m5#~62Lgdvq5IeO%Xkx5BIYTG(SrV_cTr4=Y(nr#cn`J$2PFYMk5ZoWN zdV%Z$jL5`Rb2?EjNBetIblMxjB2IxBCBJ-D&y5lnO1TRRmi}I(<;@3>vGX4t;DxTA zW8^0Lo-GrBQf@YjXBlxQGyYZHkQUh(mfSrkw$sfw^C$m)87EeE*L3Kr=4MZ=ee%V)+ep>WE;)lU~aV+DuNAs{_e5mfpn5 zC~ipg1GEo?cbMt{LY)t*cg^9~_E?fNoWHp`$mHi;7dYDbssI20 literal 0 HcmV?d00001 diff --git a/src/public/assets/discord-logo-purple.png b/src/public/assets/discord-logo-purple.png new file mode 100644 index 0000000000000000000000000000000000000000..db0e70d5d42d5a4e9df0db6491f647b3f33bea76 GIT binary patch literal 1559 zcmb7Edo&XY9G)H&d0dp;v2w8MeVH|3lGiqpVP>mYPyKh#`F_9ecYf!5|9t0sUz$G#t*#1E1pol* z-d>(q1+OYbx^1&!FO>{S6a@1>ghMKrnl}Ew5KRfpQ^>TUv6w)BYl7CprQ*R*+bP4d z{&iWJtIY@iU~7`MryGu;wD|n@yeeDG-!&?T(Y5fuTrQ(iMeiG5Xp|7A#B%9-@XptnMd3^YRW!BRa-Md=M|NLpK{9eS{qY# z#+lk91@5qxyHYr42->07qd8BIROvpgNvj)4AUg^$YEEz|%VJ*CO|U5SgN2xu)j-5u|JfpgU@0am_iI zdX8qG;>=E*)BI$sROL*@AH`G2&ih_@2nik7S{_|F%j~gU;kxx;yspl4m86!d(c#p4 zG0^d34V2LXY?TkM+rG4%tu3Q}>NUWpHI5`OJHiNIwzOtX8Z@3g2Q7s+b{^pBUz0;b z3cq!qslOK{pZgLAR>o@fV1Fu{ZCk0UFc ze(I|Br?qji^DFL-@(lxhNBLG*@SP}3$$048byr&3yO@|a-?i#VDpVH8yME=Ib49Y9 zrV~)7!rPV9+eI)9^CwtSgJCltUxzZc8%&`a()-QjB%(=$iUDp{S*C-P4VrT9uv_N% z%RASB{H~Pbup0Q~a3QfkIX1PEcM=C1oETp64U3x%jSaZM^n|F&`yLv9KjrK+VT3H2 z=-TF^Zh5-8!PNW>mvV+x)V#3GJ9V6L6ULEZ$C^y7>_qgDhd>Y=#gPgOJ@!+G+v9rs z^p^zz$!zJ}r?%NE!dzjh|9S?3FhOl%9W)YYES+}b)(88|lx*QY=h3ahlRoxqi%x0M zgzME?_+t$F`%Q-aJzoBiU}YP){7d4&BMB|HhDRH2uLPsny0_^1n(U*!nEj=A#}KeR zM~|JHKB*y|{1l!}#DRXe{@j5mr3#!VAj*Dh$ECNInQO89Hs!m5#~62Lgdvq5IeO%Xkx5BIYTG(SrV_cTr4=Y(nr#cn`J$2PFYMk5ZoWN zdV%Z$jL5`Rb2?EjNBetIblMxjB2IxBCBJ-D&y5lnO1TRRmi}I(<;@3>vGX4t;DxTA zW8^0Lo-GrBQf@YjXBlxQGyYZHkQUh(mfSrkw$sfw^C$m)87EeE*L3Kr=4MZ=ee%V)+ep>WE;)lU~aV+DuNAs{_e5mfpn5 zC~ipg1GEo?cbMt{LY)t*cg^9~_E?fNoWHp`$mHi;7dYDbssI20 literal 0 HcmV?d00001 diff --git a/src/public/assets/discord-logo.png b/src/public/assets/discord-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d5346b794c9a35d70a1299fc1362b245b526d605 GIT binary patch literal 1559 zcmb7^c`zFY6vm?mEp@D;Y)ESy>s}(Fh?^u-1rbRbY1mfRP)8j}Bc+rEt-6bC5Up$D zu6s+H*3qEOkaS(GA}w1~XdNY6YjeIGo_@XosPQti1X?x5`L5adtQt=DHQz7~2PIaKWlH_QWZDVz@;u@@&UUT>tAP z>r61#sRV3RtRtW6MKC6(vO8r{j_yJga`7hPTJ&?_5}Vq{+`0h%!s5#sI+qMH&v-B9CH)3pM(=stUjHDuF zNsnKU{%j;tWl6-I$A%LvPrY?ur_mqq_|Pjmko zFr`naT{yaH^hR&Kwv_z2Uj=)saV(D7<%jb#BDFe_z_IiNa0#@r+ooJOL#WBk1pwq< zN`7P~hJA?vi5RT&!1J8NC4Qg@;^)wSKc#P9*{~nZb0nw!yu`qxU_<=WD(^5B_Cu)mY#2W+RG_auhi||T|pL(j@ zNga&Lyo#3bW>rtu@n(HA=wSq^c+z(v%a+vfAu8(qckPP&3bAG4@n0EXws5+|Y#bsW zuv0{`lM9j3d4bka8P#@iH7m8dOJ&=^o!{R~z-v^9sbG$mrkUv*B7?)u+NDjtd6=ct z+>?~(R|CBn$j0Z3MkjYO{V|Z?snJzeznFR7Xph@eM@@0zz*F__XDltI)Zm3vJx5$5 z^)6R8Xz9E!4-TOfwk{uWPM!?D2Vn@%6HQwB#$58)Qzal7!4R-i9jt=!M`QX2l-F1u ziF85Bh*9P`JBOX@zMBfeO@%knPOEXHRxg{E*L%Co6(4GT#UvX9CTtDLas#AE?A_`^ z%@Y*U$4#p4eNOJ7AW=i8@JsyZb8&6=N5>l;ta~Hr^7qNg()9EFD60~zxev&cp-4|m znU>;Be-2E+V}L(oy)wfK!dVu$$9(mjBlB+jN6y4Cg3l9|NEavy*X~{A6)g7YvN5H?3A12a?3s|iM$cv< z=8PXW_?eGh;yMisMb9kbnkXADLdduQJ$y#n_52I#0|eQadD`>Vq?H64@4<+TYeZ|M zpfq$fqZ?s;ey~4DuCu`}C;&t${$)opCxTZXC|{<~luh7z_nv4@T-`E*7TE4Y2{lf= zT*E5~$}?$9y`VE`v2SxZGDLMqV(+lfm@wO?Cq-FV>DA&4ZpLb6FYk%}xPEf5f=aW` zpo3;(FcvW|L*((YTH=a$A*%~QjS8(FbSMh7cFnPh*Vv$!olsBTKK9u3Q2pxUHCW`f ztbgh4bGg)D25V0fm1I-Q=clL6JE&Po%m^v3Gv4*ziSmkvKB7jH&py;rhUH15UBapC zU94SH%K3_3QtLPP{*CugD<;8hs0YHOxeay8aUn(1PHPm>Ty})58NoH0+(b()YDjhi zbaDc_v=jlpmS-h<7Oe{{gM{Q4@W|^UwcT> zSDB)n20W$Ee{2)`Ho^y{=yO=59b`VuVC1VL4c+viioKNYQS;E>k7|H39OYPR?;HOY DGqDaI literal 0 HcmV?d00001 diff --git a/src/public/assets/icons/exp.png b/src/public/assets/icons/exp.png new file mode 100644 index 0000000000000000000000000000000000000000..78557075b5efb1e47b723e12fb55d685be16eed5 GIT binary patch literal 9604 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 OXvW9Pj=nXZM*I)3L38u~ literal 0 HcmV?d00001 diff --git a/src/public/assets/icons/fish.png b/src/public/assets/icons/fish.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6f5c5a3ea34173980b16cddaf1d97111ec6967 GIT binary patch literal 2597 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 TLZSu!kq|#`l2^mwQ<;ANRg@3_ literal 0 HcmV?d00001 diff --git a/src/public/assets/icons/hp.png b/src/public/assets/icons/hp.png new file mode 100644 index 0000000000000000000000000000000000000000..9305b354b3d228debc40337ba2aa9af3d3260864 GIT binary patch literal 6878 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 JEYN41`!BZY2c-Z2 literal 0 HcmV?d00001 diff --git a/src/public/assets/icons/luck.png b/src/public/assets/icons/luck.png new file mode 100644 index 0000000000000000000000000000000000000000..533229801d5ace35475915c2a6500bf09fa5949c GIT binary patch literal 13600 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 literal 0 HcmV?d00001 diff --git a/src/public/assets/icons/pow.png b/src/public/assets/icons/pow.png new file mode 100644 index 0000000000000000000000000000000000000000..960ba5d6277d30dbcedc27019f005e9561972ad4 GIT binary patch literal 14932 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 literal 0 HcmV?d00001 diff --git a/src/public/assets/icons/quirk.png b/src/public/assets/icons/quirk.png new file mode 100644 index 0000000000000000000000000000000000000000..d35a0967f7673bf7a29919388aef0d917852b5f9 GIT binary patch literal 12722 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
IcB% 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 T^EYUpEo-UiT`p3!zx%%cW0D0y literal 0 HcmV?d00001 diff --git a/src/public/assets/icons/wow.png b/src/public/assets/icons/wow.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9d3a1205ba2f153b7f2c31d031d5d2273bcc62 GIT binary patch literal 6891 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 literal 0 HcmV?d00001 diff --git a/src/public/assets/logo.png b/src/public/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..55a36c7f58d5fb1192e80bae99d42f0a5b816f71 GIT binary patch literal 9650 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 b{L9-5iEvAcHW{aXeoje$RuHccH4OYeq0?1p literal 0 HcmV?d00001 diff --git a/src/public/assets/progress-bar-bg.png b/src/public/assets/progress-bar-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..282e7d42fd0e7010a4021ca5016b20ce129d9970 GIT binary patch literal 3267 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 KBTFwj5dH@|5Cz)+ literal 0 HcmV?d00001 diff --git a/src/public/bundle.js b/src/public/bundle.js new file mode 100644 index 0000000..f4bf2f5 --- /dev/null +++ b/src/public/bundle.js @@ -0,0 +1,13377 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/axios/index.js": +/*!*************************************!*\ + !*** ./node_modules/axios/index.js ***! + \*************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports = __webpack_require__(/*! ./lib/axios */ "./node_modules/axios/lib/axios.js"); + +/***/ }), + +/***/ "./node_modules/axios/lib/adapters/xhr.js": +/*!************************************************!*\ + !*** ./node_modules/axios/lib/adapters/xhr.js ***! + \************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); +var settle = __webpack_require__(/*! ./../core/settle */ "./node_modules/axios/lib/core/settle.js"); +var cookies = __webpack_require__(/*! ./../helpers/cookies */ "./node_modules/axios/lib/helpers/cookies.js"); +var buildURL = __webpack_require__(/*! ./../helpers/buildURL */ "./node_modules/axios/lib/helpers/buildURL.js"); +var buildFullPath = __webpack_require__(/*! ../core/buildFullPath */ "./node_modules/axios/lib/core/buildFullPath.js"); +var parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ "./node_modules/axios/lib/helpers/parseHeaders.js"); +var isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ "./node_modules/axios/lib/helpers/isURLSameOrigin.js"); +var createError = __webpack_require__(/*! ../core/createError */ "./node_modules/axios/lib/core/createError.js"); +var transitionalDefaults = __webpack_require__(/*! ../defaults/transitional */ "./node_modules/axios/lib/defaults/transitional.js"); +var Cancel = __webpack_require__(/*! ../cancel/Cancel */ "./node_modules/axios/lib/cancel/Cancel.js"); + +module.exports = function xhrAdapter(config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + var requestData = config.data; + var requestHeaders = config.headers; + var responseType = config.responseType; + var onCanceled; + function done() { + if (config.cancelToken) { + config.cancelToken.unsubscribe(onCanceled); + } + + if (config.signal) { + config.signal.removeEventListener('abort', onCanceled); + } + } + + if (utils.isFormData(requestData)) { + delete requestHeaders['Content-Type']; // Let the browser set it + } + + var request = new XMLHttpRequest(); + + // HTTP basic authentication + if (config.auth) { + var username = config.auth.username || ''; + var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); + } + + var fullPath = buildFullPath(config.baseURL, config.url); + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); + + // Set the request timeout in MS + request.timeout = config.timeout; + + function onloadend() { + if (!request) { + return; + } + // Prepare the response + var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; + var responseData = !responseType || responseType === 'text' || responseType === 'json' ? + request.responseText : request.response; + var response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config: config, + request: request + }; + + settle(function _resolve(value) { + resolve(value); + done(); + }, function _reject(err) { + reject(err); + done(); + }, response); + + // Clean up request + request = null; + } + + if ('onloadend' in request) { + // Use onloadend if available + request.onloadend = onloadend; + } else { + // Listen for ready state to emulate onloadend + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + // readystate handler is calling before onerror or ontimeout handlers, + // so we should call onloadend on the next 'tick' + setTimeout(onloadend); + }; + } + + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } + + reject(createError('Request aborted', config, 'ECONNABORTED', request)); + + // Clean up request + request = null; + }; + + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(createError('Network Error', config, null, request)); + + // Clean up request + request = null; + }; + + // Handle timeout + request.ontimeout = function handleTimeout() { + var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded'; + var transitional = config.transitional || transitionalDefaults; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(createError( + timeoutErrorMessage, + config, + transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED', + request)); + + // Clean up request + request = null; + }; + + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if (utils.isStandardBrowserEnv()) { + // Add xsrf header + var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? + cookies.read(config.xsrfCookieName) : + undefined; + + if (xsrfValue) { + requestHeaders[config.xsrfHeaderName] = xsrfValue; + } + } + + // Add headers to the request + if ('setRequestHeader' in request) { + utils.forEach(requestHeaders, function setRequestHeader(val, key) { + if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { + // Remove Content-Type if data is undefined + delete requestHeaders[key]; + } else { + // Otherwise add header to the request + request.setRequestHeader(key, val); + } + }); + } + + // Add withCredentials to request if needed + if (!utils.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } + + // Add responseType to request if needed + if (responseType && responseType !== 'json') { + request.responseType = config.responseType; + } + + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', config.onDownloadProgress); + } + + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', config.onUploadProgress); + } + + if (config.cancelToken || config.signal) { + // Handle cancellation + // eslint-disable-next-line func-names + onCanceled = function(cancel) { + if (!request) { + return; + } + reject(!cancel || (cancel && cancel.type) ? new Cancel('canceled') : cancel); + request.abort(); + request = null; + }; + + config.cancelToken && config.cancelToken.subscribe(onCanceled); + if (config.signal) { + config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled); + } + } + + if (!requestData) { + requestData = null; + } + + // Send the request + request.send(requestData); + }); +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/axios.js": +/*!*****************************************!*\ + !*** ./node_modules/axios/lib/axios.js ***! + \*****************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js"); +var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js"); +var Axios = __webpack_require__(/*! ./core/Axios */ "./node_modules/axios/lib/core/Axios.js"); +var mergeConfig = __webpack_require__(/*! ./core/mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js"); +var defaults = __webpack_require__(/*! ./defaults */ "./node_modules/axios/lib/defaults/index.js"); + +/** + * Create an instance of Axios + * + * @param {Object} defaultConfig The default config for the instance + * @return {Axios} A new instance of Axios + */ +function createInstance(defaultConfig) { + var context = new Axios(defaultConfig); + var instance = bind(Axios.prototype.request, context); + + // Copy axios.prototype to instance + utils.extend(instance, Axios.prototype, context); + + // Copy context to instance + utils.extend(instance, context); + + // Factory for creating new instances + instance.create = function create(instanceConfig) { + return createInstance(mergeConfig(defaultConfig, instanceConfig)); + }; + + return instance; +} + +// Create the default instance to be exported +var axios = createInstance(defaults); + +// Expose Axios class to allow class inheritance +axios.Axios = Axios; + +// Expose Cancel & CancelToken +axios.Cancel = __webpack_require__(/*! ./cancel/Cancel */ "./node_modules/axios/lib/cancel/Cancel.js"); +axios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ "./node_modules/axios/lib/cancel/CancelToken.js"); +axios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ "./node_modules/axios/lib/cancel/isCancel.js"); +axios.VERSION = (__webpack_require__(/*! ./env/data */ "./node_modules/axios/lib/env/data.js").version); + +// Expose all/spread +axios.all = function all(promises) { + return Promise.all(promises); +}; +axios.spread = __webpack_require__(/*! ./helpers/spread */ "./node_modules/axios/lib/helpers/spread.js"); + +// Expose isAxiosError +axios.isAxiosError = __webpack_require__(/*! ./helpers/isAxiosError */ "./node_modules/axios/lib/helpers/isAxiosError.js"); + +module.exports = axios; + +// Allow use of default import syntax in TypeScript +module.exports["default"] = axios; + + +/***/ }), + +/***/ "./node_modules/axios/lib/cancel/Cancel.js": +/*!*************************************************!*\ + !*** ./node_modules/axios/lib/cancel/Cancel.js ***! + \*************************************************/ +/***/ ((module) => { + +"use strict"; + + +/** + * A `Cancel` is an object that is thrown when an operation is canceled. + * + * @class + * @param {string=} message The message. + */ +function Cancel(message) { + this.message = message; +} + +Cancel.prototype.toString = function toString() { + return 'Cancel' + (this.message ? ': ' + this.message : ''); +}; + +Cancel.prototype.__CANCEL__ = true; + +module.exports = Cancel; + + +/***/ }), + +/***/ "./node_modules/axios/lib/cancel/CancelToken.js": +/*!******************************************************!*\ + !*** ./node_modules/axios/lib/cancel/CancelToken.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var Cancel = __webpack_require__(/*! ./Cancel */ "./node_modules/axios/lib/cancel/Cancel.js"); + +/** + * A `CancelToken` is an object that can be used to request cancellation of an operation. + * + * @class + * @param {Function} executor The executor function. + */ +function CancelToken(executor) { + if (typeof executor !== 'function') { + throw new TypeError('executor must be a function.'); + } + + var resolvePromise; + + this.promise = new Promise(function promiseExecutor(resolve) { + resolvePromise = resolve; + }); + + var token = this; + + // eslint-disable-next-line func-names + this.promise.then(function(cancel) { + if (!token._listeners) return; + + var i; + var l = token._listeners.length; + + for (i = 0; i < l; i++) { + token._listeners[i](cancel); + } + token._listeners = null; + }); + + // eslint-disable-next-line func-names + this.promise.then = function(onfulfilled) { + var _resolve; + // eslint-disable-next-line func-names + var promise = new Promise(function(resolve) { + token.subscribe(resolve); + _resolve = resolve; + }).then(onfulfilled); + + promise.cancel = function reject() { + token.unsubscribe(_resolve); + }; + + return promise; + }; + + executor(function cancel(message) { + if (token.reason) { + // Cancellation has already been requested + return; + } + + token.reason = new Cancel(message); + resolvePromise(token.reason); + }); +} + +/** + * Throws a `Cancel` if cancellation has been requested. + */ +CancelToken.prototype.throwIfRequested = function throwIfRequested() { + if (this.reason) { + throw this.reason; + } +}; + +/** + * Subscribe to the cancel signal + */ + +CancelToken.prototype.subscribe = function subscribe(listener) { + if (this.reason) { + listener(this.reason); + return; + } + + if (this._listeners) { + this._listeners.push(listener); + } else { + this._listeners = [listener]; + } +}; + +/** + * Unsubscribe from the cancel signal + */ + +CancelToken.prototype.unsubscribe = function unsubscribe(listener) { + if (!this._listeners) { + return; + } + var index = this._listeners.indexOf(listener); + if (index !== -1) { + this._listeners.splice(index, 1); + } +}; + +/** + * Returns an object that contains a new `CancelToken` and a function that, when called, + * cancels the `CancelToken`. + */ +CancelToken.source = function source() { + var cancel; + var token = new CancelToken(function executor(c) { + cancel = c; + }); + return { + token: token, + cancel: cancel + }; +}; + +module.exports = CancelToken; + + +/***/ }), + +/***/ "./node_modules/axios/lib/cancel/isCancel.js": +/*!***************************************************!*\ + !*** ./node_modules/axios/lib/cancel/isCancel.js ***! + \***************************************************/ +/***/ ((module) => { + +"use strict"; + + +module.exports = function isCancel(value) { + return !!(value && value.__CANCEL__); +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/core/Axios.js": +/*!**********************************************!*\ + !*** ./node_modules/axios/lib/core/Axios.js ***! + \**********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); +var buildURL = __webpack_require__(/*! ../helpers/buildURL */ "./node_modules/axios/lib/helpers/buildURL.js"); +var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ "./node_modules/axios/lib/core/InterceptorManager.js"); +var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ "./node_modules/axios/lib/core/dispatchRequest.js"); +var mergeConfig = __webpack_require__(/*! ./mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js"); +var validator = __webpack_require__(/*! ../helpers/validator */ "./node_modules/axios/lib/helpers/validator.js"); + +var validators = validator.validators; +/** + * Create a new instance of Axios + * + * @param {Object} instanceConfig The default config for the instance + */ +function Axios(instanceConfig) { + this.defaults = instanceConfig; + this.interceptors = { + request: new InterceptorManager(), + response: new InterceptorManager() + }; +} + +/** + * Dispatch a request + * + * @param {Object} config The config specific for this request (merged with this.defaults) + */ +Axios.prototype.request = function request(configOrUrl, config) { + /*eslint no-param-reassign:0*/ + // Allow for axios('example/url'[, config]) a la fetch API + if (typeof configOrUrl === 'string') { + config = config || {}; + config.url = configOrUrl; + } else { + config = configOrUrl || {}; + } + + config = mergeConfig(this.defaults, config); + + // Set config.method + if (config.method) { + config.method = config.method.toLowerCase(); + } else if (this.defaults.method) { + config.method = this.defaults.method.toLowerCase(); + } else { + config.method = 'get'; + } + + var transitional = config.transitional; + + if (transitional !== undefined) { + validator.assertOptions(transitional, { + silentJSONParsing: validators.transitional(validators.boolean), + forcedJSONParsing: validators.transitional(validators.boolean), + clarifyTimeoutError: validators.transitional(validators.boolean) + }, false); + } + + // filter out skipped interceptors + var requestInterceptorChain = []; + var synchronousRequestInterceptors = true; + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) { + return; + } + + synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous; + + requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected); + }); + + var responseInterceptorChain = []; + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected); + }); + + var promise; + + if (!synchronousRequestInterceptors) { + var chain = [dispatchRequest, undefined]; + + Array.prototype.unshift.apply(chain, requestInterceptorChain); + chain = chain.concat(responseInterceptorChain); + + promise = Promise.resolve(config); + while (chain.length) { + promise = promise.then(chain.shift(), chain.shift()); + } + + return promise; + } + + + var newConfig = config; + while (requestInterceptorChain.length) { + var onFulfilled = requestInterceptorChain.shift(); + var onRejected = requestInterceptorChain.shift(); + try { + newConfig = onFulfilled(newConfig); + } catch (error) { + onRejected(error); + break; + } + } + + try { + promise = dispatchRequest(newConfig); + } catch (error) { + return Promise.reject(error); + } + + while (responseInterceptorChain.length) { + promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift()); + } + + return promise; +}; + +Axios.prototype.getUri = function getUri(config) { + config = mergeConfig(this.defaults, config); + return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, ''); +}; + +// Provide aliases for supported request methods +utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, config) { + return this.request(mergeConfig(config || {}, { + method: method, + url: url, + data: (config || {}).data + })); + }; +}); + +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, data, config) { + return this.request(mergeConfig(config || {}, { + method: method, + url: url, + data: data + })); + }; +}); + +module.exports = Axios; + + +/***/ }), + +/***/ "./node_modules/axios/lib/core/InterceptorManager.js": +/*!***********************************************************!*\ + !*** ./node_modules/axios/lib/core/InterceptorManager.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); + +function InterceptorManager() { + this.handlers = []; +} + +/** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ +InterceptorManager.prototype.use = function use(fulfilled, rejected, options) { + this.handlers.push({ + fulfilled: fulfilled, + rejected: rejected, + synchronous: options ? options.synchronous : false, + runWhen: options ? options.runWhen : null + }); + return this.handlers.length - 1; +}; + +/** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + */ +InterceptorManager.prototype.eject = function eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } +}; + +/** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + */ +InterceptorManager.prototype.forEach = function forEach(fn) { + utils.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); +}; + +module.exports = InterceptorManager; + + +/***/ }), + +/***/ "./node_modules/axios/lib/core/buildFullPath.js": +/*!******************************************************!*\ + !*** ./node_modules/axios/lib/core/buildFullPath.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isAbsoluteURL = __webpack_require__(/*! ../helpers/isAbsoluteURL */ "./node_modules/axios/lib/helpers/isAbsoluteURL.js"); +var combineURLs = __webpack_require__(/*! ../helpers/combineURLs */ "./node_modules/axios/lib/helpers/combineURLs.js"); + +/** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * @returns {string} The combined full path + */ +module.exports = function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL); + } + return requestedURL; +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/core/createError.js": +/*!****************************************************!*\ + !*** ./node_modules/axios/lib/core/createError.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var enhanceError = __webpack_require__(/*! ./enhanceError */ "./node_modules/axios/lib/core/enhanceError.js"); + +/** + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The created error. + */ +module.exports = function createError(message, config, code, request, response) { + var error = new Error(message); + return enhanceError(error, config, code, request, response); +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/core/dispatchRequest.js": +/*!********************************************************!*\ + !*** ./node_modules/axios/lib/core/dispatchRequest.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); +var transformData = __webpack_require__(/*! ./transformData */ "./node_modules/axios/lib/core/transformData.js"); +var isCancel = __webpack_require__(/*! ../cancel/isCancel */ "./node_modules/axios/lib/cancel/isCancel.js"); +var defaults = __webpack_require__(/*! ../defaults */ "./node_modules/axios/lib/defaults/index.js"); +var Cancel = __webpack_require__(/*! ../cancel/Cancel */ "./node_modules/axios/lib/cancel/Cancel.js"); + +/** + * Throws a `Cancel` if cancellation has been requested. + */ +function throwIfCancellationRequested(config) { + if (config.cancelToken) { + config.cancelToken.throwIfRequested(); + } + + if (config.signal && config.signal.aborted) { + throw new Cancel('canceled'); + } +} + +/** + * Dispatch a request to the server using the configured adapter. + * + * @param {object} config The config that is to be used for the request + * @returns {Promise} The Promise to be fulfilled + */ +module.exports = function dispatchRequest(config) { + throwIfCancellationRequested(config); + + // Ensure headers exist + config.headers = config.headers || {}; + + // Transform request data + config.data = transformData.call( + config, + config.data, + config.headers, + config.transformRequest + ); + + // Flatten headers + config.headers = utils.merge( + config.headers.common || {}, + config.headers[config.method] || {}, + config.headers + ); + + utils.forEach( + ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], + function cleanHeaderConfig(method) { + delete config.headers[method]; + } + ); + + var adapter = config.adapter || defaults.adapter; + + return adapter(config).then(function onAdapterResolution(response) { + throwIfCancellationRequested(config); + + // Transform response data + response.data = transformData.call( + config, + response.data, + response.headers, + config.transformResponse + ); + + return response; + }, function onAdapterRejection(reason) { + if (!isCancel(reason)) { + throwIfCancellationRequested(config); + + // Transform response data + if (reason && reason.response) { + reason.response.data = transformData.call( + config, + reason.response.data, + reason.response.headers, + config.transformResponse + ); + } + } + + return Promise.reject(reason); + }); +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/core/enhanceError.js": +/*!*****************************************************!*\ + !*** ./node_modules/axios/lib/core/enhanceError.js ***! + \*****************************************************/ +/***/ ((module) => { + +"use strict"; + + +/** + * Update an Error with the specified config, error code, and response. + * + * @param {Error} error The error to update. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The error. + */ +module.exports = function enhanceError(error, config, code, request, response) { + error.config = config; + if (code) { + error.code = code; + } + + error.request = request; + error.response = response; + error.isAxiosError = true; + + error.toJSON = function toJSON() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: this.config, + code: this.code, + status: this.response && this.response.status ? this.response.status : null + }; + }; + return error; +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/core/mergeConfig.js": +/*!****************************************************!*\ + !*** ./node_modules/axios/lib/core/mergeConfig.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js"); + +/** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * @returns {Object} New object resulting from merging config2 to config1 + */ +module.exports = function mergeConfig(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + var config = {}; + + function getMergedValue(target, source) { + if (utils.isPlainObject(target) && utils.isPlainObject(source)) { + return utils.merge(target, source); + } else if (utils.isPlainObject(source)) { + return utils.merge({}, source); + } else if (utils.isArray(source)) { + return source.slice(); + } + return source; + } + + // eslint-disable-next-line consistent-return + function mergeDeepProperties(prop) { + if (!utils.isUndefined(config2[prop])) { + return getMergedValue(config1[prop], config2[prop]); + } else if (!utils.isUndefined(config1[prop])) { + return getMergedValue(undefined, config1[prop]); + } + } + + // eslint-disable-next-line consistent-return + function valueFromConfig2(prop) { + if (!utils.isUndefined(config2[prop])) { + return getMergedValue(undefined, config2[prop]); + } + } + + // eslint-disable-next-line consistent-return + function defaultToConfig2(prop) { + if (!utils.isUndefined(config2[prop])) { + return getMergedValue(undefined, config2[prop]); + } else if (!utils.isUndefined(config1[prop])) { + return getMergedValue(undefined, config1[prop]); + } + } + + // eslint-disable-next-line consistent-return + function mergeDirectKeys(prop) { + if (prop in config2) { + return getMergedValue(config1[prop], config2[prop]); + } else if (prop in config1) { + return getMergedValue(undefined, config1[prop]); + } + } + + var mergeMap = { + 'url': valueFromConfig2, + 'method': valueFromConfig2, + 'data': valueFromConfig2, + 'baseURL': defaultToConfig2, + 'transformRequest': defaultToConfig2, + 'transformResponse': defaultToConfig2, + 'paramsSerializer': defaultToConfig2, + 'timeout': defaultToConfig2, + 'timeoutMessage': defaultToConfig2, + 'withCredentials': defaultToConfig2, + 'adapter': defaultToConfig2, + 'responseType': defaultToConfig2, + 'xsrfCookieName': defaultToConfig2, + 'xsrfHeaderName': defaultToConfig2, + 'onUploadProgress': defaultToConfig2, + 'onDownloadProgress': defaultToConfig2, + 'decompress': defaultToConfig2, + 'maxContentLength': defaultToConfig2, + 'maxBodyLength': defaultToConfig2, + 'transport': defaultToConfig2, + 'httpAgent': defaultToConfig2, + 'httpsAgent': defaultToConfig2, + 'cancelToken': defaultToConfig2, + 'socketPath': defaultToConfig2, + 'responseEncoding': defaultToConfig2, + 'validateStatus': mergeDirectKeys + }; + + utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) { + var merge = mergeMap[prop] || mergeDeepProperties; + var configValue = merge(prop); + (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue); + }); + + return config; +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/core/settle.js": +/*!***********************************************!*\ + !*** ./node_modules/axios/lib/core/settle.js ***! + \***********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var createError = __webpack_require__(/*! ./createError */ "./node_modules/axios/lib/core/createError.js"); + +/** + * Resolve or reject a Promise based on response status. + * + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. + */ +module.exports = function settle(resolve, reject, response) { + var validateStatus = response.config.validateStatus; + if (!response.status || !validateStatus || validateStatus(response.status)) { + resolve(response); + } else { + reject(createError( + 'Request failed with status code ' + response.status, + response.config, + null, + response.request, + response + )); + } +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/core/transformData.js": +/*!******************************************************!*\ + !*** ./node_modules/axios/lib/core/transformData.js ***! + \******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); +var defaults = __webpack_require__(/*! ../defaults */ "./node_modules/axios/lib/defaults/index.js"); + +/** + * Transform the data for a request or a response + * + * @param {Object|String} data The data to be transformed + * @param {Array} headers The headers for the request or response + * @param {Array|Function} fns A single function or Array of functions + * @returns {*} The resulting transformed data + */ +module.exports = function transformData(data, headers, fns) { + var context = this || defaults; + /*eslint no-param-reassign:0*/ + utils.forEach(fns, function transform(fn) { + data = fn.call(context, data, headers); + }); + + return data; +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/defaults/index.js": +/*!**************************************************!*\ + !*** ./node_modules/axios/lib/defaults/index.js ***! + \**************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js"); +var normalizeHeaderName = __webpack_require__(/*! ../helpers/normalizeHeaderName */ "./node_modules/axios/lib/helpers/normalizeHeaderName.js"); +var enhanceError = __webpack_require__(/*! ../core/enhanceError */ "./node_modules/axios/lib/core/enhanceError.js"); +var transitionalDefaults = __webpack_require__(/*! ./transitional */ "./node_modules/axios/lib/defaults/transitional.js"); + +var DEFAULT_CONTENT_TYPE = { + 'Content-Type': 'application/x-www-form-urlencoded' +}; + +function setContentTypeIfUnset(headers, value) { + if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { + headers['Content-Type'] = value; + } +} + +function getDefaultAdapter() { + var adapter; + if (typeof XMLHttpRequest !== 'undefined') { + // For browsers use XHR adapter + adapter = __webpack_require__(/*! ../adapters/xhr */ "./node_modules/axios/lib/adapters/xhr.js"); + } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { + // For node use HTTP adapter + adapter = __webpack_require__(/*! ../adapters/http */ "./node_modules/axios/lib/adapters/xhr.js"); + } + return adapter; +} + +function stringifySafely(rawValue, parser, encoder) { + if (utils.isString(rawValue)) { + try { + (parser || JSON.parse)(rawValue); + return utils.trim(rawValue); + } catch (e) { + if (e.name !== 'SyntaxError') { + throw e; + } + } + } + + return (encoder || JSON.stringify)(rawValue); +} + +var defaults = { + + transitional: transitionalDefaults, + + adapter: getDefaultAdapter(), + + transformRequest: [function transformRequest(data, headers) { + normalizeHeaderName(headers, 'Accept'); + normalizeHeaderName(headers, 'Content-Type'); + + if (utils.isFormData(data) || + utils.isArrayBuffer(data) || + utils.isBuffer(data) || + utils.isStream(data) || + utils.isFile(data) || + utils.isBlob(data) + ) { + return data; + } + if (utils.isArrayBufferView(data)) { + return data.buffer; + } + if (utils.isURLSearchParams(data)) { + setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); + return data.toString(); + } + if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) { + setContentTypeIfUnset(headers, 'application/json'); + return stringifySafely(data); + } + return data; + }], + + transformResponse: [function transformResponse(data) { + var transitional = this.transitional || defaults.transitional; + var silentJSONParsing = transitional && transitional.silentJSONParsing; + var forcedJSONParsing = transitional && transitional.forcedJSONParsing; + var strictJSONParsing = !silentJSONParsing && this.responseType === 'json'; + + if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) { + try { + return JSON.parse(data); + } catch (e) { + if (strictJSONParsing) { + if (e.name === 'SyntaxError') { + throw enhanceError(e, this, 'E_JSON_PARSE'); + } + throw e; + } + } + } + + return data; + }], + + /** + * A timeout in milliseconds to abort a request. If set to 0 (default) a + * timeout is not created. + */ + timeout: 0, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + maxContentLength: -1, + maxBodyLength: -1, + + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; + }, + + headers: { + common: { + 'Accept': 'application/json, text/plain, */*' + } + } +}; + +utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { + defaults.headers[method] = {}; +}); + +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); +}); + +module.exports = defaults; + + +/***/ }), + +/***/ "./node_modules/axios/lib/defaults/transitional.js": +/*!*********************************************************!*\ + !*** ./node_modules/axios/lib/defaults/transitional.js ***! + \*********************************************************/ +/***/ ((module) => { + +"use strict"; + + +module.exports = { + silentJSONParsing: true, + forcedJSONParsing: true, + clarifyTimeoutError: false +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/env/data.js": +/*!********************************************!*\ + !*** ./node_modules/axios/lib/env/data.js ***! + \********************************************/ +/***/ ((module) => { + +module.exports = { + "version": "0.26.1" +}; + +/***/ }), + +/***/ "./node_modules/axios/lib/helpers/bind.js": +/*!************************************************!*\ + !*** ./node_modules/axios/lib/helpers/bind.js ***! + \************************************************/ +/***/ ((module) => { + +"use strict"; + + +module.exports = function bind(fn, thisArg) { + return function wrap() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + return fn.apply(thisArg, args); + }; +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/helpers/buildURL.js": +/*!****************************************************!*\ + !*** ./node_modules/axios/lib/helpers/buildURL.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); + +function encode(val) { + return encodeURIComponent(val). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, '+'). + replace(/%5B/gi, '['). + replace(/%5D/gi, ']'); +} + +/** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @returns {string} The formatted url + */ +module.exports = function buildURL(url, params, paramsSerializer) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url; + } + + var serializedParams; + if (paramsSerializer) { + serializedParams = paramsSerializer(params); + } else if (utils.isURLSearchParams(params)) { + serializedParams = params.toString(); + } else { + var parts = []; + + utils.forEach(params, function serialize(val, key) { + if (val === null || typeof val === 'undefined') { + return; + } + + if (utils.isArray(val)) { + key = key + '[]'; + } else { + val = [val]; + } + + utils.forEach(val, function parseValue(v) { + if (utils.isDate(v)) { + v = v.toISOString(); + } else if (utils.isObject(v)) { + v = JSON.stringify(v); + } + parts.push(encode(key) + '=' + encode(v)); + }); + }); + + serializedParams = parts.join('&'); + } + + if (serializedParams) { + var hashmarkIndex = url.indexOf('#'); + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex); + } + + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; + } + + return url; +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/helpers/combineURLs.js": +/*!*******************************************************!*\ + !*** ./node_modules/axios/lib/helpers/combineURLs.js ***! + \*******************************************************/ +/***/ ((module) => { + +"use strict"; + + +/** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * @returns {string} The combined URL + */ +module.exports = function combineURLs(baseURL, relativeURL) { + return relativeURL + ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL; +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/helpers/cookies.js": +/*!***************************************************!*\ + !*** ./node_modules/axios/lib/helpers/cookies.js ***! + \***************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); + +module.exports = ( + utils.isStandardBrowserEnv() ? + + // Standard browser envs support document.cookie + (function standardBrowserEnv() { + return { + write: function write(name, value, expires, path, domain, secure) { + var cookie = []; + cookie.push(name + '=' + encodeURIComponent(value)); + + if (utils.isNumber(expires)) { + cookie.push('expires=' + new Date(expires).toGMTString()); + } + + if (utils.isString(path)) { + cookie.push('path=' + path); + } + + if (utils.isString(domain)) { + cookie.push('domain=' + domain); + } + + if (secure === true) { + cookie.push('secure'); + } + + document.cookie = cookie.join('; '); + }, + + read: function read(name) { + var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, + + remove: function remove(name) { + this.write(name, '', Date.now() - 86400000); + } + }; + })() : + + // Non standard browser env (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return { + write: function write() {}, + read: function read() { return null; }, + remove: function remove() {} + }; + })() +); + + +/***/ }), + +/***/ "./node_modules/axios/lib/helpers/isAbsoluteURL.js": +/*!*********************************************************!*\ + !*** ./node_modules/axios/lib/helpers/isAbsoluteURL.js ***! + \*********************************************************/ +/***/ ((module) => { + +"use strict"; + + +/** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ +module.exports = function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/helpers/isAxiosError.js": +/*!********************************************************!*\ + !*** ./node_modules/axios/lib/helpers/isAxiosError.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); + +/** + * Determines whether the payload is an error thrown by Axios + * + * @param {*} payload The value to test + * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false + */ +module.exports = function isAxiosError(payload) { + return utils.isObject(payload) && (payload.isAxiosError === true); +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/helpers/isURLSameOrigin.js": +/*!***********************************************************!*\ + !*** ./node_modules/axios/lib/helpers/isURLSameOrigin.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); + +module.exports = ( + utils.isStandardBrowserEnv() ? + + // Standard browser envs have full support of the APIs needed to test + // whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + var msie = /(msie|trident)/i.test(navigator.userAgent); + var urlParsingNode = document.createElement('a'); + var originURL; + + /** + * Parse a URL to discover it's components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + var href = url; + + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } + + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : + + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })() +); + + +/***/ }), + +/***/ "./node_modules/axios/lib/helpers/normalizeHeaderName.js": +/*!***************************************************************!*\ + !*** ./node_modules/axios/lib/helpers/normalizeHeaderName.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js"); + +module.exports = function normalizeHeaderName(headers, normalizedName) { + utils.forEach(headers, function processHeader(value, name) { + if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { + headers[normalizedName] = value; + delete headers[name]; + } + }); +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/helpers/parseHeaders.js": +/*!********************************************************!*\ + !*** ./node_modules/axios/lib/helpers/parseHeaders.js ***! + \********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); + +// Headers whose duplicates are ignored by node +// c.f. https://nodejs.org/api/http.html#http_message_headers +var ignoreDuplicateOf = [ + 'age', 'authorization', 'content-length', 'content-type', 'etag', + 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', + 'last-modified', 'location', 'max-forwards', 'proxy-authorization', + 'referer', 'retry-after', 'user-agent' +]; + +/** + * Parse headers into an object + * + * ``` + * Date: Wed, 27 Aug 2014 08:58:49 GMT + * Content-Type: application/json + * Connection: keep-alive + * Transfer-Encoding: chunked + * ``` + * + * @param {String} headers Headers needing to be parsed + * @returns {Object} Headers parsed into an object + */ +module.exports = function parseHeaders(headers) { + var parsed = {}; + var key; + var val; + var i; + + if (!headers) { return parsed; } + + utils.forEach(headers.split('\n'), function parser(line) { + i = line.indexOf(':'); + key = utils.trim(line.substr(0, i)).toLowerCase(); + val = utils.trim(line.substr(i + 1)); + + if (key) { + if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { + return; + } + if (key === 'set-cookie') { + parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); + } else { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + } + }); + + return parsed; +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/helpers/spread.js": +/*!**************************************************!*\ + !*** ./node_modules/axios/lib/helpers/spread.js ***! + \**************************************************/ +/***/ ((module) => { + +"use strict"; + + +/** + * Syntactic sugar for invoking a function and expanding an array for arguments. + * + * Common use case would be to use `Function.prototype.apply`. + * + * ```js + * function f(x, y, z) {} + * var args = [1, 2, 3]; + * f.apply(null, args); + * ``` + * + * With `spread` this example can be re-written. + * + * ```js + * spread(function(x, y, z) {})([1, 2, 3]); + * ``` + * + * @param {Function} callback + * @returns {Function} + */ +module.exports = function spread(callback) { + return function wrap(arr) { + return callback.apply(null, arr); + }; +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/helpers/validator.js": +/*!*****************************************************!*\ + !*** ./node_modules/axios/lib/helpers/validator.js ***! + \*****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var VERSION = (__webpack_require__(/*! ../env/data */ "./node_modules/axios/lib/env/data.js").version); + +var validators = {}; + +// eslint-disable-next-line func-names +['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) { + validators[type] = function validator(thing) { + return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type; + }; +}); + +var deprecatedWarnings = {}; + +/** + * Transitional option validator + * @param {function|boolean?} validator - set to false if the transitional option has been removed + * @param {string?} version - deprecated version / removed since version + * @param {string?} message - some message with additional info + * @returns {function} + */ +validators.transitional = function transitional(validator, version, message) { + function formatMessage(opt, desc) { + return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : ''); + } + + // eslint-disable-next-line func-names + return function(value, opt, opts) { + if (validator === false) { + throw new Error(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : ''))); + } + + if (version && !deprecatedWarnings[opt]) { + deprecatedWarnings[opt] = true; + // eslint-disable-next-line no-console + console.warn( + formatMessage( + opt, + ' has been deprecated since v' + version + ' and will be removed in the near future' + ) + ); + } + + return validator ? validator(value, opt, opts) : true; + }; +}; + +/** + * Assert object's properties type + * @param {object} options + * @param {object} schema + * @param {boolean?} allowUnknown + */ + +function assertOptions(options, schema, allowUnknown) { + if (typeof options !== 'object') { + throw new TypeError('options must be an object'); + } + var keys = Object.keys(options); + var i = keys.length; + while (i-- > 0) { + var opt = keys[i]; + var validator = schema[opt]; + if (validator) { + var value = options[opt]; + var result = value === undefined || validator(value, opt, options); + if (result !== true) { + throw new TypeError('option ' + opt + ' must be ' + result); + } + continue; + } + if (allowUnknown !== true) { + throw Error('Unknown option ' + opt); + } + } +} + +module.exports = { + assertOptions: assertOptions, + validators: validators +}; + + +/***/ }), + +/***/ "./node_modules/axios/lib/utils.js": +/*!*****************************************!*\ + !*** ./node_modules/axios/lib/utils.js ***! + \*****************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js"); + +// utils is a library of generic helper functions non-specific to axios + +var toString = Object.prototype.toString; + +/** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Array, otherwise false + */ +function isArray(val) { + return Array.isArray(val); +} + +/** + * Determine if a value is undefined + * + * @param {Object} val The value to test + * @returns {boolean} True if the value is undefined, otherwise false + */ +function isUndefined(val) { + return typeof val === 'undefined'; +} + +/** + * Determine if a value is a Buffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Buffer, otherwise false + */ +function isBuffer(val) { + return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) + && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); +} + +/** + * Determine if a value is an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an ArrayBuffer, otherwise false + */ +function isArrayBuffer(val) { + return toString.call(val) === '[object ArrayBuffer]'; +} + +/** + * Determine if a value is a FormData + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an FormData, otherwise false + */ +function isFormData(val) { + return toString.call(val) === '[object FormData]'; +} + +/** + * Determine if a value is a view on an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false + */ +function isArrayBufferView(val) { + var result; + if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { + result = ArrayBuffer.isView(val); + } else { + result = (val) && (val.buffer) && (isArrayBuffer(val.buffer)); + } + return result; +} + +/** + * Determine if a value is a String + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a String, otherwise false + */ +function isString(val) { + return typeof val === 'string'; +} + +/** + * Determine if a value is a Number + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Number, otherwise false + */ +function isNumber(val) { + return typeof val === 'number'; +} + +/** + * Determine if a value is an Object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Object, otherwise false + */ +function isObject(val) { + return val !== null && typeof val === 'object'; +} + +/** + * Determine if a value is a plain Object + * + * @param {Object} val The value to test + * @return {boolean} True if value is a plain Object, otherwise false + */ +function isPlainObject(val) { + if (toString.call(val) !== '[object Object]') { + return false; + } + + var prototype = Object.getPrototypeOf(val); + return prototype === null || prototype === Object.prototype; +} + +/** + * Determine if a value is a Date + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Date, otherwise false + */ +function isDate(val) { + return toString.call(val) === '[object Date]'; +} + +/** + * Determine if a value is a File + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a File, otherwise false + */ +function isFile(val) { + return toString.call(val) === '[object File]'; +} + +/** + * Determine if a value is a Blob + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Blob, otherwise false + */ +function isBlob(val) { + return toString.call(val) === '[object Blob]'; +} + +/** + * Determine if a value is a Function + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Function, otherwise false + */ +function isFunction(val) { + return toString.call(val) === '[object Function]'; +} + +/** + * Determine if a value is a Stream + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Stream, otherwise false + */ +function isStream(val) { + return isObject(val) && isFunction(val.pipe); +} + +/** + * Determine if a value is a URLSearchParams object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ +function isURLSearchParams(val) { + return toString.call(val) === '[object URLSearchParams]'; +} + +/** + * Trim excess whitespace off the beginning and end of a string + * + * @param {String} str The String to trim + * @returns {String} The String freed of excess whitespace + */ +function trim(str) { + return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); +} + +/** + * Determine if we're running in a standard browser environment + * + * This allows axios to run in a web worker, and react-native. + * Both environments support XMLHttpRequest, but not fully standard globals. + * + * web workers: + * typeof window -> undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + * nativescript + * navigator.product -> 'NativeScript' or 'NS' + */ +function isStandardBrowserEnv() { + if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || + navigator.product === 'NativeScript' || + navigator.product === 'NS')) { + return false; + } + return ( + typeof window !== 'undefined' && + typeof document !== 'undefined' + ); +} + +/** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + */ +function forEach(obj, fn) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } + + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } + + if (isArray(obj)) { + // Iterate over array values + for (var i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + fn.call(null, obj[key], key, obj); + } + } + } +} + +/** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * @returns {Object} Result of all merge properties + */ +function merge(/* obj1, obj2, obj3, ... */) { + var result = {}; + function assignValue(val, key) { + if (isPlainObject(result[key]) && isPlainObject(val)) { + result[key] = merge(result[key], val); + } else if (isPlainObject(val)) { + result[key] = merge({}, val); + } else if (isArray(val)) { + result[key] = val.slice(); + } else { + result[key] = val; + } + } + + for (var i = 0, l = arguments.length; i < l; i++) { + forEach(arguments[i], assignValue); + } + return result; +} + +/** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * @return {Object} The resulting value of object a + */ +function extend(a, b, thisArg) { + forEach(b, function assignValue(val, key) { + if (thisArg && typeof val === 'function') { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }); + return a; +} + +/** + * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + * + * @param {string} content with BOM + * @return {string} content value without BOM + */ +function stripBOM(content) { + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; +} + +module.exports = { + isArray: isArray, + isArrayBuffer: isArrayBuffer, + isBuffer: isBuffer, + isFormData: isFormData, + isArrayBufferView: isArrayBufferView, + isString: isString, + isNumber: isNumber, + isObject: isObject, + isPlainObject: isPlainObject, + isUndefined: isUndefined, + isDate: isDate, + isFile: isFile, + isBlob: isBlob, + isFunction: isFunction, + isStream: isStream, + isURLSearchParams: isURLSearchParams, + isStandardBrowserEnv: isStandardBrowserEnv, + forEach: forEach, + merge: merge, + extend: extend, + trim: trim, + stripBOM: stripBOM +}; + + +/***/ }), + +/***/ "./node_modules/jquery/dist/jquery.js": +/*!********************************************!*\ + !*** ./node_modules/jquery/dist/jquery.js ***! + \********************************************/ +/***/ (function(module, exports) { + +var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! + * jQuery JavaScript Library v3.6.0 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2021-03-02T17:08Z + */ +( function( global, factory ) { + + "use strict"; + + if ( true && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.6.0", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.6 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2021-02-16 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the primary Deferred + primary = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + // Support: Chrome 86+ + // In Chrome, if an element having a focusout handler is blurred by + // clicking outside of it, it invokes the handler synchronously. If + // that handler calls `.remove()` on the element, the data is cleared, + // leaving `result` undefined. We need to guard against this. + return result && result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + // Suppress native focus or blur as it's already being fired + // in leverageNative. + _default: function() { + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = "1px"; + trChild.style.height = "9px"; + + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is display: block + // gets around this issue. + trChild.style.display = "block"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ).filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ).map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + +originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + +
+
+
+
+
+
+ +
+
+
+
+
+
+
+ HIT +
+
+
+ Sta +
+
+
+ Exp +
+
+
+
+
+
+
Pow:
+ + +
+
+
Zest:
+ + +
+
+
Woosh:
+ + +
+
+
Quirk:
+ + +
+
+
+
+
Aha:
+ + +
+
+
Luck:
+ + +
+
+
Wow:
+ + +
+ +
+
+
+
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + diff --git a/src/routes/account/create.ts b/src/routes/account/create.ts new file mode 100644 index 0000000..0c4dee5 --- /dev/null +++ b/src/routes/account/create.ts @@ -0,0 +1,80 @@ +import { server } from '../../lib/server'; +import { Static, Type } from '@sinclair/typebox'; +import { prisma } from '../../lib/db'; +import { BadInputError } from '../../lib/http-errors'; +import { random } from 'lodash'; +import { maxHp, maxStamina } from '../../formulas'; +import {Biome, Player} from '@prisma/client'; + +const AccountInput = Type.Object({ + body: Type.Object({ + username: Type.String(), + password: Type.String(), + confirmation: Type.String() + }) +}); + +type AccountInputType = Static + +export type AccountCreateType = { + player: Player, + biome: { + id: string, + biome: Biome + } +} + +export const createAccount = server.post('/v1/accounts', { + schema: AccountInput +}, async (req) => { + const {username, password, confirmation} = req.body; + + if(username.length < 3) { + throw new BadInputError('Username must be at least 3 characters'); + } + + if(password !== confirmation) { + throw new BadInputError('Password and confirmation did not match'); + } + + // we should get the default zone that the player will be in! + + const data = { + username: username, + password: password, + pow: random(3,6), + zest: random(3,6), + woosh: random(3, 6), + luck: random(3, 6), + aha: random(3, 6), + wow: random(3, 6), + hp: 0, + stamina: 0, + zoneBiomeId: '' + }; + + + + data.hp = maxHp(1, data.zest); + data.stamina = maxStamina(1, data.woosh); + + // create a new biome for this player! + const biome = await prisma.zoneBiomes.create({ + data: { + biome: 'PLAINS', + maxSteps: 500 + } + }); + + data.zoneBiomeId = biome.id; + + const player = await prisma.player.create({ data }); + + return { + player, + biome: { + id: biome.id, + biome: biome.biome + } + } +}); diff --git a/src/routes/account/index.ts b/src/routes/account/index.ts new file mode 100644 index 0000000..fa2bbe5 --- /dev/null +++ b/src/routes/account/index.ts @@ -0,0 +1,2 @@ +export * from './create'; +export * from './login'; diff --git a/src/routes/account/login.ts b/src/routes/account/login.ts new file mode 100644 index 0000000..6651ae2 --- /dev/null +++ b/src/routes/account/login.ts @@ -0,0 +1,52 @@ +import { server } from '../../lib/server'; +import { Static, Type } from '@sinclair/typebox'; +import { prisma } from '../../lib/db'; +import { NotFoundError } from '../../lib/http-errors'; +import { v4 as uuid } from 'uuid'; +import {Player} from '@prisma/client'; + +const LoginInput = Type.Object({ + body: Type.Object({ + username: Type.String(), + password: Type.String() + }) +}); + +type LoginInputType = Static; + +export type LoginOutputType = { + token: string, + player: Player +}; + +export const login = server.post('/v1/accounts/auth', { + schema: LoginInput +}, async req => { + const {username, password} = req.body; + const player = await prisma.player.findUnique({ + where: { + username: username + } + }); + + if(!player || password !== player.password) { + throw new NotFoundError('Invalid user credentials'); + } + + const token = await prisma.authToken.upsert({ + where: { + playerId: player.id + }, + create: { + playerId: player.id + }, + update: { + token: uuid() + } + }); + + return { + token: token.token, + player + }; +}); diff --git a/src/routes/healthcheck.ts b/src/routes/healthcheck.ts new file mode 100644 index 0000000..d36809a --- /dev/null +++ b/src/routes/healthcheck.ts @@ -0,0 +1,7 @@ +import { server } from '../lib/server'; + +export const healthcheck = server.get('/healthcheck', {}, async () => { + return { + status: 'ok' + } +}); diff --git a/src/routes/index.ts b/src/routes/index.ts new file mode 100644 index 0000000..6f5015b --- /dev/null +++ b/src/routes/index.ts @@ -0,0 +1,3 @@ +export * from './account'; +export * from './move'; +export * from './healthcheck'; diff --git a/src/routes/move.ts b/src/routes/move.ts new file mode 100644 index 0000000..8ba79f0 --- /dev/null +++ b/src/routes/move.ts @@ -0,0 +1,97 @@ +import { server } from '../lib/server'; +import { Static, Type } from '@sinclair/typebox'; +import { prisma } from '../lib/db'; +import { ForbiddenError } from '../lib/http-errors'; +import { random, sample } from 'lodash'; +import {Biome, Player} from '@prisma/client'; + +const MoveInput = Type.Object({ + params: Type.Object({ + playerId: Type.String() + }) +}); + +type MoveInputType = Static; + +export type MoveOutputType = { + player: Player, + biome: { + id: string; + biome: Biome + }, + displayText: string +} + +const moveStatements = [ + "You walk forward", + "You take a few steps", + "You pause for a second before hurrying along", + "You stumble forward..." +]; + +export const move = server.post('/v1/accounts/:playerId/move', { + schema: MoveInput, + authenicated: true +}, async req => { + + const player = await prisma.player.findUnique({ + where: { + id: req.params.playerId + }, + include: { + zoneBiome: true + } + }); + + if(!player) { + throw new ForbiddenError(); + } + + if(player.stamina <= 0) { + throw new ForbiddenError('Insufficient Stamina'); + } + + + player.stamina--; + player.steps++; + + if(player.steps > player.zoneBiome.maxSteps) { + // ok, move them to a new zone! + const chosenBiome = sample(Object.values(Biome)) as Biome; + const biome = await prisma.zoneBiomes.create({ + data: { + biome: chosenBiome, + maxSteps: random(500, 1500) + } + }); + + await prisma.zoneBiomes.delete({ + where: { + id: player.zoneBiomeId + } + }); + + player.zoneBiome = biome; + player.steps = 0; + } + + + await prisma.player.update({ + where: { + id: player.id + }, + data: { + steps: player.steps, + stamina: player.stamina + } + }); + + return { + player, + biome: { + id: player.zoneBiome.id, + biome: player.zoneBiome.biome + }, + displayText: sample(moveStatements) || moveStatements[0] + } +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..31db929 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,102 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + "paths": { + }, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "resolveJsonModule": true, /* Enable importing .json files */ + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..6eb2e04 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,25 @@ +//webpack.config.js +const path = require('path'); + +module.exports = { + mode: "development", + devtool: "inline-source-map", + entry: { + main: "./src/public/app/game.ts", + }, + output: { + path: path.resolve(__dirname, './src/public'), + filename: "bundle.js" // <--- Will be compiled to this single file + }, + resolve: { + extensions: [".ts", ".tsx", ".js"], + }, + module: { + rules: [ + { + test: /\.tsx?$/, + loader: "ts-loader" + } + ] + } +}; -- 2.25.1