diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..579aa61 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +artifacts +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Config files +.webextrc +.webextrc.* diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 0000000..7dc5d17 --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1,6 @@ +singleQuote: true +trailingComma: all +endOfLine: lf +printWidth: 100 +tabWidth: 2 +arrowParens: avoid diff --git a/package.json b/package.json new file mode 100644 index 0000000..0f98032 --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "web-activity-time-tracker", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite build --watch --mode development", + "start": "vite build --watch --mode production", + "format": "prettier --write .", + "script:zip": "vite build --mode production && powershell scripts/zip.ps1" + }, + "dependencies": { + "@vueuse/core": "^10.2.1", + "chart.js": "^4.3.0", + "date-fns": "^2.30.0", + "rollup-plugin-copy": "^3.4.0", + "vue": "^3.2.47", + "vue-chartjs": "^5.2.0", + "vue-i18n": "^9.2.2" + }, + "devDependencies": { + "@intlify/unplugin-vue-i18n": "^0.12.2", + "@kyvg/vue3-notification": "^2.9.1", + "@types/webextension-polyfill": "^0.10.0", + "@vitejs/plugin-vue": "^4.0.0", + "@vuepic/vue-datepicker": "^5.3.0", + "typescript": "^5.0.4", + "vite": "^4.1.4", + "vite-plugin-web-extension": "^3.0.0", + "vue-tsc": "^1.2.0", + "webextension-polyfill": "^0.10.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..ef8692b --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4261 @@ +lockfileVersion: 5.4 + +specifiers: + '@intlify/unplugin-vue-i18n': ^0.12.2 + '@kyvg/vue3-notification': ^2.9.1 + '@types/webextension-polyfill': ^0.10.0 + '@vitejs/plugin-vue': ^4.0.0 + '@vuepic/vue-datepicker': ^5.3.0 + '@vueuse/core': ^10.2.1 + chart.js: ^4.3.0 + date-fns: ^2.30.0 + rollup-plugin-copy: ^3.4.0 + typescript: ^5.0.4 + vite: ^4.1.4 + vite-plugin-web-extension: ^3.0.0 + vue: ^3.2.47 + vue-chartjs: ^5.2.0 + vue-i18n: ^9.2.2 + vue-tsc: ^1.2.0 + webextension-polyfill: ^0.10.0 + +dependencies: + '@vueuse/core': 10.2.1_vue@3.2.47 + chart.js: 4.3.0 + date-fns: 2.30.0 + rollup-plugin-copy: 3.4.0 + vue: 3.2.47 + vue-chartjs: 5.2.0_chart.js@4.3.0+vue@3.2.47 + vue-i18n: 9.2.2_vue@3.2.47 + +devDependencies: + '@intlify/unplugin-vue-i18n': 0.12.2_vue-i18n@9.2.2 + '@kyvg/vue3-notification': 2.9.1_vue@3.2.47 + '@types/webextension-polyfill': 0.10.0 + '@vitejs/plugin-vue': 4.2.1_vite@4.3.3+vue@3.2.47 + '@vuepic/vue-datepicker': 5.3.0_vue@3.2.47 + typescript: 5.0.4 + vite: 4.3.3 + vite-plugin-web-extension: 3.0.6_vite@4.3.3 + vue-tsc: 1.6.1_typescript@5.0.4 + webextension-polyfill: 0.10.0 + +packages: + + /@babel/code-frame/7.21.4: + resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/helper-string-parser/7.21.5: + resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser/7.21.5: + resolution: {integrity: sha512-J+IxH2IsxV4HbnTrSWgMAQj0UEo61hDA4Ny8h8PCX0MLXiibqHbqIOVneqdocemSBc22VpBKxt4J6FQzy9HarQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.5 + + /@babel/runtime/7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + + /@babel/types/7.21.5: + resolution: {integrity: sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + + /@devicefarmer/adbkit-logcat/2.1.3: + resolution: {integrity: sha512-yeaGFjNBc/6+svbDeul1tNHtNChw6h8pSHAt5D+JsedUrMTN7tla7B15WLDyekxsuS2XlZHRxpuC6m92wiwCNw==} + engines: {node: '>= 4'} + dev: true + + /@devicefarmer/adbkit-monkey/1.2.1: + resolution: {integrity: sha512-ZzZY/b66W2Jd6NHbAhLyDWOEIBWC11VizGFk7Wx7M61JZRz7HR9Cq5P+65RKWUU7u6wgsE8Lmh9nE4Mz+U2eTg==} + engines: {node: '>= 0.10.4'} + dev: true + + /@devicefarmer/adbkit/3.2.3: + resolution: {integrity: sha512-wK9rVrabs4QU0oK8Jnwi+HRBEm+s1x/o63kgthUe0y7K1bfcYmgLuQf41/adsj/5enddlSxzkJavl2EwOu+r1g==} + engines: {node: '>= 0.10.4'} + hasBin: true + dependencies: + '@devicefarmer/adbkit-logcat': 2.1.3 + '@devicefarmer/adbkit-monkey': 1.2.1 + bluebird: 3.7.2 + commander: 9.5.0 + debug: 4.3.4 + node-forge: 1.3.1 + split: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@esbuild/android-arm/0.17.18: + resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.17.18: + resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.17.18: + resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.17.18: + resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.17.18: + resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.17.18: + resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.17.18: + resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.17.18: + resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.17.18: + resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.17.18: + resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.17.18: + resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.17.18: + resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.17.18: + resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.17.18: + resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.17.18: + resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.17.18: + resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.17.18: + resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.17.18: + resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.17.18: + resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.17.18: + resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.17.18: + resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.17.18: + resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils/4.4.0_eslint@8.36.0: + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.36.0 + eslint-visitor-keys: 3.4.0 + dev: true + + /@eslint-community/regexpp/4.5.1: + resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc/2.0.2: + resolution: {integrity: sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.5.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js/8.36.0: + resolution: {integrity: sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@fluent/syntax/0.19.0: + resolution: {integrity: sha512-5D2qVpZrgpjtqU4eNOcWGp1gnUCgjfM+vKGE2y03kKN6z5EBhtx0qdRFbg8QuNNj8wXNoX93KJoYb+NqoxswmQ==} + engines: {node: '>=14.0.0', npm: '>=7.0.0'} + dev: true + + /@humanwhocodes/config-array/0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer/1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@intlify/bundle-utils/7.0.2_vue-i18n@9.2.2: + resolution: {integrity: sha512-8wbx9xhbawBFTE5LPTECiK26RRqrNS31jyWSur72ZXZZ4it5jiZTcG6eUJlNirr4+jXYio2DGY299JsGVT4cpw==} + engines: {node: '>= 14.16'} + peerDependencies: + petite-vue-i18n: '*' + vue-i18n: '*' + peerDependenciesMeta: + petite-vue-i18n: + optional: true + vue-i18n: + optional: true + dependencies: + '@intlify/message-compiler': 9.3.0-beta.24 + '@intlify/shared': 9.3.0-beta.24 + acorn: 8.8.2 + escodegen: 2.1.0 + estree-walker: 2.0.2 + jsonc-eslint-parser: 1.4.1 + magic-string: 0.30.1 + mlly: 1.4.0 + source-map-js: 1.0.2 + vue-i18n: 9.2.2_vue@3.2.47 + yaml-eslint-parser: 0.3.2 + dev: true + + /@intlify/core-base/9.2.2: + resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==} + engines: {node: '>= 14'} + dependencies: + '@intlify/devtools-if': 9.2.2 + '@intlify/message-compiler': 9.2.2 + '@intlify/shared': 9.2.2 + '@intlify/vue-devtools': 9.2.2 + + /@intlify/devtools-if/9.2.2: + resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==} + engines: {node: '>= 14'} + dependencies: + '@intlify/shared': 9.2.2 + + /@intlify/message-compiler/9.2.2: + resolution: {integrity: sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==} + engines: {node: '>= 14'} + dependencies: + '@intlify/shared': 9.2.2 + source-map: 0.6.1 + + /@intlify/message-compiler/9.3.0-beta.24: + resolution: {integrity: sha512-prhHATkgp0mpPqoVgiAtLmUc1JMvs8fMH6w53AVEBn+VF87dLhzanfmWY5FoZWORG51ag54gBDBOoM/VFv3m3A==} + engines: {node: '>= 16'} + dependencies: + '@intlify/shared': 9.3.0-beta.24 + source-map-js: 1.0.2 + dev: true + + /@intlify/shared/9.2.2: + resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==} + engines: {node: '>= 14'} + + /@intlify/shared/9.3.0-beta.24: + resolution: {integrity: sha512-AKxJ8s7eKIQWkNaf4wyyoLRwf4puCuQgjSChlDJm5JBEt6T8HGgnYTJLRXu6LD/JACn3Qwu6hM/XRX1c9yvjmQ==} + engines: {node: '>= 16'} + dev: true + + /@intlify/unplugin-vue-i18n/0.12.2_vue-i18n@9.2.2: + resolution: {integrity: sha512-IIgzLRSPUKZM1FBdUAZ9NwVPiLUr4ea5g/HLWe2lB7gNtPDz4FOfUNUllIT504hT+3pDoJmjaYJ6pyqT7F4Wuw==} + engines: {node: '>= 14.16'} + peerDependencies: + petite-vue-i18n: '*' + vue-i18n: '*' + vue-i18n-bridge: '*' + peerDependenciesMeta: + petite-vue-i18n: + optional: true + vue-i18n: + optional: true + vue-i18n-bridge: + optional: true + dependencies: + '@intlify/bundle-utils': 7.0.2_vue-i18n@9.2.2 + '@intlify/shared': 9.3.0-beta.24 + '@rollup/pluginutils': 5.0.2 + '@vue/compiler-sfc': 3.2.47 + debug: 4.3.4 + fast-glob: 3.3.0 + js-yaml: 4.1.0 + json5: 2.2.3 + pathe: 1.1.1 + picocolors: 1.0.0 + source-map-js: 1.0.2 + unplugin: 1.4.0 + vue-i18n: 9.2.2_vue@3.2.47 + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + /@intlify/vue-devtools/9.2.2: + resolution: {integrity: sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==} + engines: {node: '>= 14'} + dependencies: + '@intlify/core-base': 9.2.2 + '@intlify/shared': 9.2.2 + + /@jridgewell/sourcemap-codec/1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@kurkle/color/0.3.2: + resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==} + dev: false + + /@kyvg/vue3-notification/2.9.1_vue@3.2.47: + resolution: {integrity: sha512-FsY8g25tQetr3etnarxHtCeNFKssH8sheFu13LyL2JJmOOel437QqKV5n4RBDDDTIo55iKgIVYXeojliXYdEhw==} + peerDependencies: + vue: ^3.0.0 + dependencies: + vue: 3.2.47 + dev: true + + /@mdn/browser-compat-data/5.2.42: + resolution: {integrity: sha512-CD/2ai1W45cDN/zN2AcYduDavU+nq9aStyQizi4MHxnwkRvS/H24WIjgc1qD8CISoqXa8AAIe+A+zpWxwV7a2Q==} + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@pnpm/config.env-replace/1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + dev: true + + /@pnpm/network.ca-file/1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + dev: true + + /@pnpm/npm-conf/2.1.1: + resolution: {integrity: sha512-yfRcuupmxxeDOSxvw4g+wFCrGiPD0L32f5WMzqMXp7Rl93EOCdFiDcaSNnZ10Up9GdNqkj70UTa8hfhPFphaZA==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: true + + /@rollup/pluginutils/5.0.2: + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.1 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@sindresorhus/is/5.3.0: + resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==} + engines: {node: '>=14.16'} + dev: true + + /@szmarczak/http-timer/5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + + /@types/estree/1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + + /@types/fs-extra/8.1.2: + resolution: {integrity: sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==} + dependencies: + '@types/node': 18.16.3 + dev: false + + /@types/glob/7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 3.0.5 + '@types/node': 18.16.3 + dev: false + + /@types/http-cache-semantics/4.0.1: + resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + dev: true + + /@types/minimatch/3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + + /@types/node/18.16.3: + resolution: {integrity: sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==} + + /@types/web-bluetooth/0.0.17: + resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} + dev: false + + /@types/webextension-polyfill/0.10.0: + resolution: {integrity: sha512-If4EcaHzYTqcbNMp/FdReVdRmLL/Te42ivnJII551bYjhX19bWem5m14FERCqdJA732OloGuxCRvLBvcMGsn4A==} + dev: true + + /@types/yauzl/2.10.0: + resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} + dependencies: + '@types/node': 18.16.3 + dev: true + + /@vitejs/plugin-vue/4.2.1_vite@4.3.3+vue@3.2.47: + resolution: {integrity: sha512-ZTZjzo7bmxTRTkb8GSTwkPOYDIP7pwuyV+RV53c9PYUouwcbkIZIvWvNWlX2b1dYZqtOv7D6iUAnJLVNGcLrSw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.3.3 + vue: 3.2.47 + dev: true + + /@volar/language-core/1.4.1: + resolution: {integrity: sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==} + dependencies: + '@volar/source-map': 1.4.1 + dev: true + + /@volar/source-map/1.4.1: + resolution: {integrity: sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==} + dependencies: + muggle-string: 0.2.2 + dev: true + + /@volar/typescript/1.4.1_typescript@5.0.4: + resolution: {integrity: sha512-phTy6p9yG6bgMIKQWEeDOi/aeT0njZsb1a/G1mrEuDsLmAn24Le4gDwSsGNhea6Uhu+3gdpUZn2PmZXa+WG2iQ==} + peerDependencies: + typescript: '*' + dependencies: + '@volar/language-core': 1.4.1 + typescript: 5.0.4 + dev: true + + /@volar/vue-language-core/1.6.1: + resolution: {integrity: sha512-lIuxzvIx5U8MfoF+vrXNG1aZgmk8T0uyPEwI8g3EUJdESuU0qIKM84o+L4TUw77IQCYXiSefaJmsSSY87/VWnA==} + dependencies: + '@volar/language-core': 1.4.1 + '@volar/source-map': 1.4.1 + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-sfc': 3.2.47 + '@vue/reactivity': 3.2.47 + '@vue/shared': 3.2.47 + minimatch: 9.0.0 + muggle-string: 0.2.2 + vue-template-compiler: 2.7.14 + dev: true + + /@volar/vue-typescript/1.6.1_typescript@5.0.4: + resolution: {integrity: sha512-5mhG6Lv2niq/AGNvHy4RSAGlJhkR+EcH7zRQ19JlffzhWDVXEdDp8luSSabCkrJzejXIMh0rsTGlKy2EFYy7vQ==} + peerDependencies: + typescript: '*' + dependencies: + '@volar/typescript': 1.4.1_typescript@5.0.4 + '@volar/vue-language-core': 1.6.1 + typescript: 5.0.4 + dev: true + + /@vue/compiler-core/3.2.47: + resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} + dependencies: + '@babel/parser': 7.21.5 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + source-map: 0.6.1 + + /@vue/compiler-dom/3.2.47: + resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} + dependencies: + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/compiler-sfc/3.2.47: + resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} + dependencies: + '@babel/parser': 7.21.5 + '@vue/compiler-core': 3.2.47 + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-ssr': 3.2.47 + '@vue/reactivity-transform': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.23 + source-map: 0.6.1 + + /@vue/compiler-ssr/3.2.47: + resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/devtools-api/6.5.0: + resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} + + /@vue/reactivity-transform/3.2.47: + resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} + dependencies: + '@babel/parser': 7.21.5 + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + + /@vue/reactivity/3.2.47: + resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} + dependencies: + '@vue/shared': 3.2.47 + + /@vue/runtime-core/3.2.47: + resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} + dependencies: + '@vue/reactivity': 3.2.47 + '@vue/shared': 3.2.47 + + /@vue/runtime-dom/3.2.47: + resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} + dependencies: + '@vue/runtime-core': 3.2.47 + '@vue/shared': 3.2.47 + csstype: 2.6.21 + + /@vue/server-renderer/3.2.47_vue@3.2.47: + resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} + peerDependencies: + vue: 3.2.47 + dependencies: + '@vue/compiler-ssr': 3.2.47 + '@vue/shared': 3.2.47 + vue: 3.2.47 + + /@vue/shared/3.2.47: + resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} + + /@vuepic/vue-datepicker/5.3.0_vue@3.2.47: + resolution: {integrity: sha512-eW5LRa3mH5klbRaKedG96/KY4EZC7ns+Zs7A+4guRBL+dQQthd8HV0xyS9nkI7hjr1K5zU+FQ3TOdo/oX5r3og==} + engines: {node: '>=14'} + peerDependencies: + vue: '>=3.2.0' + dependencies: + date-fns: 2.30.0 + date-fns-tz: 1.3.8_date-fns@2.30.0 + vue: 3.2.47 + dev: true + + /@vueuse/core/10.2.1_vue@3.2.47: + resolution: {integrity: sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w==} + dependencies: + '@types/web-bluetooth': 0.0.17 + '@vueuse/metadata': 10.2.1 + '@vueuse/shared': 10.2.1_vue@3.2.47 + vue-demi: 0.14.5_vue@3.2.47 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/metadata/10.2.1: + resolution: {integrity: sha512-3Gt68mY/i6bQvFqx7cuGBzrCCQu17OBaGWS5JdwISpMsHnMKKjC2FeB5OAfMcCQ0oINfADP3i9A4PPRo0peHdQ==} + dev: false + + /@vueuse/shared/10.2.1_vue@3.2.47: + resolution: {integrity: sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==} + dependencies: + vue-demi: 0.14.5_vue@3.2.47 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /abort-controller/3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: true + + /acorn-jsx/5.3.2_acorn@7.4.1: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 7.4.1 + dev: true + + /acorn-jsx/5.3.2_acorn@8.8.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + dev: true + + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn/8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /addons-linter/5.32.0_node-fetch@3.3.1: + resolution: {integrity: sha512-Lf6oOyw8X9z5BMd9xhQwSbPlN2PUlzDLnYLAVT5lkrgXEx0fO9hRk4JRxWZ8+rFGz+mCIA2TTClZF2f+MKgJQA==} + engines: {node: '>=12.21.0'} + hasBin: true + dependencies: + '@fluent/syntax': 0.19.0 + '@mdn/browser-compat-data': 5.2.42 + addons-moz-compare: 1.3.0 + addons-scanner-utils: 8.5.0_node-fetch@3.3.1 + ajv: 8.12.0 + chalk: 4.1.2 + cheerio: 1.0.0-rc.12 + columnify: 1.6.0 + common-tags: 1.8.2 + deepmerge: 4.3.1 + eslint: 8.36.0 + eslint-plugin-no-unsanitized: 4.0.2_eslint@8.36.0 + eslint-visitor-keys: 3.3.0 + espree: 9.5.0 + esprima: 4.0.1 + fast-json-patch: 3.1.1 + glob: 9.3.0 + image-size: 1.0.2 + is-mergeable-object: 1.1.1 + jed: 1.1.1 + json-merge-patch: 1.0.2 + os-locale: 5.0.0 + pino: 8.11.0 + postcss: 8.4.21 + relaxed-json: 1.0.3 + semver: 7.3.8 + sha.js: 2.4.11 + source-map-support: 0.5.21 + tosource: 1.0.0 + upath: 2.0.1 + yargs: 17.7.1 + yauzl: 2.10.0 + transitivePeerDependencies: + - body-parser + - express + - node-fetch + - safe-compare + - supports-color + dev: true + + /addons-moz-compare/1.3.0: + resolution: {integrity: sha512-/rXpQeaY0nOKhNx00pmZXdk5Mu+KhVlL3/pSBuAYwrxRrNiTvI/9xfQI8Lmm7DMMl+PDhtfAHY/0ibTpdeoQQQ==} + dev: true + + /addons-scanner-utils/8.5.0_node-fetch@3.3.1: + resolution: {integrity: sha512-X35SYZRdSnxx7UZuAk+DizKihQp2Ze2c5GV+5nnRr/FFyx/fOgE3Zo8jdhzSne57PENE9w1ZVocBLJTN6UDB3g==} + peerDependencies: + body-parser: 1.20.2 + express: 4.18.2 + node-fetch: 2.6.7 + safe-compare: 1.1.4 + peerDependenciesMeta: + body-parser: + optional: true + express: + optional: true + node-fetch: + optional: true + safe-compare: + optional: true + dependencies: + '@types/yauzl': 2.10.0 + common-tags: 1.8.2 + first-chunk-stream: 3.0.0 + node-fetch: 3.3.1 + strip-bom-stream: 4.0.0 + upath: 2.0.1 + yauzl: 2.10.0 + dev: true + + /adm-zip/0.5.10: + resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==} + engines: {node: '>=6.0'} + dev: true + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv/8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-align/3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex/6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles/6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /any-promise/1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-differ/4.0.0: + resolution: {integrity: sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /array-union/3.0.1: + resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==} + engines: {node: '>=12'} + dev: true + + /asn1/0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /assert-plus/1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: true + + /async-lock/1.4.0: + resolution: {integrity: sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==} + dev: true + + /async/3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + dev: true + + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /at-least-node/1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /atomic-sleep/1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: true + + /aws-sign2/0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: true + + /aws4/1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /bcrypt-pbkdf/1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bluebird/3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /boolbase/1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /boxen/7.0.2: + resolution: {integrity: sha512-1Z4UJabXUP1/R9rLpoU3O2lEMnG3pPLAs/ZD2lF3t2q7qD5lM8rqbtnvtvm4N0wEyNlE+9yZVTVAGmd1V5jabg==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.2.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-equal-constant-time/1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer/6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /bunyan/1.8.15: + resolution: {integrity: sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==} + engines: {'0': node >=0.10.0} + hasBin: true + optionalDependencies: + dtrace-provider: 0.8.8 + moment: 2.29.4 + mv: 2.1.1 + safe-json-stringify: 1.2.0 + dev: true + + /cacheable-lookup/7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + dev: true + + /cacheable-request/10.2.10: + resolution: {integrity: sha512-v6WB+Epm/qO4Hdlio/sfUn69r5Shgh39SsE9DSd4bIezP0mblOlObI+I0kUEM7J0JFc+I7pSeMeYaOYtX1N/VQ==} + engines: {node: '>=14.16'} + dependencies: + '@types/http-cache-semantics': 4.0.1 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.2 + mimic-response: 4.0.0 + normalize-url: 8.0.0 + responselike: 3.0.0 + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase/7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + dev: true + + /caseless/0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk/5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /charenc/0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: true + + /chart.js/4.3.0: + resolution: {integrity: sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g==} + engines: {pnpm: '>=7'} + dependencies: + '@kurkle/color': 0.3.2 + dev: false + + /cheerio-select/2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + dev: true + + /cheerio/1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chrome-launcher/0.15.1: + resolution: {integrity: sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==} + engines: {node: '>=12.13.0'} + hasBin: true + dependencies: + '@types/node': 18.16.3 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /ci-info/3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /cli-boxes/3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + dev: true + + /cliui/8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone/1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colorette/1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + dev: false + + /columnify/1.6.0: + resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} + engines: {node: '>=8.0.0'} + dependencies: + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander/2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander/2.9.0: + resolution: {integrity: sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==} + engines: {node: '>= 0.6.x'} + dependencies: + graceful-readlink: 1.0.1 + dev: true + + /commander/9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /common-tags/1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream/1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: true + + /config-chain/1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true + + /configstore/6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + dependencies: + dot-prop: 6.0.1 + graceful-fs: 4.2.11 + unique-string: 3.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 5.1.0 + dev: true + + /core-js/3.29.0: + resolution: {integrity: sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==} + requiresBuild: true + dev: true + + /core-util-is/1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: true + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypt/0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: true + + /crypto-random-string/4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: true + + /css-select/5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: true + + /css-what/6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssom/0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + dev: true + + /csstype/2.6.21: + resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} + + /dashdash/1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /data-uri-to-buffer/4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: true + + /date-fns-tz/1.3.8_date-fns@2.30.0: + resolution: {integrity: sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==} + peerDependencies: + date-fns: '>=2.0.0' + dependencies: + date-fns: 2.30.0 + dev: true + + /date-fns/2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.21.0 + + /de-indent/1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + + /debounce/1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + dev: true + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decamelize/6.0.0: + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /decompress-response/6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-extend/0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepcopy/2.1.0: + resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /deepmerge/4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /defaults/1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /defer-to-connect/2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: true + + /define-lazy-prop/2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-serializer/2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler/5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils/3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /dot-prop/6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dependencies: + is-obj: 2.0.0 + dev: true + + /dtrace-provider/0.8.8: + resolution: {integrity: sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + nan: 2.17.0 + dev: true + optional: true + + /eastasianwidth/0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /ecc-jsbn/0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: true + + /ecdsa-sig-formatter/1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex/9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /entities/4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es6-error/4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + dev: true + + /es6-promisify/7.0.0: + resolution: {integrity: sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==} + engines: {node: '>=6'} + dev: true + + /esbuild/0.17.18: + resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.18 + '@esbuild/android-arm64': 0.17.18 + '@esbuild/android-x64': 0.17.18 + '@esbuild/darwin-arm64': 0.17.18 + '@esbuild/darwin-x64': 0.17.18 + '@esbuild/freebsd-arm64': 0.17.18 + '@esbuild/freebsd-x64': 0.17.18 + '@esbuild/linux-arm': 0.17.18 + '@esbuild/linux-arm64': 0.17.18 + '@esbuild/linux-ia32': 0.17.18 + '@esbuild/linux-loong64': 0.17.18 + '@esbuild/linux-mips64el': 0.17.18 + '@esbuild/linux-ppc64': 0.17.18 + '@esbuild/linux-riscv64': 0.17.18 + '@esbuild/linux-s390x': 0.17.18 + '@esbuild/linux-x64': 0.17.18 + '@esbuild/netbsd-x64': 0.17.18 + '@esbuild/openbsd-x64': 0.17.18 + '@esbuild/sunos-x64': 0.17.18 + '@esbuild/win32-arm64': 0.17.18 + '@esbuild/win32-ia32': 0.17.18 + '@esbuild/win32-x64': 0.17.18 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-goat/4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escodegen/2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-plugin-no-unsanitized/4.0.2_eslint@8.36.0: + resolution: {integrity: sha512-Pry0S9YmHoz8NCEMRQh7N0Yexh2MYCNPIlrV52hTmS7qXnTghWsjXouF08bgsrrZqaW9tt1ZiK3j5NEmPE+EjQ==} + peerDependencies: + eslint: ^6 || ^7 || ^8 + dependencies: + eslint: 8.36.0 + dev: true + + /eslint-scope/7.2.0: + resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils/2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-visitor-keys/1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint-visitor-keys/3.4.0: + resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint/8.36.0: + resolution: {integrity: sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0_eslint@8.36.0 + '@eslint-community/regexpp': 4.5.1 + '@eslint/eslintrc': 2.0.2 + '@eslint/js': 8.36.0 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.0 + eslint-visitor-keys: 3.4.0 + espree: 9.5.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.4.0 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree/6.2.1: + resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} + engines: {node: '>=6.0.0'} + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.2_acorn@7.4.1 + eslint-visitor-keys: 1.3.0 + dev: true + + /espree/9.5.0: + resolution: {integrity: sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2_acorn@8.8.2 + eslint-visitor-keys: 3.4.0 + dev: true + + /espree/9.5.1: + resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2_acorn@8.8.2 + eslint-visitor-keys: 3.4.0 + dev: true + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery/1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /event-target-shim/5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: true + + /events/3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /execa/4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /extend/3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /extsprintf/1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + dev: true + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob/3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-patch/3.1.1: + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-redact/3.1.2: + resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} + engines: {node: '>=6'} + dev: true + + /fastq/1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /fd-slicer/1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /fetch-blob/3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: true + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /firefox-profile/4.3.2: + resolution: {integrity: sha512-/C+Eqa0YgIsQT2p66p7Ygzqe7NlE/GNTbhw2SBCm5V3OsWDPITNdTPEcH2Q2fe7eMpYYNPKdUcuVioZBZiR6kA==} + hasBin: true + dependencies: + adm-zip: 0.5.10 + fs-extra: 9.0.1 + ini: 2.0.0 + minimist: 1.2.8 + xml2js: 0.5.0 + dev: true + + /first-chunk-stream/3.0.0: + resolution: {integrity: sha512-LNRvR4hr/S8cXXkIY5pTgVP7L3tq6LlYWcg9nWBuW7o1NMxKZo6oOVa/6GIekMGI0Iw7uC+HWimMe9u/VAeKqw==} + engines: {node: '>=8'} + dev: true + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatted/3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /forever-agent/0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + dev: true + + /form-data-encoder/2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + dev: true + + /form-data/2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /formdata-polyfill/4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: true + + /fs-extra/10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra/11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra/8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs-extra/9.0.1: + resolution: {integrity: sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 1.0.0 + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /fx-runner/1.3.0: + resolution: {integrity: sha512-5b37H4GCyhF+Nf8xk9mylXoDq4wb7pbGAXxlCXp/631UTeeZomWSYcEGXumY4wk8g2QAqjPMGdWW+RbNt8PUcA==} + hasBin: true + dependencies: + commander: 2.9.0 + shell-quote: 1.7.3 + spawn-sync: 1.0.15 + when: 3.7.7 + which: 1.2.4 + winreg: 0.0.12 + dev: true + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-stream/5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /getpass/0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp/0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob/6.0.4: + resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + optional: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob/9.3.0: + resolution: {integrity: sha512-EAZejC7JvnQINayvB/7BJbpZpNOJ8Lrw2OZNEvQxe0vaLn1SuwMcfV7/MNaX8L/T0wmptBFI4YMtDvSBxYDc7w==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + fs.realpath: 1.0.0 + minimatch: 7.4.6 + minipass: 4.2.8 + path-scurry: 1.7.0 + dev: true + + /global-dirs/3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + dev: true + + /globals/13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globby/10.0.1: + resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} + engines: {node: '>=8'} + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.0 + glob: 7.2.3 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /got/12.6.0: + resolution: {integrity: sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 5.3.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.10 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.0 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graceful-readlink/1.0.1: + resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==} + dev: true + + /grapheme-splitter/1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /growly/1.3.0: + resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} + dev: true + + /har-schema/2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + dev: true + + /har-validator/5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-yarn/3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /he/1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /html-escaper/3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + dev: true + + /htmlparser2/8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + + /http-cache-semantics/4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + + /http-signature/1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.17.0 + dev: true + + /http2-wrapper/2.2.0: + resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + + /human-signals/1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore/5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + /image-size/1.0.2: + resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + queue: 6.0.2 + dev: true + + /immediate/3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-lazy/4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /ini/2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + dev: true + + /invert-kv/3.0.1: + resolution: {integrity: sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==} + engines: {node: '>=8'} + dev: true + + /is-absolute/0.1.7: + resolution: {integrity: sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==} + engines: {node: '>=0.10.0'} + dependencies: + is-relative: 0.1.3 + dev: true + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-buffer/1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + + /is-ci/3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.8.0 + dev: true + + /is-docker/2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-installed-globally/0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + dev: true + + /is-mergeable-object/1.1.1: + resolution: {integrity: sha512-CPduJfuGg8h8vW74WOxHtHmtQutyQBzR+3MjQ6iDHIYdbOnm1YC7jv43SqCoU8OPGTJD4nibmiryA4kmogbGrA==} + dev: true + + /is-npm/6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-obj/2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-object/3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} + engines: {node: '>=0.10.0'} + dev: false + + /is-relative/0.1.3: + resolution: {integrity: sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-typedarray/1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-utf8/0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: true + + /is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /is-yarn-global/0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} + dev: true + + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe/1.1.2: + resolution: {integrity: sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw==} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isstream/0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: true + + /jed/1.1.1: + resolution: {integrity: sha512-z35ZSEcXHxLW4yumw0dF6L464NT36vmx3wxJw8MDpraBcWuNVgUPZgPJKcu1HekNgwlMFNqol7i/IpSbjhqwqA==} + dev: true + + /jose/4.13.1: + resolution: {integrity: sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==} + dev: true + + /js-sdsl/4.4.0: + resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsbn/0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: true + + /json-buffer/3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-merge-patch/1.0.2: + resolution: {integrity: sha512-M6Vp2GN9L7cfuMXiWOmHj9bEFbeC250iVtcKQbqVgEsDVYnIsrNsbU+h/Y/PkbBQCtEa4Bez+Ebv0zfbC8ObLg==} + dependencies: + fast-deep-equal: 3.1.3 + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse/1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-schema/0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe/5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-eslint-parser/1.4.1: + resolution: {integrity: sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==} + engines: {node: '>=8.10.0'} + dependencies: + acorn: 7.4.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 1.3.0 + espree: 6.2.1 + semver: 6.3.1 + dev: true + + /jsonc-parser/3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile/4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonwebtoken/9.0.0: + resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash: 4.17.21 + ms: 2.1.3 + semver: 7.5.0 + dev: true + + /jsprim/1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + + /jszip/3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: true + + /jwa/1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: true + + /jws/3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: true + + /keyv/4.5.2: + resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /latest-version/7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + dependencies: + package-json: 8.1.0 + dev: true + + /lcid/3.1.1: + resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==} + engines: {node: '>=8'} + dependencies: + invert-kv: 3.0.1 + dev: true + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lie/3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: true + + /lighthouse-logger/1.3.0: + resolution: {integrity: sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA==} + dependencies: + debug: 2.6.9 + marky: 1.2.5 + transitivePeerDependencies: + - supports-color + dev: true + + /lines-and-columns/2.0.3: + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /linkedom/0.14.26: + resolution: {integrity: sha512-mK6TrydfFA7phrnp+1j57ycBwFI5bGSW6YXlw9acHoqF+mP/y+FooEYYyniOt5Ot57FSKB3iwmnuQ1UUyNLm5A==} + dependencies: + css-select: 5.1.0 + cssom: 0.5.0 + html-escaper: 3.0.3 + htmlparser2: 8.0.2 + uhyphen: 0.2.0 + dev: true + + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.uniq/4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.uniqby/4.7.0: + resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /lowercase-keys/3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /lru-cache/9.1.1: + resolution: {integrity: sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==} + engines: {node: 14 || >=16.14} + dev: true + + /magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + + /magic-string/0.30.1: + resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /map-age-cleaner/0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + dependencies: + p-defer: 1.0.0 + dev: true + + /marky/1.2.5: + resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + dev: true + + /md5/2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: true + + /mem/5.1.1: + resolution: {integrity: sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==} + engines: {node: '>=8'} + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 2.1.0 + p-is-promise: 2.1.0 + dev: true + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-response/3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /mimic-response/4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch/7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch/9.0.0: + resolution: {integrity: sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass/4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: true + + /minipass/5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + optional: true + + /mkdirp/1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mlly/1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.1.2 + dev: true + + /moment/2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + requiresBuild: true + dev: true + optional: true + + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /muggle-string/0.2.2: + resolution: {integrity: sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==} + dev: true + + /multimatch/6.0.0: + resolution: {integrity: sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 4.0.0 + array-union: 3.0.1 + minimatch: 3.1.2 + dev: true + + /mv/2.1.1: + resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} + engines: {node: '>=0.8.0'} + requiresBuild: true + dependencies: + mkdirp: 0.5.6 + ncp: 2.0.0 + rimraf: 2.4.5 + dev: true + optional: true + + /mz/2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nan/2.17.0: + resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + dev: true + optional: true + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /ncp/2.0.0: + resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} + hasBin: true + dev: true + optional: true + + /node-domexception/1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: true + + /node-fetch/3.3.1: + resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: true + + /node-forge/1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + + /node-notifier/10.0.1: + resolution: {integrity: sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==} + dependencies: + growly: 1.3.0 + is-wsl: 2.2.0 + semver: 7.5.0 + shellwords: 0.1.1 + uuid: 8.3.2 + which: 2.0.2 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url/8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + engines: {node: '>=14.16'} + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /oauth-sign/0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /on-exit-leak-free/2.1.0: + resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /open/8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /optionator/0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /os-locale/5.0.0: + resolution: {integrity: sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==} + engines: {node: '>=10'} + dependencies: + execa: 4.1.0 + lcid: 3.1.1 + mem: 5.1.1 + dev: true + + /os-shim/0.1.3: + resolution: {integrity: sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==} + engines: {node: '>= 0.4.0'} + dev: true + + /p-cancelable/3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: true + + /p-defer/1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + dev: true + + /p-is-promise/2.1.0: + resolution: {integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==} + engines: {node: '>=6'} + dev: true + + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /package-json/8.1.0: + resolution: {integrity: sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==} + engines: {node: '>=14.16'} + dependencies: + got: 12.6.0 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.5.0 + dev: true + + /pako/1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json/6.0.2: + resolution: {integrity: sha512-SA5aMiaIjXkAiBrW/yPgLgQAQg42f7K3ACO+2l/zOvtQBwX58DMUsFJXelW2fx3yMBmWOVkR6j1MGsdSbCA4UA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + '@babel/code-frame': 7.21.4 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 2.0.3 + dev: true + + /parse5-htmlparser2-tree-adapter/7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + dev: true + + /parse5/7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-scurry/1.7.0: + resolution: {integrity: sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 9.1.1 + minipass: 5.0.0 + dev: true + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false + + /pathe/1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /pend/1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /performance-now/2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pino-abstract-transport/1.0.0: + resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} + dependencies: + readable-stream: 4.3.0 + split2: 4.2.0 + dev: true + + /pino-std-serializers/6.2.0: + resolution: {integrity: sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==} + dev: true + + /pino/8.11.0: + resolution: {integrity: sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.1.2 + on-exit-leak-free: 2.1.0 + pino-abstract-transport: 1.0.0 + pino-std-serializers: 6.2.0 + process-warning: 2.2.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.3.0 + thread-stream: 2.3.0 + dev: true + + /pkg-types/1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.0 + pathe: 1.1.1 + dev: true + + /postcss/8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /postcss/8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /process-warning/2.2.0: + resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} + dev: true + + /process/0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + + /promise-toolbox/0.21.0: + resolution: {integrity: sha512-NV8aTmpwrZv+Iys54sSFOBx3tuVaOBvvrft5PNppnxy9xpU/akHbaWIril22AB22zaPgrgwKdD0KsrM0ptUtpg==} + engines: {node: '>=6'} + dependencies: + make-error: 1.3.6 + dev: true + + /proto-list/1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: true + + /psl/1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + + /pump/3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /punycode/2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /pupa/3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + dependencies: + escape-goat: 4.0.0 + dev: true + + /qs/6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /queue/6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + dependencies: + inherits: 2.0.4 + dev: true + + /quick-format-unescaped/4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: true + + /quick-lru/5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /rc/1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /readable-stream/2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream/4.3.0: + resolution: {integrity: sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /real-require/0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + dev: true + + /regenerator-runtime/0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + /registry-auth-token/5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + dependencies: + '@pnpm/npm-conf': 2.1.1 + dev: true + + /registry-url/6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + dependencies: + rc: 1.2.8 + dev: true + + /relaxed-json/1.0.3: + resolution: {integrity: sha512-b7wGPo7o2KE/g7SqkJDDbav6zmrEeP4TK2VpITU72J/M949TLe/23y/ZHJo+pskcGM52xIfFoT9hydwmgr1AEg==} + engines: {node: '>= 0.10.0'} + hasBin: true + dependencies: + chalk: 2.4.2 + commander: 2.20.3 + dev: true + + /request/2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + dev: true + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-alpn/1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /responselike/3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: 3.0.0 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf/2.4.5: + resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} + hasBin: true + dependencies: + glob: 6.0.4 + dev: true + optional: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup-plugin-copy/3.4.0: + resolution: {integrity: sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==} + engines: {node: '>=8.3'} + dependencies: + '@types/fs-extra': 8.1.2 + colorette: 1.4.0 + fs-extra: 8.1.0 + globby: 10.0.1 + is-plain-object: 3.0.1 + dev: false + + /rollup/3.21.2: + resolution: {integrity: sha512-c4vC+JZ3bbF4Kqq2TtM7zSKtSyMybFOjqmomFax3xpfYaPZDZ4iz8NMIuBRMjnXOcKYozw7bC6vhJjiWD6JpzQ==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-json-stringify/1.2.0: + resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} + requiresBuild: true + dev: true + optional: true + + /safe-stable-stringify/2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: true + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /sax/1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: true + + /semver-diff/4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + dependencies: + semver: 7.5.0 + dev: true + + /semver/6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver/7.5.0: + resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /setimmediate/1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: true + + /sha.js/2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote/1.7.3: + resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} + dev: true + + /shellwords/0.1.1: + resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} + dev: true + + /sign-addon/5.3.0: + resolution: {integrity: sha512-7nHlCzhQgVMLBNiXVEgbG/raq48awOW0lYMN5uo1BaB3mp0+k8M8pvDwbfTlr3apcxZJsk9HQsAW1POwoJugpQ==} + dependencies: + common-tags: 1.8.2 + core-js: 3.29.0 + deepcopy: 2.1.0 + es6-error: 4.1.1 + es6-promisify: 7.0.0 + jsonwebtoken: 9.0.0 + mz: 2.7.0 + request: 2.88.2 + source-map-support: 0.5.21 + stream-to-promise: 3.0.0 + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /sonic-boom/3.3.0: + resolution: {integrity: sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==} + dependencies: + atomic-sleep: 1.0.0 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + /spawn-sync/1.0.15: + resolution: {integrity: sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==} + requiresBuild: true + dependencies: + concat-stream: 1.6.2 + os-shim: 0.1.3 + dev: true + + /split/1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: true + + /split2/4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: true + + /sshpk/1.17.0: + resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: true + + /stream-to-array/2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + dependencies: + any-promise: 1.3.0 + dev: true + + /stream-to-promise/3.0.0: + resolution: {integrity: sha512-h+7wLeFiYegOdgTfTxjRsrT7/Op7grnKEIHWgaO1RTHwcwk7xRreMr3S8XpDfDMesSxzgM2V4CxNCFAGo6ssnA==} + engines: {node: '>= 10'} + dependencies: + any-promise: 1.3.0 + end-of-stream: 1.4.4 + stream-to-array: 2.3.0 + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width/5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.0.1 + dev: true + + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi/7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom-buf/2.0.0: + resolution: {integrity: sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ==} + engines: {node: '>=8'} + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom-stream/4.0.0: + resolution: {integrity: sha512-0ApK3iAkHv6WbgLICw/J4nhwHeDZsBxIIsOD+gHgZICL6SeJ0S9f/WZqemka9cjkTyMN5geId6e8U5WGFAn3cQ==} + engines: {node: '>=8'} + dependencies: + first-chunk-stream: 3.0.0 + strip-bom-buf: 2.0.0 + dev: true + + /strip-bom/5.0.0: + resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==} + engines: {node: '>=12'} + dev: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-json-comments/2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-json-comments/5.0.0: + resolution: {integrity: sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==} + engines: {node: '>=14.16'} + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /thenify-all/1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify/3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /thread-stream/2.3.0: + resolution: {integrity: sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==} + dependencies: + real-require: 0.2.0 + dev: true + + /through/2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /tmp/0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + dependencies: + rimraf: 3.0.2 + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tosource/1.0.0: + resolution: {integrity: sha512-N6g8eQ1eerw6Y1pBhdgkubWIiPFwXa2POSUrlL8jth5CyyEWNWzoGKRkO3CaO7Jx27hlJP54muB3btIAbx4MPg==} + engines: {node: '>=0.4.0'} + dev: true + + /tough-cookie/2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + dev: true + + /tunnel-agent/0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /tweetnacl/0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: true + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest/1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true + + /type-fest/2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: true + + /typedarray-to-buffer/3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typedarray/0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript/5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo/1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + dev: true + + /uhyphen/0.2.0: + resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} + dev: true + + /unique-string/3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + dependencies: + crypto-random-string: 4.0.0 + dev: true + + /universalify/0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify/1.0.0: + resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==} + engines: {node: '>= 10.0.0'} + dev: true + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /unplugin/1.4.0: + resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==} + dependencies: + acorn: 8.10.0 + chokidar: 3.5.3 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + dev: true + + /upath/2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + dev: true + + /update-notifier/6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} + dependencies: + boxen: 7.0.2 + chalk: 5.2.0 + configstore: 6.0.0 + has-yarn: 3.0.0 + import-lazy: 4.0.0 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + is-npm: 6.0.0 + is-yarn-global: 0.4.1 + latest-version: 7.0.0 + pupa: 3.1.0 + semver: 7.5.0 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 + dev: true + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /uuid/3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /uuid/8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: true + + /verror/1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: true + + /vite-plugin-web-extension/3.0.6_vite@4.3.3: + resolution: {integrity: sha512-FglKlPGzsoEajFTJygmcOHtZ8QuN6ElB1cpu9l4uwPjWO7JTvlDZo62hOEzWQPTlZ3rrskPSSTb1d6vqimSNCg==} + peerDependencies: + vite: ^4 + dependencies: + ajv: 8.12.0 + async-lock: 1.4.0 + fs-extra: 10.1.0 + json5: 2.2.3 + linkedom: 0.14.26 + lodash.uniq: 4.5.0 + lodash.uniqby: 4.7.0 + md5: 2.3.0 + vite: 4.3.3 + web-ext: 7.6.2 + webextension-polyfill: 0.10.0 + yaml: 2.2.2 + transitivePeerDependencies: + - body-parser + - bufferutil + - express + - safe-compare + - supports-color + - utf-8-validate + dev: true + + /vite/4.3.3: + resolution: {integrity: sha512-MwFlLBO4udZXd+VBcezo3u8mC77YQk+ik+fbc0GZWGgzfbPP+8Kf0fldhARqvSYmtIWoAJ5BXPClUbMTlqFxrA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.17.18 + postcss: 8.4.23 + rollup: 3.21.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vue-chartjs/5.2.0_chart.js@4.3.0+vue@3.2.47: + resolution: {integrity: sha512-d3zpKmGZr2OWHQ1xmxBcAn5ShTG917+/UCLaSpaCDDqT0U7DBsvFzTs69ZnHCgKoXT55GZDW8YEj9Av+dlONLA==} + peerDependencies: + chart.js: ^4.1.1 + vue: ^3.0.0-0 || ^2.7.0 + dependencies: + chart.js: 4.3.0 + vue: 3.2.47 + dev: false + + /vue-demi/0.14.5_vue@3.2.47: + resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.2.47 + dev: false + + /vue-i18n/9.2.2_vue@3.2.47: + resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==} + engines: {node: '>= 14'} + peerDependencies: + vue: ^3.0.0 + dependencies: + '@intlify/core-base': 9.2.2 + '@intlify/shared': 9.2.2 + '@intlify/vue-devtools': 9.2.2 + '@vue/devtools-api': 6.5.0 + vue: 3.2.47 + + /vue-template-compiler/2.7.14: + resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /vue-tsc/1.6.1_typescript@5.0.4: + resolution: {integrity: sha512-cKKKrv98MdU9kgd434fkjcIpU7a5bUflhklF9usf/GzebjmZpaht7tYGm/MNdBz7V9icySceCzCr3RiG02mOJg==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@volar/vue-language-core': 1.6.1 + '@volar/vue-typescript': 1.6.1_typescript@5.0.4 + semver: 7.5.0 + typescript: 5.0.4 + dev: true + + /vue/3.2.47: + resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-sfc': 3.2.47 + '@vue/runtime-dom': 3.2.47 + '@vue/server-renderer': 3.2.47_vue@3.2.47 + '@vue/shared': 3.2.47 + + /watchpack/2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /wcwidth/1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /web-ext/7.6.2: + resolution: {integrity: sha512-xlxbzgFBIS/UWWlvWxyR1PIqRRzDj1cutoHh+VZu4ZTcJTfv35KVdKkLRZv4PQwHu4dg8VfTg7WEcNP4QLaaFQ==} + engines: {node: '>=14.0.0', npm: '>=6.9.0'} + hasBin: true + dependencies: + '@babel/runtime': 7.21.0 + '@devicefarmer/adbkit': 3.2.3 + addons-linter: 5.32.0_node-fetch@3.3.1 + bunyan: 1.8.15 + camelcase: 7.0.1 + chrome-launcher: 0.15.1 + debounce: 1.2.1 + decamelize: 6.0.0 + es6-error: 4.1.1 + firefox-profile: 4.3.2 + fs-extra: 11.1.0 + fx-runner: 1.3.0 + import-fresh: 3.3.0 + jose: 4.13.1 + mkdirp: 1.0.4 + multimatch: 6.0.0 + mz: 2.7.0 + node-fetch: 3.3.1 + node-notifier: 10.0.1 + open: 8.4.2 + parse-json: 6.0.2 + promise-toolbox: 0.21.0 + sign-addon: 5.3.0 + source-map-support: 0.5.21 + strip-bom: 5.0.0 + strip-json-comments: 5.0.0 + tmp: 0.2.1 + update-notifier: 6.0.2 + watchpack: 2.4.0 + ws: 8.13.0 + yargs: 17.7.1 + zip-dir: 2.0.0 + transitivePeerDependencies: + - body-parser + - bufferutil + - express + - safe-compare + - supports-color + - utf-8-validate + dev: true + + /web-streams-polyfill/3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + dev: true + + /webextension-polyfill/0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + dev: true + + /webpack-sources/3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack-virtual-modules/0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + dev: true + + /when/3.7.7: + resolution: {integrity: sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==} + dev: true + + /which/1.2.4: + resolution: {integrity: sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA==} + hasBin: true + dependencies: + is-absolute: 0.1.7 + isexe: 1.1.2 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /widest-line/4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + dev: true + + /winreg/0.0.12: + resolution: {integrity: sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==} + dev: true + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi/8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.0.1 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic/3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /ws/8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xdg-basedir/5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + dev: true + + /xml2js/0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: true + + /xmlbuilder/11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: true + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml-eslint-parser/0.3.2: + resolution: {integrity: sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==} + dependencies: + eslint-visitor-keys: 1.3.0 + lodash: 4.17.21 + yaml: 1.10.2 + dev: true + + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yaml/2.2.2: + resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} + engines: {node: '>= 14'} + dev: true + + /yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs/17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yauzl/2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /zip-dir/2.0.0: + resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==} + dependencies: + async: 3.2.4 + jszip: 3.10.1 + dev: true diff --git a/src/icons/128x128.png b/public/128x128.png similarity index 100% rename from src/icons/128x128.png rename to public/128x128.png diff --git a/src/icons/16x16.png b/public/16x16.png similarity index 100% rename from src/icons/16x16.png rename to public/16x16.png diff --git a/src/icons/32x32.png b/public/32x32.png similarity index 100% rename from src/icons/32x32.png rename to public/32x32.png diff --git a/src/icons/48x48.png b/public/48x48.png similarity index 100% rename from src/icons/48x48.png rename to public/48x48.png diff --git a/scripts/zip.ps1 b/scripts/zip.ps1 new file mode 100644 index 0000000..3e258e5 --- /dev/null +++ b/scripts/zip.ps1 @@ -0,0 +1,7 @@ +$sourceFolder = ".\dist\*" +$targetFolder = ".\artifacts" +If (!(test-path -PathType container $targetFolder)) { + New-Item -ItemType Directory -Path $targetFolder +} +$version = $(node -pe "require('./src/manifest.json').version") +Compress-Archive -Path $sourceFolder -DestinationPath $targetFolder/web-activity-time-tracker-$version.zip \ No newline at end of file diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json new file mode 100644 index 0000000..fc89df6 --- /dev/null +++ b/src/_locales/de/messages.json @@ -0,0 +1,229 @@ +{ + "extName": { + "message": "Web Activity Time Tracker - Web Analytics" + }, + "extDescription": { + "message": "Verfolgen, beschränken und blockieren Sie die Zeit Ihrer Web-Aktivität. Achte darauf, wie viel Zeit Sie auf Seiten verbringen." + }, + "settings": { + "message": "Einstellungen" + }, + "today": { + "message": "Heute" + }, + "allTime": { + "message": "Die ganze Zeit " + }, + "byDays": { + "message": "Täglich" + }, + "noData": { + "message": "Keine Daten verfügbar" + }, + "noDataForPeriod": { + "message": "Keine Daten für den ausgewählten Zeitraum" + }, + "showAll": { + "message": "Alle Websites anzeigen" + }, + "sortBy": { + "message": "Nach sortieren" + }, + "usageTime": { + "message": "Verwendungszeit" + }, + "session": { + "message": "Die Session " + }, + "someSession": { + "message": "Die Sessionen" + }, + "sessions": { + "message": "Die Sessionen " + }, + "days": { + "message": "Tage" + }, + "aggregate": { + "message": "Aggregierte Daten seit" + }, + "websites": { + "message": "webseiten" + }, + "cannotOpenFile": { + "message": "Aus Sicherheitsgründen können Sie keine lokale Datei öffnen" + }, + "document": { + "message": "Das Dokument" + }, + "limit": { + "message": "Das Limit " + }, + "d": { + "message": "d" + }, + "h": { + "message": "h" + }, + "m": { + "message": "m" + }, + "s": { + "message": "s" + }, + "firstActiveDay": { + "message": "Der erste aktive Tag" + }, + "numberOfActiveDays": { + "message": "Gesamtzahl der aktiven Tage" + }, + "totalNumberOfDays": { + "message": "Alle Tage" + }, + "todayTime": { + "message": "Gesamtzeit heute" + }, + "averageTime": { + "message": "Durchschnittliche Zeit an aktiven Tagen" + }, + "mostActiveDay": { + "message": "Der aktivste Tag" + }, + "mostInactiveDay": { + "message": "Der inaktivste Tag" + }, + "todayInclude": { + "message": "Der heutige Tag ist in der Statistik enthalten. Klicken Sie auf, wenn Sie aus der Statistik ausschließen möchten." + }, + "todayEcclude": { + "message": "Der heutige Tag ist aus der Statistik ausgeschlossen. Klicken Sie auf, wenn Sie in die Statistik einbeziehen möchten." + }, + "averageTimeByDays": { + "message": "Durchschnittliche Zeit für ausgewählte Tage" + }, + "exportToCsv": { + "message": "In CSV exportieren" + }, + "week": { + "message": "Diese Woche" + }, + "month": { + "message": "In diesem Monat " + }, + "lastMonth": { + "message": "Im letzten Monat" + }, + "generalSettings": { + "message": "Grundlegende Einstellungen" + }, + "whiteListSettings": { + "message": "Weiße Liste" + }, + "limitsSettings": { + "message": "Die Beschränkungen" + }, + "notificationsSettings": { + "message": "Die Notifikationen" + }, + "aboutSettings": { + "message": "Über das Programm" + }, + "viewTimeInBadge": { + "message": "Zeitindikator anzeigen", + "description": "Sie können die aktuellen Informationen zur verbrauchten Zeit im Kurzformat auf dem Erweiterungssymbol anzeigen" + }, + "deferringDescription": { + "message": "Sie können die Sperre nur einmal während des Tages um 5 Minuten verschieben" + }, + "allowDeferringBlock": { + "message": "Verzögerung der Sperre um 5 Minuten zulassen", + "description": "Nachdem die Site gesperrt wurde, können Sie die Sperrung einmal täglich um 5 Minuten verschieben" + }, + "intervalInactivity": { + "message": "Stoppen Sie den Tracker, wenn es keine Aktionen während:", + "description": "Dies sind alle Aktionen mit der Maus oder der Tastatur" + }, + "exportToCsvSetting": { + "message": "Ihre Webaktivitätsdaten werden in das CSV-Format exportiert", + "description": "Sie können Ihre Webaktivität für jeden Datumsbereich exportieren" + }, + "sec": { + "message": "sekundenschnelle" + }, + "min": { + "message": "minute" + }, + "2min": { + "message": "minuten" + }, + "mins": { + "message": "minuten" + }, + "whiteList": { + "message": "Aktivität und Zeit für diese Websites werden nicht erfasst." + }, + "addWebsite": { + "message": "Website hinzufügen" + }, + "enterWebsite": { + "message": "Geben Sie Ihre Website ein..." + }, + "enterNotification": { + "message": "Geben Sie den Text für die Benachrichtigung ein..." + }, + "limits": { + "message": "Tägliche Zugriffsbeschränkungen für die Website", + "description": "Legen Sie die maximale Zeit fest, die pro Tag für den Besuch der Website zulässig ist. Nach dieser Zeit wird die Website gesperrt." + }, + "limitsTip": { + "message": "Wenn Sie die Blockierungszeit auf 0 Stunden 0 Minuten einstellen, wird die Site sofort blockiert" + }, + "save": { + "message": "Speichern" + }, + "showDailyNotifacation": { + "message": "Tägliche Zusammenfassungsbenachrichtigungen", + "description": "Am Ende jedes Tages erhalten Sie eine Benachrichtigung mit einer Zusammenfassung Ihrer täglichen Nutzung." + }, + "notificationTime": { + "message": "Benachrichtigungen für Websites", + "description": "Zeigen Sie jedes Mal Benachrichtigungen an, wenn Sie den angegebenen Zeitraum auf der Website verbringen" + }, + "notificationMessage": { + "message": "Benachrichtigungstext", + "description": "Dieser Text wird in der Benachrichtigung für Websites angezeigt" + }, + "notificationTimeSetting": { + "message": "Zeigt eine Benachrichtigung an, die eine Zusammenfassung Ihrer täglichen Nutzung enthält" + }, + "github": { + "message": "Wenn Sie eine Frage haben oder ein Problem melden möchten, können Sie dies tun" + }, + "question": { + "message": "Sie können auch Fragen stellen oder Ihre Vorschläge hier abgeben (hinterlassen)" + }, + "supportForm": { + "message": "unterstützungsformular" + }, + "doYouEnjoy": { + "message": "Gefällt Ihnen" + }, + "review": { + "message": "Schreiben Sie eine Bewertung" + }, + "block": { + "message": "Sie haben heute Ihr Nutzungslimit erreicht" + }, + "5mins": { + "message": "+ 5 minuten" + }, + "todayUsageTime": { + "message": "Bisherige Gesamtnutzungszeit " + }, + "comparedToYesterday": { + "message": " im Vergleich zu gestern " + }, + "mostVisited": { + "message": "Die meistbesuchte Website " + } +} diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json new file mode 100644 index 0000000..0043047 --- /dev/null +++ b/src/_locales/en/messages.json @@ -0,0 +1,229 @@ +{ + "extName": { + "message": "Web Activity Time Tracker - Web Analytics" + }, + "extDescription": { + "message": "Track and limit the time of your web activity and block access to the web resources. Monitor the time limits and review your web analytics." + }, + "settings": { + "message": "Settings" + }, + "today": { + "message": "Today" + }, + "allTime": { + "message": "Total time" + }, + "byDays": { + "message": "Daily" + }, + "noData": { + "message": "No data" + }, + "noDataForPeriod": { + "message": "No data for the selected period" + }, + "showAll": { + "message": "Show all the websites" + }, + "sortBy": { + "message": "Sorting by" + }, + "usageTime": { + "message": "Usage Time" + }, + "session": { + "message": "session" + }, + "someSession": { + "message": "sessions" + }, + "sessions": { + "message": "Sessions" + }, + "days": { + "message": "days" + }, + "aggregate": { + "message": "Aggregate data since" + }, + "websites": { + "message": "websites" + }, + "cannotOpenFile": { + "message": "You cannot open a local file due to security protocol" + }, + "document": { + "message": "Document" + }, + "limit": { + "message": "Limit" + }, + "d": { + "message": "d" + }, + "h": { + "message": "h" + }, + "m": { + "message": "m" + }, + "s": { + "message": "s" + }, + "firstActiveDay": { + "message": "The first active day" + }, + "numberOfActiveDays": { + "message": "Number of active days" + }, + "totalNumberOfDays": { + "message": "Total number of days" + }, + "todayTime": { + "message": "All the time today" + }, + "averageTime": { + "message": "Average time for active days" + }, + "mostActiveDay": { + "message": "The most active day" + }, + "mostInactiveDay": { + "message": "The most inactive day" + }, + "todayInclude": { + "message": "Today is included in the statistics. Click to exclude." + }, + "todayEcclude": { + "message": "Today is excluded from the statistics. Click to include." + }, + "averageTimeByDays": { + "message": "Average time on selected days" + }, + "exportToCsv": { + "message": "Export to CSV" + }, + "week": { + "message": "This week" + }, + "month": { + "message": "This month" + }, + "lastMonth": { + "message": "Last month" + }, + "generalSettings": { + "message": "General Settings" + }, + "whiteListSettings": { + "message": "WhiteList" + }, + "limitsSettings": { + "message": "Limits" + }, + "notificationsSettings": { + "message": "Notifications" + }, + "aboutSettings": { + "message": "About" + }, + "viewTimeInBadge": { + "message": "Display time tracker in icon", + "description": "You are able to see current 'spent time' information in short format on the extension icon" + }, + "deferringDescription": { + "message": "You can postpone the blocking for 5 minutes only once during the day" + }, + "allowDeferringBlock": { + "message": "Allow deferring block for 5 minutes", + "description": "After the site is blocked, you can postpone the blocking for 5 minutes once during the day" + }, + "intervalInactivity": { + "message": "Stop the tracker if there is no action during:", + "description": "These are any actions with the mouse or keyboard" + }, + "exportToCsvSetting": { + "message": "Exporting your web activity data to CSV", + "description": "You can export your web activity for any date range" + }, + "sec": { + "message": "seconds" + }, + "min": { + "message": "minute" + }, + "2min": { + "message": "minutes" + }, + "mins": { + "message": "minutes" + }, + "whiteList": { + "message": "Activity and spent time for these websites will not be tracked" + }, + "addWebsite": { + "message": "Add Website" + }, + "enterWebsite": { + "message": "Enter website name..." + }, + "enterNotification": { + "message": "Enter notification message..." + }, + "limits": { + "message": "Daily restrictions on access to websites", + "description": "Set the maximum time allowed to visit the site per day. After this time, the site will be blocked." + }, + "limitsTip": { + "message": "If you set the blocking time to 0 hours 0 minutes, the website will be blocked immediately" + }, + "save": { + "message": "Save" + }, + "showDailyNotifacation": { + "message": "Daily Summary Notifications", + "description": "At the end of each day, you will receive a notification with a summary of your daily usage" + }, + "notificationTime": { + "message": "Notifications for websites", + "description": "Show notifications every time you spend a selected period of time on the website" + }, + "notificationMessage": { + "message": "Notification message", + "description": "You will see this message in notification for websites every time" + }, + "notificationTimeSetting": { + "message": "Notification time with summary information about your daily usage" + }, + "github": { + "message": "If you have feedback or would like to report an issue, you can do so on the" + }, + "question": { + "message": "You can also ask questions or leave your suggestions here" + }, + "supportForm": { + "message": "support form" + }, + "doYouEnjoy": { + "message": "Do you enjoy using Web Activity Time Tracker?" + }, + "review": { + "message": "Leave a review!" + }, + "block": { + "message": "You've reached your limit today on " + }, + "5mins": { + "message": "+ 5 minutes" + }, + "todayUsageTime": { + "message": "Today's total usage time " + }, + "comparedToYesterday": { + "message": " compared to yesterday " + }, + "mostVisited": { + "message": "Most visited website " + } +} diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json new file mode 100644 index 0000000..0e763cd --- /dev/null +++ b/src/_locales/ru/messages.json @@ -0,0 +1,229 @@ +{ + "extName": { + "message": "Web Activity Time Tracker - \u0412\u0435\u0431 аналитика" + }, + "extDescription": { + "message": "Отслеживайте время вашей веб-активности и блокируйте доступ к веб-ресурсам. Следите за тем, сколько времени вы проводите на сайтах." + }, + "settings": { + "message": "Настройки" + }, + "today": { + "message": "Сегодня" + }, + "allTime": { + "message": "\u0417\u0430 все время" + }, + "byDays": { + "message": "По дням" + }, + "noData": { + "message": "Нет данных" + }, + "noDataForPeriod": { + "message": "Нет данных за выбранный период" + }, + "showAll": { + "message": "Показать все сайты" + }, + "sortBy": { + "message": "Сортировать по" + }, + "usageTime": { + "message": "Время использования" + }, + "session": { + "message": "сессия" + }, + "someSession": { + "message": "сессий" + }, + "sessions": { + "message": "Сессии" + }, + "days": { + "message": "дней" + }, + "aggregate": { + "message": "Данные \u0441 " + }, + "websites": { + "message": "сайтов" + }, + "cannotOpenFile": { + "message": "Вы не можете открыть локальный файл из-за правил безопасности" + }, + "document": { + "message": "Документ" + }, + "limit": { + "message": "Лимит" + }, + "d": { + "message": "д" + }, + "h": { + "message": "ч" + }, + "m": { + "message": "мин" + }, + "s": { + "message": "\u0441\u0435к" + }, + "firstActiveDay": { + "message": "Первый активный день" + }, + "numberOfActiveDays": { + "message": "\u0412\u0441\u0435\u0433\u043E активных дней" + }, + "totalNumberOfDays": { + "message": "\u0412\u0441\u0435\u0433\u043E дней" + }, + "todayTime": { + "message": "Общее время сегодня" + }, + "averageTime": { + "message": "Среднее время по активным дням" + }, + "mostActiveDay": { + "message": "Самый активный день" + }, + "mostInactiveDay": { + "message": "Самый неактивный день" + }, + "todayInclude": { + "message": "Сегодняшний день включен в статистику. Нажмите, если хотите исключить из статистики." + }, + "todayEcclude": { + "message": "Сегодняшний день исключен из статистику. Нажмите, если хотите включить в статистику." + }, + "averageTimeByDays": { + "message": "Среднее время по выбранным дням" + }, + "exportToCsv": { + "message": "Экспортировать в CSV" + }, + "week": { + "message": "Эта неделя" + }, + "month": { + "message": "Этот месяц" + }, + "lastMonth": { + "message": "Последний месяц" + }, + "generalSettings": { + "message": "Основные настройки" + }, + "whiteListSettings": { + "message": "Белый список" + }, + "limitsSettings": { + "message": "Лимиты" + }, + "notificationsSettings": { + "message": "Уведомления" + }, + "aboutSettings": { + "message": "\u041E программе" + }, + "viewTimeInBadge": { + "message": "Показывать индикатор времени", + "description": "Вы можете увидеть текущее затраченное время в сокращенном формате на значке расширения" + }, + "deferringDescription": { + "message": "Вы можете отложить блокировку на 5 минут только один раз в течение дня" + }, + "allowDeferringBlock": { + "message": "Разрешить отсрочку блокировки на 5 минут", + "description": "После того, как сайт будет заблокирован, вы можете один раз в течение дня отложить блокировку на 5 минут" + }, + "intervalInactivity": { + "message": "Остановить трекер, если нет никаких действий в течение:", + "description": "Это любые действия \u0441 помощью мыши или клавиатуры" + }, + "exportToCsvSetting": { + "message": "Экспорт данных вашей веб-активности в формат CSV", + "description": "Вы можете экспортировать свою веб-активность для любого диапазона дат" + }, + "sec": { + "message": "секунд" + }, + "min": { + "message": "минута" + }, + "2min": { + "message": "минуты" + }, + "mins": { + "message": "минут" + }, + "whiteList": { + "message": "Активность и время для этих сайтов отслеживаться не будут" + }, + "addWebsite": { + "message": "Добавить сайт" + }, + "enterWebsite": { + "message": "Введите сайт..." + }, + "enterNotification": { + "message": "Введите текст уведомления..." + }, + "limits": { + "message": "Ежедневные ограничения доступа к сайтам", + "description": "Установите максимальное время, разрешенное для посещения сайта в день. По истечении этого времени сайт будет заблокирован." + }, + "limitsTip": { + "message": "Если вы установите время блокировки равным 0 часам 0 минутам, сайт будет немедленно заблокирован" + }, + "save": { + "message": "Сохранить" + }, + "showDailyNotifacation": { + "message": "Ежедневные итоговые уведомления", + "description": "\u0412 конце каждого дня вы будете получать уведомление \u0441 краткой информацией \u043E вашем ежедневном использовании" + }, + "notificationTimeSetting": { + "message": "Время показа уведомления \u0441 краткой информацией \u043E вашем ежедневном использовании" + }, + "notificationTime": { + "message": "Уведомления для сайтов", + "description": "Показывать уведомления каждый раз, когда вы проводите указанный период времени на сайте" + }, + "notificationMessage": { + "message": "Текст уведомления", + "description": "Вы будете видеть это сообщение в уведомлении для сайтов" + }, + "github": { + "message": "Если \u0443 вас есть вопрос или вы хотели бы сообщить \u043E проблеме, вы можете сделать это на" + }, + "question": { + "message": "Также вы можете задать вопросы или оставить свои предложения здесь" + }, + "supportForm": { + "message": "поддержка" + }, + "doYouEnjoy": { + "message": "Вам нравится использовать Web Activity Time Tracker?" + }, + "review": { + "message": "Оставьте отзыв!" + }, + "block": { + "message": "Вы достигли лимита использования сегодня на " + }, + "5mins": { + "message": "+ 5 минут" + }, + "todayUsageTime": { + "message": "Общее время использования на сегодняшний день " + }, + "comparedToYesterday": { + "message": " по сравнению \u0441\u043e вчерашним днем " + }, + "mostVisited": { + "message": "Самый посещаемый сайт " + } +} diff --git a/src/assets/css/dashboard.css b/src/assets/css/dashboard.css new file mode 100644 index 0000000..32a2f14 --- /dev/null +++ b/src/assets/css/dashboard.css @@ -0,0 +1,318 @@ +body { + font-family: 'Segoe UI', Tahoma, sans-serif !important; + color: #262626; + background-color: #eee; + margin: 0; +} + +.container { + width: 850px; + margin: 10px auto; +} + +.title { + font-size: 18px; + font-weight: 650; +} + +.setting-header { + font-weight: 550; + font-size: 15px; +} + +.description { + font-size: 13px; + color: grey; + margin: 7px 0 15px 0; + font-weight: normal; +} + +.url-list { + border-radius: 3px; + border: 1px solid #ccc; + width: 515px; + min-height: 150px; + cursor: pointer; + list-style: none; + padding: 10px; + max-height: 300px; + overflow: auto; +} + +.url-list li { + line-height: 25px; + font-size: 14px; +} + +input[type='text'] { + height: 36px; + padding: 0 0 0 5px; + width: 400px; + border-radius: 3px; + border: 1px solid #ccc; +} + +input[type='button'].small-btn { + padding: 0 5px; + width: 120px; +} + +.option { + min-width: 170px; + color: #444; + background: #fff; + border-radius: 3px; + margin: 0; + padding: 10px 30px 10px 15px; + font-size: 14px; + border-color: #ccc; + position: relative; + cursor: pointer; +} + +.header { + grid-area: h; + margin: 0 0 10px; + font-size: 20px; +} + +a { + color: #3477db; + text-decoration: none; + cursor: pointer; +} + +label { + font-size: 14px; +} + +[type='checkbox']:not(:checked), +[type='checkbox']:checked { + position: absolute; + opacity: 0; + pointer-events: none; +} + +[type='checkbox'] + span { + position: relative; + padding-left: 30px; + cursor: pointer; + display: inline-block; + height: 25px; + line-height: 25px; + font-size: 14px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +[type='checkbox'] + span:before, +[type='checkbox']:not(.filled-in) + span:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 18px; + height: 18px; + z-index: 0; + border: 2px solid #5a5a5a; + border-radius: 1px; + margin-top: 3px; +} + +[type='checkbox']:not(:checked):disabled + span:before { + border: none; + background-color: rgba(0, 0, 0, 0.42); +} + +[type='checkbox']:checked:disabled + span:before { + border-right: 2px solid rgba(0, 0, 0, 0.42); + border-bottom: 2px solid rgba(0, 0, 0, 0.42); +} + +[type='checkbox'].filled-in + span:after { + border-radius: 2px; +} + +[type='checkbox'].filled-in + span:before, +[type='checkbox'].filled-in + span:after { + content: ''; + left: 0; + position: absolute; + z-index: 1; +} + +[type='checkbox'].filled-in:not(:checked) + span:before { + width: 0; + height: 0; + border: 3px solid transparent; + left: 6px; + top: 10px; + -webkit-transform: rotateZ(37deg); + transform: rotateZ(37deg); + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type='checkbox'].filled-in:not(:checked) + span:after { + height: 17px; + width: 17px; + background-color: transparent; + border: 2px solid #5a5a5a; + top: 0px; + z-index: 0; +} + +[type='checkbox'].filled-in:checked + span:before { + top: -3px; + left: -2px; + width: 7px; + height: 12px; + border-top: 3px solid transparent; + border-left: 3px solid transparent; + border-right: 3px solid #fff; + border-bottom: 3px solid #fff; + -webkit-transform: rotateZ(35deg); + transform: rotateZ(35deg); + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type='checkbox'].filled-in:checked + span:after { + top: 0; + width: 17px; + height: 17px; + border: 2px solid #3477db; + background-color: #3477db; + z-index: 0; +} + +.hidden { + display: none !important; +} + +.notify { + width: 220px; + height: 27px; + margin: auto; + background-color: rgb(21, 104, 0); + color: rgb(255, 255, 255); + text-align: center; + font-weight: 600; + border-radius: 5px; + position: fixed; + z-index: 1; + top: 10px; + right: 20px; + font-size: 15px; + white-space: nowrap; + padding: 10px; +} + +.block { + display: block; +} + +.readonly-input { + cursor: default; + border: 0; + display: block; +} + +.setting-notify-block { + width: 450px; + height: 100px; + margin-top: 15px; + background-color: rgb(175, 175, 175); + border-radius: 10px; +} + +.setting-notify-block .setting-notify-title { + padding: 15px 20px 5px 0; + font-weight: 700; + color: #ffffff; + font-size: 15px; + text-align: left; + display: block; +} + +.setting-notify-block .setting-notify-message { + padding: 3px 20px 5px 0; + font-size: 14px; + display: block; + width: 320px; +} +.setting-notify-block .setting-notify-message-g { + padding: 0 30px 5px 0; + color: rgb(199, 199, 199); + font-size: 11px; + display: block; +} + +.setting-notify-block .setting-notify-img { + height: 50px; + padding: 25px 15px 25px 25px; +} + +.setting-notify-block .setting-notify-message-block { + display: inline-block; + position: absolute; +} + +.settings-tabs { +} +.settings-tab { + clear: both; + width: 286px; +} +.settings-tab label[name='tabName'] { + background: #eee; + padding: 5px 0 5px 35px; + font-size: 16px; + vertical-align: middle; + width: 250px; + height: 40px; + display: table-cell; + cursor: pointer; +} +.settings-tab [type='radio'] { + display: none; +} +.settings-content { + position: absolute; + top: 0; + left: 286px; + background: white; + right: 0; + bottom: 0; + padding: 50px; + border-left: 1px solid #ccc; +} +.settings-content span { + animation: 0.5s ease-out 0s 1 slideInFromTop; +} +[type='radio']:checked ~ label { + background: white; + border-bottom: 2px solid #8bc34a; + z-index: 2; +} +[type='radio']:checked ~ label ~ .settings-content { + z-index: 1; +} +.settings-item { + margin-bottom: 30px; +} +.url-list img { + vertical-align: middle; + margin-right: 10px; + cursor: pointer; +} +.url-list { + width: 655px !important; +} + +.url-list .time-value { + margin-top: 5px; + margin-left: 30px; +} diff --git a/src/assets/css/general.css b/src/assets/css/general.css new file mode 100644 index 0000000..3da15dd --- /dev/null +++ b/src/assets/css/general.css @@ -0,0 +1,73 @@ +.float-right { + float: right; +} +.d-inline-block { + display: inline-block; +} +.mt-0 { + margin-top: 0; +} +.mt-20 { + margin-top: 20px; +} +.ml-10 { + margin-left: 10px; +} +.mr-10 { + margin-right: 10px; +} +.mr-5 { + margin-right: 5px; +} +.pr-5 { + padding-right: 5px; +} +.p-5 { + padding: 5px; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} + +.mt-15 { + margin-top: 15px; +} +select { + border-color: #ccc; + border-radius: 5px; +} +.w-100 { + width: 100%; +} +.w-80 { + width: 80%; +} +input[type='button'] { + background: #428bff; + color: #fff; + border-radius: 3px; + height: 36px; + line-height: 35px; + padding: 0 20px; + border: 0; + font-size: 14px; + font-weight: 500; + cursor: pointer; + min-width: 80px; + text-align: center; + width: 200px; +} + +input[type='button']:hover { + background: #5c9dfe; + text-decoration: none; +} + +input[type='button'][disabled] { + border: 1px solid #999999; + background-color: #cccccc; + color: #666666; +} diff --git a/src/assets/css/main.css b/src/assets/css/main.css new file mode 100644 index 0000000..e804281 --- /dev/null +++ b/src/assets/css/main.css @@ -0,0 +1,233 @@ +:root { + --main-color: #6ebf5d; + --popup-header: #efefef; + --progress-bar: #428bff; +} +::-webkit-scrollbar-track { + border-radius: 10px; + background-color: #f5f5f5; +} + +::-webkit-scrollbar { + width: 7px; + background-color: #f5f5f5; +} + +::-webkit-scrollbar-thumb { + border-radius: 10px; + background-color: #7c7c7c; +} +html, +body { + width: 600px; + height: 590px; + padding: 0; + margin: 0; +} +.no-data { + text-align: center; + font-size: 16px; + font-weight: 600; + margin-top: 30%; +} +.tabs { +} +.tabs input[name='tab-control'] { + display: none; +} +.tabs .content section h2, +.tabs ul li label { + font-size: 15px; + color: #428bff; +} +.tabs ul { + list-style-type: none; + padding-left: 0; + display: flex; + flex-direction: row; + margin-bottom: 10px; + justify-content: space-between; + align-items: flex-end; + flex-wrap: wrap; +} +.tabs ul li { + box-sizing: border-box; + flex: 1; + width: 25%; + padding: 0 10px; + text-align: center; +} +.tabs ul li label { + transition: all 0.3s ease-in-out; + color: #929daf; + padding: 5px auto; + overflow: hidden; + display: block; + cursor: pointer; + transition: all 0.2s ease-in-out; + white-space: nowrap; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tabs ul li label br { + display: none; +} +.tabs ul li label img { + filter: brightness(0) saturate(100%) invert(67%) sepia(15%) saturate(342%) hue-rotate(178deg) + brightness(91%) contrast(89%); + vertical-align: bottom; + margin-right: 0.2em; + transition: all 0.2s ease-in-out; +} +.tabs ul li label:hover, +.tabs ul li label:focus, +.tabs ul li label:active { + outline: 0; + color: #bec5cf; +} +.tabs ul li label:hover img, +.tabs ul li label:focus img, +.tabs ul li label:active img { + filter: #bec5cf; +} +.tabs .slider { + position: relative; + width: 25%; + transition: all 0.33s cubic-bezier(0.38, 0.8, 0.32, 1.07); +} +.tabs .slider .indicator { + position: relative; + width: 50px; + max-width: 100%; + margin: 0 auto; + height: 4px; + background: #428bff; + border-radius: 1px; +} +.tabs .content { + margin-top: 10px; +} +.tabs .content section { + display: none; + -webkit-animation-name: content; + animation-name: content; + -webkit-animation-direction: normal; + animation-direction: normal; + -webkit-animation-duration: 0.3s; + animation-duration: 0.3s; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + -webkit-animation-iteration-count: 1; + animation-iteration-count: 1; + line-height: 1.4; +} +.tabs .content section h2 { + color: #428bff; + display: none; +} +.tabs .content section h2::after { + content: ''; + position: relative; + display: block; + width: 30px; + height: 3px; + background: #428bff; + margin-top: 5px; + left: 1px; +} +.tabs input[name='tab-control']:nth-of-type(1):checked ~ ul > li:nth-child(1) > label { + cursor: default; + color: #428bff; +} +.tabs input[name='tab-control']:nth-of-type(1):checked ~ ul > li:nth-child(1) > label img { + filter: brightness(0) saturate(100%) invert(59%) sepia(82%) saturate(4677%) hue-rotate(202deg) + brightness(103%) contrast(101%); +} +.tabs input[name='tab-control']:nth-of-type(1):checked ~ .slider { + transform: translateX(17%); +} +.tabs input[name='tab-control']:nth-of-type(1):checked ~ .content > section:nth-child(1) { + display: block; +} +.tabs input[name='tab-control']:nth-of-type(2):checked ~ ul > li:nth-child(2) > label { + cursor: default; + color: #428bff; +} +.tabs input[name='tab-control']:nth-of-type(2):checked ~ ul > li:nth-child(2) > label img { + filter: brightness(0) saturate(100%) invert(59%) sepia(82%) saturate(4677%) hue-rotate(202deg) + brightness(103%) contrast(101%); +} +.tabs input[name='tab-control']:nth-of-type(2):checked ~ .slider { + transform: translateX(150%); +} +.tabs input[name='tab-control']:nth-of-type(2):checked ~ .content > section:nth-child(2) { + display: block; +} +.tabs input[name='tab-control']:nth-of-type(3):checked ~ ul > li:nth-child(3) > label { + cursor: default; + color: #428bff; +} +.tabs input[name='tab-control']:nth-of-type(3):checked ~ ul > li:nth-child(3) > label img { + filter: brightness(0) saturate(100%) invert(59%) sepia(82%) saturate(4677%) hue-rotate(202deg) + brightness(103%) contrast(101%); +} +.tabs input[name='tab-control']:nth-of-type(3):checked ~ .slider { + transform: translateX(290%); +} +.tabs input[name='tab-control']:nth-of-type(3):checked ~ .content > section:nth-child(3) { + display: block; +} +@-webkit-keyframes content { + from { + opacity: 0; + transform: translateY(5%); + } + to { + opacity: 1; + transform: translateY(0%); + } +} +@keyframes content { + from { + opacity: 0; + transform: translateY(5%); + } + to { + opacity: 1; + transform: translateY(0%); + } +} +.tabs ul li label { + white-space: initial; +} +.tabs ul li label img { + height: 1.2em; +} +.tooltip { + position: relative; + display: inline-block; + vertical-align: middle; +} +.tooltip .tooltiptext { + font-size: 11px; + font-weight: 500; + visibility: hidden; + width: 180px; + background-color: #555; + color: #fff; + text-align: center; + padding: 10px 10px; + border-radius: 6px; + position: absolute; + z-index: 1; + transform: translate(-55%) translateY(-125%); + opacity: 0; + transition: opacity 0.3s; +} +.tooltip:hover .tooltiptext { + visibility: visible; + opacity: 1; +} diff --git a/src/assets/icons/128x128.png b/src/assets/icons/128x128.png new file mode 100644 index 0000000..8915f31 Binary files /dev/null and b/src/assets/icons/128x128.png differ diff --git a/src/assets/icons/16x16.png b/src/assets/icons/16x16.png new file mode 100644 index 0000000..4916da6 Binary files /dev/null and b/src/assets/icons/16x16.png differ diff --git a/src/assets/icons/32x32.png b/src/assets/icons/32x32.png new file mode 100644 index 0000000..f6812bb Binary files /dev/null and b/src/assets/icons/32x32.png differ diff --git a/src/assets/icons/48x48.png b/src/assets/icons/48x48.png new file mode 100644 index 0000000..336d1ef Binary files /dev/null and b/src/assets/icons/48x48.png differ diff --git a/src/assets/icons/dark-mode.svg b/src/assets/icons/dark-mode.svg new file mode 100644 index 0000000..767b50e --- /dev/null +++ b/src/assets/icons/dark-mode.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/assets/icons/delete.png b/src/assets/icons/delete.png new file mode 100644 index 0000000..1899aff Binary files /dev/null and b/src/assets/icons/delete.png differ diff --git a/src/assets/icons/edit.svg b/src/assets/icons/edit.svg new file mode 100644 index 0000000..c06b44d --- /dev/null +++ b/src/assets/icons/edit.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/icons/empty.png b/src/assets/icons/empty.png similarity index 100% rename from src/icons/empty.png rename to src/assets/icons/empty.png diff --git a/src/assets/icons/no-today.svg b/src/assets/icons/no-today.svg new file mode 100644 index 0000000..9933b25 --- /dev/null +++ b/src/assets/icons/no-today.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/preloader.gif b/src/assets/icons/preloader.gif new file mode 100644 index 0000000..32ac2b4 Binary files /dev/null and b/src/assets/icons/preloader.gif differ diff --git a/src/assets/icons/settings.svg b/src/assets/icons/settings.svg new file mode 100644 index 0000000..9b86d3e --- /dev/null +++ b/src/assets/icons/settings.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/icons/success.png b/src/assets/icons/success.png similarity index 100% rename from src/icons/success.png rename to src/assets/icons/success.png diff --git a/src/icons/today.svg b/src/assets/icons/today.svg similarity index 100% rename from src/icons/today.svg rename to src/assets/icons/today.svg diff --git a/src/background.ts b/src/background.ts new file mode 100644 index 0000000..fa23a17 --- /dev/null +++ b/src/background.ts @@ -0,0 +1,37 @@ +import Browser from 'webextension-polyfill'; +import { initTracker } from './tracker'; +import { logger } from './compositions/logger'; +import { scheduleJobs } from './jobs/sheduler'; +import { Settings } from './compositions/settings'; +import { StorageParams } from './storage/storage-params'; + +logger.log('Start background script'); + +self.onerror = err => { + console.error('Unhandled error:', err); +}; + +Browser.runtime.onInstalled.addListener(details => { + logger.log('Extension installed:', details); +}); + +Browser.storage.onChanged.addListener((changes, namespace) => { + for (var key in changes) { + if (Object.values(StorageParams).includes(key as StorageParams)) + Settings.getInstance().reloadSetting(key as StorageParams); + } +}); + +Browser.runtime.onInstalled.addListener(details => { + if ( + details.reason == 'update' && + details.previousVersion != undefined && + details.previousVersion < '2.0.0' + ) { + } +}); + +Browser.runtime.setUninstallURL('https://webtracker.online/goodbye.html'); + +scheduleJobs(); +initTracker(); diff --git a/src/block.html b/src/block.html index e4c2d86..f0075ee 100644 --- a/src/block.html +++ b/src/block.html @@ -1,29 +1,16 @@ - - + + + + + + + Access to the site is limited - Web Activity Time Tracker + - - - Access to the site is limited - - - - - + + + - -
- -

Time limit

-
You've reached your limit today on
-
Your current daily limit is
- -
You have already been here - times for a total duration of - today ! -
-
Set aside for 5 minutes
-
-

Web Activity Time Tracker

- - - \ No newline at end of file + + + diff --git a/src/block.ts b/src/block.ts new file mode 100644 index 0000000..fd1c16d --- /dev/null +++ b/src/block.ts @@ -0,0 +1,7 @@ +import Block from './pages/Block.vue'; +import { createApp } from 'vue'; +import i18n from './plugins/i18n'; + +const app = createApp(Block); +app.use(i18n); +app.mount('body'); diff --git a/src/components/About.vue b/src/components/About.vue new file mode 100644 index 0000000..367d0e7 --- /dev/null +++ b/src/components/About.vue @@ -0,0 +1,51 @@ + + + + + + + diff --git a/src/components/BadgeIcons.vue b/src/components/BadgeIcons.vue new file mode 100644 index 0000000..d9ab734 --- /dev/null +++ b/src/components/BadgeIcons.vue @@ -0,0 +1,54 @@ + + + + + + + diff --git a/src/components/ByDays.vue b/src/components/ByDays.vue new file mode 100644 index 0000000..0c0071d --- /dev/null +++ b/src/components/ByDays.vue @@ -0,0 +1,173 @@ + + + + + + + diff --git a/src/components/ByDaysChart.vue b/src/components/ByDaysChart.vue new file mode 100644 index 0000000..71fcaf6 --- /dev/null +++ b/src/components/ByDaysChart.vue @@ -0,0 +1,104 @@ + + + + + + + diff --git a/src/components/DonutChart.vue b/src/components/DonutChart.vue new file mode 100644 index 0000000..60329f5 --- /dev/null +++ b/src/components/DonutChart.vue @@ -0,0 +1,78 @@ + + + + + + + diff --git a/src/components/Expander.vue b/src/components/Expander.vue new file mode 100644 index 0000000..b66e900 --- /dev/null +++ b/src/components/Expander.vue @@ -0,0 +1,108 @@ + + + + + + + diff --git a/src/components/Favicon.vue b/src/components/Favicon.vue new file mode 100644 index 0000000..38132ce --- /dev/null +++ b/src/components/Favicon.vue @@ -0,0 +1,35 @@ + + + + + + + diff --git a/src/components/GeneralSettings.vue b/src/components/GeneralSettings.vue new file mode 100644 index 0000000..12ee14a --- /dev/null +++ b/src/components/GeneralSettings.vue @@ -0,0 +1,184 @@ + + + + + + + diff --git a/src/components/Limits.vue b/src/components/Limits.vue new file mode 100644 index 0000000..5a9999e --- /dev/null +++ b/src/components/Limits.vue @@ -0,0 +1,34 @@ + + + + + + + diff --git a/src/components/ListWithTime.vue b/src/components/ListWithTime.vue new file mode 100644 index 0000000..a9f19d9 --- /dev/null +++ b/src/components/ListWithTime.vue @@ -0,0 +1,171 @@ + + + + + + + diff --git a/src/components/Notifications.vue b/src/components/Notifications.vue new file mode 100644 index 0000000..442300b --- /dev/null +++ b/src/components/Notifications.vue @@ -0,0 +1,141 @@ + + + + + + + diff --git a/src/components/OverallStatistics.vue b/src/components/OverallStatistics.vue new file mode 100644 index 0000000..e968f2b --- /dev/null +++ b/src/components/OverallStatistics.vue @@ -0,0 +1,192 @@ + + + + + + + diff --git a/src/components/TabItem.vue b/src/components/TabItem.vue new file mode 100644 index 0000000..3504f81 --- /dev/null +++ b/src/components/TabItem.vue @@ -0,0 +1,144 @@ + + + + + + + diff --git a/src/components/TabItemHeader.vue b/src/components/TabItemHeader.vue new file mode 100644 index 0000000..92da4fb --- /dev/null +++ b/src/components/TabItemHeader.vue @@ -0,0 +1,92 @@ + + + + + + + diff --git a/src/components/TabList.vue b/src/components/TabList.vue new file mode 100644 index 0000000..26b7981 --- /dev/null +++ b/src/components/TabList.vue @@ -0,0 +1,162 @@ + + + + + + + diff --git a/src/components/WhiteList.vue b/src/components/WhiteList.vue new file mode 100644 index 0000000..82791b3 --- /dev/null +++ b/src/components/WhiteList.vue @@ -0,0 +1,95 @@ + + + + + + + diff --git a/src/compositions/active-tab.ts b/src/compositions/active-tab.ts new file mode 100644 index 0000000..0196613 --- /dev/null +++ b/src/compositions/active-tab.ts @@ -0,0 +1,33 @@ +import { extractHostname } from './extract-hostname'; + +export class ActiveTab { + private static instance: ActiveTab; + private _activeTabUrl: string | null; + private _activeTabDomain: string | null; + + constructor() { + if (ActiveTab.instance) { + throw new Error('Error - use ActiveTab.getInstance()'); + } + this._activeTabUrl = null; + this._activeTabDomain = null; + } + + static getInstance(): ActiveTab { + ActiveTab.instance = ActiveTab.instance || new ActiveTab(); + return ActiveTab.instance; + } + + public setActiveTab(value: string | null): void { + this._activeTabUrl = value; + this._activeTabDomain = value != null ? extractHostname(value) : null; + } + + public getActiveTabUrl(): string | null { + return this._activeTabUrl; + } + + public getActiveTabDomain(): string | null { + return this._activeTabDomain; + } +} diff --git a/src/compositions/all-tab-list-summary.ts b/src/compositions/all-tab-list-summary.ts new file mode 100644 index 0000000..aee301b --- /dev/null +++ b/src/compositions/all-tab-list-summary.ts @@ -0,0 +1,146 @@ +import { ActiveDay, OverallStats } from '../dto/tabListSummary'; +import { Tab, TabDay } from '../entity/tab'; +import { injectTabsRepository } from '../repository/inject-tabs-repository'; +import { SortingBy } from '../utils/enums'; +import { daysBetween } from '../utils/time'; +import { todayLocalDate } from '../utils/date'; + +export async function useAllTabListSummary(sortingBy: SortingBy): Promise { + const repo = await injectTabsRepository(); + const unSortedTabs = repo.getTabs(); + let tabs: Tab[] = []; + + if (unSortedTabs.length == 0) return null; + const todayTabs = unSortedTabs?.filter(x => x.days.find(s => s.date === todayLocalDate())); + + const summaryTimeListForToday = todayTabs.map(function (tab) { + return tab.days.find(day => day.date === todayLocalDate())!.summary; + }); + + const todaySummaryTime = + summaryTimeListForToday != undefined && summaryTimeListForToday.length > 0 + ? summaryTimeListForToday.reduce(function (a, b) { + return a + b; + }) + : 0; + + tabs = unSortedTabs.sort(function (a: Tab, b: Tab) { + return b.summaryTime - a.summaryTime; + }); + + let days: TabDay[] = []; + tabs.map(function (tab) { + return tab.days.forEach(function (day) { + const existDay = days.find(x => x.date == day.date); + if (!existDay) days.push(day); + else { + existDay.summary += day.summary; + existDay.counter += day.counter; + } + }); + }); + + days = days.sort(function (a, b) { + return new Date(a.date).valueOf() - new Date(b.date).valueOf(); + }); + + const mostDayExceptToday = fillMostListWithoutToday(days); + + const firstDay = new Date(days[0].date); + const activeDaysTotal = days.length; + + if (sortingBy == SortingBy.Sessions) + tabs = unSortedTabs.sort(function (a: Tab, b: Tab) { + return b.counter - a.counter; + }); + + const summaryTimeList = tabs?.map(function (tab) { + return tab.summaryTime; + }); + const siteList = tabs?.map(function (tab) { + return tab.url; + }); + const timeForChart = summaryTimeList?.slice(0, 10); + const sitesForChart = siteList?.slice(0, 10); + + const summaryTime = + summaryTimeList != undefined && summaryTimeList.length > 0 + ? summaryTimeList.reduce(function (a, b) { + return a + b; + }) + : 0; + + const averageTimeByActiveDays = Math.round(summaryTime / activeDaysTotal); + const daysTotal = daysBetween(firstDay, new Date(days[days.length - 1].date)); + + const mostDay = fillMostList(days); + + return { + firstDay: firstDay, + daysTotal: daysTotal, + activeDaysTotal: activeDaysTotal, + todaySummaryTime: todaySummaryTime, + averageTimeByActiveDays: averageTimeByActiveDays, + mostActiveDay: mostDay.mostActiveDayObj, + mostInactiveDay: mostDay.mostInactiveDayObj, + mostActiveDayExceptToday: + mostDayExceptToday != null ? mostDayExceptToday.mostActiveDayObjExceptToday : null, + mostInactiveDayExceptToday: + mostDayExceptToday != null ? mostDayExceptToday.mostInactiveDayObjExceptToday : null, + tabs: tabs, + summaryTime: summaryTime, + chart: { + timeForChart, + sitesForChart, + }, + }; +} + +function fillMostDay(mostDat: TabDay): ActiveDay { + return { + date: new Date(mostDat.date), + summaryTime: mostDat.summary, + }; +} + +function fillMostListWithoutToday(days: TabDay[]) { + const daysWithoutToday = days + .filter(x => x.date != todayLocalDate()) + .sort(function (a, b) { + return new Date(a.date).valueOf() - new Date(b.date).valueOf(); + }); + + const sortedByTimeDaysWithoutToday = daysWithoutToday.sort(function (a, b) { + return a.summary - b.summary; + }); + + if (sortedByTimeDaysWithoutToday.length == 0) return null; + const mostActiveDayExceptToday = + sortedByTimeDaysWithoutToday[sortedByTimeDaysWithoutToday.length - 1]; + const mostActiveDayObjExceptToday = fillMostDay(mostActiveDayExceptToday); + + const mostInactiveDayExceptToday = sortedByTimeDaysWithoutToday[0]; + const mostInactiveDayObjExceptToday = fillMostDay(mostInactiveDayExceptToday); + + return { + mostActiveDayObjExceptToday, + mostInactiveDayObjExceptToday, + }; +} + +function fillMostList(days: TabDay[]) { + const sortedByTimeDays = days.sort(function (a, b) { + return a.summary - b.summary; + }); + + const mostActiveDay = sortedByTimeDays[sortedByTimeDays.length - 1]; + const mostActiveDayObj = fillMostDay(mostActiveDay); + + const mostInactiveDay = sortedByTimeDays[0]; + const mostInactiveDayObj = fillMostDay(mostInactiveDay); + + return { + mostActiveDayObj, + mostInactiveDayObj, + }; +} diff --git a/src/compositions/black-list.ts b/src/compositions/black-list.ts new file mode 100644 index 0000000..53fb2cb --- /dev/null +++ b/src/compositions/black-list.ts @@ -0,0 +1,10 @@ +import { StorageParams } from '../storage/storage-params'; +import { isDomainEquals } from '../utils/common'; +import { extractHostname } from './extract-hostname'; +import { Settings } from './settings'; + +export async function isInBlackList(url: string): Promise { + const blackList = (await Settings.getInstance().getSetting(StorageParams.BLACK_LIST)) as string[]; + const array = Object.values(blackList); + return array?.find(x => isDomainEquals(extractHostname(x), extractHostname(url))) !== undefined; +} diff --git a/src/compositions/block-page.ts b/src/compositions/block-page.ts new file mode 100644 index 0000000..d1ef10a --- /dev/null +++ b/src/compositions/block-page.ts @@ -0,0 +1,21 @@ +import Browser from 'webextension-polyfill'; +import { buildBlockQuery } from '../utils/block-page'; +import { NO_FAVICON_URL } from '../utils/consts'; + +export async function useBlockPage( + domain: string, + url: string, + liimitTime: number, + summaryCounter: number, + favIconUrl: string | undefined, +): Promise { + const favicon = + favIconUrl == undefined || favIconUrl == '' || favIconUrl.startsWith('chrome://favicon/') + ? NO_FAVICON_URL + : favIconUrl; + const blockUrl = + Browser.runtime.getURL('src/block.html') + + buildBlockQuery(domain, url, liimitTime, summaryCounter, favicon); + const tab = await Browser.tabs.query({ currentWindow: true, active: true }); + Browser.tabs.update(tab[0].id, { url: blockUrl }); +} diff --git a/src/compositions/current-tab.ts b/src/compositions/current-tab.ts new file mode 100644 index 0000000..079be59 --- /dev/null +++ b/src/compositions/current-tab.ts @@ -0,0 +1,8 @@ +import Browser from 'webextension-polyfill'; + +export async function getCurrentTab() { + const tabs = await Browser.tabs.query({ active: true, currentWindow: true }); + // since only one tab should be active and in the current window at once + // the return variable should only have one entry + return tabs[0]; +} diff --git a/src/compositions/daily-intervals.ts b/src/compositions/daily-intervals.ts new file mode 100644 index 0000000..7cf73ae --- /dev/null +++ b/src/compositions/daily-intervals.ts @@ -0,0 +1,41 @@ +import { TimeInterval } from '../entity/time-interval'; +import { injecStorage } from '../storage/inject-storage'; +import { StorageDeserializeParam } from '../storage/storage-params'; +import { todayLocalDate } from '../utils/date'; + +export async function closeInterval(domain: string | null): Promise { + if (domain == null) return; + const storage = injecStorage(); + const timeIntervalList = (await storage.getDeserializeList( + StorageDeserializeParam.TIMEINTERVAL_LIST, + )) as TimeInterval[]; + const item = timeIntervalList?.find(x => x.domain === domain && x.day == todayLocalDate()); + item?.closeInterval(); + await storage.saveIntervalList(timeIntervalList); +} + +export async function addInterval(domain: string | null): Promise { + if (domain == null) return; + + const storage = injecStorage(); + let timeIntervalList = (await storage.getDeserializeList( + StorageDeserializeParam.TIMEINTERVAL_LIST, + )) as TimeInterval[]; + if (timeIntervalList == undefined) timeIntervalList = []; + const item = timeIntervalList?.find(x => x.domain === domain && x.day == todayLocalDate()); + if (item != undefined) { + if (item.day == todayLocalDate()) item.addInterval(); + else { + const newInterval = new TimeInterval(); + newInterval.init(todayLocalDate(), domain); + newInterval.addInterval(); + timeIntervalList.push(newInterval); + } + } else { + const newInterval = new TimeInterval(); + newInterval.init(todayLocalDate(), domain); + newInterval.addInterval(); + timeIntervalList.push(newInterval); + } + await storage.saveIntervalList(timeIntervalList); +} diff --git a/src/compositions/deferList.ts b/src/compositions/deferList.ts new file mode 100644 index 0000000..a6ca436 --- /dev/null +++ b/src/compositions/deferList.ts @@ -0,0 +1,56 @@ +import { differenceInHours } from 'date-fns'; +import { StorageParams } from '../storage/storage-params'; +import { isDomainEquals } from '../utils/common'; +import { Settings } from './settings'; +import { Deffering } from '../entity/deffering'; +import { injecStorage } from '../storage/inject-storage'; +import { MINUTE } from '../utils/time'; +import { log } from './logger'; + +export async function isInDeferList(url: string): Promise { + const deferList = (await Settings.getInstance().getSetting( + StorageParams.BLOCK_DEFERRAL_TIME, + )) as Deffering[]; + const array = Object.values(deferList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + if (item != undefined) + log( + `Deferring time ${url} ${new Date(item.time)} diff ${differenceInHours( + new Date(item.time), + new Date(), + )}`, + ); + return item != undefined && item.time > Date.now(); +} + +export async function canDefering(url: string): Promise { + const deferList = (await Settings.getInstance().getSetting( + StorageParams.BLOCK_DEFERRAL_TIME, + )) as Deffering[]; + const array = Object.values(deferList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + if (item != undefined) + log( + `Deferring time ${url} ${new Date(item.time)} diff ${differenceInHours( + new Date(item.time), + new Date(), + )}`, + ); + if (item == undefined) return true; + + return item != undefined && differenceInHours(new Date(item.time), new Date()) > 24; +} + +export async function defering(url: string, timeInMinutes: number): Promise { + const settingsStorage = injecStorage(); + + const deferList = (await Settings.getInstance().getSetting( + StorageParams.BLOCK_DEFERRAL_TIME, + )) as Deffering[]; + const array = Object.values(deferList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + if (item != undefined) item.time = Date.now() + timeInMinutes * MINUTE; + else array.push(new Deffering(url, 5)); + + await settingsStorage.saveValue(StorageParams.BLOCK_DEFERRAL_TIME, array); +} diff --git a/src/compositions/extract-hostname.ts b/src/compositions/extract-hostname.ts new file mode 100644 index 0000000..b0f70f1 --- /dev/null +++ b/src/compositions/extract-hostname.ts @@ -0,0 +1,19 @@ +export function extractHostname(url: string | undefined): string { + let hostname; + if (url == undefined) return ''; + + if (url.startsWith('file:')) { + return url; + } + + if (url.indexOf('//') > -1) { + hostname = url.split('/')[2]; + } else { + hostname = url.split('/')[0]; + } + + hostname = hostname.split(':')[0]; + hostname = hostname.split('?')[0]; + + return hostname; +} diff --git a/src/compositions/limit-list.ts b/src/compositions/limit-list.ts new file mode 100644 index 0000000..dcced8c --- /dev/null +++ b/src/compositions/limit-list.ts @@ -0,0 +1,55 @@ +import { Restriction } from '../entity/restriction'; +import { Tab } from '../entity/tab'; +import { StorageParams } from '../storage/storage-params'; +import { isDomainEquals } from '../utils/common'; +import { todayLocalDate } from '../utils/date'; +import { isInDeferList } from './deferList'; +import { log } from './logger'; +import { Settings } from './settings'; + +export type LimitExceed = { + IsLimitExceeded: boolean; + LimitTime: number | null; +}; + +export async function isLimitExceeded(url: string, tab: Tab): Promise { + const limitList = (await Settings.getInstance().getSetting( + StorageParams.RESTRICTION_LIST, + )) as Restriction[]; + const array = Object.values(limitList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + if (item != undefined) { + const date = tab.days.find(x => x.date == todayLocalDate()); + if (date != undefined) { + if (date.summary >= item.time) { + log(`Limit Exceeded: website ${url} limit ${item.time} summary time ${date.summary}`); + if (await isInDeferList(url)) { + log(`Page ${url} is in deffering list`); + return { + IsLimitExceeded: false, + LimitTime: null, + }; + } + + return { + IsLimitExceeded: true, + LimitTime: item.time, + }; + } + } + } + + return { + IsLimitExceeded: false, + LimitTime: null, + }; +} + +export async function isDomainInLimits(url: string): Promise { + const limitList = (await Settings.getInstance().getSetting( + StorageParams.RESTRICTION_LIST, + )) as Restriction[]; + const array = Object.values(limitList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + return item != undefined; +} diff --git a/src/compositions/loadFile.ts b/src/compositions/loadFile.ts new file mode 100644 index 0000000..f1a1724 --- /dev/null +++ b/src/compositions/loadFile.ts @@ -0,0 +1,14 @@ +export enum FileType { + CSV = 'text/csv', +} + +export function useFile(data: string, type: FileType, fileName: string) { + const file = new Blob([data], { type: type }); + let downloadLink; + downloadLink = document.createElement('a'); + downloadLink.download = fileName; + downloadLink.href = window.URL.createObjectURL(file); + downloadLink.style.display = 'none'; + document.body.appendChild(downloadLink); + downloadLink.click(); +} diff --git a/src/compositions/logger.ts b/src/compositions/logger.ts new file mode 100644 index 0000000..ad06cd6 --- /dev/null +++ b/src/compositions/logger.ts @@ -0,0 +1,27 @@ +function print(logFn: typeof console.log, style: string, ...args: any[]) { + if (typeof args[0] === 'string') { + const newArgs = [...args]; + logFn( + `%cWeb Activity Time Tracker%c${new Date().toLocaleTimeString()}%c ${newArgs.shift()}`, + style, + 'background-color: #eaf1fb; padding: 2px 4px; border-radius: 3px', + '', + ...newArgs, + ); + } else { + logFn('%cWeb Activity Time Tracker', style, ...args); + } +} + +export function log(...args: any[]) { + if (__DEV__) + print( + console.log, + 'color: white; background-color: #1e8e3e; padding: 2px 4px; border-radius: 3px; font-weight: bold', + ...args, + ); +} + +export const logger = { + log, +}; diff --git a/src/compositions/notification-list.ts b/src/compositions/notification-list.ts new file mode 100644 index 0000000..3dab441 --- /dev/null +++ b/src/compositions/notification-list.ts @@ -0,0 +1,40 @@ +import { Notifications } from '../entity/notification'; +import { Tab } from '../entity/tab'; +import { StorageParams } from '../storage/storage-params'; +import { isDomainEquals } from '../utils/common'; +import { todayLocalDate } from '../utils/date'; +import { log } from './logger'; +import { Settings } from './settings'; + +export type LimitExceed = { + IsLimitExceeded: boolean; + LimitTime: number | null; +}; + +export async function isNeedToShowNotification(url: string, tab: Tab): Promise { + const notificationList = (await Settings.getInstance().getSetting( + StorageParams.NOTIFICATION_LIST, + )) as Notifications[]; + const array = Object.values(notificationList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + if (item != undefined) { + const date = tab.days.find(x => x.date == todayLocalDate()); + if (date != undefined) { + if (date.summary != 0 && (date.summary == item.time || date.summary % item.time == 0)) { + log(`Time for notification: website ${url} time ${item.time} summary time ${date.summary}`); + return true; + } + } + } + + return false; +} + +export async function isDomainInNotificationsLimit(url: string): Promise { + const notificationList = (await Settings.getInstance().getSetting( + StorageParams.NOTIFICATION_LIST, + )) as Notifications[]; + const array = Object.values(notificationList); + const item = array?.find(x => isDomainEquals(x.domain, url)); + return item != undefined; +} diff --git a/src/compositions/set-badge.ts b/src/compositions/set-badge.ts new file mode 100644 index 0000000..4662815 --- /dev/null +++ b/src/compositions/set-badge.ts @@ -0,0 +1,22 @@ +import Browser from 'webextension-polyfill'; + +export interface BadgeState { + color: BadgeColor; + tabId: number; + text: string; +} + +export enum BadgeColor { + red = '#fdb8b8', + green = '#6ec05e', + blue = '#1a73e8', + none = '#000', +} + +export function useBadge(badge: BadgeState): void { + Browser.action.setBadgeBackgroundColor({ color: badge.color }); + Browser.action.setBadgeText({ + tabId: badge.tabId, + text: badge.text, + }); +} diff --git a/src/compositions/settings.ts b/src/compositions/settings.ts new file mode 100644 index 0000000..70ba99c --- /dev/null +++ b/src/compositions/settings.ts @@ -0,0 +1,34 @@ +import { injecStorage } from '../storage/inject-storage'; +import { StorageParams, getDefaultValue } from '../storage/storage-params'; + +export class Settings { + private static instance: Settings; + private _settings = new Map(); + + constructor() { + if (Settings.instance) { + throw new Error('Error - use Settings.getInstance()'); + } + } + + static getInstance(): Settings { + Settings.instance = Settings.instance || new Settings(); + return Settings.instance; + } + + async getSetting(param: StorageParams) { + if (this._settings.has(param)) return this._settings.get(param); + else return await this.getValue(param); + } + + async reloadSetting(param: StorageParams) { + await this.getValue(param); + } + + private async getValue(param: StorageParams) { + const storage = injecStorage(); + const value = await storage.getValue(param, getDefaultValue(param)); + this._settings.set(param, value); + return value; + } +} diff --git a/src/compositions/show-notification.ts b/src/compositions/show-notification.ts new file mode 100644 index 0000000..c6a3e48 --- /dev/null +++ b/src/compositions/show-notification.ts @@ -0,0 +1,23 @@ +import Browser from 'webextension-polyfill'; +import { SECOND } from '../utils/time'; + +export enum NotificationType { + DailySummaryNotification = 'daily-summary-notification', + WebSiteNotification = 'website-notification', +} + +export async function showNotification( + notificationType: NotificationType, + title: string, + message: string, +): Promise { + await Browser.notifications.clear(notificationType); + await new Promise(res => setTimeout(res, 3 * SECOND)); + return Browser.notifications.create(notificationType, { + type: 'basic', + title: title, + message: message, + iconUrl: Browser.runtime.getURL('128x128.png'), + isClickable: false, + }); +} diff --git a/src/compositions/summary-data-today.ts b/src/compositions/summary-data-today.ts new file mode 100644 index 0000000..9088842 --- /dev/null +++ b/src/compositions/summary-data-today.ts @@ -0,0 +1,63 @@ +import { Tab } from '../entity/tab'; +import { injectTabsRepository } from '../repository/inject-tabs-repository'; +import { todayLocalDate } from '../utils/date'; +import { DaySummary } from '../dto/daySummary'; +import { startOfYesterday } from 'date-fns'; +import { getPercentage } from '../utils/common'; +import { ITabsRepository } from '../repository/tabs-repository-interface'; + +export async function useWebUsageSummaryForDay(): Promise { + const repo = await injectTabsRepository(); + + const unSortedTabs = repo.getTabs(); + if (unSortedTabs.length == 0) return null; + + const dataToday = getData(todayLocalDate(), repo); + const dataYesterday = getData(startOfYesterday().toLocaleDateString('en-US'), repo); + + return { + time: dataToday?.time, + mostVisitedSite: dataToday?.mostVisitedSite, + mostVisitedSiteTime: dataToday?.mostVisitedSiteTime, + timeYesterDay: dataYesterday?.time, + percentageFromYesterday: + dataToday == null + ? '0%' + : dataYesterday == null + ? '100%' + : `${getPercentage(dataToday.time, dataYesterday.time)}%`, + }; +} + +function getData(date: string, repo: ITabsRepository) { + const unSortedTabs = repo.getTabs(); + if (unSortedTabs.length == 0) return null; + + const targetTabs = unSortedTabs.filter(x => x.days.find(s => s.date === date)); + if (targetTabs.length == 0) return null; + + const tabs = targetTabs.sort(function (a: Tab, b: Tab) { + return b.days.find(s => s.date === date)!.summary - a.days.find(s => s.date === date)!.summary; + }); + + const summaryTimeList = tabs?.map(function (tab) { + return tab.days.find(day => day.date === date)!.summary; + }); + + const summaryTime = + summaryTimeList != undefined && summaryTimeList.length > 0 + ? summaryTimeList.reduce(function (a, b) { + return a + b; + }) + : 0; + + const mostVisitedTab = tabs[0]; + const mostVisitedSite = mostVisitedTab.url; + const mostVisitedSiteTime = mostVisitedTab.days.find(s => s.date === date)?.summary!; + + return { + time: summaryTime, + mostVisitedSite: mostVisitedSite, + mostVisitedSiteTime: mostVisitedSiteTime, + }; +} diff --git a/src/compositions/tab-list-by-days.ts b/src/compositions/tab-list-by-days.ts new file mode 100644 index 0000000..e755c76 --- /dev/null +++ b/src/compositions/tab-list-by-days.ts @@ -0,0 +1,87 @@ +import { CurrentTabItem } from '../dto/currentTabItem'; +import { DayTabs, TabListByDays } from '../dto/tabListSummary'; +import { injectTabsRepository } from '../repository/inject-tabs-repository'; +import { isSameDay } from 'date-fns'; + +export async function useTabListByDays( + dateFrom: Date, + dateTo: Date, +): Promise { + const repo = await injectTabsRepository(); + const unSortedTabs = repo.getTabs(); + let daysTabs: DayTabs[] = []; + + if (unSortedTabs.length == 0) return null; + + const isTheSameDay = isSameDay(dateFrom, dateTo); + + const unSortedTabsByDays = unSortedTabs.filter(x => + isTheSameDay + ? x.days.find(s => isSameDay(new Date(s.date), dateFrom)) != undefined + : x.days.find(s => new Date(s.date) >= dateFrom && new Date(s.date) <= dateTo) != undefined, + ); + + if (unSortedTabsByDays.length == 0) + return { + days: [], + averageTime: 0, + summaryTime: 0, + }; + + unSortedTabsByDays.forEach(tab => { + tab.days.forEach(day => { + if ( + (new Date(day.date) >= dateFrom && new Date(day.date) <= dateTo) || + (isTheSameDay && isSameDay(new Date(day.date), dateFrom)) + ) { + let dayTab = daysTabs.find(x => x.day == day.date); + if (dayTab == undefined) { + dayTab = { + day: day.date, + tabs: [], + time: day.summary, + }; + dayTab.tabs.push({ + favicon: tab.favicon, + url: tab.url, + sessions: day.counter, + summaryTime: day.summary, + }); + daysTabs.push(dayTab); + } else { + dayTab.time += day.summary; + dayTab.tabs.push({ + favicon: tab.favicon, + url: tab.url, + sessions: day.counter, + summaryTime: day.summary, + }); + } + } + }); + }); + + daysTabs.sort(function (a, b) { + return new Date(a.day).valueOf() - new Date(b.day).valueOf(); + }); + + daysTabs.forEach(dayTab => { + dayTab.tabs.sort(function (a: CurrentTabItem, b: CurrentTabItem) { + return b.summaryTime - a.summaryTime; + }); + }); + + const summaryTime = daysTabs + .map(x => x.time) + .reduce(function (a, b) { + return a + b; + }); + + const averageTime = Math.round(summaryTime / daysTabs.length); + + return { + days: daysTabs, + summaryTime: summaryTime, + averageTime: averageTime, + }; +} diff --git a/src/compositions/toCsv.ts b/src/compositions/toCsv.ts new file mode 100644 index 0000000..edd4b79 --- /dev/null +++ b/src/compositions/toCsv.ts @@ -0,0 +1,35 @@ +import { DayTabs } from '../dto/tabListSummary'; +import { useTabListByDays } from './tab-list-by-days'; + +const CSV_HEADER = 'Date,WebSite,Time(sec),Sessions\r\n'; + +export async function useImportToCsvWithData(days: DayTabs[] | undefined): Promise { + return getCsv(days); +} + +export async function useImportToCsv(dateFrom: Date, dateTo: Date): Promise { + const summary = await useTabListByDays(dateFrom, dateTo); + if (summary == null) return CSV_HEADER; + + return getCsv(summary.days); +} + +function getCsv(days: DayTabs[] | undefined) { + let str = CSV_HEADER; + + if (days != undefined && days.length > 0) { + days.forEach(day => { + let newLine = ''; + day.tabs.forEach(tab => { + newLine += day.day + ','; + newLine += tab.url + ','; + newLine += tab.summaryTime + ','; + newLine += tab.sessions; + newLine += '\r\n'; + }); + str += newLine + '\r\n'; + }); + } + + return str; +} diff --git a/src/compositions/today-tab-list-summary.ts b/src/compositions/today-tab-list-summary.ts new file mode 100644 index 0000000..fcd6afd --- /dev/null +++ b/src/compositions/today-tab-list-summary.ts @@ -0,0 +1,47 @@ +import { TabListSummary } from '../dto/tabListSummary'; +import { Tab } from '../entity/tab'; +import { injectTabsRepository } from '../repository/inject-tabs-repository'; +import { SortingBy } from '../utils/enums'; +import { todayLocalDate } from '../utils/date'; + +export async function useTodayTabListSummary(sortingBy: SortingBy): Promise { + const repo = await injectTabsRepository(); + const unSortedTabs = repo.getTodayTabs(); + let tabs: Tab[] = []; + + if (unSortedTabs.length == 0) return null; + + tabs = unSortedTabs.sort(function (a: Tab, b: Tab) { + return sortingBy == SortingBy.UsageTime + ? b.days.find(s => s.date === todayLocalDate())!.summary - + a.days.find(s => s.date === todayLocalDate())!.summary + : b.days.find(s => s.date === todayLocalDate())!.counter - + a.days.find(s => s.date === todayLocalDate())!.counter; + }); + + const summaryTimeList = tabs?.map(function (tab) { + return tab.days.find(day => day.date === todayLocalDate())!.summary; + }); + + const siteList = tabs?.map(function (tab) { + return tab.url; + }); + + const timeForChart = summaryTimeList?.slice(0, 10); + const sitesForChart = siteList?.slice(0, 10); + + const summaryTime = + summaryTimeList != undefined && summaryTimeList.length > 0 + ? summaryTimeList.reduce(function (a, b) { + return a + b; + }) + : 0; + return { + tabs, + summaryTime, + chart: { + timeForChart, + sitesForChart, + }, + }; +} diff --git a/src/compositions/valid-page.ts b/src/compositions/valid-page.ts new file mode 100644 index 0000000..33bc85f --- /dev/null +++ b/src/compositions/valid-page.ts @@ -0,0 +1,15 @@ +import Browser from 'webextension-polyfill'; + +export function isValidPage(tab: Browser.Tabs.Tab | undefined): boolean { + if (tab == null || tab == undefined || !tab.url || !tab.id) return false; + + if ( + (!tab.url.startsWith('http:') && + !tab.url.startsWith('https:') && + !tab.url.startsWith('file:')) || + tab.url.startsWith('chrome://') || + tab.url.startsWith('chrome-extension://') + ) + return false; + return true; +} diff --git a/src/dashboard.html b/src/dashboard.html new file mode 100644 index 0000000..e62fae6 --- /dev/null +++ b/src/dashboard.html @@ -0,0 +1,16 @@ + + + + + + + Web Activity Time Tracker - Dashboard + + + + + + + + + diff --git a/src/dashboard.ts b/src/dashboard.ts new file mode 100644 index 0000000..1d55780 --- /dev/null +++ b/src/dashboard.ts @@ -0,0 +1,12 @@ +import Settings from './pages/Dashboard.vue'; +import Notifications from '@kyvg/vue3-notification'; +import VueDatePicker from '@vuepic/vue-datepicker'; +import '@vuepic/vue-datepicker/dist/main.css'; +import { createApp } from 'vue'; +import i18n from './plugins/i18n'; + +const app = createApp(Settings); +app.use(Notifications); +app.use(i18n); +app.component('VueDatePicker', VueDatePicker); +app.mount('body'); diff --git a/src/dto/currentTabItem.ts b/src/dto/currentTabItem.ts new file mode 100644 index 0000000..eeed770 --- /dev/null +++ b/src/dto/currentTabItem.ts @@ -0,0 +1,6 @@ +export interface CurrentTabItem { + url: string; + favicon: string | undefined; + summaryTime: number; + sessions: number; +} diff --git a/src/dto/daySummary.ts b/src/dto/daySummary.ts new file mode 100644 index 0000000..29c136e --- /dev/null +++ b/src/dto/daySummary.ts @@ -0,0 +1,7 @@ +export type DaySummary = { + time: number | undefined; + timeYesterDay: number | undefined; + percentageFromYesterday: string | undefined; + mostVisitedSite: string | undefined; + mostVisitedSiteTime: number | undefined; +}; diff --git a/src/dto/tabListSummary.ts b/src/dto/tabListSummary.ts new file mode 100644 index 0000000..f68266b --- /dev/null +++ b/src/dto/tabListSummary.ts @@ -0,0 +1,42 @@ +import { Tab } from '../entity/tab'; +import { CurrentTabItem } from './currentTabItem'; + +export interface OverallStats extends TabListSummary { + firstDay: Date; + activeDaysTotal: number; + daysTotal: number; + todaySummaryTime: number; + averageTimeByActiveDays: number; + mostActiveDay: ActiveDay; + mostInactiveDay: ActiveDay; + mostActiveDayExceptToday: ActiveDay | null; + mostInactiveDayExceptToday: ActiveDay | null; +} + +export interface ActiveDay { + date: Date; + summaryTime: number; +} + +export interface TabListSummary { + tabs: Tab[]; + summaryTime: number; + chart: DataForChart; +} + +export interface DataForChart { + timeForChart: number[]; + sitesForChart: string[]; +} + +export interface TabListByDays { + days: DayTabs[]; + averageTime: number; + summaryTime: number; +} + +export interface DayTabs { + day: string; + tabs: CurrentTabItem[]; + time: number; +} diff --git a/src/entity/baseTimeList.ts b/src/entity/baseTimeList.ts new file mode 100644 index 0000000..42dfe28 --- /dev/null +++ b/src/entity/baseTimeList.ts @@ -0,0 +1,4 @@ +export interface BaseTimeList { + domain: string; + time: number; +} diff --git a/src/entity/deffering.ts b/src/entity/deffering.ts new file mode 100644 index 0000000..0e58c8e --- /dev/null +++ b/src/entity/deffering.ts @@ -0,0 +1,12 @@ +import { MINUTE } from '../utils/time'; +import { BaseTimeList } from './baseTimeList'; + +export class Deffering implements BaseTimeList { + domain: string; + time: number; + + constructor(domain: string, minutes: number) { + this.domain = domain; + this.time = Date.now() + minutes * MINUTE; + } +} diff --git a/src/entity/notification.ts b/src/entity/notification.ts new file mode 100644 index 0000000..c3ab1d2 --- /dev/null +++ b/src/entity/notification.ts @@ -0,0 +1,12 @@ +import { convertHHMMToSeconds } from '../utils/converter'; +import { BaseTimeList } from './baseTimeList'; + +export class Notifications implements BaseTimeList { + domain: string; + time: number; + + constructor(domain: string, hours: number, minutes: number) { + this.domain = domain; + this.time = convertHHMMToSeconds(hours, minutes); + } +} diff --git a/src/entity/restriction.ts b/src/entity/restriction.ts new file mode 100644 index 0000000..7fe84ae --- /dev/null +++ b/src/entity/restriction.ts @@ -0,0 +1,11 @@ +import { convertHHMMToSeconds } from '../utils/converter'; + +export class Restriction { + domain: string; + time: number; + + constructor(domain: string, hours: number, minutes: number) { + this.domain = domain; + this.time = convertHHMMToSeconds(hours, minutes); + } +} diff --git a/src/entity/tab.ts b/src/entity/tab.ts new file mode 100644 index 0000000..9a2ea79 --- /dev/null +++ b/src/entity/tab.ts @@ -0,0 +1,81 @@ +import { todayLocalDate } from '../utils/date'; +import { logger } from '../compositions/logger'; + +export class Tab implements ISerializable { + url: string = ''; + favicon: string | undefined = ''; + summaryTime: number = 0; + counter: number = 0; + days: TabDay[] = []; + + init(url: string) { + this.url = url; + } + + incSummaryTime(): void { + this.summaryTime += 1; + + const day = this.days.find(x => x.date == todayLocalDate()); + if (day === undefined) { + const newTab = this.addNewDay(); + newTab.incSummaryTime(); + } else day.incSummaryTime(); + } + + incCounter(): void { + this.counter += 1; + if (__DEV__) logger.log(`Counter ${this.url} - ${this.counter}`); + const day = this.days.find(x => x.date == todayLocalDate()); + if (day === undefined) { + const newTab = this.addNewDay(); + newTab.incCounter(); + } else day.incCounter(); + } + + addNewDay(): TabDay { + const newTabDay = new TabDay(); + newTabDay.init(todayLocalDate()); + this.days.push(newTabDay); + return newTabDay; + } + + deserialize(input: Tab) { + this.url = input.url; + this.counter = input.counter; + this.favicon = input.favicon; + this.summaryTime = input.summaryTime; + if (input.days?.length > 0) this.days = input.days.map(x => new TabDay().deserialize(x)); + + return this; + } + + setFavicon(favicon: string | undefined) { + this.favicon = favicon; + } +} + +export class TabDay implements ISerializable { + counter: number = 0; + date: string = ''; + summary: number = 0; + + init(date: string) { + this.date = date; + } + + incSummaryTime(): void { + this.summary += 1; + } + + incCounter(): void { + this.counter += 1; + } + + deserialize(input: TabDay): TabDay { + this.counter = input.counter; + this.date = input.date; + this.summary = input.summary; + + return this; + } +} diff --git a/src/entity/time-interval.ts b/src/entity/time-interval.ts new file mode 100644 index 0000000..9a1da38 --- /dev/null +++ b/src/entity/time-interval.ts @@ -0,0 +1,46 @@ +import { logger } from '../compositions/logger'; + +export class TimeInterval implements ISerializable { + domain: string = ''; + intervals: string[] = []; + day: string = ''; + + init(day: string, domain: string) { + this.domain = domain; + this.intervals = []; + this.day = day; + } + + addInterval() { + const stringDate = this.getCurrentStringDate(); + this.intervals.push(stringDate + '-' + stringDate); + logger.log(`Add interval ${this.domain} - ${stringDate} - ${stringDate}`); + } + + closeInterval() { + const stringDate = this.getCurrentStringDate(); + const currentInterval = this.intervals[this.intervals.length - 1]; + if (currentInterval != null) { + if (currentInterval.split('-')[0] == currentInterval.split('-')[1]) { + this.intervals.pop(); + this.intervals.push(currentInterval.split('-')[0] + '-' + stringDate); + logger.log( + `Close interval ${this.domain} - ${currentInterval.split('-')[0]} - ${stringDate}`, + ); + } + } + } + + deserialize(input: TimeInterval): TimeInterval { + this.domain = input.domain; + this.day = input.day; + this.intervals = input.intervals; + + return this; + } + + private getCurrentStringDate(): string { + const date = new Date(); + return date.getHours() + ':' + date.getMinutes() + ':' + date.getSeconds(); + } +} diff --git a/src/globals.d.ts b/src/globals.d.ts new file mode 100644 index 0000000..66fb358 --- /dev/null +++ b/src/globals.d.ts @@ -0,0 +1,6 @@ +// Global vars +declare var __EXTENSION_MODE__: ExtensionMode; +declare var __DEV__: boolean; +declare var __PROD__: boolean; +declare var __EXTENSION_VERSION__: string; +declare var __REAL_APP_ID__: string; diff --git a/src/icons/bmc-new-btn-logo.svg b/src/icons/bmc-new-btn-logo.svg deleted file mode 100644 index d7b9b32..0000000 --- a/src/icons/bmc-new-btn-logo.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - Group - Created with Sketch. - - - - - - \ No newline at end of file diff --git a/src/icons/delete.png b/src/icons/delete.png deleted file mode 100644 index d5160c2..0000000 Binary files a/src/icons/delete.png and /dev/null differ diff --git a/src/icons/edit.png b/src/icons/edit.png deleted file mode 100644 index e80f09d..0000000 Binary files a/src/icons/edit.png and /dev/null differ diff --git a/src/icons/eye.png b/src/icons/eye.png deleted file mode 100644 index 0a358a7..0000000 Binary files a/src/icons/eye.png and /dev/null differ diff --git a/src/icons/heat-map-16.png b/src/icons/heat-map-16.png deleted file mode 100644 index 60afb64..0000000 Binary files a/src/icons/heat-map-16.png and /dev/null differ diff --git a/src/icons/information.svg b/src/icons/information.svg deleted file mode 100644 index 0bd40ae..0000000 --- a/src/icons/information.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/icons/limit.png b/src/icons/limit.png deleted file mode 100644 index b42bb6c..0000000 Binary files a/src/icons/limit.png and /dev/null differ diff --git a/src/icons/no-today.svg b/src/icons/no-today.svg deleted file mode 100644 index 94a6ac5..0000000 --- a/src/icons/no-today.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/icons/pie-chart.png b/src/icons/pie-chart.png deleted file mode 100644 index fa2f378..0000000 Binary files a/src/icons/pie-chart.png and /dev/null differ diff --git a/src/icons/preloader.svg b/src/icons/preloader.svg deleted file mode 100644 index cdd962e..0000000 --- a/src/icons/preloader.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/icons/time.svg b/src/icons/time.svg deleted file mode 100644 index c4f9923..0000000 --- a/src/icons/time.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/index.html b/src/index.html index fcfc431..3688b51 100644 --- a/src/index.html +++ b/src/index.html @@ -1,117 +1,140 @@ - + - - - + + Web Activity Time Tracker - + - +
-
-
Loading...
-
+
+
Loading...
+
- - - - - - + + + + + + - +
-

Web Activity Time Tracker

+

Web Activity Time Tracker

- Today - All-time - By days - Settings -
-
-

In Web Activity Time Tracker you can:

-

Set daily limits for sites

-

Set notifications after a certain time has elapsed

-

Set a list of sites with no tracking

-

Enable time tracking on YouTube.com

-

Enable time tracking on Netflix.com

-

Enable dark mode

-
+ Today + All-time + By days + Settings +
+
+

In Web Activity Time Tracker you can:

+

Set daily limits for sites

+

Set notifications after a certain time has elapsed

+

Set a list of sites with no tracking

+

Enable time tracking on YouTube.com

+

Enable time tracking on Netflix.com

+

Enable dark mode

+
-

Overall statistics

-
-
-
-
First day
-
-
-
-
Active days
-
-
-
-
Days in total
-
-
-
-
-
-
Today
-
-
-
-
All-time
-
-
-
-
Average by active days
-
-
+

Overall statistics

+
+
+
+
First day
+
+
+
+
Active days
+
+
+
+
Days in total
+
+
+
+
+
+
Today
+
+
+
+
All-time
+
+
+
+
Average by active days
+
+
+
+
+
+
+ Most active day +
+ Don't include the current day in the calculation of statistics +
-
-
-
Most active day
Don't include the current day in the calculation of statistics
-
-
-
+
+
+
-
-
-
-
-
-
Most inactive day
Don't include the current day in the calculation of statistics
-
-
-
+
+
+
+
+
+
+ Most inactive day +
+ Don't include the current day in the calculation of statistics +
+
+
+
+
-
-
-
-
+
+
+
+
- +
- - - + @@ -119,4 +142,4 @@ - \ No newline at end of file + diff --git a/src/jobs/daily-summary-notification.ts b/src/jobs/daily-summary-notification.ts new file mode 100644 index 0000000..1968b03 --- /dev/null +++ b/src/jobs/daily-summary-notification.ts @@ -0,0 +1,31 @@ +import { useWebUsageSummaryForDay } from '../compositions/summary-data-today'; +import { convertLimitTimeToString } from '../utils/converter'; +import { Settings } from '../compositions/settings'; +import { StorageParams } from '../storage/storage-params'; +import { NotificationType, showNotification } from '../compositions/show-notification'; +import { getMessagesFromLocale } from '../plugins/i18n'; + +export async function dailySummaryNotification() { + const showDailyNotifacation = (await Settings.getInstance().getSetting( + StorageParams.DAILY_NOTIFICATION, + )) as boolean; + + if (showDailyNotifacation) { + const data = await useWebUsageSummaryForDay(); + if (data == null) return; + + const title = `${ + getMessagesFromLocale()['todayUsageTime']['message'] + }${convertLimitTimeToString(data.time!)}`; + const message = [ + `${data?.percentageFromYesterday}${ + getMessagesFromLocale()['comparedToYesterday']['message'] + }`, + `${data.mostVisitedSite} ${ + getMessagesFromLocale()['mostVisited']['message'] + }${convertLimitTimeToString(data.mostVisitedSiteTime!)}`, + ].join('\n'); + + return await showNotification(NotificationType.DailySummaryNotification, title, message); + } +} diff --git a/src/jobs/remove-time-intervals.ts b/src/jobs/remove-time-intervals.ts new file mode 100644 index 0000000..ef86498 --- /dev/null +++ b/src/jobs/remove-time-intervals.ts @@ -0,0 +1,23 @@ +import { StorageDeserializeParam } from '../storage/storage-params'; +import { injecStorage } from '../storage/inject-storage'; +import { TimeInterval } from '../entity/time-interval'; +import { todayLocalDate } from '../utils/date'; + +export async function removeOldTimeIntervals() { + const storage = injecStorage(); + let timeIntervalList = (await storage.getDeserializeList( + StorageDeserializeParam.TIMEINTERVAL_LIST, + )) as TimeInterval[]; + if (timeIntervalList == undefined) timeIntervalList = []; + const arrayToRemove: number[] = []; + timeIntervalList.forEach(interval => { + if (new Date(interval.day) < new Date(todayLocalDate())) + arrayToRemove.push(timeIntervalList.indexOf(interval)); + }); + + arrayToRemove.forEach(index => { + if (index > -1) timeIntervalList.splice(index, 1); + }); + + await storage.saveIntervalList(timeIntervalList); +} diff --git a/src/jobs/sheduler.ts b/src/jobs/sheduler.ts new file mode 100644 index 0000000..59904fd --- /dev/null +++ b/src/jobs/sheduler.ts @@ -0,0 +1,71 @@ +import Browser, { Alarms } from 'webextension-polyfill'; +import { log } from '../compositions/logger'; +import { StorageParams } from '../storage/storage-params'; +import { DAY_MINUTES, SECOND, getNextTimeOfDay } from '../utils/time'; +import { Settings } from '../compositions/settings'; +import { dailySummaryNotification } from './daily-summary-notification'; +import { removeOldTimeIntervals } from './remove-time-intervals'; +import { startOfTomorrow } from 'date-fns'; +import { Messages } from '../utils/messages'; + +export enum JobId { + DailySummaryNotification = '@alarm/daily-summary-notification', + RemoveOldTimeIntervals = '@alarm/remove-old-time-intervals', +} + +export function scheduleJobs(): void { + Browser.alarms.onAlarm.addListener(async alarm => { + log(`[schedule-jobs] Alarm ${alarm.name} triggered`, alarm); + switch (alarm.name) { + case JobId.DailySummaryNotification: { + await dailySummaryNotification(); + break; + } + case JobId.RemoveOldTimeIntervals: { + await removeOldTimeIntervals(); + break; + } + } + log(`[schedule-jobs] ${alarm.name} finished`); + }); + + Browser.runtime.onMessage.addListener(message => { + if (message == Messages.RescheduleJobs) rescheduleJobs(); + }); + + rescheduleJobs(); +} + +async function rescheduleJobs(): Promise { + log('Reschedule jobs'); + const dailySummaryNotificationTime = (await Settings.getInstance().getSetting( + StorageParams.DAILY_SUMMARY_NOTIFICATION_TIME, + )) as number; + await Browser.alarms.clear(JobId.DailySummaryNotification); + const nextTime = getNextTimeOfDay(dailySummaryNotificationTime * SECOND); + log(`[schedule-jobs] ${JobId.DailySummaryNotification} start time ${new Date(nextTime)}`); + Browser.alarms.create(JobId.DailySummaryNotification, { + when: nextTime, + periodInMinutes: DAY_MINUTES, + }); + + await createAlarmIfMissing(JobId.RemoveOldTimeIntervals, { + when: startOfTomorrow().getTime(), + periodInMinutes: DAY_MINUTES, + }); +} + +async function createAlarmIfMissing( + name: string, + alarmInfo: Alarms.CreateAlarmInfoType, +): Promise { + const existing = await Browser.alarms.get(name).catch(() => undefined); + if (existing == null) { + log( + `[schedule-jobs] ${name} start time ${ + alarmInfo.when != undefined ? new Date(alarmInfo.when) : null + }`, + ); + Browser.alarms.create(name, alarmInfo); + } +} diff --git a/src/manifest.json b/src/manifest.json index 585195d..fd0a524 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,50 +1,32 @@ { - "manifest_version": 2, - - "name": "Web Activity Time Tracker", - "short_name": "Web Time Tracker", - "version": "1.7.2", - "minimum_chrome_version": "26", - - "description": "Track and limit time your activity in the browser every day.", - - "options_page": "options.html", - - "icons": { - "16": "icons/16x16.png", - "32": "icons/32x32.png", - "48": "icons/48x48.png", - "128": "icons/128x128.png" - }, - "permissions": [ - "tabs", - "activeTab", - "storage", - "idle", - "chrome://favicon/*", - "webNavigation", - "unlimitedStorage", - "alarms" - ], - "optional_permissions": [ - "https://www.youtube.com/*", - "https://www.netflix.com/*", - "notifications" - ], - "offline_enabled": true, - "background": { - "scripts": ["scripts/common.js", - "scripts/storage.js", - "scripts/activity.js", - "scripts/tab.js", - "scripts/timeInterval.js", - "scripts/background.js", - "scripts/restriction.js"], - "persistent": false - }, - "browser_action": { - "default_popup": "index.html", - "default_title": "Web Activity Time Tracker", - "default_icon": "icons/48x48.png" - } -} \ No newline at end of file + "manifest_version": 3, + "name": "__MSG_extName__", + "short_name": "Web Tracker", + "version": "2.0.0", + "description": "__MSG_extDescription__", + "options_page": "src/dashboard.html", + "default_locale": "en", + "icons": { + "16": "16x16.png", + "32": "32x32.png", + "48": "48x48.png", + "128": "128x128.png" + }, + "permissions": [ + "tabs", + "activeTab", + "storage", + "idle", + "unlimitedStorage", + "alarms", + "notifications" + ], + "offline_enabled": true, + "background": { + "service_worker": "src/background.ts" + }, + "action": { + "default_popup": "src/popup.html", + "default_title": "Web Activity Time Tracker" + } +} diff --git a/src/options.html b/src/options.html deleted file mode 100644 index 2a29a13..0000000 --- a/src/options.html +++ /dev/null @@ -1,270 +0,0 @@ - - - - - - Web Activity Time Tracker - - - - - - - - - - - - -
-
-

Web Activity Time Tracker

-
- -
-
- -
- -
-
- -
-
-
- -
- An activity is an action with a mouse or keyboard -
-
- -
-
-
-
- -
-
-
- -
- Activity for these domains not will tracked -
-
-
    -
    -
    - - -
    - -
    -
    -
    - -
    -
    - -
    -
    - - - - - - - -
    -
    - - - -
    - - - - - -
    - -
    - -
    -
    - - - -
    - -
    - - - -
    -
    -
    - -
    -
    - -
    -
    - - - -
    -
    - - - diff --git a/src/pages/Block.vue b/src/pages/Block.vue new file mode 100644 index 0000000..80a498c --- /dev/null +++ b/src/pages/Block.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue new file mode 100644 index 0000000..cdf2053 --- /dev/null +++ b/src/pages/Dashboard.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/src/pages/Popup.vue b/src/pages/Popup.vue new file mode 100644 index 0000000..77df4c6 --- /dev/null +++ b/src/pages/Popup.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts new file mode 100644 index 0000000..b718732 --- /dev/null +++ b/src/plugins/i18n.ts @@ -0,0 +1,29 @@ +import { createI18n } from 'vue-i18n'; +import Browser from 'webextension-polyfill'; +import en from '../_locales/en/messages.json'; +import ru from '../_locales/ru/messages.json'; +import de from '../_locales/de/messages.json'; + +const locales = { + en, + ru, + de, +}; + +export type Languages = keyof typeof locales; + +const i18n = createI18n({ + legacy: false, + locale: Browser.i18n.getUILanguage(), + fallbackLocale: 'en', + globalInjection: true, + messages: locales, +}); + +export default i18n; + +export function getMessagesFromLocale() { + let locale = i18n.global.locale.value; + if (Object.keys(locales).indexOf(locale) == -1) locale = 'en'; + return i18n.global.getLocaleMessage(locale); +} diff --git a/src/popup.html b/src/popup.html new file mode 100644 index 0000000..c0a5d37 --- /dev/null +++ b/src/popup.html @@ -0,0 +1,16 @@ + + + + + + + Popup + + + + + + + + + diff --git a/src/popup.ts b/src/popup.ts new file mode 100644 index 0000000..42ccbf5 --- /dev/null +++ b/src/popup.ts @@ -0,0 +1,10 @@ +import Popup from './pages/Popup.vue'; +import VueDatePicker from '@vuepic/vue-datepicker'; +import '@vuepic/vue-datepicker/dist/main.css'; +import { createApp } from 'vue'; +import i18n from './plugins/i18n'; + +const app = createApp(Popup); +app.component('VueDatePicker', VueDatePicker); +app.use(i18n); +app.mount('body'); diff --git a/src/repository/inject-tabs-repository.ts b/src/repository/inject-tabs-repository.ts new file mode 100644 index 0000000..44de742 --- /dev/null +++ b/src/repository/inject-tabs-repository.ts @@ -0,0 +1,21 @@ +import { ITabsRepository } from './tabs-repository-interface'; +import { TabsRepository } from './tabs-repository'; + +let instanse: ITabsRepository | null = null; + +async function createAndInitInstance() { + let repo = new TabsRepository(); + await repo.initAsync(); + return repo; +} + +export async function injectTabsRepositorySingleton(): Promise { + if (instanse == null) { + instanse = await createAndInitInstance(); + } + return instanse; +} + +export async function injectTabsRepository(): Promise { + return createAndInitInstance(); +} diff --git a/src/repository/tabs-repository-interface.ts b/src/repository/tabs-repository-interface.ts new file mode 100644 index 0000000..a14b124 --- /dev/null +++ b/src/repository/tabs-repository-interface.ts @@ -0,0 +1,8 @@ +import { Tab } from '../entity/tab'; + +export interface ITabsRepository { + getTabs(): Tab[]; + getTodayTabs(): Tab[]; + getTab(domain: string): Tab | undefined; + addTab(domain: string, favicon: string | undefined): Promise; +} diff --git a/src/repository/tabs-repository.ts b/src/repository/tabs-repository.ts new file mode 100644 index 0000000..73b59f3 --- /dev/null +++ b/src/repository/tabs-repository.ts @@ -0,0 +1,44 @@ +import { ITabsRepository } from './tabs-repository-interface'; +import { Tab } from '../entity/tab'; +import { injecStorage } from '../storage/inject-storage'; +import { isInBlackList } from '../compositions/black-list'; +import { StorageDeserializeParam } from '../storage/storage-params'; +import { todayLocalDate } from '../utils/date'; + +export class TabsRepository implements ITabsRepository { + private tabs: Tab[]; + + constructor() { + this.tabs = []; + } + + async initAsync() { + this.tabs = (await injecStorage().getDeserializeList(StorageDeserializeParam.TABS)) as Tab[]; + } + + getTabs(): Tab[] { + return this.tabs; + } + + getTodayTabs(): Tab[] { + return this.tabs.filter(x => x.days.find(s => s.date === todayLocalDate())); + } + + getTab(domain: string): Tab | undefined { + return this.tabs?.find(x => x.url === domain); + } + + async addTab(domain: string, favicon: string | undefined): Promise { + const tabFromStorage = this.getTab(domain); + const isInBlackListFlag = await isInBlackList(domain); + + if (!isInBlackListFlag && !tabFromStorage) { + const newTab = new Tab(); + newTab.init(domain); + this.tabs.push(newTab); + return newTab; + } + + return undefined; + } +} diff --git a/src/scripts/activity.js b/src/scripts/activity.js deleted file mode 100644 index 920513c..0000000 --- a/src/scripts/activity.js +++ /dev/null @@ -1,160 +0,0 @@ -'use strict'; - -class Activity { - addTab(tab) { - if (this.isValidPage(tab) === true) { - if (tab.id && (tab.id != 0)) { - tabs = tabs || []; - var domain = extractHostname(tab.url); - var isDifferentUrl = false; - if (currentTab !== tab.url) { - isDifferentUrl = true; - } - - if (this.isNewUrl(domain) && !this.isInBlackList(domain)) { - var favicon = tab.favIconUrl; - if (favicon === undefined) { - favicon = 'chrome://favicon/' + domain; - } - var newTab = new Tab(domain, favicon); - tabs.push(newTab); - } - - if (isDifferentUrl && !this.isInBlackList(domain)) { - this.setCurrentActiveTab(domain); - var tabUrl = this.getTab(domain); - if (tabUrl !== undefined) - tabUrl.incCounter(); - this.addTimeInterval(domain); - } - } - } else this.closeIntervalForCurrentTab(); - } - - isValidPage(tab) { - if (!tab || !tab.url || (tab.url.indexOf('http:') == -1 && tab.url.indexOf('https:') == -1) - || tab.url.indexOf('chrome://') !== -1 - || tab.url.indexOf('chrome-extension://') !== -1) - return false; - return true; - } - - isInBlackList(domain) { - if (setting_black_list !== undefined && setting_black_list.length > 0) - return setting_black_list.find(o => isDomainEquals(extractHostname(o), extractHostname(domain))) !== undefined; - else return false; - } - - isLimitExceeded(domain, tab) { - if (setting_restriction_list !== undefined && setting_restriction_list.length > 0) { - var item = setting_restriction_list.find(o => isDomainEquals(extractHostname(o.domain), extractHostname(domain))); - if (item !== undefined) { - var data = tab.days.find(x => x.date == todayLocalDate()); - if (data !== undefined) { - var todayTimeUse = data.summary; - if (todayTimeUse >= item.time) { - return true; - } - } - } - } - return false; - } - - wasDeferred(domain){ - if (deferredRestrictionsList != undefined){ - let defItem = deferredRestrictionsList.find(x => extractHostname(x.site) == extractHostname(domain)); - if (defItem != null){ - let time = defItem.dateOfDeferred; - if (time + DEFERRED_TIMEOUT > new Date().getTime()){ - return true; - } - else { - let index = deferredRestrictionsList.indexOf(defItem); - if (index > -1) - deferredRestrictionsList.splice(index, 1); - - return false; - } - } - } - - return false; - } - - isNewUrl(domain) { - if (tabs.length > 0) - return tabs.find(o => o.url === domain) === undefined; - else return true; - } - - getTab(domain) { - if (tabs !== undefined) - return tabs.find(o => o.url === domain); - } - - - updateFavicon(tab) { - var domain = extractHostname(tab.url); - var currentTab = this.getTab(domain); - if (currentTab !== null && currentTab !== undefined) { - if (tab.favIconUrl !== undefined && tab.favIconUrl !== currentTab.favicon) { - currentTab.favicon = tab.favIconUrl; - } - } - } - - setCurrentActiveTab(domain) { - this.closeIntervalForCurrentTab(); - currentTab = domain; - this.addTimeInterval(domain); - } - - clearCurrentActiveTab() { - this.closeIntervalForCurrentTab(); - currentTab = ''; - } - - addTimeInterval(domain) { - var item = timeIntervalList.find(o => o.domain === domain && o.day == todayLocalDate()); - if (item != undefined) { - if (item.day == todayLocalDate()) - item.addInterval(); - else { - var newInterval = new TimeInterval(todayLocalDate(), domain); - newInterval.addInterval(); - timeIntervalList.push(newInterval); - } - } else { - var newInterval = new TimeInterval(todayLocalDate(), domain); - newInterval.addInterval(); - timeIntervalList.push(newInterval); - } - } - - closeIntervalForCurrentTab() { - if (currentTab !== '' && timeIntervalList != undefined) { - var item = timeIntervalList.find(o => o.domain === currentTab && o.day == todayLocalDate()); - if (item != undefined) - item.closeInterval(); - } - currentTab = ''; - } - - isNeedNotifyView(domain, tab){ - if (setting_notification_list !== undefined && setting_notification_list.length > 0) { - var item = setting_notification_list.find(o => isDomainEquals(extractHostname(o.domain), extractHostname(domain))); - if (item !== undefined) { - var today = todayLocalDate(); - var data = tab.days.find(x => x.date == today); - if (data !== undefined) { - var todayTimeUse = data.summary; - if (todayTimeUse == item.time || todayTimeUse % item.time == 0) { - return true; - } - } - } - } - return false; - } -}; \ No newline at end of file diff --git a/src/scripts/background.js b/src/scripts/background.js deleted file mode 100644 index fcb61bc..0000000 --- a/src/scripts/background.js +++ /dev/null @@ -1,476 +0,0 @@ -'use strict'; - -var tabs; -var timeIntervalList; -var currentTab; -var isNeedDeleteTimeIntervalFromTabs = false; -var activity = new Activity(); -var storage = new LocalStorage(); -var deferredRestrictionsList; - -var setting_black_list; -var setting_restriction_list; -var setting_interval_save; -var setting_interval_inactivity; -var setting_view_in_badge; -var setting_block_deferral; -var setting_dark_mode; -var setting_notification_list; -var setting_notification_message; - -var isHasPermissioForYouTube; -var isHasPermissioForNetflix; -var isHasPermissioForNotification; - -function updateSummaryTime() { - setInterval(backgroundCheck, SETTINGS_INTERVAL_CHECK_DEFAULT); -} - -function updateStorage() { - setInterval(backgroundUpdateStorage, SETTINGS_INTERVAL_SAVE_STORAGE_DEFAULT); -} - -function backgroundCheck() { - chrome.windows.getLastFocused({ populate: true }, function(currentWindow) { - if (currentWindow.focused) { - var activeTab = currentWindow.tabs.find(t => t.active === true); - if (activeTab !== undefined && activity.isValidPage(activeTab)) { - var activeUrl = extractHostname(activeTab.url); - var tab = activity.getTab(activeUrl); - if (tab === undefined) { - activity.addTab(activeTab); - } - - if (activity.isInBlackList(activeUrl)) { - chrome.browserAction.setBadgeBackgroundColor({ color: '#fdb8b8' }) - chrome.browserAction.setBadgeText({ - tabId: activeTab.id, - text: 'n/a' - }); - } else { - if (tab !== undefined) { - if (currentTab !== tab.url) { - activity.setCurrentActiveTab(tab.url); - } - chrome.idle.queryState(parseInt(setting_interval_inactivity), function(state) { - if (state === 'active') { - mainTRacker(activeUrl, tab, activeTab); - } else checkDOM(state, activeUrl, tab, activeTab); - }); - } - } - } - } else activity.closeIntervalForCurrentTab(); - }); -} - -function mainTRacker(activeUrl, tab, activeTab) { - if (activity.isLimitExceeded(activeUrl, tab) && !activity.wasDeferred(activeUrl)) { - setBlockPageToCurrent(activeTab.url, tab.days.at(-1).summary, tab.days.at(-1).counter); - } - if (!activity.isInBlackList(activeUrl)) { - if (activity.isNeedNotifyView(activeUrl, tab)) { - if (isHasPermissioForNotification) { - showNotification(activeUrl, tab); - } else { - checkPermissionsForNotifications(showNotification, activeUrl, tab); - } - } - tab.incSummaryTime(); - } - if (setting_view_in_badge === true) { - chrome.browserAction.setBadgeBackgroundColor({ color: '#e7e7e7' }) - var summary = tab.days.find(s => s.date === todayLocalDate()).summary; - chrome.browserAction.setBadgeText({ - tabId: activeTab.id, - text: String(convertSummaryTimeToBadgeString(summary)) - }); - } else { - chrome.browserAction.setBadgeBackgroundColor({ color: [0, 0, 0, 0] }) - chrome.browserAction.setBadgeText({ - tabId: activeTab.id, - text: '' - }); - } -} - -function showNotification(activeUrl, tab) { - chrome.notifications.clear('watt-site-notification', function(wasCleared) { - if (!wasCleared) { - console.log('!wasCleared'); - - chrome.notifications.create( - 'watt-site-notification', { - type: 'basic', - iconUrl: 'icons/128x128.png', - title: "Web Activity Time Tracker", - contextMessage: activeUrl + ' ' + convertShortSummaryTimeToString(tab.getTodayTime()), - message: setting_notification_message - }, - function(notificationId) { - console.log(notificationId); - chrome.notifications.clear('watt-site-notification', function(wasCleared) { - if (wasCleared) - notificationAction(activeUrl, tab); - }); - }); - } else { - notificationAction(activeUrl, tab); - } - }); -} - -function notificationAction(activeUrl, tab) { - chrome.notifications.create( - 'watt-site-notification', { - type: 'basic', - iconUrl: 'icons/128x128.png', - title: "Web Activity Time Tracker", - contextMessage: activeUrl + ' ' + convertShortSummaryTimeToString(tab.getTodayTime()), - message: setting_notification_message - }); -} - -function setBlockPageToCurrent(currentUrl, summaryTime, counter) { - var blockUrl = chrome.runtime.getURL("block.html") + '?url=' + currentUrl - + '&summaryTime=' + summaryTime - + '&counter=' + counter; - chrome.tabs.query({ currentWindow: true, active: true }, function(tab) { - chrome.tabs.update(tab.id, { url: blockUrl }); - }); -} - -function isVideoPlayedOnPage() { - var videoElement = document.getElementsByTagName('video')[0]; - if (videoElement !== undefined && videoElement.currentTime > 0 && !videoElement.paused && !videoElement.ended && videoElement.readyState > 2) { - return true; - } else return false; -} - -function checkDOM(state, activeUrl, tab, activeTab) { - if (state === 'idle' && isDomainEquals(activeUrl, "youtube.com")) { - trackForYT(mainTRacker, activeUrl, tab, activeTab); - } else if (state === 'idle' && isDomainEquals(activeUrl, "netflix.com")) { - trackForNetflix(mainTRacker, activeUrl, tab, activeTab); - } else activity.closeIntervalForCurrentTab(); -} - -function trackForYT(callback, activeUrl, tab, activeTab) { - if (isHasPermissioForYouTube) { - executeScriptYoutube(callback, activeUrl, tab, activeTab); - } else { - checkPermissionsForYT(executeScriptYoutube, activity.closeIntervalForCurrentTab, callback, activeUrl, tab, activeTab); - } -} - -function trackForNetflix(callback, activeUrl, tab, activeTab) { - if (isHasPermissioForNetflix) { - executeScriptNetflix(callback, activeUrl, tab, activeTab); - } else { - checkPermissionsForNetflix(executeScriptNetflix, activity.closeIntervalForCurrentTab, callback, activeUrl, tab, activeTab); - } -} - -function executeScriptYoutube(callback, activeUrl, tab, activeTab) { - chrome.tabs.executeScript({ code: "var videoElement = document.getElementsByTagName('video')[0]; (videoElement !== undefined && videoElement.currentTime > 0 && !videoElement.paused && !videoElement.ended && videoElement.readyState > 2);" }, (results) => { - if (results !== undefined && results[0] !== undefined && results[0] === true) - callback(activeUrl, tab, activeTab); - else activity.closeIntervalForCurrentTab(); - }); -} - -function executeScriptNetflix(callback, activeUrl, tab, activeTab) { - chrome.tabs.executeScript({ code: "var videoElement = document.getElementsByTagName('video')[0]; (videoElement !== undefined && videoElement.currentTime > 0 && !videoElement.paused && !videoElement.ended && videoElement.readyState > 2);" }, (results) => { - if (results !== undefined && results[0] !== undefined && results[0] === true) { - callback(activeUrl, tab, activeTab); - } else { - activity.closeIntervalForCurrentTab(); - } - }); -} - -function backgroundUpdateStorage() { - if (tabs != undefined && tabs.length > 0) - storage.saveTabs(tabs); - if (timeIntervalList != undefined && timeIntervalList.length > 0) - storage.saveValue(STORAGE_TIMEINTERVAL_LIST, timeIntervalList); -} - -function setDefaultSettings() { - storage.saveValue(SETTINGS_INTERVAL_INACTIVITY, SETTINGS_INTERVAL_INACTIVITY_DEFAULT); - storage.saveValue(SETTINGS_INTERVAL_RANGE, SETTINGS_INTERVAL_RANGE_DEFAULT); - storage.saveValue(SETTINGS_VIEW_TIME_IN_BADGE, SETTINGS_VIEW_TIME_IN_BADGE_DEFAULT); - storage.saveValue(SETTINGS_BLOCK_DEFERRAL, SETTINGS_BLOCK_DEFERRAL_DEFAULT); - storage.saveValue(SETTINGS_DARK_MODE, SETTINGS_DARK_MODE_DEFAULT); - storage.saveValue(SETTINGS_INTERVAL_SAVE_STORAGE, SETTINGS_INTERVAL_SAVE_STORAGE_DEFAULT); - storage.saveValue(STORAGE_NOTIFICATION_MESSAGE, STORAGE_NOTIFICATION_MESSAGE_DEFAULT); -} - -function checkSettingsImEmpty() { - chrome.storage.local.getBytesInUse(['inactivity_interval'], function(item) { - if (item == 0) { - setDefaultSettings(); - } - }); -} - -function setDefaultValueForNewSettings() { - loadNotificationMessage(); -} - -function addListener() { - chrome.tabs.onActivated.addListener(function(info) { - chrome.tabs.get(info.tabId, function(tab) { - activity.addTab(tab); - }); - }); - - chrome.webNavigation.onCompleted.addListener(function(details) { - chrome.tabs.get(details.tabId, function(tab) { - activity.updateFavicon(tab); - }); - }); - chrome.runtime.onInstalled.addListener(function(details) { - if (details.reason == 'install') { - storage.saveValue(SETTINGS_SHOW_HINT, SETTINGS_SHOW_HINT_DEFAULT); - setDefaultSettings(); - } - if (details.reason == 'update') { - storage.saveValue(SETTINGS_SHOW_HINT, SETTINGS_SHOW_HINT_DEFAULT); - checkSettingsImEmpty(); - setDefaultValueForNewSettings(); - isNeedDeleteTimeIntervalFromTabs = true; - } - }); - chrome.storage.onChanged.addListener(function(changes, namespace) { - for (var key in changes) { - if (key === STORAGE_BLACK_LIST) { - loadBlackList(); - } - if (key === STORAGE_RESTRICTION_LIST) { - loadRestrictionList(); - } - if (key === STORAGE_NOTIFICATION_LIST) { - loadNotificationList(); - } - if (key === STORAGE_NOTIFICATION_MESSAGE) { - loadNotificationMessage(); - } - if (key === SETTINGS_INTERVAL_INACTIVITY) { - storage.getValue(SETTINGS_INTERVAL_INACTIVITY, function(item) { setting_interval_inactivity = item; }); - } - if (key === SETTINGS_VIEW_TIME_IN_BADGE) { - storage.getValue(SETTINGS_VIEW_TIME_IN_BADGE, function(item) { setting_view_in_badge = item; }); - } - if (key === SETTINGS_BLOCK_DEFERRAL) { - storage.getValue(SETTINGS_BLOCK_DEFERRAL, function(item) { setting_block_deferral = item; }); - } - if (key === SETTINGS_DARK_MODE) { - storage.getValue(SETTINGS_DARK_MODE, function(item) { setting_dark_mode = item; }); - } - } - }); - - chrome.runtime.setUninstallURL("https://docs.google.com/forms/d/e/1FAIpQLSdImHtvey6sg5mzsQwWfAQscgZOOV52blSf9HkywSXJhuQQHg/viewform"); -} - -function loadTabs() { - storage.loadTabs(STORAGE_TABS, function(items) { - tabs = []; - if (items != undefined) { - for (var i = 0; i < items.length; i++) { - tabs.push(new Tab(items[i].url, items[i].favicon, items[i].days, items[i].summaryTime, items[i].counter)); - } - if (isNeedDeleteTimeIntervalFromTabs) - deleteTimeIntervalFromTabs(); - } - }); -} - -function deleteTimeIntervalFromTabs() { - tabs.forEach(function(item) { - item.days.forEach(function(day) { - if (day.time != undefined) - day.time = []; - }) - }) -} - -function deleteYesterdayTimeInterval() { - timeIntervalList = timeIntervalList.filter(x => x.day == todayLocalDate()); -} - -function loadBlackList() { - storage.getValue(STORAGE_BLACK_LIST, function(items) { - setting_black_list = items; - }) -} - -function loadTimeIntervals() { - storage.getValue(STORAGE_TIMEINTERVAL_LIST, function(items) { - timeIntervalList = []; - if (items != undefined) { - for (var i = 0; i < items.length; i++) { - timeIntervalList.push(new TimeInterval(items[i].day, items[i].domain, items[i].intervals)); - } - deleteYesterdayTimeInterval(); - } - }); -} - -function loadRestrictionList() { - storage.getValue(STORAGE_RESTRICTION_LIST, function(items) { - setting_restriction_list = items; - }) -} - -function loadNotificationList() { - storage.getValue(STORAGE_NOTIFICATION_LIST, function(items) { - setting_notification_list = items; - }); -} - -function loadNotificationMessage() { - storage.getValue(STORAGE_NOTIFICATION_MESSAGE, function(item) { - setting_notification_message = item; - if (isEmpty(setting_notification_message)) { - storage.saveValue(STORAGE_NOTIFICATION_MESSAGE, STORAGE_NOTIFICATION_MESSAGE_DEFAULT); - setting_notification_message = STORAGE_NOTIFICATION_MESSAGE_DEFAULT; - } - }); -} - -function loadSettings() { - storage.getValue(SETTINGS_INTERVAL_INACTIVITY, function(item) { setting_interval_inactivity = item; }); - storage.getValue(SETTINGS_VIEW_TIME_IN_BADGE, function(item) { setting_view_in_badge = item; }); - storage.getValue(SETTINGS_BLOCK_DEFERRAL, function(item) { setting_block_deferral = item; }); - storage.getValue(SETTINGS_DARK_MODE, function(item) { setting_dark_mode = item; }); -} - -function loadAddDataFromStorage() { - loadTabs(); - loadTimeIntervals(); - loadBlackList(); - loadRestrictionList(); - loadNotificationList(); - loadNotificationMessage(); - loadSettings(); -} - -function loadPermissions() { - checkPermissionsForYT(); - checkPermissionsForNetflix(); - checkPermissionsForNotifications(); -} - -function checkPermissionsForYT(callbackIfTrue, callbackIfFalse, ...props) { - chrome.permissions.contains({ - permissions: ['tabs'], - origins: ["https://www.youtube.com/*"] - }, function(result) { - if (callbackIfTrue != undefined && result) - callbackIfTrue(...props); - if (callbackIfFalse != undefined && !result) - callbackIfFalse(); - isHasPermissioForYouTube = result; - }); -} - -function checkPermissionsForNetflix(callbackIfTrue, callbackIfFalse, ...props) { - chrome.permissions.contains({ - permissions: ['tabs'], - origins: ["https://www.netflix.com/*"] - }, function(result) { - if (callbackIfTrue != undefined && result) - callbackIfTrue(...props); - if (callbackIfFalse != undefined && !result) - callbackIfFalse(); - isHasPermissioForNetflix = result; - }); -} - -function checkPermissionsForNotifications(callback, ...props) { - chrome.permissions.contains({ - permissions: ["notifications"] - }, function(result) { - if (callback != undefined && result) - callback(...props); - isHasPermissioForNotification = result; - }); -} - -function createFile(data, type, fileName) { - var file = new Blob([data], { type: type }); - var downloadLink; - downloadLink = document.createElement("a"); - downloadLink.download = fileName; - downloadLink.href = window.URL.createObjectURL(file); - downloadLink.style.display = "none"; - document.body.appendChild(downloadLink); - downloadLink.click(); - } - - function toCsv(tabsData) { - var str = "domain,date,time(sec)\r\n"; - for (var i = 0; i < tabsData.length; i++) { - for (var y = 0; y < tabsData[i].days.length; y++) { - var line = - tabsData[i].url + - "," + - new Date(tabsData[i].days[y].date).toLocaleDateString() + - "," + - tabsData[i].days[y].summary; - str += line + "\r\n"; - } - } - - createFile(str, "text/csv", "domains.csv"); - } - - function exportToCSV() { - storage.getValue(STORAGE_TABS, function (item) { - toCsv(item); - }); - } - - storage.getValue("SETTINGS_PERIODIC_HOUR_DOWNLOAD", function (hour) { - storage.getValue("SETTINGS_PERIODIC_MINUTE_DOWNLOAD", function (minute) { - if (typeof hour !== "number" || typeof minute !== "number") { - return; - } else { - autoDownloadCsv(hour, minute); - } - }); - }); - - function autoDownloadCsv(hour, minute) { - var now = new Date(); - var triggerTime = new Date( - now.getFullYear(), - now.getMonth(), - now.getDate(), - hour, - minute, - 0, - 0 - ); - - if (triggerTime < now) { - triggerTime.setDate(triggerTime.getDate() + 1); - } - chrome.alarms.create("periodic_Download", { - when: triggerTime.getTime(), - periodInMinutes: 1440, // 24 hours - }); - chrome.alarms.onAlarm.addListener(function (alarm) { - if (alarm.name === "periodic_Download") { - exportToCSV(); - } - }); - } - -loadPermissions(); -addListener(); -loadAddDataFromStorage(); -updateSummaryTime(); -updateStorage(); \ No newline at end of file diff --git a/src/scripts/block.js b/src/scripts/block.js deleted file mode 100644 index e2d34d0..0000000 --- a/src/scripts/block.js +++ /dev/null @@ -1,56 +0,0 @@ -"use strict"; - -var storage = new LocalStorage(); -var blockSiteUrl; -var blockSiteTime; -var blockSiteCounter; -var restrictionList = []; - -document.addEventListener("DOMContentLoaded", function () { - var url = new URL(document.URL); - blockSiteUrl = url.searchParams.get("url"); - blockSiteTime = url.searchParams.get("summaryTime"); - blockSiteCounter = url.searchParams.get("counter"); - document.getElementById("site").innerText = extractHostname(blockSiteUrl); - document.getElementById("deferredTime").innerText = convertShortSummaryTimeToString(blockSiteTime); - document.getElementById("deferredCount").innerText = blockSiteCounter; - - storage.getValue(STORAGE_RESTRICTION_LIST, function (items) { - restrictionList = items; - if (restrictionList === undefined) restrictionList = []; - var currentItem = restrictionList.find((x) => - isDomainEquals(extractHostname(x.domain), extractHostname(blockSiteUrl)) - ); - if (currentItem !== undefined) { - document.getElementById("limit").innerText = - convertShortSummaryTimeToString(currentItem.time); - } - }); - - storage.getValue(SETTINGS_BLOCK_DEFERRAL, function (item) { - var deferBtn = document.getElementById("deffererBtn"); - if (item) { - deferBtn.addEventListener("click", function () { - chrome.runtime.getBackgroundPage(function (bg) { - let defList = bg.deferredRestrictionsList; - if (defList == undefined) defList = []; - defList.push({ - site: blockSiteUrl, - dateOfDeferred: new Date().getTime(), - }); - - bg.deferredRestrictionsList = defList; - - chrome.tabs.query( - { currentWindow: true, active: true }, - function (tab) { - chrome.tabs.update(tab.id, { url: blockSiteUrl }); - } - ); - }); - }); - } else { - deferBtn.remove(); - } - }); -}); diff --git a/src/scripts/chart/chart-core.js b/src/scripts/chart/chart-core.js deleted file mode 100644 index 7b859ad..0000000 --- a/src/scripts/chart/chart-core.js +++ /dev/null @@ -1,528 +0,0 @@ -function donutChart() { - var width, - height, - darkMode, - margin = { top: 10, right: 10, bottom: 0, left: 10 }, - colour = d3.scaleOrdinal(d3.schemeCategory20), // colour scheme - variable, // value in data that will dictate proportions on chart - category, // compare data by - padAngle, // effectively dictates the gap between slices - floatFormat = d3.format('.4r'), - cornerRadius, // sets how rounded the corners are on each slice - percentFormat = d3.format(',.2%'); - - function chart(selection) { - selection.each(function (data) { - // generate chart - - // =========================================================================================== - // Set up constructors for making donut. See https://github.com/d3/d3-shape/blob/master/README.md - var radius = 110; - - // creates a new pie generator - var pie = d3.pie() - .value(function (d) { return floatFormat(d[variable]); }) - .sort(null); - - // contructs and arc generator. This will be used for the donut. The difference between outer and inner - // radius will dictate the thickness of the donut - var arc = d3.arc() - .outerRadius(radius) - .innerRadius(radius * 0.75) - .cornerRadius(cornerRadius) - .padAngle(padAngle); - - // =========================================================================================== - // append the svg object to the selection - var svg = selection.append('svg') - .attr('width', width + margin.left + margin.right) - .attr('height', height + margin.top + margin.bottom) - .attr('class', 'backColorChart') - .append('g') - .attr('transform', 'translate(' + (width / 2 - 105) + ',' + (height / 2) + ')'); - // =========================================================================================== - - // =========================================================================================== - // g elements to keep elements within svg modular - svg.append('g').attr('class', 'slices'); - svg.append('g').attr('class', 'labelName'); - svg.append('g').attr('class', 'lines'); - // =========================================================================================== - - // =========================================================================================== - // add and colour the donut slices - var path = svg.select('.slices') - .datum(data).selectAll('path') - .data(pie) - .enter().append('path') - .attr('fill', function (d) { return colour(d.data[category]); }) - .attr('d', arc) - .attr('id', function (d) { return d.data[category]; }); - // =========================================================================================== - - var legendG = svg.selectAll(".legend") // note appending it to mySvg and not svg to make positioning easier - .data(pie(data)) - .enter().append("g") - .attr("transform", function (d, i) { - return "translate(" + (130) + "," + (i * 20 - 100) + ")"; // place each legend on the right and bump each one down 15 pixels - }) - .attr("class", "legend"); - - if (darkMode) - legendG.style("fill", "#ffffff"); - else legendG.style("fill", "black"); - - legendG.append("rect") // make a matching color rect - .attr("width", 10) - .attr("height", 10) - .attr("fill", function (d, i) { - return colour(d.data[category]); - }); - - if (darkMode) - legendG.append("text") // add the text - .text(function (d) { - return d.data.url; - }) - .style("font-size", 13) - .style('fill', '#ffffff') - .attr("y", 10) - .attr("x", 13); - else - legendG.append("text") // add the text - .text(function (d) { - return d.data.url; - }) - .style("fill", "black") - .style("font-size", 14) - .attr("y", 10) - .attr("x", 15); - - // =========================================================================================== - // add tooltip to mouse events on slices and labels - d3.selectAll('.labelName text, .slices path').call(toolTip); - // =========================================================================================== - - // =========================================================================================== - // Functions - - // calculates the angle for the middle of a slice - function midAngle(d) { return d.startAngle + (d.endAngle - d.startAngle) / 2; } - - // function that creates and adds the tool tip to a selected element - function toolTip(selection) { - - // add tooltip (svg circle element) when mouse enters label or slice - selection.on('mouseenter', function (data) { - d3.selectAll('.toolCircle').remove(); - if (darkMode) - svg.append('text') - .attr('class', 'toolCircle') - .attr('dy', -15) // hard-coded. can adjust this to adjust text vertical alignment in tooltip - .html(toolTipHTML(data)) // add text to the circle. - .style('font-size', '.9em') - .style('fill', '#ffffff') - .style('text-anchor', 'middle'); // centres text in tooltip - else - svg.append('text') - .attr('class', 'toolCircle') - .attr('dy', -15) - .html(toolTipHTML(data)) - .style('font-size', '.9em') - .style('text-anchor', 'middle'); - - svg.append('circle') - .attr('class', 'toolCircle') - .attr('r', radius * 0.75) // radius of tooltip circle - .style('fill', 'white') // colour based on category mouse is over - .style('fill-opacity', 0.35); - - }); - - // remove the tooltip when mouse leaves the slice/label - // selection.on('mouseout', function () { - // d3.selectAll('.toolCircle').remove(); - // }); - } - - // function to create the HTML string for the tool tip. Loops through each key in data object - // and returns the html string key: value - function toolTipHTML(data) { - - var tip = '', - i = 0; - - for (var key in data.data) { - - // if value is a number, format it as a percentage - var value = (!isNaN(parseFloat(data.data[key]))) ? percentFormat(data.data[key]) : data.data[key]; - if (key === 'summary') - value = convertSummaryTimeToString(data.data[key]); - if (key === 'visits' && data.data[key] !== undefined) - value = data.data[key] + ' visits'; - var className = ''; - if (key === 'percentage') - className = 'class="percentageValue"'; - - // leave off 'dy' attr for first tspan so the 'dy' attr on text element works. The 'dy' attr on - // tspan effectively imitates a line break. - if (i === 0) tip += '' + value + ''; - else tip += '' + value + ''; - i++; - } - - return tip; - } - - function angleIsInRangeDifference(tempAngle, currentAngle, difference) { - return currentAngle < (tempAngle + difference) && currentAngle > (tempAngle - difference); - } - // =========================================================================================== - - }); - } - - chart.width = function (value) { - if (!arguments.length) return width; - width = value; - return chart; - }; - - chart.height = function (value) { - if (!arguments.length) return height; - height = value; - return chart; - }; - - chart.darkMode = function (value) { - if (!arguments.length) return darkMode; - darkMode = value; - return chart; - }; - - chart.margin = function (value) { - if (!arguments.length) return margin; - margin = value; - return chart; - }; - - chart.radius = function (value) { - if (!arguments.length) return radius; - radius = value; - return chart; - }; - - chart.padAngle = function (value) { - if (!arguments.length) return padAngle; - padAngle = value; - return chart; - }; - - chart.cornerRadius = function (value) { - if (!arguments.length) return cornerRadius; - cornerRadius = value; - return chart; - }; - - chart.colour = function (value) { - if (!arguments.length) return colour; - colour = value; - return chart; - }; - - chart.variable = function (value) { - if (!arguments.length) return variable; - variable = value; - return chart; - }; - - chart.category = function (value) { - if (!arguments.length) return category; - category = value; - return chart; - }; - - return chart; -} - -function barChart(data, darkMode) { - var margin = { top: 25, right: 5, bottom: 25, left: 5 }, - width = 555, - height = 160; - - // set the ranges - var x = d3.scaleBand() - .range([0, width]) - .padding(0.1); - var y = d3.scaleLinear() - .range([height, 0]); - - // append the svg object to the body of the page - // append a 'group' element to 'svg' - // moves the 'group' element to the top left margin - var svg = d3.select("#barChart").append("svg") - .attr("width", width + margin.left + margin.right) - .attr("height", height + margin.top + margin.bottom) - .append("g") - .attr("transform", - "translate(" + margin.left + "," + margin.top + ")"); - - var tip = d3.tip() - .attr('class', 'd3-tip') - .offset([-10, 0]) - .html(function (d) { - if (data.length > 9) - return "" + new Date(d.date).toLocaleDateString() + "
    " + convertShortSummaryTimeToString(d.total) + ""; - else - return "" + convertShortSummaryTimeToString(d.total) + ""; - }); - - svg.call(tip); - - // Scale the range of the data in the domains - x.domain(data.map(function (d) { return new Date(d.date).toLocaleDateString(); })); - y.domain([0, d3.max(data, function (d) { return d.total; })]); - - // append the rectangles for the bar chart - svg.selectAll(".bar") - .data(data) - .enter().append("rect") - .attr("class", "bar") - .attr("x", function (d) { return x(new Date(d.date).toLocaleDateString()); }) - .attr("width", x.bandwidth()) - .attr("y", function (d) { return y(d.total); }) - .attr("height", function (d) { return height - y(d.total); }) - .on('mouseover', tip.show) - .on('mouseout', tip.hide); - - // add the x Axis - svg.append("g") - .attr("transform", "translate(0," + height + ")") - .style("stroke", darkMode ? "white" : "") - .style("stroke-width", darkMode ? "0.5px" : "") - .call(d3.axisBottom(x)); - - if (data.length > 9) - document.querySelectorAll('#barChart g.tick ').forEach(element => { element.remove() }); - - if (darkMode){ - document.querySelector("#barChart path").setAttribute("stroke", "white"); - document.querySelectorAll('#barChart g.tick line').forEach(element => { element.setAttribute("stroke", "white") }); - } -} - -function drawIntervalChart(data) { - data.forEach(function (item) { - var hFrom = getHourFrom(item.interval); - var hTo = getHourTo(item.interval); - if (hFrom != hTo) { - var sourceTimeFrom = item.interval.split('-')[0].split(':'); - var sourceTimeTo = item.interval.split('-')[1].split(':'); - var timeTo = sourceTimeFrom[0] + ":" + 59 + ":" + 59; - var timeFrom = sourceTimeTo[0] + ":" + 00 + ":" + 00; - data.push({ "domain": item.domain, "interval": item.interval.split('-')[0] + "-" + timeTo }); - data.push({ "domain": item.domain, "interval": timeFrom + "-" + item.interval.split('-')[1] }); - } - }); - - var margin = { top: 5, right: 10, bottom: 20, left: 20 }, - width = 580 - margin.left - margin.right, - height = 410 - margin.top - margin.bottom; - - //linear 24 hour scale - var y = d3.scaleLinear() - .domain([0, 60]) - .range([height, 0]); - - //vertical axis - var yAxis = d3.axisLeft() - .ticks(10) - .scale(y); - - var x = d3.scaleLinear() - .domain([0, 24]) - .range([0, width]); - - //vertical axis - var xAxis = d3.axisBottom() - .ticks(24) - .scale(x) - - var tickDistance = 4.38; - - var tooltip; - if (document.body.classList.contains('dark-mode')) - tooltip = d3.select("#timeChart") - .append("div") - .style("opacity", 0) - .style("display", "none") - .style("position", "absolute") - .attr("class", "tooltip") - .style("background-color", "#cbcbcb") - .style("color", "black") - .style("border", "solid") - .style("border-width", "1px") - .style("border-radius", "5px") - .style("padding", "5px") - else - tooltip = d3.select("#timeChart") - .append("div") - .style("opacity", 0) - .style("display", "none") - .style("position", "absolute") - .attr("class", "tooltip") - .style("background-color", "white") - .style("color", "black") - .style("border", "solid") - .style("border-width", "1px") - .style("border-radius", "5px") - .style("padding", "5px") - - // Three function that change the tooltip when user hover / move / leave a cell - var mouseover = function (d) { - tooltip - .style("opacity", 1) - .style("display", "block") - d3.select(this) - .style("stroke", "black") - .style("stroke-width", "0.5px") - .style("opacity", 1) - } - var mousemove = function (d) { - tooltip - .html(d.domain + "
    " + d.interval) - .style("left", (d3.mouse(this)[0]) + 10 + "px") - .style("top", (d3.mouse(this)[1]) + 30 + "px") - } - var mouseleave = function (d) { - tooltip - .style("opacity", 0) - .style("display", "none") - d3.select(this) - .style("stroke", "none") - .style("opacity", 0.8) - } - - //create the svg - var svg; - if (document.body.classList.contains('dark-mode')) - svg = d3.select("#timeChart").append("svg") - .style('background-color', '#383838') - .attr("width", width + margin.left + margin.right) - .attr("height", height + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); - else - svg = d3.select("#timeChart").append("svg") - .attr("width", width + margin.left + margin.right) - .attr("height", height + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); - - //draw the axis. - svg.append("g") - .attr("class", "x axis") - .attr("transform", "translate(0," + height + ")") - .attr("class", "label") - .call(xAxis) - .append("text") - .text("Value"); - - // Add a y-axis with label. - svg.append("g") - .attr("class", "y axis") - .call(yAxis) - .append("text") - .attr("class", "label") - .attr("y", 6) - .attr("dy", ".71em") - .attr("text-anchor", "end") - .attr("transform", "rotate(-90)") - .text("Value"); - - svg.append("g") - .attr("class", "grid") - .attr("transform", "translate(0," + height + ")") - .call(make_x_axis() - .tickSize(-height, 0, 0) - ) - - svg.append("g") - .attr("class", "grid") - .call(make_y_axis() - .tickSize(-width, 0, 0) - ) - - //draw the bars, offset y and bar height based on data - svg.selectAll(".bar") - .data(data) - .enter() - .append("rect") - .style("fill", "orangered") - .style("stroke", "#f1f1f1") - .style("stroke-width", "1") - .attr("class", "bar") - .attr("x", function (d) { - return x(getHourFrom(d.interval)) + 2; - }) - .attr("width", 20) - .attr("y", function (d) { - return y(getMinutesTo(d.interval)) - 1; - }) - .attr("height", function (d) { - var offset = getMinutesTo(d.interval) - getMinutesFrom(d.interval); - if (offset == 0) { - var offsetSeconds = getSecondsTo(d.interval) - getSecondsFrom(d.interval); - if (offsetSeconds <= 3) - return 0; - else - return 1; - } - else return offset * tickDistance; - }) - .on("mouseover", mouseover) - .on("mousemove", mousemove) - .on("mouseleave", mouseleave); - - function make_x_axis() { - return d3.axisBottom() - .scale(x) - .ticks(24) - } - - function make_y_axis() { - return d3.axisLeft() - .scale(y) - .ticks(10) - } - - function getHourFrom(interval) { - var time = interval.split('-')[0]; - return time.split(':')[0]; - } - - function getHourTo(interval) { - var time = interval.split('-')[1]; - return time.split(':')[0]; - } - - function getMinutesFrom(interval) { - var time = interval.split('-')[0]; - return time.split(':')[1]; - } - - function getMinutesTo(interval) { - var time = interval.split('-')[1]; - return time.split(':')[1]; - } - - function getSecondsFrom(interval) { - var time = interval.split('-')[0]; - return time.split(':')[2]; - } - - function getSecondsTo(interval) { - var time = interval.split('-')[1]; - return time.split(':')[2]; - } -} \ No newline at end of file diff --git a/src/scripts/chart/d3.v4.min.js b/src/scripts/chart/d3.v4.min.js deleted file mode 100644 index ffe427c..0000000 --- a/src/scripts/chart/d3.v4.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(t.d3=t.d3||{})}(this,function(I){"use strict";function a(t,n){return t>>1;o(t[i],n)<0?e=i+1:r=i}return e},right:function(t,n,e,r){for(null==e&&(e=0),null==r&&(r=t.length);e>>1;0>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1):(n=Xs.exec(t))?At(parseInt(n[1],16)):(n=Vs.exec(t))?new Rt(n[1],n[2],n[3],1):(n=$s.exec(t))?new Rt(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=Ws.exec(t))?Ct(n[1],n[2],n[3],n[4]):(n=Zs.exec(t))?Ct(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=Gs.exec(t))?Lt(n[1],n[2]/100,n[3]/100,1):(n=Qs.exec(t))?Lt(n[1],n[2]/100,n[3]/100,n[4]):Js.hasOwnProperty(t)?At(Js[t]):"transparent"===t?new Rt(NaN,NaN,NaN,0):null}function At(t){return new Rt(t>>16&255,t>>8&255,255&t,1)}function Ct(t,n,e,r){return r<=0&&(t=n=e=NaN),new Rt(t,n,e,r)}function zt(t){return t instanceof St||(t=Et(t)),t?new Rt((t=t.rgb()).r,t.g,t.b,t.opacity):new Rt}function Pt(t,n,e,r){return 1===arguments.length?zt(t):new Rt(t,n,e,null==r?1:r)}function Rt(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}function Lt(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||1<=e?t=n=NaN:n<=0&&(t=NaN),new Dt(t,n,e,r)}function qt(t,n,e,r){return 1===arguments.length?function(t){if(t instanceof Dt)return new Dt(t.h,t.s,t.l,t.opacity);if(t instanceof St||(t=Et(t)),!t)return new Dt;if(t instanceof Dt)return t;var n=(t=t.rgb()).r/255,e=t.g/255,r=t.b/255,i=Math.min(n,e,r),o=Math.max(n,e,r),u=NaN,a=o-i,c=(o+i)/2;return a?(u=n===o?(e-r)/a+6*(ea&&(i=r.slice(a,i),s[c]?s[c]+=i:s[++c]=i),(n=n[0])===(e=e[0])?s[c]?s[c]+=e:s[++c]=e:(s[++c]=null,f.push({i:c,x:un(n,e)})),a=Nf.lastIndex;return ae._time&&(r=e._time),(t=e)._next):(n=e._next,e._next=null,t?t._next=n:mf=n);xf=t,Nn(r)}(),Bf=0}}function Tn(){var t=jf.now(),n=t-Yf;IfWf)throw new Error("too late; already scheduled");return e}function An(t,n){var e=Cn(t,n);if(e.state>Gf)throw new Error("too late; already started");return e}function Cn(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function zn(t,n){var e,r,i,o=t.__transition,u=!0;if(o){for(i in n=null==n?null:n+"",o)(e=o[i]).name===n?(r=e.state>Gf&&e.stateMath.abs(t[1]-C[1])?v=!0:d=!0),C=t,p=!0,Vn(),n()}function n(){var t;switch(l=C[0]-A[0],h=C[1]-A[1],y){case xl:case ml:m&&(l=Math.max(T-r,Math.min(k-a,l)),i=r+l,c=a+l),x&&(h=Math.max(N-o,Math.min(S-s,h)),u=o+h,f=s+h);break;case bl:m<0?(l=Math.max(T-r,Math.min(k-r,l)),i=r+l,c=a):0=o?c=!0:10===(n=r.charCodeAt(u++))?s=!0:13===n&&(s=!0,10===r.charCodeAt(u)&&++u),r.slice(e+1,t-1).replace(/""/g,'"')}for(;u=(o=(v+_)/2))?v=o:_=o,(f=e>=(u=(g+y)/2))?g=u:y=u,!(p=(i=p)[l=f<<1|s]))return i[l]=d,t;if(a=+t._x.call(null,p.data),c=+t._y.call(null,p.data),n===a&&e===c)return d.next=p,i?i[l]=d:t._root=d,t;for(;i=i?i[l]=new Array(4):t._root=new Array(4),(s=n>=(o=(v+_)/2))?v=o:_=o,(f=e>=(u=(g+y)/2))?g=u:y=u,(l=f<<1|s)==(h=(u<=c)<<1|o<=a););return i[h]=p,i[l]=d,t}function xe(t,n,e,r,i){this.node=t,this.x0=n,this.y0=e,this.x1=r,this.y1=i}function be(t){return t[0]}function we(t){return t[1]}function Me(t,n,e){var r=new Te(null==n?be:n,null==e?we:e,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function Te(t,n,e,r,i,o){this._x=t,this._y=n,this._x0=e,this._y0=r,this._x1=i,this._y1=o,this._root=void 0}function Ne(t){for(var n={data:t.data},e=n;t=t.next;)e=e.next={data:t.data};return n}function ke(t){return t.x+t.vx}function Se(t){return t.y+t.vy}function Ee(t){return t.index}function Ae(t,n){var e=t.get(n);if(!e)throw new Error("missing: "+n);return e}function Ce(t){return t.x}function ze(t){return t.y}function Pe(t,n){if((e=(t=n?t.toExponential(n-1):t.toExponential()).indexOf("e"))<0)return null;var e,r=t.slice(0,e);return[1i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}function qe(t){return new De(t)}function De(t){if(!(n=ih.exec(t)))throw new Error("invalid format: "+t);var n,e=n[1]||" ",r=n[2]||">",i=n[3]||"-",o=n[4]||"",u=!!n[5],a=n[6]&&+n[6],c=!!n[7],s=n[8]&&+n[8].slice(1),f=n[9]||"";"n"===f?(c=!0,f="g"):rh[f]||(f=""),(u||"0"===e&&"="===r)&&(u=!0,e="0",r="="),this.fill=e,this.align=r,this.sign=i,this.symbol=o,this.zero=u,this.width=a,this.comma=c,this.precision=s,this.type=f}function Ue(t){return t}function Oe(t){function u(t){function n(t){var n,e,r,i=_,o=y;if("c"===g)o=m(t)+o,t="";else{var u=(t=+t)<0;if(t=m(Math.abs(t),v),u&&0==+t&&(u=!1),i=(u?"("===l?l:"-":"-"===l||"("===l?"":l)+i,o=("s"===g?uh[8+nh/3]:"")+o+(u&&"("===l?")":""),x)for(n=-1,e=t.length;++n>1)+i+t+o+c.slice(a);break;default:t=c+i+t+o}return M(t)}var s=(t=qe(t)).fill,f=t.align,l=t.sign,e=t.symbol,h=t.zero,p=t.width,d=t.comma,v=t.precision,g=t.type,_="$"===e?r[0]:"#"===e&&/[boxX]/.test(g)?"0"+g.toLowerCase():"",y="$"===e?r[1]:/[%p]/.test(g)?i:"",m=rh[g],x=!g||/[defgprs%]/.test(g);return v=null==v?g?6:12:/[gprs]/.test(g)?Math.max(1,Math.min(21,v)):Math.max(0,Math.min(20,v)),n.toString=function(){return t+""},n}var n,a,c,b=t.grouping&&t.thousands?(a=t.grouping,c=t.thousands,function(t,n){for(var e=t.length,r=[],i=0,o=a[0],u=0;0n));)o=a[i=(i+1)%a.length];return r.reverse().join(c)}):Ue,r=t.currency,w=t.decimal,M=t.numerals?(n=t.numerals,function(t){return t.replace(/[0-9]/g,function(t){return n[+t]})}):Ue,i=t.percent||"%";return{format:u,formatPrefix:function(t,n){var e=u(((t=qe(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(Re(n)/3))),i=Math.pow(10,-r),o=uh[8+r/3];return function(t){return e(i*t)+o}}}}function Fe(t){return oh=Oe(t),I.format=oh.format,I.formatPrefix=oh.formatPrefix,oh}function Ie(t){return Math.max(0,-Re(Math.abs(t)))}function Ye(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Re(n)/3)))-Re(Math.abs(t)))}function Be(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,Re(n)-Re(t))+1}function He(){return new je}function je(){this.reset()}function Xe(t,n,e){var r=t.s=n+e,i=r-n,o=r-i;t.t=n-o+(e-i)}function Ve(t){return 1vh&&(vh=o):s^(a*gh<(c=(c+360)%360-180)&&cyr(hh,dh)&&(dh=t):yr(t,dh)>yr(hh,dh)&&(hh=t):hh<=dh?(tyr(hh,dh)&&(dh=t):yr(t,dh)>yr(hh,dh)&&(hh=t)}else xh.push(bh=[hh=t,dh=t]);nFh&&(hh=-(dh=180)),bh[0]=hh,bh[1]=dh,mh=null}function yr(t,n){return(n-=t)<0?n+360:n}function mr(t,n){return t[0]-n[0]}function xr(t,n){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nk}function d(t,n,e){var r=[1,0,0],i=ar(or(t),or(n)),o=ur(i,i),u=i[0],a=o-u*u;if(!a)return!e&&t;var c=k*o/a,s=-k*u/a,f=ar(r,i),l=sr(r,c);cr(l,sr(i,s));var h=f,p=ur(l,h),d=ur(h,h),v=p*p-d*(ur(l,l)-1);if(!(v<0)){var g=ep(v),_=sr(h,(-p-g)/d);if(cr(_,l),_=ir(_),!e)return _;var y,m=t[0],x=n[0],b=t[1],w=n[1];xFh;return $r(p,function(a){var c,s,f,l,h;return{lineStart:function(){l=f=!1,h=1},point:function(t,n){var e,r=[t,n],i=p(t,n),o=g?i?0:v(t,n):i?v(t+(t<0?Ih:-Ih),n):0;if(!c&&(l=f=i)&&a.lineStart(),i!==f&&(!(e=d(c,r))||Br(c,e)||Br(r,e))&&(r[0]+=Fh,r[1]+=Fh,i=p(r[0],r[1])),i!==f)h=0,i?(a.lineStart(),e=d(r,c),a.point(e[0],e[1])):(e=d(c,r),a.point(e[0],e[1]),a.lineEnd()),c=e;else if(_&&c&&g^i){var u;o&s||!(u=d(r,c,!0))||(h=0,g?(a.lineStart(),a.point(u[0][0],u[0][1]),a.point(u[1][0],u[1][1]),a.lineEnd()):(a.point(u[1][0],u[1][1]),a.lineEnd(),a.lineStart(),a.point(u[0][0],u[0][1])))}!i||c&&Br(c,r)||a.point(r[0],r[1]),c=r,f=i,s=o},lineEnd:function(){f&&a.lineEnd(),c=null},clean:function(){return h|(l&&f)<<1}}},function(t,n,e,r){Fr(r,i,o,e,t,n)},g?[0,-i]:[-Ih,i-Ih])}function Qr(_,y,m,x){function b(t,n){return _<=t&&t<=m&&y<=n&&n<=x}function w(t,n,e,r){var i=0,o=0;if(null==t||(i=u(t,e))!==(o=u(n,e))||a(t,n)<0^0Fh}).map(f)).concat(N(Gh(a/v)*v,u,v).filter(function(t){return Vh(t%_)>Fh}).map(l))}var e,r,i,o,u,a,c,s,f,l,h,p,d=10,v=d,g=90,_=360,y=2.5;return n.lines=function(){return t().map(function(t){return{type:"LineString",coordinates:t}})},n.outline=function(){return{type:"Polygon",coordinates:[h(o).concat(p(c).slice(1),h(i).reverse().slice(1),p(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.extentMajor(t).extentMinor(t):n.extentMinor()},n.extentMajor=function(t){return arguments.length?(o=+t[0][0],i=+t[1][0],s=+t[0][1],c=+t[1][1],id){f-=a;break}d=p}_.push(u={value:f,dice:cvg){var a=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*a-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*a-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>vg){var s=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,f=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*s+t._x1*t._l23_2a-n*t._l12_2a)/f,u=(u*s+t._y1*t._l23_2a-e*t._l12_2a)/f}t._context.bezierCurveTo(r,i,o,u,t._x2,t._y2)}function wc(t,n){this._context=t,this._alpha=n}function Mc(t,n){this._context=t,this._alpha=n}function Tc(t,n){this._context=t,this._alpha=n}function Nc(t){this._context=t}function kc(t){return t<0?-1:1}function Sc(t,n,e){var r=t._x1-t._x0,i=n-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),u=(e-t._y1)/(i||r<0&&-0),a=(o*i+u*r)/(r+i);return(kc(o)+kc(u))*Math.min(Math.abs(o),Math.abs(u),.5*Math.abs(a))||0}function Ec(t,n){var e=t._x1-t._x0;return e?(3*(t._y1-t._y0)/e-n)/2:n}function Ac(t,n,e){var r=t._x0,i=t._y0,o=t._x1,u=t._y1,a=(o-r)/3;t._context.bezierCurveTo(r+a,i+a*n,o-a,u-a*e,o,u)}function Cc(t){this._context=t}function zc(t){this._context=new Pc(t)}function Pc(t){this._context=t}function Rc(t){this._context=t}function Lc(t){var n,e,r=t.length-1,i=new Array(r),o=new Array(r),u=new Array(r);for(o[i[0]=0]=2,u[0]=t[0]+2*t[1],n=1;n=i)return}else c=[v,e];o=[v,i]}else{if(c){if(c[1]=i)return}else c=[(e-a)/u,e];o=[(i-a)/u,i]}else{if(c){if(c[1]=r)return}else c=[n,u*n+a];o=[r,u*r+a]}else{if(c){if(c[0]Jg)a=a.L;else{if(!((i=o-function(t,n){var e=t.N;if(e)return as(e,n);var r=t.site;return r[1]===n?r[0]:1/0}(a,u))>Jg)){-JgJg||Math.abs(i[0][1]-i[1][1])>Jg)||delete Zg[o]})(u,a,c,s),function(t,n,e,r){var i,o,u,a,c,s,f,l,h,p,d,v,g,_,y=$g.length,m=!0;for(i=0;iJg||Math.abs(v-h)>Jg)&&(c.splice(a,0,Zg.push(Gc(u,p,Math.abs(d-t)h||(o=c.y0)>p||(u=c.x1)=(a=(d+g)/2))?d=a:g=a,(f=u>=(c=(v+_)/2))?v=c:_=c,!(p=(n=p)[l=f<<1|s]))return this;if(!p.length)break;(n[l+1&3]||n[l+2&3]||n[l+3&3])&&(e=n,h=l)}for(;p.data!==t;)if(!(p=(r=p).next))return this;return(i=p.next)&&delete p.next,r?i?r.next=i:delete r.next:n?(i?n[l]=i:delete n[l],(p=n[0]||n[1]||n[2]||n[3])&&p===(n[3]||n[2]||n[1]||n[0])&&!p.length&&(e?e[h]=p:this._root=p)):this._root=i,this},th.removeAll=function(t){for(var n=0,e=t.length;n=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;qe.prototype=De.prototype,De.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(null==this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(null==this.precision?"":"."+Math.max(0,0|this.precision))+this.type};var oh,uh=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];Fe({decimal:".",thousands:",",grouping:[3],currency:["$",""]}),je.prototype={constructor:je,reset:function(){this.s=this.t=0},add:function(t){Xe(Oh,t,this.t),Xe(this,Oh.s,this.s),this.s?this.t+=Oh.t:this.s=Oh.t},valueOf:function(){return this.s}};var ah,ch,sh,fh,lh,hh,ph,dh,vh,gh,_h,yh,mh,xh,bh,wh,Mh,Th,Nh,kh,Sh,Eh,Ah,Ch,zh,Ph,Rh,Lh,qh,Dh,Uh,Oh=new je,Fh=1e-6,Ih=Math.PI,Yh=Ih/2,Bh=Ih/4,Hh=2*Ih,jh=180/Ih,Xh=Ih/180,Vh=Math.abs,$h=Math.atan,Wh=Math.atan2,Zh=Math.cos,Gh=Math.ceil,Qh=Math.exp,Jh=Math.log,Kh=Math.pow,tp=Math.sin,np=Math.sign||function(t){return 0Fh?$h((tp(r)*(a=Zh(o))*tp(i)-tp(o)*(u=Zh(r))*tp(e))/(u*a*c)):(r+o)/2,l.point(v,d),l.lineEnd(),l.lineStart(),l.point(s,d),h=0),l.point(p=t,d=n),v=s},lineEnd:function(){l.lineEnd(),p=d=NaN},clean:function(){return 2-h}}},function(t,n,e,r){var i;if(null==t)i=e*Yh,r.point(-Ih,i),r.point(0,i),r.point(Ih,i),r.point(Ih,0),r.point(Ih,-i),r.point(0,-i),r.point(-Ih,-i),r.point(-Ih,0),r.point(-Ih,i);else if(Vh(t[0]-n[0])>Fh){var o=t[0]Fh&&0<--i);return[t/(.8707+(o=r*r)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),r]},eo.invert=Vi($e),ro.invert=Vi(function(t){return 2*$h(t)}),io.invert=function(t,n){return[-n,2*$h(Qh(t))-Yh]},po.prototype=so.prototype={constructor:po,count:function(){return this.eachAfter(co)},each:function(t){var n,e,r,i,o=this,u=[o];do{for(n=u.reverse(),u=[];o=n.pop();)if(t(o),e=o.children)for(r=0,i=e.length;r=e)return null;for(var r=u-c.site[0],i=a-c.site[1],l=r*r+i*i;c=s.cells[n=f],f=null,c.halfedges.forEach(function(t){var n=s.edges[t],e=n.left;if(e!==c.site&&e||(e=n.right)){var r=u-e[0],i=a-e[1],o=r*r+i*i;oa;)c.pop(),--s;var f,l=new Array(s+1);for(n=0;n<=s;++n)(f=l[n]=[]).x0=0=v.length)return null!=p&&t.sort(p),null!=d?d(t):t;for(var n,o,u,a=-1,c=t.length,s=v[e++],f=ce(),l=r();++av.length)return t;var i,o=u[r-1];return null!=d&&r>=v.length?i=t.entries():(i=[],t.each(function(t,n){i.push({key:n,values:e(t,r)})})),null!=o?i.sort(function(t,n){return o(t.key,n.key)}):i}(h(t,0,le,he),0)},key:function(t){return v.push(t),n},sortKeys:function(t){return u[v.length-1]=t,n},sortValues:function(t){return p=t,n},rollup:function(t){return d=t,n}}},I.set=de,I.map=ce,I.keys=function(t){var n=[];for(var e in t)n.push(e);return n},I.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},I.entries=function(t){var n=[];for(var e in t)n.push({key:e,value:t[e]});return n},I.color=Et,I.rgb=Pt,I.hsl=qt,I.lab=Ft,I.hcl=Xt,I.cubehelix=$t,I.dispatch=z,I.drag=function(){function d(t){t.on("mousedown.drag",n).filter(g).on("touchstart.drag",i).on("touchmove.drag",o).on("touchend.drag touchcancel.drag",u).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function n(){if(!l&&h.apply(this,arguments)){var t=a("mouse",p.apply(this,arguments),pt,this,arguments);t&&(ct(I.event.view).on("mousemove.drag",e,!0).on("mouseup.drag",r,!0),_t(I.event.view),vt(),f=!1,c=I.event.clientX,s=I.event.clientY,t("start"))}}function e(){if(gt(),!f){var t=I.event.clientX-c,n=I.event.clientY-s;f=xl.index){var c=h-o.x-o.vx,s=p-o.y-o.vy,f=c*c+s*s;ft.r&&(t.r=t[n].r)}function e(){if(o){var t,n,e=o.length;for(u=new Array(e),t=0;tyr(r[0],r[1])&&(r[1]=i[1]),yr(i[0],r[1])>yr(r[0],r[1])&&(r[0]=i[0])):o.push(r=i);for(u=-1/0,n=0,r=o[e=o.length-1];n<=e;r=i,++n)i=o[n],(a=yr(r[1],i[0]))>u&&(u=a,hh=i[0],dh=r[1])}return xh=bh=null,hh===1/0||ph===1/0?[[NaN,NaN],[NaN,NaN]]:[[hh,ph],[dh,vh]]},I.geoCentroid=function(t){wh=Mh=Th=Nh=kh=Sh=Eh=Ah=Ch=zh=Ph=0,Ke(t,lp);var n=Ch,e=zh,r=Ph,i=n*n+e*e+r*r;return i<1e-12&&(n=Sh,e=Eh,r=Ah,Mhe.x&&(e=t),t.depth>r.depth&&(r=t)});var i=n===e?1:m(n,e)/2,o=i-n.x,u=h/(e.x+i+o),a=p/(r.depth||1);c.eachBefore(function(t){t.x=(t.x+o)*u,t.y=t.depth*a})}return c}function s(u){var t=u.children,n=u.parent.children,e=u.i?n[u.i-1]:null;if(t){!function(t){for(var n,e=0,r=0,i=u.children,o=i.length;0<=--o;)(n=i[o]).z+=e,n.m+=e,e+=n.s+(r+=n.c)}();var r=(t[0].z+t[t.length-1].z)/2;e?(u.z=e.z+m(u._,e._),u.m=u.z-r):u.z=r}else e&&(u.z=e.z+m(u._,e._));u.parent.A=function(t,n,e){if(n){for(var r,i=t,o=t,u=n,a=i.parent.children[0],c=i.m,s=o.m,f=u.m,l=a.m;u=Fo(u),i=Oo(i),u&&i;)a=Oo(a),(o=Fo(o)).a=t,0<(r=u.z+f-i.z-c+m(u._,i._))&&(_=t,y=e,h=(g=u).a.parent===_.parent?g.a:y,void 0,v=(d=r)/((p=t).i-h.i),p.c-=v,p.s+=d,h.c+=v,p.z+=d,p.m+=d,c+=r,s+=r),f+=u.m,c+=i.m,l+=a.m,s+=o.m;u&&!Fo(o)&&(o.t=u,o.m+=f-s),i&&!Oo(a)&&(a.t=i,a.m+=c-l,e=t)}var h,p,d,v,g,_,y;return e}(u,e,u.parent.A||n[0])}function f(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function l(t){t.x*=h,t.y=t.depth*p}var m=Uo,h=1,p=1,d=null;return n.separation=function(t){return arguments.length?(m=t,n):m},n.size=function(t){return arguments.length?(d=!1,h=+t[0],p=+t[1],n):d?null:[h,p]},n.nodeSize=function(t){return arguments.length?(d=!0,h=+t[0],p=+t[1],n):d?[h,p]:null},n},I.treemap=function(){function n(t){return t.x0=t.y0=0,t.x1=i,t.y1=o,t.eachBefore(e),a=[0],r&&t.eachBefore(Ro),t}function e(t){var n=a[t.depth],e=t.x0+n,r=t.y0+n,i=t.x1-n,o=t.y1-n;i>>1;m[p]a!=avg?(y+=S*=p?1:-1,m-=S):(x=0,y=m=(f+l)/2),(b-=2*E)>vg?(g+=E*=p?1:-1,_-=E):(b=0,g=_=(f+l)/2)}var A=s*fg(g),C=s*pg(g),z=c*fg(m),P=c*pg(m);if(vgZf&&e.name===n)return new Ln([[t]],yl,n,+r);return null},I.interrupt=zn,I.voronoi=function(){function n(r){return new ss(r.map(function(t,n){var e=[Math.round(i(t,n,r)/Jg)*Jg,Math.round(o(t,n,r)/Jg)*Jg];return e.index=n,e.data=t,e}),e)}var i=Bc,o=Hc,e=null;return n.polygons=function(t){return n(t).polygons()},n.links=function(t){return n(t).links()},n.triangles=function(t){return n(t).triangles()},n.x=function(t){return arguments.length?(i="function"==typeof t?t:Yc(+t),n):i},n.y=function(t){return arguments.length?(o="function"==typeof t?t:Yc(+t),n):o},n.extent=function(t){return arguments.length?(e=null==t?null:[[+t[0][0],+t[0][1]],[+t[1][0],+t[1][1]]],n):e&&[[e[0][0],e[0][1]],[e[1][0],e[1][1]]]},n.size=function(t){return arguments.length?(e=null==t?null:[[0,0],[+t[0],+t[1]]],n):e&&[e[1][0]-e[0][0],e[1][1]-e[0][1]]},n},I.zoom=function(){function u(t){t.property("__zoom",_s).on("wheel.zoom",n).on("mousedown.zoom",e).on("dblclick.zoom",r).filter(x).on("touchstart.zoom",i).on("touchmove.zoom",c).on("touchend.zoom touchcancel.zoom",s).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function p(t,n){return(n=Math.max(b[0],Math.min(b[1],n)))===t.k?t:new ls(n,t.x,t.y)}function d(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i===t.y?t:new ls(t.k,r,i)}function f(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function o(t,c,s){t.on("start.zoom",function(){v(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){v(this,arguments).end()}).tween("zoom",function(){var t=arguments,r=v(this,t),n=_.apply(this,t),i=s||f(n),o=Math.max(n[1][0]-n[0][0],n[1][1]-n[0][1]),e=this.__zoom,u="function"==typeof c?c.apply(this,t):c,a=T(e.invert(i).concat(o/e.k),u.invert(i).concat(o/u.k));return function(t){if(1===t)t=u;else{var n=a(t),e=o/n[2];t=new ls(e,i[0]-n[0]*e,i[1]-n[1]*e)}r.zoom(null,t)}})}function v(t,n){for(var e,r=0,i=N.length;r 0) - resultTimeValue = hour * 3600; - resultTimeValue += min * 60; - - return resultTimeValue; -} - -function convertSummaryTimeToBadgeString(summaryTime) { - var sec = (summaryTime); - var min = (summaryTime / 60).toFixed(0); - var hours = (summaryTime / (60 * 60)).toFixed(1); - var days = (summaryTime / (60 * 60 * 24)).toFixed(0); - - if (sec < 60) { - return sec + "s"; - } else if (min < 60) { - return min + "m"; - } else if (hours < 24) { - return hours + "h"; - } else { - return days + "d" - } -} - -function convertShortSummaryTimeToString(summaryTime) { - var hours = Math.floor(summaryTime / 3600); - var totalSeconds = summaryTime % 3600; - var mins = Math.floor(totalSeconds / 60); - - hours = zeroAppend(hours); - mins = zeroAppend(mins); - - return hours + 'h : ' + mins + 'm'; -} - -function convertShortSummaryTimeToLongString(summaryTime) { - var hours = Math.floor(summaryTime / 3600); - var totalSeconds = summaryTime % 3600; - var mins = Math.floor(totalSeconds / 60); - - hours = zeroAppend(hours); - mins = zeroAppend(mins); - - return `${hours} hour ${mins} minutes`; -} - -function getArrayTime(summaryTime) { - var days = Math.floor(summaryTime / 3600 / 24); - var totalHours = summaryTime % (3600 * 24); - var hours = Math.floor(totalHours / 3600); - var totalSeconds = summaryTime % 3600; - var mins = Math.floor(totalSeconds / 60); - var seconds = totalSeconds % 60; - - days = zeroAppend(days); - hours = zeroAppend(hours); - mins = zeroAppend(mins); - seconds = zeroAppend(seconds); - - return { - 'days': days, - 'hours': hours, - 'mins': mins, - 'seconds': seconds - }; -} - -function convertSummaryTimeToString(summaryTime) { - var days = Math.floor(summaryTime / 3600 / 24); - var totalHours = summaryTime % (3600 * 24); - var hours = Math.floor(totalHours / 3600); - var totalSeconds = summaryTime % 3600; - var mins = Math.floor(totalSeconds / 60); - var seconds = totalSeconds % 60; - - hours = zeroAppend(hours); - mins = zeroAppend(mins); - seconds = zeroAppend(seconds); - - if (days > 0) - return days + 'd ' + hours + 'h ' + mins + 'm ' + seconds + 's'; - else return hours + 'h ' + mins + 'm ' + seconds + 's'; -} - -function zeroAppend(time) { - if (time < 10) - return '0' + time; - else return time; -} - -function isDateInRange(dateStr, range) { - return new Date(dateStr) >= range.from && new Date(dateStr) <= range.to; -} - -function isCorrectDate(range) { - return range.from.getFullYear() >= 2019 && range.to.getFullYear() >= 2019; -} - -function getDateFromRange(range) { - switch (range) { - case 'days2': - return 2; - case 'days3': - return 3; - case 'days4': - return 4; - case 'days5': - return 5; - case 'days6': - return 6; - case 'days7': - return 7; - case 'month1': - return 30; - case 'month2': - return 60; - case 'month3': - return 90; - } -} - -function isDomainEquals(first, second) { - if (first === second) - return true; - else { - var resultUrl = function(url) { - if (url.indexOf('www.') > -1) - return url.split('www.')[1]; - return url; - }; - - if (resultUrl(first) === resultUrl(second)) - return true; - else return false; - } -} - -function extractHostname(url) { - var hostname; - - if (url.indexOf("//") > -1) { - hostname = url.split('/')[2]; - } - else { - hostname = url.split('/')[0]; - } - - hostname = hostname.split(':')[0]; - hostname = hostname.split('?')[0]; - - return hostname; -} - -function treatAsUTC(date) { - var result = new Date(date); - result.setMinutes(result.getMinutes() - result.getTimezoneOffset()); - return result; -} - -function daysBetween(startDate, endDate) { - var millisecondsPerDay = 24 * 60 * 60 * 1000; - return ((treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay) + 1; -} - -function todayLocalDate(){ - return new Date().toLocaleDateString('en-US'); -} \ No newline at end of file diff --git a/src/scripts/picker/clockpicker.min.js b/src/scripts/picker/clockpicker.min.js deleted file mode 100644 index 5283942..0000000 --- a/src/scripts/picker/clockpicker.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var P,t,i,e,x=window.jQuery,o=x(window),S=x(document),s="http://www.w3.org/2000/svg",E="SVGAngle"in window&&((i=document.createElement("div")).innerHTML="",t=(i.firstChild&&i.firstChild.namespaceURI)==s,i.innerHTML="",t),c="transition"in(e=document.createElement("div").style)||"WebkitTransition"in e||"MozTransition"in e||"msTransition"in e||"OTransition"in e,n="ontouchstart"in window,D="mousedown"+(n?" touchstart":""),I="mousemove.clockpicker"+(n?" touchmove.clockpicker":""),B="mouseup.clockpicker"+(n?" touchend.clockpicker":""),d=navigator.vibrate?"vibrate":navigator.webkitVibrate?"webkitVibrate":null;function z(t){return document.createElementNS(s,t)}function O(t){return(t<10?"0":"")+t}var j=0;var L=100,U=80,W=13,N=c?350:1,X=['
    ','
    ','
    ',''," : ",'','',"
    ",'
    ','
    ','
    ','
    ','
    ',"
    ",'',"","
    ","
    "].join("");function a(t,h){var i,e,s=x(X),u=s.find(".clockpicker-plate"),o=s.find(".clockpicker-hours"),c=s.find(".clockpicker-minutes"),n=s.find(".clockpicker-am-pm-block"),a="INPUT"===t.prop("tagName"),r=a?t:t.find("input"),p=t.find(".input-group-addon"),k=this;if(this.id=(e=++j+"",(i="cp")?i+e:e),this.element=t,this.options=h,this.isAppended=!1,this.isShown=!1,this.currentView="hours",this.isInput=a,this.input=r,this.addon=p,this.popover=s,this.plate=u,this.hoursView=o,this.minutesView=c,this.amPmBlock=n,this.spanHours=s.find(".clockpicker-span-hours"),this.spanMinutes=s.find(".clockpicker-span-minutes"),this.spanAmPm=s.find(".clockpicker-span-am-pm"),this.amOrPm="PM",h.twelvehour){var l=['
    ','",'","
    "].join("");x(l);x('').on("click",function(){k.amOrPm="AM",x(".clockpicker-span-am-pm").empty().append("AM")}).appendTo(this.amPmBlock),x('').on("click",function(){k.amOrPm="PM",x(".clockpicker-span-am-pm").empty().append("PM")}).appendTo(this.amPmBlock)}h.autoclose||x('").click(x.proxy(this.done,this)).appendTo(s),"top"!==h.placement&&"bottom"!==h.placement||"top"!==h.align&&"bottom"!==h.align||(h.align="left"),"left"!==h.placement&&"right"!==h.placement||"left"!==h.align&&"right"!==h.align||(h.align="top"),s.addClass(h.placement),s.addClass("clockpicker-align-"+h.align),this.spanHours.click(x.proxy(this.toggleView,this,"hours")),this.spanMinutes.click(x.proxy(this.toggleView,this,"minutes")),r.on("focus.clockpicker click.clockpicker",x.proxy(this.show,this)),p.on("click.clockpicker",x.proxy(this.toggle,this));var d,f,v,m,b=x('
    ');if(h.twelvehour)for(d=1;d<13;d+=1)f=b.clone(),v=d/6*Math.PI,m=U,f.css("font-size","120%"),f.css({left:L+Math.sin(v)*m-W,top:L-Math.cos(v)*m-W}),f.html(0===d?"00":d),o.append(f),f.on(D,w);else for(d=0;d<24;d+=1){f=b.clone(),v=d/6*Math.PI;var g=0=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,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"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("