From d4b46901de3e29f68726d46ce8d1f782e68dfe48 Mon Sep 17 00:00:00 2001 From: Alfredo Gallardo Date: Tue, 5 Sep 2023 12:35:45 -0300 Subject: [PATCH] - feature: added shinkai app to the monorepo --- shinkai-app/.browserslistrc | 6 + shinkai-app/.eslintrc.js | 17 + shinkai-app/.gitignore | 29 + shinkai-app/.nvmrc | 1 + shinkai-app/.vscode/extensions.json | 5 + shinkai-app/README.md | 10 + shinkai-app/capacitor.config.ts | 12 + shinkai-app/cypress.config.ts | 10 + shinkai-app/cypress/e2e/test.cy.ts | 6 + shinkai-app/cypress/fixtures/example.json | 5 + shinkai-app/cypress/support/commands.ts | 37 + shinkai-app/cypress/support/e2e.ts | 20 + shinkai-app/index.html | 30 + shinkai-app/ionic.config.json | 7 + shinkai-app/package-lock.json | 12298 ++++++++++++++++ shinkai-app/package.json | 82 + shinkai-app/postcss.config.js | 7 + shinkai-app/public/favicon.png | Bin 0 -> 930 bytes .../public/fonts/inter-var-latin.woff2 | Bin 0 -> 36532 bytes shinkai-app/public/fonts/newake.otf | Bin 0 -> 68568 bytes shinkai-app/public/manifest.json | 21 + shinkai-app/public/messaging.png | Bin 0 -> 120225 bytes shinkai-app/public/shinkai-logo-white.svg | 4 + shinkai-app/public/shinkai-logo.svg | 4 + shinkai-app/src/App.test.tsx | 31 + shinkai-app/src/App.tsx | 72 + shinkai-app/src/api/api_config.ts | 23 + shinkai-app/src/api/index.ts | 484 + .../src/components/ExploreContainer.css | 24 + .../src/components/ExploreContainer.tsx | 14 + shinkai-app/src/components/ui/Avatar.tsx | 25 + shinkai-app/src/components/ui/Button.css | 42 + shinkai-app/src/components/ui/Button.tsx | 33 + shinkai-app/src/components/ui/Input.css | 26 + shinkai-app/src/components/ui/Input.tsx | 37 + shinkai-app/src/components/ui/Layout.css | 19 + shinkai-app/src/components/ui/Layout.tsx | 53 + shinkai-app/src/features/chat/chatSlice.ts | 27 + shinkai-app/src/hooks/usetSetup.ts | 14 + .../src/lib/wasm/InboxNameWrapper.test.ts | 88 + shinkai-app/src/lib/wasm/InboxNameWrapper.ts | 51 + .../src/lib/wasm/JobCreationWrapper.test.ts | 45 + .../src/lib/wasm/JobCreationWrapper.ts | 38 + shinkai-app/src/lib/wasm/JobMessageWrapper.ts | 34 + shinkai-app/src/lib/wasm/JobScopeWrapper.ts | 34 + .../lib/wasm/SerializedAgentWrapper.test.ts | 75 + .../src/lib/wasm/SerializedAgentWrapper.ts | 97 + .../wasm/ShinkaiMessageBuilderWrapper.test.ts | 185 + .../lib/wasm/ShinkaiMessageBuilderWrapper.ts | 484 + .../lib/wasm/ShinkaiMessageWrapper.test.ts | 57 + .../src/lib/wasm/ShinkaiMessageWrapper.ts | 49 + .../src/lib/wasm/ShinkaiNameWrapper.test.ts | 49 + .../src/lib/wasm/ShinkaiNameWrapper.ts | 45 + shinkai-app/src/main.tsx | 11 + shinkai-app/src/models/QRSetupData.ts | 12 + shinkai-app/src/models/SchemaTypes.ts | 85 + shinkai-app/src/models/ShinkaiMessage.ts | 52 + shinkai-app/src/pages/AddAgent.tsx | 201 + shinkai-app/src/pages/AdminCommands.tsx | 183 + shinkai-app/src/pages/Chat.css | 38 + shinkai-app/src/pages/Chat.tsx | 278 + shinkai-app/src/pages/Connect.tsx | 397 + shinkai-app/src/pages/CreateChat.tsx | 123 + shinkai-app/src/pages/CreateJob.tsx | 176 + shinkai-app/src/pages/Home.css | 27 + shinkai-app/src/pages/Home.tsx | 211 + shinkai-app/src/pages/JobChat.tsx | 285 + shinkai-app/src/pages/Settings.tsx | 18 + shinkai-app/src/setupTests.ts | 14 + shinkai-app/src/store/actions.ts | 96 + shinkai-app/src/store/index.ts | 28 + shinkai-app/src/store/main.ts | 12 + shinkai-app/src/store/reducers.ts | 229 + shinkai-app/src/store/types.ts | 19 + shinkai-app/src/theme/global.css | 28 + shinkai-app/src/theme/lib/utils.ts | 6 + shinkai-app/src/theme/variables.css | 236 + shinkai-app/src/types.d.ts | 7 + .../src/utils/inbox_name_handler.test.ts | 51 + shinkai-app/src/utils/inbox_name_handler.ts | 60 + .../src/utils/shinkai_message_handler.ts | 7 + shinkai-app/src/utils/validation.test.ts | 10 + shinkai-app/src/utils/validation.ts | 18 + shinkai-app/src/utils/wasm_helpers.test.ts | 51 + shinkai-app/src/utils/wasm_helpers.ts | 60 + shinkai-app/src/vite-env.d.ts | 1 + shinkai-app/tailwind.config.js | 35 + shinkai-app/tsconfig.json | 27 + shinkai-app/tsconfig.node.json | 9 + shinkai-app/vite.config.ts | 15 + 90 files changed, 17982 insertions(+) create mode 100644 shinkai-app/.browserslistrc create mode 100644 shinkai-app/.eslintrc.js create mode 100644 shinkai-app/.gitignore create mode 100644 shinkai-app/.nvmrc create mode 100644 shinkai-app/.vscode/extensions.json create mode 100644 shinkai-app/README.md create mode 100644 shinkai-app/capacitor.config.ts create mode 100644 shinkai-app/cypress.config.ts create mode 100644 shinkai-app/cypress/e2e/test.cy.ts create mode 100644 shinkai-app/cypress/fixtures/example.json create mode 100644 shinkai-app/cypress/support/commands.ts create mode 100644 shinkai-app/cypress/support/e2e.ts create mode 100644 shinkai-app/index.html create mode 100644 shinkai-app/ionic.config.json create mode 100644 shinkai-app/package-lock.json create mode 100644 shinkai-app/package.json create mode 100644 shinkai-app/postcss.config.js create mode 100644 shinkai-app/public/favicon.png create mode 100644 shinkai-app/public/fonts/inter-var-latin.woff2 create mode 100644 shinkai-app/public/fonts/newake.otf create mode 100644 shinkai-app/public/manifest.json create mode 100644 shinkai-app/public/messaging.png create mode 100644 shinkai-app/public/shinkai-logo-white.svg create mode 100644 shinkai-app/public/shinkai-logo.svg create mode 100644 shinkai-app/src/App.test.tsx create mode 100644 shinkai-app/src/App.tsx create mode 100644 shinkai-app/src/api/api_config.ts create mode 100644 shinkai-app/src/api/index.ts create mode 100644 shinkai-app/src/components/ExploreContainer.css create mode 100644 shinkai-app/src/components/ExploreContainer.tsx create mode 100644 shinkai-app/src/components/ui/Avatar.tsx create mode 100644 shinkai-app/src/components/ui/Button.css create mode 100644 shinkai-app/src/components/ui/Button.tsx create mode 100644 shinkai-app/src/components/ui/Input.css create mode 100644 shinkai-app/src/components/ui/Input.tsx create mode 100644 shinkai-app/src/components/ui/Layout.css create mode 100644 shinkai-app/src/components/ui/Layout.tsx create mode 100644 shinkai-app/src/features/chat/chatSlice.ts create mode 100644 shinkai-app/src/hooks/usetSetup.ts create mode 100644 shinkai-app/src/lib/wasm/InboxNameWrapper.test.ts create mode 100644 shinkai-app/src/lib/wasm/InboxNameWrapper.ts create mode 100644 shinkai-app/src/lib/wasm/JobCreationWrapper.test.ts create mode 100644 shinkai-app/src/lib/wasm/JobCreationWrapper.ts create mode 100644 shinkai-app/src/lib/wasm/JobMessageWrapper.ts create mode 100644 shinkai-app/src/lib/wasm/JobScopeWrapper.ts create mode 100644 shinkai-app/src/lib/wasm/SerializedAgentWrapper.test.ts create mode 100644 shinkai-app/src/lib/wasm/SerializedAgentWrapper.ts create mode 100644 shinkai-app/src/lib/wasm/ShinkaiMessageBuilderWrapper.test.ts create mode 100644 shinkai-app/src/lib/wasm/ShinkaiMessageBuilderWrapper.ts create mode 100644 shinkai-app/src/lib/wasm/ShinkaiMessageWrapper.test.ts create mode 100644 shinkai-app/src/lib/wasm/ShinkaiMessageWrapper.ts create mode 100644 shinkai-app/src/lib/wasm/ShinkaiNameWrapper.test.ts create mode 100644 shinkai-app/src/lib/wasm/ShinkaiNameWrapper.ts create mode 100644 shinkai-app/src/main.tsx create mode 100644 shinkai-app/src/models/QRSetupData.ts create mode 100644 shinkai-app/src/models/SchemaTypes.ts create mode 100644 shinkai-app/src/models/ShinkaiMessage.ts create mode 100644 shinkai-app/src/pages/AddAgent.tsx create mode 100644 shinkai-app/src/pages/AdminCommands.tsx create mode 100644 shinkai-app/src/pages/Chat.css create mode 100644 shinkai-app/src/pages/Chat.tsx create mode 100644 shinkai-app/src/pages/Connect.tsx create mode 100644 shinkai-app/src/pages/CreateChat.tsx create mode 100644 shinkai-app/src/pages/CreateJob.tsx create mode 100644 shinkai-app/src/pages/Home.css create mode 100644 shinkai-app/src/pages/Home.tsx create mode 100644 shinkai-app/src/pages/JobChat.tsx create mode 100644 shinkai-app/src/pages/Settings.tsx create mode 100644 shinkai-app/src/setupTests.ts create mode 100644 shinkai-app/src/store/actions.ts create mode 100644 shinkai-app/src/store/index.ts create mode 100644 shinkai-app/src/store/main.ts create mode 100644 shinkai-app/src/store/reducers.ts create mode 100644 shinkai-app/src/store/types.ts create mode 100644 shinkai-app/src/theme/global.css create mode 100644 shinkai-app/src/theme/lib/utils.ts create mode 100644 shinkai-app/src/theme/variables.css create mode 100644 shinkai-app/src/types.d.ts create mode 100644 shinkai-app/src/utils/inbox_name_handler.test.ts create mode 100644 shinkai-app/src/utils/inbox_name_handler.ts create mode 100644 shinkai-app/src/utils/shinkai_message_handler.ts create mode 100644 shinkai-app/src/utils/validation.test.ts create mode 100644 shinkai-app/src/utils/validation.ts create mode 100644 shinkai-app/src/utils/wasm_helpers.test.ts create mode 100644 shinkai-app/src/utils/wasm_helpers.ts create mode 100644 shinkai-app/src/vite-env.d.ts create mode 100644 shinkai-app/tailwind.config.js create mode 100644 shinkai-app/tsconfig.json create mode 100644 shinkai-app/tsconfig.node.json create mode 100644 shinkai-app/vite.config.ts diff --git a/shinkai-app/.browserslistrc b/shinkai-app/.browserslistrc new file mode 100644 index 000000000..ade73929d --- /dev/null +++ b/shinkai-app/.browserslistrc @@ -0,0 +1,6 @@ +Chrome >=79 +ChromeAndroid >=79 +Firefox >=70 +Edge >=79 +Safari >=14 +iOS >=14 \ No newline at end of file diff --git a/shinkai-app/.eslintrc.js b/shinkai-app/.eslintrc.js new file mode 100644 index 000000000..af472a1f7 --- /dev/null +++ b/shinkai-app/.eslintrc.js @@ -0,0 +1,17 @@ +module.exports = { + root: true, + env: { + node: true + }, + 'extends': [ + 'plugin:react/recommended', + 'eslint:recommended' + ], + parserOptions: { + ecmaVersion: 2020 + }, + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + } +} diff --git a/shinkai-app/.gitignore b/shinkai-app/.gitignore new file mode 100644 index 000000000..1dcf08b9f --- /dev/null +++ b/shinkai-app/.gitignore @@ -0,0 +1,29 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local +/.vscode/* +!/.vscode/extensions.json +.idea + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Optional eslint cache +.eslintcache diff --git a/shinkai-app/.nvmrc b/shinkai-app/.nvmrc new file mode 100644 index 000000000..cbd89321d --- /dev/null +++ b/shinkai-app/.nvmrc @@ -0,0 +1 @@ +v18.17.0 \ No newline at end of file diff --git a/shinkai-app/.vscode/extensions.json b/shinkai-app/.vscode/extensions.json new file mode 100644 index 000000000..ffcebbeb2 --- /dev/null +++ b/shinkai-app/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "ionic.ionic" + ] +} diff --git a/shinkai-app/README.md b/shinkai-app/README.md new file mode 100644 index 000000000..b988f6dea --- /dev/null +++ b/shinkai-app/README.md @@ -0,0 +1,10 @@ +## Install + +`nvm use` +`npm install` + +Note: it requires the wasm `pkg` folder to be copied to the src directory of this project. + +## Tests + +`npm run test.unit` \ No newline at end of file diff --git a/shinkai-app/capacitor.config.ts b/shinkai-app/capacitor.config.ts new file mode 100644 index 000000000..b8c5011f1 --- /dev/null +++ b/shinkai-app/capacitor.config.ts @@ -0,0 +1,12 @@ +import { CapacitorConfig } from '@capacitor/cli'; + +const config: CapacitorConfig = { + appId: 'io.ionic.starter', + appName: 'ShinkaiApp', + webDir: 'dist', + server: { + androidScheme: 'https' + } +}; + +export default config; diff --git a/shinkai-app/cypress.config.ts b/shinkai-app/cypress.config.ts new file mode 100644 index 000000000..5d58e7ab1 --- /dev/null +++ b/shinkai-app/cypress.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "cypress"; + +export default defineConfig({ + e2e: { + baseUrl: "http://localhost:5173", + setupNodeEvents(on, config) { + // implement node event listeners here + }, + }, +}); \ No newline at end of file diff --git a/shinkai-app/cypress/e2e/test.cy.ts b/shinkai-app/cypress/e2e/test.cy.ts new file mode 100644 index 000000000..7b9a2e029 --- /dev/null +++ b/shinkai-app/cypress/e2e/test.cy.ts @@ -0,0 +1,6 @@ +describe('My First Test', () => { + it('Visits the app root url', () => { + cy.visit('/') + cy.contains('#container', 'Ready to create an app?') + }) +}) \ No newline at end of file diff --git a/shinkai-app/cypress/fixtures/example.json b/shinkai-app/cypress/fixtures/example.json new file mode 100644 index 000000000..02e425437 --- /dev/null +++ b/shinkai-app/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/shinkai-app/cypress/support/commands.ts b/shinkai-app/cypress/support/commands.ts new file mode 100644 index 000000000..698b01a42 --- /dev/null +++ b/shinkai-app/cypress/support/commands.ts @@ -0,0 +1,37 @@ +/// +// *********************************************** +// This example commands.ts shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) +// +// declare global { +// namespace Cypress { +// interface Chainable { +// login(email: string, password: string): Chainable +// drag(subject: string, options?: Partial): Chainable +// dismiss(subject: string, options?: Partial): Chainable +// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable +// } +// } +// } \ No newline at end of file diff --git a/shinkai-app/cypress/support/e2e.ts b/shinkai-app/cypress/support/e2e.ts new file mode 100644 index 000000000..f80f74f8e --- /dev/null +++ b/shinkai-app/cypress/support/e2e.ts @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/e2e.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') \ No newline at end of file diff --git a/shinkai-app/index.html b/shinkai-app/index.html new file mode 100644 index 000000000..6c233a8e6 --- /dev/null +++ b/shinkai-app/index.html @@ -0,0 +1,30 @@ + + + + + Ionic App + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/shinkai-app/ionic.config.json b/shinkai-app/ionic.config.json new file mode 100644 index 000000000..72ee5fb82 --- /dev/null +++ b/shinkai-app/ionic.config.json @@ -0,0 +1,7 @@ +{ + "name": "ShinkaiApp", + "integrations": { + "capacitor": {} + }, + "type": "react-vite" +} diff --git a/shinkai-app/package-lock.json b/shinkai-app/package-lock.json new file mode 100644 index 000000000..0f801bb68 --- /dev/null +++ b/shinkai-app/package-lock.json @@ -0,0 +1,12298 @@ +{ + "name": "ShinkaiApp", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ShinkaiApp", + "version": "0.0.1", + "dependencies": { + "@capacitor-community/barcode-scanner": "^4.0.1", + "@capacitor/app": "5.0.6", + "@capacitor/camera": "^5.0.6", + "@capacitor/core": "5.2.2", + "@capacitor/haptics": "5.0.6", + "@capacitor/keyboard": "5.0.6", + "@capacitor/status-bar": "5.0.6", + "@ionic/react": "^7.0.0", + "@ionic/react-router": "^7.0.0", + "@noble/ed25519": "^2.0.0", + "@noble/hashes": "^1.3.1", + "@reduxjs/toolkit": "^1.9.5", + "@yudiel/react-qr-scanner": "^1.1.10", + "@zxing/browser": "^0.1.4", + "axios": "^1.4.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "curve25519-js": "^0.0.4", + "ionicons": "^7.0.0", + "jsbi": "^4.3.0", + "lucide-react": "^0.263.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-redux": "^7.2.4", + "react-router": "^5.3.4", + "react-router-dom": "^5.3.4", + "react-toastify": "^9.1.3", + "redux": "^4.2.1", + "redux-persist": "^6.0.0", + "redux-thunk": "^2.4.2", + "tailwind-merge": "^1.14.0", + "tailwindcss-animate": "^1.0.6", + "vite-plugin-wasm": "^3.2.2" + }, + "devDependencies": { + "@babel/cli": "^7.22.10", + "@babel/core": "^7.22.10", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/preset-env": "^7.22.10", + "@capacitor/cli": "5.2.2", + "@peculiar/webcrypto": "^1.4.3", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.4.3", + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@types/react-redux": "^7.1.25", + "@types/react-router": "^5.1.20", + "@types/react-router-dom": "^5.3.3", + "@vitejs/plugin-legacy": "^4.0.2", + "@vitejs/plugin-react": "^4.0.1", + "autoprefixer": "^10.4.15", + "babel-plugin-transform-bigint-to-jsbi": "^1.0.3", + "cypress": "^12.7.0", + "eslint": "^8.35.0", + "eslint-plugin-react": "^7.32.2", + "jest": "^29.6.2", + "jsdom": "^22.1.0", + "postcss": "^8.4.28", + "prettier": "^3.0.2", + "tailwindcss": "^3.3.3", + "typescript": "^5.1.6", + "vite": "^4.3.9", + "vitest": "^0.34.1" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", + "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==", + "dev": true + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/cli": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.22.10.tgz", + "integrity": "sha512-rM9ZMmaII630zGvtMtQ3P4GyHs28CHLYE9apLG7L8TgaSqcfoIGrlLSLsh4Q8kDTdZQQEXZm1M0nQtOvU/2heg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/cli/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@babel/cli/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/cli/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/cli/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/cli/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.10", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", + "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", + "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", + "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", + "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", + "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", + "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", + "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.10", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.10", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.10", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.10", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.10", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", + "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@capacitor-community/barcode-scanner": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@capacitor-community/barcode-scanner/-/barcode-scanner-4.0.1.tgz", + "integrity": "sha512-acuhDU2mqskSeCIQMc5TGNnDszXXs4IqEES+3C2JDiq+MkJMTr+B2Dhq4k55hlkRFMOumMhlnbr2R9G6qyFPhw==", + "dependencies": { + "@zxing/browser": "^0.1.3", + "@zxing/library": "^0.20.0" + }, + "peerDependencies": { + "@capacitor/core": "^5.0.0" + } + }, + "node_modules/@capacitor/app": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-5.0.6.tgz", + "integrity": "sha512-6ZXVdnNmaYILasC/RjQw+yfTmq2ZO7Q3v5lFcDVfq3PFGnybyYQh+RstBrYri+376OmXOXxBD7E6UxBhrMzXGA==", + "peerDependencies": { + "@capacitor/core": "^5.0.0" + } + }, + "node_modules/@capacitor/camera": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@capacitor/camera/-/camera-5.0.6.tgz", + "integrity": "sha512-X9WhbFz3dGv58JyfoAFGk/KN0oacEA+ReZkRc+JMRef0GUDfzlqEhqY4kP0i9nKH2koOFNdq4Pmya/Wu3mQXMg==", + "peerDependencies": { + "@capacitor/core": "^5.0.0" + } + }, + "node_modules/@capacitor/cli": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-5.2.2.tgz", + "integrity": "sha512-h/cefX3sefLcmd4VI2h+fNIYKWH1QCUACWAH8bkdJ+aEL+x2xYbGlqeW6Belb3E2Uvu9OA+cz7YVDnNRcjyQyw==", + "dev": true, + "dependencies": { + "@ionic/cli-framework-output": "^2.2.5", + "@ionic/utils-fs": "^3.1.6", + "@ionic/utils-subprocess": "^2.1.11", + "@ionic/utils-terminal": "^2.3.3", + "commander": "^9.3.0", + "debug": "^4.3.4", + "env-paths": "^2.2.0", + "kleur": "^4.1.4", + "native-run": "^1.7.2", + "open": "^8.4.0", + "plist": "^3.0.5", + "prompts": "^2.4.2", + "rimraf": "^4.4.1", + "semver": "^7.3.7", + "tar": "^6.1.11", + "tslib": "^2.4.0", + "xml2js": "^0.5.0" + }, + "bin": { + "cap": "bin/capacitor", + "capacitor": "bin/capacitor" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@capacitor/core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.2.2.tgz", + "integrity": "sha512-3jKECZC5+YD2rljMZm1e/K3AYyoxUmLDZCyofTPbRYPBSI0wJh5ZCkX+XIGzNM0o/Wokl3Voa1JB8xsLC0MPxA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@capacitor/haptics": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-5.0.6.tgz", + "integrity": "sha512-UrMcR7p2X10ql4VLlowUuH/VckTeu0lj+RQpekxox14uxDmu5AGIFDK/iDTi8W6QZkxTJRZK6sbCjgwYgNJ7Pw==", + "peerDependencies": { + "@capacitor/core": "^5.0.0" + } + }, + "node_modules/@capacitor/keyboard": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.6.tgz", + "integrity": "sha512-9GewAa/y2Hwkdw/Be8MTdiAjrFZ7TPDKpR44M0Y/0QMnK+mBbgzcoZ/UkuumWv6e2F1IAI+VY5eYVQHDeZcRoA==", + "peerDependencies": { + "@capacitor/core": "^5.0.0" + } + }, + "node_modules/@capacitor/status-bar": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-5.0.6.tgz", + "integrity": "sha512-7od8CxsBnot1XMK3IeOkproFL4hgoKoWAc3pwUvmDOkQsXoxwQm4SR9mLwQavv1XfxtHbFV9Ukd7FwMxOPSViw==", + "peerDependencies": { + "@capacitor/core": "^5.0.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cypress/request": { + "version": "2.88.12", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz", + "integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.10.3", + "safe-buffer": "^5.1.2", + "tough-cookie": "^4.1.3", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.19.tgz", + "integrity": "sha512-1uOoDurJYh5MNqPqpj3l/TQCI1V25BXgChEldCB7D6iryBYqYKrbZIhYO5AI9fulf66sM8UJpc3UcCly2Tv28w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.19.tgz", + "integrity": "sha512-4+jkUFQxZkQfQOOxfGVZB38YUWHMJX2ihZwF+2nh8m7bHdWXpixiurgGRN3c/KMSwlltbYI0/i929jwBRMFzbA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.19.tgz", + "integrity": "sha512-ae5sHYiP/Ogj2YNrLZbWkBmyHIDOhPgpkGvFnke7XFGQldBDWvc/AyYwSLpNuKw9UNkgnLlB/jPpnBmlF3G9Bg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.19.tgz", + "integrity": "sha512-HIpQvNQWFYROmWDANMRL+jZvvTQGOiTuwWBIuAsMaQrnStedM+nEKJBzKQ6bfT9RFKH2wZ+ej+DY7+9xHBTFPg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.19.tgz", + "integrity": "sha512-m6JdvXJQt0thNLIcWOeG079h2ivhYH4B5sVCgqb/B29zTcFd7EE8/J1nIUHhdtwGeItdUeqKaqqb4towwxvglQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.19.tgz", + "integrity": "sha512-G0p4EFMPZhGn/xVNspUyMQbORH3nlKTV0bFNHPIwLraBuAkTeMyxNviTe0ZXUbIXQrR1lrwniFjNFU4s+x7veQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.19.tgz", + "integrity": "sha512-hBxgRlG42+W+j/1/cvlnSa+3+OBKeDCyO7OG2ICya1YJaSCYfSpuG30KfOnQHI7Ytgu4bRqCgrYXxQEzy0zM5Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.19.tgz", + "integrity": "sha512-qtWyoQskfJlb9MD45mvzCEKeO4uCnDZ7lPFeNqbfaaJHqBiH9qA5Vu2EuckqYZuFMJWy1l4dxTf9NOulCVfUjg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.19.tgz", + "integrity": "sha512-X8g33tczY0GsJq3lhyBrjnFtaKjWVpp1gMq5IlF9BQJ3TUfSK74nQnz9mRIEejmcV+OIYn6bkOJeUaU1Knrljg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.19.tgz", + "integrity": "sha512-SAkRWJgb+KN+gOhmbiE6/wu23D6HRcGQi15cB13IVtBZZgXxygTV5GJlUAKLQ5Gcx0gtlmt+XIxEmSqA6sZTOw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.19.tgz", + "integrity": "sha512-YLAslaO8NsB9UOxBchos82AOMRDbIAWChwDKfjlGrHSzS3v1kxce7dGlSTsrb0PJwo1KYccypN3VNjQVLtz7LA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.19.tgz", + "integrity": "sha512-vSYFtlYds/oTI8aflEP65xo3MXChMwBOG1eWPGGKs/ev9zkTeXVvciU+nifq8J1JYMz+eQ4J9JDN0O2RKF8+1Q==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.19.tgz", + "integrity": "sha512-tgG41lRVwlzqO9tv9l7aXYVw35BxKXLtPam1qALScwSqPivI8hjkZLNH0deaaSCYCFT9cBIdB+hUjWFlFFLL9A==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.19.tgz", + "integrity": "sha512-EgBZFLoN1S5RuB4cCJI31pBPsjE1nZ+3+fHRjguq9Ibrzo29bOLSBcH1KZJvRNh5qtd+fcYIGiIUia8Jw5r1lQ==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.19.tgz", + "integrity": "sha512-q1V1rtHRojAzjSigZEqrcLkpfh5K09ShCoIsdTakozVBnM5rgV58PLFticqDp5UJ9uE0HScov9QNbbl8HBo6QQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.19.tgz", + "integrity": "sha512-D0IiYjpZRXxGZLQfsydeAD7ZWqdGyFLBj5f2UshJpy09WPs3qizDCsEr8zyzcym6Woj/UI9ZzMIXwvoXVtyt0A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.19.tgz", + "integrity": "sha512-3tt3SOS8L3D54R8oER41UdDshlBIAjYhdWRPiZCTZ1E41+shIZBpTjaW5UaN/jD1ENE/Ok5lkeqhoNMbxstyxw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.19.tgz", + "integrity": "sha512-MxbhcuAYQPlfln1EMc4T26OUoeg/YQc6wNoEV8xvktDKZhLtBxjkoeESSo9BbPaGKhAPzusXYj5n8n5A8iZSrA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.19.tgz", + "integrity": "sha512-m0/UOq1wj25JpWqOJxoWBRM9VWc3c32xiNzd+ERlYstUZ6uwx5SZsQUtkiFHaYmcaoj+f6+Tfcl7atuAz3idwQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.19.tgz", + "integrity": "sha512-L4vb6pcoB1cEcXUHU6EPnUhUc4+/tcz4OqlXTWPcSQWxegfmcOprhmIleKKwmMNQVc4wrx/+jB7tGkjjDmiupg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.19.tgz", + "integrity": "sha512-rQng7LXSKdrDlNDb7/v0fujob6X0GAazoK/IPd9C3oShr642ri8uIBkgM37/l8B3Rd5sBQcqUXoDdEy75XC/jg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.19.tgz", + "integrity": "sha512-z69jhyG20Gq4QL5JKPLqUT+eREuqnDAFItLbza4JCmpvUnIlY73YNjd5djlO7kBiiZnvTnJuAbOjIoZIOa1GjA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", + "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", + "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@ionic/cli-framework-output": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.6.tgz", + "integrity": "sha512-YLPRwnk5Lw0XQ9pKWG+p2KoR5HjMBigZ6yv+/XtL3TGOnCS1+oAz56ABbAORCjTWhSJQisr8APNFiELAecY6QA==", + "dev": true, + "dependencies": { + "@ionic/utils-terminal": "2.3.4", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/core": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-7.2.2.tgz", + "integrity": "sha512-KD+dZrrIpKs1BlE3Ffp05yrejSvurUhr0OWP2P/NRax5Dld8wSZj+ETOMkV8uiIPbOTOUbLaAQ7m5ZXduMCYhQ==", + "dependencies": { + "@stencil/core": "^3.4.0", + "ionicons": "7.1.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@ionic/core/node_modules/ionicons": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.1.0.tgz", + "integrity": "sha512-iE4GuEdEHARJpp0sWL7WJZCzNCf5VxpNRhAjW0fLnZPnNL5qZOJUcfup2Z2Ty7Jk8Q5hacrHfGEB1lCwOdXqGg==", + "dependencies": { + "@stencil/core": "^2.18.0" + } + }, + "node_modules/@ionic/core/node_modules/ionicons/node_modules/@stencil/core": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.22.3.tgz", + "integrity": "sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=12.10.0", + "npm": ">=6.0.0" + } + }, + "node_modules/@ionic/react": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-7.2.2.tgz", + "integrity": "sha512-QFvLTCw/9/7aBFooRUZFD/pIOLgMO5E7AzW9DeJoyjenVp3TBbhKvlz275+2Z4Nmj82nXMZs2xWnmuzgweb2sQ==", + "dependencies": { + "@ionic/core": "7.2.2", + "ionicons": "^7.0.0", + "tslib": "*" + }, + "peerDependencies": { + "react": ">=16.8.6", + "react-dom": ">=16.8.6" + } + }, + "node_modules/@ionic/react-router": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@ionic/react-router/-/react-router-7.2.2.tgz", + "integrity": "sha512-WSr5K1CUO4irE2TdXR8R818iuG1iEGveJeEZ0oPqjqBlKh2EiFzNjJWbu1r0lXGArUtXTTqJ0WLhxKTRyJCY/g==", + "dependencies": { + "@ionic/react": "7.2.2", + "tslib": "*" + }, + "peerDependencies": { + "react": ">=16.8.6", + "react-dom": ">=16.8.6", + "react-router": "^5.0.1", + "react-router-dom": "^5.0.1" + } + }, + "node_modules/@ionic/utils-array": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", + "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-fs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", + "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-object": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", + "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-process": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.11.tgz", + "integrity": "sha512-Uavxn+x8j3rDlZEk1X7YnaN6wCgbCwYQOeIjv/m94i1dzslqWhqIHEqxEyeE8HsT5Negboagg7GtQiABy+BLbA==", + "dev": true, + "dependencies": { + "@ionic/utils-object": "2.1.6", + "@ionic/utils-terminal": "2.3.4", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.6.tgz", + "integrity": "sha512-4+Kitey1lTA1yGtnigeYNhV/0tggI3lWBMjC7tBs1K9GXa/q7q4CtOISppdh8QgtOhrhAXS2Igp8rbko/Cj+lA==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-subprocess": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.12.tgz", + "integrity": "sha512-N05Y+dIXBHofKWJTheCMzVqmgY9wFmZcRv/LdNnfXaaA/mxLTyGxQYeig8fvQXTtDafb/siZXcrTkmQ+y6n3Yg==", + "dev": true, + "dependencies": { + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-process": "2.1.11", + "@ionic/utils-stream": "3.1.6", + "@ionic/utils-terminal": "2.3.4", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.4.tgz", + "integrity": "sha512-cEiMFl3jklE0sW60r8JHH3ijFTwh/jkdEKWbylSyExQwZ8pPuwoXz7gpkWoJRLuoRHHSvg+wzNYyPJazIHfoJA==", + "dev": true, + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", + "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", + "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.2", + "@jest/reporters": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.2", + "jest-resolve-dependencies": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "jest-watcher": "^29.6.2", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.2", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@jest/environment": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", + "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", + "dev": true, + "dependencies": { + "expect": "^29.6.2", + "jest-snapshot": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", + "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", + "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", + "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", + "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", + "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", + "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.2", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", + "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.2", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, + "node_modules/@noble/ed25519": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.0.0.tgz", + "integrity": "sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz", + "integrity": "sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA==", + "dev": true, + "dependencies": { + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.3.tgz", + "integrity": "sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A==", + "dev": true, + "dependencies": { + "@peculiar/asn1-schema": "^2.3.6", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.2", + "tslib": "^2.5.0", + "webcrypto-core": "^1.7.7" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", + "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@stencil/core": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-3.4.2.tgz", + "integrity": "sha512-FAUhUVaakCy29nU2GwO/HQBRV1ihPRvncz3PUc8oR+UJLAxGabTmP8PLY7wvHfbw+Cvi4VXfJFTBvdfDu6iKPQ==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=14.10.0", + "npm": ">=6.0.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz", + "integrity": "sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.0.0.tgz", + "integrity": "sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.4.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.4.3.tgz", + "integrity": "sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", + "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "dev": true + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.4.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.8.tgz", + "integrity": "sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==", + "devOptional": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/react": { + "version": "18.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.18.tgz", + "integrity": "sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.25", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz", + "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dev": true, + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dev": true, + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "node_modules/@types/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "dev": true, + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-legacy": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-4.1.1.tgz", + "integrity": "sha512-um3gbVouD2Q/g19C0qpDfHwveXDCAHzs8OC3e9g6aXpKoD1H14himgs7wkMnhAynBJy7QqUoZNAXDuqN8zLR2g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "browserslist": "^4.21.9", + "core-js": "^3.31.1", + "magic-string": "^0.30.1", + "regenerator-runtime": "^0.13.11", + "systemjs": "^6.14.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "peerDependencies": { + "terser": "^5.4.0", + "vite": "^4.0.0" + } + }, + "node_modules/@vitejs/plugin-legacy/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", + "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/@vitest/expect": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.1.tgz", + "integrity": "sha512-q2CD8+XIsQ+tHwypnoCk8Mnv5e6afLFvinVGCq3/BOT4kQdVQmY6rRfyKkwcg635lbliLPqbunXZr+L1ssUWiQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.34.1", + "@vitest/utils": "0.34.1", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.1.tgz", + "integrity": "sha512-YfQMpYzDsYB7yqgmlxZ06NI4LurHWfrH7Wy3Pvf/z/vwUSgq1zLAb1lWcItCzQG+NVox+VvzlKQrYEXb47645g==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.34.1", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.1.tgz", + "integrity": "sha512-0O9LfLU0114OqdF8lENlrLsnn024Tb1CsS9UwG0YMWY2oGTQfPtkW+B/7ieyv0X9R2Oijhi3caB1xgGgEgclSQ==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/snapshot/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/snapshot/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@vitest/spy": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.1.tgz", + "integrity": "sha512-UT4WcI3EAPUNO8n6y9QoEqynGGEPmmRxC+cLzneFFXpmacivjHZsNbiKD88KUScv5DCHVDgdBsLD7O7s1enFcQ==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.1.tgz", + "integrity": "sha512-/ql9dsFi4iuEbiNcjNHQWXBum7aL8pyhxvfnD9gNtbjR9fUKAjxhj4AA3yfLXg6gJpMGGecvtF8Au2G9y3q47Q==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/utils/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@yudiel/react-qr-scanner": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@yudiel/react-qr-scanner/-/react-qr-scanner-1.1.10.tgz", + "integrity": "sha512-+YIHbnocynkkGgyMK8MMkn1NBnJRwJntdm4shQ+linm4NdGdSAavLYxJYwnk2PixZyVu/GZ3Uc2aM0XWlBq+Zw==", + "dependencies": { + "@zxing/library": "^0.20.0" + }, + "peerDependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@zxing/browser": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@zxing/browser/-/browser-0.1.4.tgz", + "integrity": "sha512-WYjaav7St4sj/u/Km2llE4NU2Pq3JFIWnczr0tmyCC1KUlp08rV3qpu7iiEB4kOx/CgcCzrSebNnSmFt5B3IFg==", + "optionalDependencies": { + "@zxing/text-encoding": "^0.9.0" + }, + "peerDependencies": { + "@zxing/library": "^0.20.0" + } + }, + "node_modules/@zxing/library": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@zxing/library/-/library-0.20.0.tgz", + "integrity": "sha512-6Ev6rcqVjMakZFIDvbUf0dtpPGeZMTfyxYg4HkVWioWeN7cRcnUWT3bU6sdohc82O1nPXcjq6WiGfXX2Pnit6A==", + "dependencies": { + "ts-custom-error": "^3.2.1" + }, + "engines": { + "node": ">= 10.4.0" + }, + "optionalDependencies": { + "@zxing/text-encoding": "~0.9.0" + } + }, + "node_modules/@zxing/text-encoding": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", + "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "optional": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "devOptional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", + "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", + "dev": true, + "dependencies": { + "pvtsutils": "^1.3.2", + "pvutils": "^1.1.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", + "integrity": "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.6.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-bigint-to-jsbi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-bigint-to-jsbi/-/babel-plugin-transform-bigint-to-jsbi-1.0.3.tgz", + "integrity": "sha512-6O9dFuJSJYUziMd4OE4o/11kW2HBCC5qmF/liddDs/+pmm6iEB5BIlNQgiowjGokOR5ne7ynSi9MZt6uGPmusg==", + "dev": true, + "peerDependencies": { + "@babel/core": "^7.17.2", + "@babel/plugin-syntax-bigint": "^7.8.3" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "dev": true, + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "devOptional": true + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cachedir": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001522", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", + "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/core-js": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", + "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", + "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.9" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "dev": true, + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/curve25519-js": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/curve25519-js/-/curve25519-js-0.0.4.tgz", + "integrity": "sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w==" + }, + "node_modules/cypress": { + "version": "12.17.3", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.17.3.tgz", + "integrity": "sha512-/R4+xdIDjUSLYkiQfwJd630S81KIgicmQOLXotFxVXkl+eTeVO+3bHXxdi5KBh/OgC33HWN33kHX+0tQR/ZWpg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^2.88.11", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^16.18.39", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^6.2.1", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.8", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.5.3", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^14.0.0 || ^16.0.0 || >=18.0.0" + } + }, + "node_modules/cypress/node_modules/@types/node": { + "version": "16.18.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.39.tgz", + "integrity": "sha512-8q9ZexmdYYyc5/cfujaXb4YOucpQxAV4RMG0himLyDUOEr8Mr79VrqsFI+cQ2M2h89YIuy95lbxuYjxT4Hk4kQ==", + "dev": true + }, + "node_modules/cypress/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cypress/node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, + "node_modules/cypress/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.1", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.486", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.486.tgz", + "integrity": "sha512-9zn9/2lbMGY/mFhoUymD9ODYdLY3zjUW/IW9ihU/sJVeIlD70m2aAb86S35aRGF+iwqLuQP25epruayZjKNjBw==", + "dev": true + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.19.tgz", + "integrity": "sha512-ra3CaIKCzJp5bU5BDfrCc0FRqKj71fQi+gbld0aj6lN0ifuX2fWJYPgLVLGwPfA+ruKna+OWwOvf/yHj6n+i0g==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.19", + "@esbuild/android-arm64": "0.18.19", + "@esbuild/android-x64": "0.18.19", + "@esbuild/darwin-arm64": "0.18.19", + "@esbuild/darwin-x64": "0.18.19", + "@esbuild/freebsd-arm64": "0.18.19", + "@esbuild/freebsd-x64": "0.18.19", + "@esbuild/linux-arm": "0.18.19", + "@esbuild/linux-arm64": "0.18.19", + "@esbuild/linux-ia32": "0.18.19", + "@esbuild/linux-loong64": "0.18.19", + "@esbuild/linux-mips64el": "0.18.19", + "@esbuild/linux-ppc64": "0.18.19", + "@esbuild/linux-riscv64": "0.18.19", + "@esbuild/linux-s390x": "0.18.19", + "@esbuild/linux-x64": "0.18.19", + "@esbuild/netbsd-x64": "0.18.19", + "@esbuild/openbsd-x64": "0.18.19", + "@esbuild/sunos-x64": "0.18.19", + "@esbuild/win32-arm64": "0.18.19", + "@esbuild/win32-ia32": "0.18.19", + "@esbuild/win32-x64": "0.18.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", + "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "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.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.1.tgz", + "integrity": "sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", + "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.6.2", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.1.tgz", + "integrity": "sha512-/KxoyCnPM0GwYI4NN0Iag38Tqt+od3/mLuguepLgCAKPn0ZhC544nssAW0tG2/00zXEYl9W+7hwAIpLHo6Oc7Q==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ionicons": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.1.2.tgz", + "integrity": "sha512-zZ4njAqSP39H8RRvZhJvkHsv7cBjYE/VfInH218Osf2UVxJITSOutTTd25MW+tAXKN5fheYzclUXUsF55JHUDg==", + "dependencies": { + "@stencil/core": "^2.18.0" + } + }, + "node_modules/ionicons/node_modules/@stencil/core": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.22.3.tgz", + "integrity": "sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=12.10.0", + "npm": ">=6.0.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz", + "integrity": "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.6.2", + "@jest/types": "^29.6.1", + "import-local": "^3.0.2", + "jest-cli": "^29.6.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/jest-circus": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz", + "integrity": "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.6.2", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "p-limit": "^3.1.0", + "pretty-format": "^29.6.2", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-cli": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz", + "integrity": "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==", + "dev": true, + "dependencies": { + "@jest/core": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz", + "integrity": "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.6.2", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.2", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.6.2", + "jest-environment-node": "^29.6.2", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.6.2", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-diff": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", + "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz", + "integrity": "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.6.2", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-environment-node": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz", + "integrity": "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/fake-timers": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", + "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz", + "integrity": "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-matcher-utils": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz", + "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.6.2", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-message-util": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz", + "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-mock": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz", + "integrity": "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-util": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz", + "integrity": "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz", + "integrity": "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz", + "integrity": "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==", + "dev": true, + "dependencies": { + "@jest/console": "^29.6.2", + "@jest/environment": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-leak-detector": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-resolve": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-util": "^29.6.2", + "jest-watcher": "^29.6.2", + "jest-worker": "^29.6.2", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz", + "integrity": "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.2", + "@jest/fake-timers": "^29.6.2", + "@jest/globals": "^29.6.2", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz", + "integrity": "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.6.2", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.6.2", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^29.6.2", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", + "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", + "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.6.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-watcher": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz", + "integrity": "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", + "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.6.2", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz", + "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", + "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/jsdom": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", + "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "engines": { + "node": "> 0.8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.263.1", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.263.1.tgz", + "integrity": "sha512-keqxAx97PlaEN89PXZ6ki1N8nRjGWtDa4021GFYLNj0RgruM5odbpl8GHTExj0hhPq3sF6Up0gnxt6TSHu+ovw==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.2.tgz", + "integrity": "sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/native-run": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-1.7.2.tgz", + "integrity": "sha512-2aahC8iXIO8BcvEukVMrYwL5sXurkuIGyQgfSGBto832W6ejV+cB5Ww+2/CRxmyozhbxARJ2OMpEGPV8sTqsrQ==", + "dev": true, + "dependencies": { + "@ionic/utils-fs": "^3.1.6", + "@ionic/utils-terminal": "^2.3.3", + "bplist-parser": "^0.3.2", + "debug": "^4.3.4", + "elementtree": "^0.1.7", + "ini": "^3.0.1", + "plist": "^3.0.6", + "split2": "^4.1.0", + "through2": "^4.0.2", + "tslib": "^2.4.0", + "yauzl": "^2.10.0" + }, + "bin": { + "native-run": "bin/native-run" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/native-run/node_modules/ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/pvtsutils": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.3.tgz", + "integrity": "sha512-6sAOMlXyrJ+8tRN5IAaYfuYZRp1C2uJ0SyDynEFxL+VY8kCRib9Lpj/+KPaNFpaQWr/iRik5nrzz6iaNlxgEGA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", + "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/qs": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-toastify": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz", + "integrity": "sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==", + "dependencies": { + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/react-toastify/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-persist": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz", + "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==", + "peerDependencies": { + "redux": ">4.0.0" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup": { + "version": "3.27.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.27.2.tgz", + "integrity": "sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "dev": true + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/systemjs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.14.1.tgz", + "integrity": "sha512-8ftwWd+XnQtZ/aGbatrN4QFNGrKJzmbtixW+ODpci7pyoTajg4sonPP8aFLESAcuVxaC1FyDESt+SpfFCH9rZQ==", + "dev": true + }, + "node_modules/tailwind-merge": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz", + "integrity": "sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.6.tgz", + "integrity": "sha512-4WigSGMvbl3gCCact62ZvOngA+PRqhAn7si3TQ3/ZuPuQZcIEtVap+ENSXbzWhpojKB8CpvnIsrwBu8/RnHtuw==", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "devOptional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "devOptional": true, + "peer": true + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "devOptional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dev": true, + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-custom-error": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", + "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz", + "integrity": "sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.1.tgz", + "integrity": "sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-wasm": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.2.2.tgz", + "integrity": "sha512-cdbBUNR850AEoMd5nvLmnyeq63CSfoP1ctD/L2vLk/5+wsgAPlAVAzUK5nGKWO/jtehNlrSSHLteN+gFQw7VOA==", + "peerDependencies": { + "vite": "^2 || ^3 || ^4" + } + }, + "node_modules/vitest": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.1.tgz", + "integrity": "sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.1", + "@vitest/runner": "0.34.1", + "@vitest/snapshot": "0.34.1", + "@vitest/spy": "0.34.1", + "@vitest/utils": "0.34.1", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.7.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.34.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webcrypto-core": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.7.tgz", + "integrity": "sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==", + "dev": true, + "dependencies": { + "@peculiar/asn1-schema": "^2.3.6", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^3.0.1", + "pvtsutils": "^1.3.2", + "tslib": "^2.4.0" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "dev": true, + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "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 + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/shinkai-app/package.json b/shinkai-app/package.json new file mode 100644 index 000000000..04aeb7f91 --- /dev/null +++ b/shinkai-app/package.json @@ -0,0 +1,82 @@ +{ + "name": "ShinkaiApp", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "transpile-noble": "./transpile-noble.sh", + "dev": "vite", + "build": "npm run transpile-noble && tsc && vite build", + "preview": "vite preview", + "test.e2e": "cypress run", + "test.unit": "vitest", + "lint": "eslint" + }, + "dependencies": { + "@capacitor-community/barcode-scanner": "^4.0.1", + "@capacitor/app": "5.0.6", + "@capacitor/camera": "^5.0.6", + "@capacitor/core": "5.2.2", + "@capacitor/haptics": "5.0.6", + "@capacitor/keyboard": "5.0.6", + "@capacitor/status-bar": "5.0.6", + "@ionic/react": "^7.0.0", + "@ionic/react-router": "^7.0.0", + "@noble/ed25519": "^2.0.0", + "@noble/hashes": "^1.3.1", + "@reduxjs/toolkit": "^1.9.5", + "@yudiel/react-qr-scanner": "^1.1.10", + "@zxing/browser": "^0.1.4", + "axios": "^1.4.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "curve25519-js": "^0.0.4", + "ionicons": "^7.0.0", + "jsbi": "^4.3.0", + "lucide-react": "^0.263.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-redux": "^7.2.4", + "react-router": "^5.3.4", + "react-router-dom": "^5.3.4", + "react-toastify": "^9.1.3", + "redux": "^4.2.1", + "redux-persist": "^6.0.0", + "redux-thunk": "^2.4.2", + "tailwind-merge": "^1.14.0", + "tailwindcss-animate": "^1.0.6", + "vite-plugin-wasm": "^3.2.2" + }, + "devDependencies": { + "@babel/cli": "^7.22.10", + "@babel/core": "^7.22.10", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/preset-env": "^7.22.10", + "@capacitor/cli": "5.2.2", + "@peculiar/webcrypto": "^1.4.3", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^14.0.0", + "@testing-library/user-event": "^14.4.3", + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@types/react-redux": "^7.1.25", + "@types/react-router": "^5.1.20", + "@types/react-router-dom": "^5.3.3", + "@vitejs/plugin-legacy": "^4.0.2", + "@vitejs/plugin-react": "^4.0.1", + "autoprefixer": "^10.4.15", + "babel-plugin-transform-bigint-to-jsbi": "^1.0.3", + "cypress": "^12.7.0", + "eslint": "^8.35.0", + "eslint-plugin-react": "^7.32.2", + "jest": "^29.6.2", + "jsdom": "^22.1.0", + "postcss": "^8.4.28", + "prettier": "^3.0.2", + "tailwindcss": "^3.3.3", + "typescript": "^5.1.6", + "vite": "^4.3.9", + "vitest": "^0.34.1" + }, + "description": "Shinkai Multiplatform App" +} diff --git a/shinkai-app/postcss.config.js b/shinkai-app/postcss.config.js new file mode 100644 index 000000000..f78038278 --- /dev/null +++ b/shinkai-app/postcss.config.js @@ -0,0 +1,7 @@ +export default { + plugins: { + "tailwindcss/nesting": {}, + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/shinkai-app/public/favicon.png b/shinkai-app/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..51888a7bbdb59f04c29c548523eb2638c1c954f5 GIT binary patch literal 930 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 literal 0 HcmV?d00001 diff --git a/shinkai-app/public/manifest.json b/shinkai-app/public/manifest.json new file mode 100644 index 000000000..580870547 --- /dev/null +++ b/shinkai-app/public/manifest.json @@ -0,0 +1,21 @@ +{ + "short_name": "Ionic App", + "name": "My Ionic App", + "icons": [ + { + "src": "assets/icon/favicon.png", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "assets/icon/icon.png", + "type": "image/png", + "sizes": "512x512", + "purpose": "maskable" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#ffffff", + "background_color": "#ffffff" +} diff --git a/shinkai-app/public/messaging.png b/shinkai-app/public/messaging.png new file mode 100644 index 0000000000000000000000000000000000000000..21591f6432e7c8db1f2860b9418b1083d29e28fc GIT binary patch literal 120225 zcmV)^K!CrAP)By9bGy7>sdE^jg|kwt@ah>4wUuw`>RpZ}TQIzj^bjW3Y@5;86#?)HTLPiW+}E zwpnYR;38ia2dCxzi!TE&1wJ0`sz8IX3OqwWje4S?#!Q$FXsp*Z!RR*PhZ?^a^wWNz zQ}c%MG{c9=i8K9dp10MgYJBnDQbOi=PUnZzxSr%?S(2bWCiH(fk3H05X*gz1;@A#@8Dl$UW@bi7W(X%u(l$whP0H<*+oUv{I9hM5ea?}N zj*euzwJptz_V@iifo)lqrQi9V|6Y4-#vH>j9OLhHbaynf&h|!DR9DBk@On#IBWq}B zWTlM_ETgu8#aB17sH!FwRnyF3YFk)BT?t%THDAHsvDi6s+*jmYFeD| zdz_+cTbv_N;kB*K;dO1!5q0e@5%r`FmxzWAm&k@rt_alDhAx-jMve30?gLIA-~Yc^ zVrC|bE-Ym+Wz{UUqLxKh*0YGp1{PM;$il0eSY&lGi>zs3;i4jHTUlgXD_*v-aMbp? zcDAXmgRQIYW+Ba57TPt&LPnlvHvzDs=q=7Exq07+E-d@^sM6~H6<1mJ&4jADYZI#K ze;ilUa3lV%TO+C(?+&kOd@#JK>9L6Frl%vTo0g-z@Oof)b#n-6GydMNh?&b- zQoLS^_qB)DGZ=kPY2^X9ezr~3xau*&=_mQ+&4BFbu5B!V^u zfgg>aMc}b81Z)@rmcWW2N42x?`VNK==L&D=WC(B;($LFX+b0-9V5OxbUK3kT{BLok zRsSolyylxRmG$4n$Nhd}RpSl#xVOaCG~E?b-SlW=P4i*|q6Z!*0`YHHA6eTPi7-!& zsB6ncmEzw~hw8xV{it1d5P234A}1p2+b`hd?@^!NbNL+gM?A3n1)tB~P?O;e9YDf^ zi$#UY6w%nFs&GmC`?`!jBi@IvFRC5F>e^v@Z5wQ>X@$)d4S(2JQnP=3K}AwXM*iJC zCqHLvvWnQMs93fttJozZIi2|@rm@xO`D|TEx~<=Oj^P;p+@rg*nYFbyu`x{xYiSqY zTiw*ivg#Vxj+#amgYb=(;9K9uqU+n7VjJ3>67Vvvo&(o8iZ0RJk`PYUAQ-OM*3j*; zwYkq_d#lblqHEB3Ti-6HwfoMpQ}{b$lag3+aVblwtYxuP^$fvifIR&!aTuIAZkx!ea8`m>5GvK9p_PR zqCP}@j`}NtQy{*PFW4)!buHlm$hTTDbJ2n3kTaF)h7UV_SMB zV_SQ##Budqj&JL`oWP~IlGtw0kozN-EQQB{pM zA;51#$li~75<$BR!RmnZ~ED#CO!4uMEeOhAYx zaFA**@95B8PU_HJN$%8LNkQ%G>Yq&Q9+*t)8JJA(8N8a=H^h~t8NQmW8PR8JNAx+` zQGJeXRG+IG)93aJ${QF*O_(Vc@6YWYhaCJ~{&U(<$kC2KF4w3a9cc{m`cVVpkUua1 zg@Y4NJhV$+GQ3+~I=l-?hbHvJgZNn5VSP%MPLF>F9XKZOHM)ZD1^qU3=Nl^;AvnMM zqt$7-5o_14`*-hzH0E8}qsOim4MEZ)|$=C;#=WOlB|h)W?CgI@Dy{gpn2Or}imz$>7P|8v;dA~~bWO{B z2;4`b>spuMbM!-yugAv>k8WsBMit;=SL1VS$IHR!hR%cdJ5C~OUqRUZ9-sS12-?r_ z^3Mp?EBH4+v4x~GPQWu7zylXVRX0IIMFWJF)xx%-3fP)o0-Li7U}Huu zY)H+7^~tFanvet`vGK4rDhAesN5JZB+hEn^EfBbA69jJD2!R_m;H9LE5U^=81Z>>~ z0o%jDKRgQjqZ43FQaXfW6~d z@Ol#~YieRU>o{~djN=>$_*piM@|a@eAi72NFLWO^^cwr^-Mt8Z9@?Z{OlWXJS{2-8Az zm_>sVg3xgythfle0&K^)^F=4jL5q(I2y{qB&?e&Zi=)4%p%d_|0D;#G+sf-Op1=m%p zVP$|ntn~ARl|Eju(#r!@dbonC+X`@XT?Vczm!g({+ls}gMc}r45x6gZhRb95LW4Z< zHrEQ$A{7Z==ik3uu_05iPwespM?c%x zIl?E@3Q9}bi{2UJqx1oE!Kc>FzDSRGo=-z@5yaeAAd>(}{jh&6r zja_~CTqaP5(b1kly^5fHKc>0+3jw;OppB8q5@@+Z&>Dc-PSWZTxO#-`Rn%l6!gfce z?s8IB|78wbbhW8HgI6TjW)N(J*g%5qRSw&J5w-&a+i^Ut$5Zd$LNz1^~%~W(BeT}|{zSoBy!^@RF9)BFX-v_^ko(ny< zl}i@D!bJ<%@c_!-A80rxx7W2#h8EX=UrP2XzG2Zf zxJSe@bm7-L6qd}cUmL^1GqP>{(RGY}w$a$$!nW3Rve2pymfh6Kb|9SNo4cLkTDo20 zT6$b!TY9e9)~a<08b9Wgl##&_D3TzU6Nu3XBRm-blWlM6VcS}DETU_eg=uy%kK-S* z?4&s7tg4!SPpNJE9zhr#@EvgtZI7etU5PF{5Pvod!J8S=)KwPS)YXNTyAirCAaKv1 zUW;k&LHPE38q?DA7Zk*_$iUmG?rLM&6u=c=%f*4)PQcY&Mc_^%a3>MC+~K0*x{ScR zoYp&dC8KxfN~QqZNrdfWt^nJsZgJ13wSaazO|{f06;Tu6W%Q{Jf1KSo(<2C4dr4 zJw?!ZxGn{E(P6tH>{p^2Ua@o`EMM|8EL;2(EM4>@*Rn-V@%vURU4X86AwM{H;Pdpv z=S6__;m}_R{@!j7=<9)U=L$d(sJ-cT;`h?e(PK!DNe-NzgLEL^pm!I5PB35k%#-lY zQ%}J|zH1<;pb83y_dvzy9z7m_^>O&VifroEZ?EsTysoqk{C4JC^ovfob7goObB#&9 z=85g`Y+2+E*4SKU>yNZ!{G*PVHUw{*hV5+bWZC7VETg59CARiD<9#lqwVHiS$#u=> zvO8I9b2p1aAwcjh#LSpzR3YR8$2*xC4K7 z1oa&L>?;IeJP06!d;b(8R1`q048HOx!9+&r3hK}S2X7~Vx1WQTT<%WM>82xe(dAx2 z=w8VdpgWnzp*w!HP;|8fRz8U}vd2UvBfIr@`m8TP2va6X@dD+zS(*`^-%_lQ)S-n0 zeBKGI>d;+}&MX*Du~%o8fPZ=cc&FrmTS5jbk4b^W;fb(ds{q_bLbk#~2;BP+xOe*m z!EZeR;r5lj@S9~`@Tu$RTuKmqj@c(YP9Ufh<0D}G9IbZ|4NGk;)RORyLax=(}%LrZ$ zHjm|Iz$F;EE`J80yO2Ydz(|l?zW8YlM}p*Xgz!qd-;Lr6JRo?}0f3$Zf_1gO7pz_7 z3+sXdVe7_Vhzi>T@iAeLvLgnv)03bmF9Rw{@}ah>1X>%bp{KJM1~gqTHmrrcyGG#f z!QF7|xr1=}#pmFqGsofOb0^`|3#Z|=m(R*{23~&Y6r4Tv0-SjMS=hgO6b7~3(A-c3 zxtTj5V%r7?@NqL7Fz7k@aF7emox65Cm@QfG7~J{0N8pj5P5gaVF}@Gq3&Z;OHjSPp zg2P0J`y^-m)h{ycx9;Jw%p)f08n>t&%rAZ?Yi_Q$^+(+?{*gvOdpC>d(6O?X9+uhO z!_fIT$93pjG(}k~5${8YqBLx6?{1b-*ZjW|n>ubvXzE-V-`uqwL7W@g+|!6|d<;Q+ zEUu;Zo!FM%KO%&AMraAZadH3?{3ut&4+FyYs_1$z@8pwb0(>(~!8<8}_bNj5D#4W? z%YloIsBCmEUJ5F~`{?V12;Y3FQs_4Y?+$t{lvmfc^Bi|;Sv_njs)BWSrLZ=$5LTt; zfPYd3_{67(u|hPsZV87K8@9so(2cNkEjruPL9obw6)g1jh2Jh*3cq+}CH!WohXCA# zD>-m)dSWsBTmtTc2;BP-xc4A%?|KNnF9P@a+wXzvZoM0!dnf$&uYL>P`{nKM-Cx`W z-@WBl_|DC!n|=-7zUf!+?Hfh?{Fhwc`q?d9|L>=$8*YYg{q$z|HtM@SyBWUs^IPD~ z2Oi)MCIERFplbx~N)fmwT4EG^-5nt<0he5DP@p%21_i*z&^53Hfg6tSi;LdQft!`K z0}67}p}Zsy8fwa*t+^I@J6m8t+XdspI@q^c0PYJ%1>h2F-+c8Yc;~HG;e&VHfR8`; zJzV_gUHJ5q_u=zPAHbKNeFT5};v)R%%S-U*KYj*({==tSbo-BAT;gB*!{?vi_k9ds zeEJdB=a)X@`t0Hd@EKi-w@LJM`d<1O{+Re!bo-MJ-+>GGTtO^vDQ0uIlXWAa;9eFN|tu? zN)7@zZ(w|~00CS$v>O4u=V}RuFG6>0pFt&~d!ZQbNBENKrOE}!qN;^%iWs!81063q ze2A`Xg>ZDa+e)foQ$ZQ5%PxZ8^juhzoB;s|Dc~EO0A2`Qk1b)~wqY~4hOUQ|YlC6M z>NT(;AOKeQ`N0YwZ&=~w0V_P+_{7;tw-w;#wjA6=r^!#xQQj!ZXnou%rxhf{3BGPi z;O3v-0RQ8^{xAH`?_Ll8=La{yH-B=I09JzRPj4~6mS5*W;NEZ(*SCLq6MP5tJp}K6 z|NLgS7Ioc?x4`wNAKY{c{1Elyn{R;|ZutfL{FlFkn}73b_|@&V!EJZm0e9YW7uW56Yf}ve?vSnrCPoKf|DG{8dT1{kN7qWgJ%8o|ce8K5@iGT4flq+#ha7|w91YMV z;F^Kg2;I*weZ)cgDG49v(#P+?MG``sM2}BUpGu#6DCwOkB>%a$;iLE8HXJlQyZ9me z5uYDDuUF5XhNikoSc9)0ok?&9PH~T`0CLLZpZwkZaKo*4fPZEY6d}Yj`-b#1=}dLw z+iKe`ug)z4&$yk(Yf5szk&>FiHl$`ckpqv&EwuH=-!c9kM@?rZE9&TB+q;HYOy>Yg z>(n?UboRUCv~@8AI9t`bm!-7#{&q*ZCN-g5b1L2h&N@gyFz-O;N?=aovBWTka&G_l zmHfe7lZ6Q5VsgHt2w(xif&-@LfogcsrDXLCKzfG;Qd+xVM?*WrRX0LZSq+30mcf>s zLfDX=4WY?t5EP#TtD<7Te|rS@Y~Bi9>oufFJHh9=;#0yY|1~o8SI6eD~UG;rl=N3H;=yo8f1__yyeft6#z` z2;E=bekvJBRbs9mO9XM6L7m>_gFtXyKfv`II5{QeLJk#v=LUV3x$BStHC$W4}AQ*!OO=3 zyu94N69MRn0Q7VhvQ;nqkVxRAY5;P!ekR}*a@;`gl^nW(2wj6D;F`#T=dAudLZ)j9 zUDG_5PM4(;HMNL=Ce7TbdV(q?Xu^)5k8lq{ha0lS4>pFb7J$2bqX68bSPtCM!Yrt% zD1_#^3g|%KYP(xuWS|FuI{*jK;Xe25UO0K|FuL30@Y;nl2;1}Ut{5p0P$ZYjp^G4u zTDuk`Ub4cpU-GvOD^|mE5UK!Z+Lp z1Z>e^b7*I2MkZVF<6C<55mimFIlmM_$RS5Y!72oEKyVQF`}=?|!I8?c zs0u)g7W_#fbjj%wbXWP9J6&_&O3)SDt`WM+Md%729yxF&=#tz_BvdH~8Lj|aiWJtZ zrAT27Y}*t95!*IGY}7VLNsNZ9v?L+JEzaeUf|TLXgxC16R?Kks@JX{%Cyv7TvnSw< zSI-FQxudTSv8oaJ_EzM0agOGY>TNn&R|kZAHSmFklFhV(R{xUITHACR7}cMFdN*Y%sg zbIls?M(0eWSiG9S6HoKe2@{Z4`?;e$I2<{IecbtsK93owY>dE5wYUgf4+C_KkR?}3 z&W4wRQS@Ob30uJ*N0>D8hm8o_?VCe|Duw9nkem<&=_&D$mz@e_MLAGgSqv==RnXnu z2>qH)UZp_Q21gD_z!fswS4Efm-tS)*PnX}f5Gj0SfbL)a^o0Ol4&Kj9vRs0$32+V2 zHP3OC(3Qhh0vbO6&;;DY4|zsRkFR`g^gRBeb}%rBI)vvWJg)Hg^gQY7^fPqOumt(9 zt&fauTM24q&TU)CUAGb9hTBrK^4?qg^`-X`y)Su0$4ejuh?Bm5{k8Du>h+L6wjYww z3`I5f@MZUF3#%`CB&I`1dhYgs#uhg?#-`}ram1o>u!^+yu8lLc^JMVRZi*0k!qle6`U*KN@+@$~~Y4_EG} zSD|xWgCJdlfL`tIDZrT=F}{I0ki`{o6n#*%Kye0rU+5Zt*s@_Qj}!>FDTy(H!_7(K zz^$nefZNs92)e!w7#Zw?y}O3F!=+NMvnOBR8Sd+^oa2*b@4o#S&v5AjMimMKA_-;! zWIs1LTn;t?Zk7RO>U8DsHFK;o5F0++GT2HL4g_0r(yG8!IT-wjyYEkgTv>!IJ@$w1 zy~+RHH(xu?%iqqt_&gqj4#5$8ZT9aOh4B#`o)vUKUsnsXx70yHZ8=ny=0jm#24tlt z@rn?t458Pa4tm>AVO!SmGY$GWomsqi>@fU+CKB;?&zBol0@Qw7xDn)XfXhKn?>+io zQk+61k^GEMJR2mKKmNN1;9KASA#AT{h3x)uh!eB$jTKE-y;5?(KRNSKdQIJTlgq2v zw%j5o_CKFynH3ebMuub9%P8*Fuv~QAtRGlJ&j?HH8E`4>)v|=1A(r0N|1iS(I88!w z$KBa~Ii-8xDpiuKEv(Wn-5#rd#xGFs>Ml6!AYV6Fix4IdQ}jS@RC3C+z=NFjrqDGU z$^_%)`byCDw85^i0eJ54K0bLy&?NwU^u7RGDZ?eG5xD;L=P%%IfB8}nUH`Mp;TnMZ zsUcpl3f<|zL;ODJXXFyxu22c_nN0G>{sMou0Ak@FLC@_A5q#vR-+$)~9-|O&Upapo z&YeEa0eJ*ZyD4@d;8H1FF9Me;J?g8=paOwgoS(_d)^;YvLPBgfo?UE)ZJR=2L&z!! zUhNBO@a%(LZ_3-HayE*ND34zu)>`w0E#l&qm3&$FLNQ8OB%Iyg_j8Fg+w?v3Gjvu& z2h_LUxFD9&%?-pQw=Iu?E`4lzX)iL5piDtdl`HgK%*#sUWrp-WF-Cez;DfzK8Mx_?&jWv?9>ura47e{E(VwVriZk(|x8<`&r+8;)TQqqD1xW%l&5 z+#Ve(?a{CuJwq;O=)#+Od%v->d!QhxYXB0d_F3qkah2+{SLape7i|jHKjY=avt@GG zYXbymlar^pG!;7rB#wryhV#vsI-v&KKdWcg%iK{@zjrLfT&G@ zZrz1TXJGU?z5LQieqg2O#EVaa3zrYv`&;w}=QFq>z{RDwn@rc-}{ z^q<7V56X$QsX=Rmxcv6#;$jQ+uUiA{R9~ODq`!p@LiD^2?Vo_$tet$7AiXvcg!wXV z>g};|iLp*x%WYYh~l?J2&=)@S1wPvR!k|WPl)`wkK%rslp~1K#4R0k z=PgRHGv_VA+j!k5wNgWRe^iwf@>QnXg;RYvYVpD+;9KAQ4)~zk&KcgrTReo-cj!Y) z>%e_S=9N`xd9W$Bq$w!7gau?2y42NGJ6!lb^T_Y*XUV<82=HM7xO26ppT+i$Fm&Hr zlDh|i!@EOwIk7{Fr*dtuG%`v5q^FOb%J$aEz)e{;L4<0JcaIJ7iV7)HrqVTeWFbWj zpUYObsp&H-_sdtvnZkSap*$0K)4_*g5?Z*D7#qP~7m6du2}=OB2wyMD&esgW^4nf= zC@UeY25aj8p93C+(IdHVI;*6Jj9fRL zpci8lYAx`iA6^gluJDAM(fttD+RJzP*-+k~_e{yr`|Zrpug@ulZMj8v5V*IX3r{I7 zaZG6bGmhNe0hZV|!je&GeM2renjv=Rglje+@;lo zbf(eKTF)zIDAJIC?QaFpa!9K}+e-m$rJJ6S%buD0wghhZb%HlVI@Di;A~1r~Tm#%J zI!es=f$kg6S{&mZ5>XH#Xf-a9oPyi>BTgyxn| z7Cz{cQOrEjik#C+%N#EJpKatJyrcTY5#XZ;@8N5*`i59R-@vz1dxxIi(M^$wj&?%1 zx~;AQmPGE*KjG%CC$I<^w->J>A$X_mh(RZDM3^{4NiehIo@Yx2w=KVIBR4Lu+otLm z%B6XuC91YD1GYNAX9ROI=WWS>Psfd$g577j5LW>>Ri;qpKX(9^gWS|@+Y{8KsuMZH z4VSVQh0G33LepfXR2NRV=g!;V+MnOVTTLY4XORHDxvCj_(+hZ&S4eK@)ph8?5!z2| z&M9Ijm&p8LmRauD!RMc1AgEbv-) z0&HJPw@qS`73MLD(vh1*D=SQ3?&E3hxMvif$V7iDRkLV%+UC@O8)Rou$+Up30J#Kk zsw$#Ri*kTJ{J=f%t?R$f%L#Y(4vPS90pE;5y;pKJAiyU>b4p-CPSN4pqI1~yw&$>< z;!+lp<>-;}4?hYK-btEK)EI|%Cc-@%y8oZ_J@@f<^KU5-0)kIQ+LVEP! z`{CQyT@M>eY9LiJA^^O)1^hCKsCT#N)XR3f-Sj4?i;cT8N%F!+;~EfBMbkB z9gTf`EDhnEib~gvpz|JKd77acQ+tO#rOC>8gg5Qp?VVPjf6&!SPajMP-n1ZxR!h<% z1aevQL6ve}TgU)wRe&p9_uRl-a^6%DMz4|NMrRV4C;@KGp{v5$n)|jmxv7Nt^jx_T z+){i(WsFJjk^KKK*Wgyq!|kgs+;myJrF!t+^Le5djvf&D<4BzfQI9|JAbk7U>&R(C zs&*6s&X?4a0|zgPQ1Z$kG_Q0rB&QhG=MYVYv7QvPU7n(^a?lXvEMxa-$4f+ilE-9 zL4XUL2`K~Tn|TD21IMq0)Em-7g3wF89-v_CeT;IyeL|Ip~bC5J8noLU?h>cHIu2mZ*z_rZ66@I%;K zRu3tZffK+ho4|*fTJ6k*ko&2g6P{*qi3!lBS0AqC zz}2qP^QNDt30rCaCgk4p=en&y+~%-0K-;wTTX{bR_-6_S&Lfm1@X-Bt!}oslV+gBj z12R}bKa@uBLU_|2rU-Bl0WP?3g!ty%;;rk+h36ExggF5Ik26X%18k>moN2Tg7T-7O zoU9$AC?!9ocZm9SU#3lb19QvtcQ5zQQ=Tc0O{i0!1S(pfVj13Z4{>=d_-D#XOC^Mt zWWc^;$&r5zfPel8?^`l8z^9H+rUPxOQHr&y6pJy6Wq_-G%}dzqS6Fbei1%cn*I>TE zJr%TV4RK?ww=w^|_@U{_Oeq6DcJ!bz0~Z(b+;i9M@co-^0cux4yHkbNcffjd> zv5)vfxf1j9OKOgM_N!0`4%Bv*Is;NCKYIOU7NN`x=+>OMIp}5X-`iZq23Bs0o#b5& zlapRzyWbV!Zt&}a1EHm%ns#UeLt3Xpz0I~p zk7In@(b3((Qu`-Zji#T4X(pUvb-P%mc2q~vNqoEZ3hjQqBsxWZ|AJ>Al$^J}r?6)u zet@Z-mzKjz6LqHWwmr11xpJiopWejgSC3KXG?+T^(e6BSDjdjLx4J1BOIeFmjNfMh zRUa8xeWsB3yEu6HB;#`K=yV{rt4sSaFw*+mu+qQL#V(!FEvv8@QRb^>`$x2MBX8O?&zYmZ2tb&Z8 zJrLR01zXW*t;#J!2c89M@G@8qaM6W_f`N{zrjsgk|@SQ+(o* zg_k+HF`v}F5sFT(M7Q+9s=NyQZJdE8(aDyQj6S8>x1|*dIBep9#ml~Z(b#q@lh$ByR_@jQto<9 zVJiUFlH6qbY|`@m)d60-7x?<%Rj?VK6K%#IZHlpTM=alvfp(Iom812to#bg3qKT1y zIJAEk?`uO{Bx%(n-&8^lZaZ?_>XC{Baap`#7cwrT7q-rOk8he`h*0o<_{@UG;M(i2 z2e*iLNbjHE6)0P(TlmiPw5h||ymA@9C5V@j6X!irHs_aS+YH*Cz42=9ohIaHVsyc~l(@buyZG#5_*Xb8gbQ0vt;q8rYo|J?rp39j{R`Q)< z>^nv=i&Ru6GpCb>e>I5H#u2o|T604cgl}EXLFyrH0Vi$wMlP7Qj}^ClBjD0mPmr|7 zCc>6>y@?Lr4Dm5x!j^A46AW9v(GEnk`9)V-1K)vYbVvhxCx&^;+82%-;I-IiPaWes z@JRb?8g?KOqcCZwAKJWFzT1ysHzIK}4B7;P{_g~8xvNzNxBbD~_OQ0>!l{WBy>IA$ zMC~c0p5XMpc;w;xg&J@KbP5_SUV&2C1k}iicBl`|uTTLvcj1$vxuvi%zwFdtTZ1D5 z|9c*Jx>2@c_z+9ijk{#@PoNVYOWuiZ2C6!tdT+O+Z2jF&FM^O&-iGLeR#}pZlp0c* zIqyp!88%k19HrO?%+0$KTAIw9-8`JOLn8>%hm`itq)lw8Ukq*aHae(*U84hh(u#H+ z5@7oRFGCcze7j)S@{Jyg{uY9*a!WNe(f{mEDqFsN&bL_;S{;~gg7KaTSWICf2eiqS zaR!LLFOv+QcHqu0DlhE<ucBKGJQl*`Hi+_kYjwsLH)eb2Y0i){xPSb!EshJ zF!n=q-+!Qb(%9C%s~ajB^>=#&=-u3w3som#y?0|>g&3WDpc0iB!TrT0`Pb|R+@=wV z0^n+{d=4fzC3i~Cfk3JTUfR&uWH)&$du*yX+l!LS0AcLbr6!*yiZ)<2P z4^Gy>J^xUbCNL@gruP8tMY>GZ$cmz}pa1kH@aspOfSp=l0+Tj14w5D?b4o=AULl*v zEH?r?uk7l&{4&^9SiaQO9CD1WILftyEM*MccR#xC0q(x@B==1dmrG-I>hF7cp&>f) z_gV>?LRa(Ce}3A0N!nc3+<}`z+qM&%s*{(~a^xSVT+U7=u7vq?WNiz$uLIw?lKeT_ z8r0SRZiKi!IB+AxrB#?&X*-MncUuZeo_P|kyY5uFk2xI!R?Wp4M9Br zuHa>a6r%*^DPokovMU7e%?0Jrw&svye8rK5?mHjdcgfH=D;XU7?+o48XWV_ak^62U z_YEHIE4ce!!wfA2e=u~)fV)8s)V==YsD2XH;+=Lg7@6ZYy)J) zeWvhM-nJpUE!<~>r~QFl9tWwOy;ybXvk!239v{5(2CrP=5sEl@{lsGr!MDHnJqSq2 z=9@W~^g!8}2WutwT_6Hna^Yf}5{dw)?0j=!MT4z5OAJLbAZbsZaeoaTSAYYozo|t=G4-}fnq>UV|``L{UUf0IA zG7K}Uz{~}|j6y?vB28qP0=!(0my;sE2W-tE$M^~(Z(xEI=tf!f;25hN82OJ(-Pqg7 z!fLLoo2y&(_xh}Xm9EPm6al_Q%)Wa%nnd^gzMwf;Zcp$wNVc%YI>_w@ z;-*eq32fU#Tg{EzTdZ6%3~ssaAxP1T zLTpPfU%(SwRLxgluF5Wv<=-j*&o=^mV`0TUTeHY9W;lAfTUh}DJZE6sC3kQFVLtAe zt{ufAc|YxGsrN}Q)Zg>WGG2K?rAxG6hgR18{*9OUgqz%bt3liZ+N#;OeSq9-B6Hdk znzNgM&j!Se?)!Z(jaBRi;>HNY2yywPT>#u9F0pL}E-j%i$W1p{z_S#uUw{2|d;w4T zz%Gbt>H;eF|f0S+4?skeE*h7nW zCU*7>)2hqKu!c_kqoLd3nPp30eUP8nCU!AYl@;(6mjnl^;8w}SO>%Fm3w-QDCa&Ae zdC&d=pRWw=PmGr)@V=z~X4E{C-m*wvTU%V2J!m73FP zbahDy@u>iA+Zg53i>4Et(*x?<1OAfYx_a%m?clltsB+ZSJaUW~j0TN{HfUg(0~0P; zgS%Mnz{HL;?I>S1AJx*MUlE_7e_-JvSijZ})&vNpgIhKP!3XcYX)<|fmU~+Px;nt^ zt2SI7r%1Q0J8=7gxZIV0D!V>?kk4O)Vszs618*a=%|UJpM=oz*Wm5mW{293A<{RPX zcis!hy~DhX?DqN&2rjPS@kwA-i3-3gOfqr7fmd81fNw6U>ajJG9AgF}dteu%Zi8ob zkFxhix}CE7$4}92))b#?tLxA|xOxLTvvjclaIx2Sab6~0H7IxAN?==zP0TXz4?#T( zw=K*qZt$SIZ3b}LfLvKxXpBx2nYbciv9$<>>T!yFN&>pA0A7@rVN(Ask2Aib8%IXt(oK)GZ@ryFmGVoxd7dF!QjL_ znYwX04bxM6vbLyNf7>G3eAW$u#oBKI`0nvR_}ibqGy%9Oyp_FB)N*oF7jFBBP5CAe zCNYW<+LzSaw|zKrvwCrpiA?&sG{I?0fGaQGvl6S=UIwVnBg8+E?ZiX^)C2s9 z$AtXbGbTxvf45l4zm@KrivWIQU123`Ev^c;HIp1;nuFq#Tm*OKz%G}p!QB*}>@>tD z%@m)c>+g8%DZcVjs6KJS>;CXIuRgg1QhZ`DDp9$v4sC0|w!IrSiBweMln-Puw*>I{ z0lMlUACu@r;lvH!V-IfJ6x?QDw;Ro``zCPNcnfRdHx+DgSWwf6Tk~A_3I0(Afl}19$RzCF{U}FbTDsV!nts07b_f`xHYqX zTu*IdW83=lp`~^DTNk;4yW4UI4H6dbc)BizL2VarTs2jEVy&#uBoCj~Vjue`GgNiq zBCJ1`gIXplNd3KH?M!>?ZAKZ3t`Ow(0!_SkIv|m*?LR+czrm zZ=wH*S8Ot*>Bb?Vu@g2|w}4+pku3jKiBAel@^7H{1O*$5s$LxFZNJ9WTyl(QjMkoR zR;e3gk-9xjaRd8U&cMVT>V1;Xp_>eE?9xBJJ{%r+;tALg9KhofUp(q3L~l2P@k}6Y zadD5*mD`!~mb-7Y+a@bDRqMm;2;lPj6)QF6_t}e#D>dyeQkk#(o8DvR&%VgF&Xecg z_uhR6eD6m;fo+vdkkm8CH*k>hZ(lM0R-L>okU?B<-&aBlD`8V{b#GvPrLEEA7}FUP zpX3irI28}=V#R|K*Jt&Qf0-imKGAQgYS!Q3>I+MkQTd=hI&Uw&`jU2ZnMr&yRh(k6 zCj3(+wCw}rYAtBxw@togb&<;wp z<(?Fuxbgh^XK>R!_d`>j?zb$9o z({bUpcjijC8}o3LSjCQ7&?>)X5~0r0g_p$Za{+RSQ7HeWO{jVQ6E~s%$+y1yUGR?I z32FV~5UHAfTXNiTcvoB%Con%wtg8D?Vr8AJ(c~CYjpDum>V4u=IW*3y2S@)StAG5> z6gmxS*IeCJ*RH=mAQT>7@D$I#Y56=Y-YLpW7gt|SZ}M{5RVivKG*z9seL!0or5Hf2 zwj$FE-qz~GZR5&K`=qEW_OSuPFUh1DsaSO6cHqEg5#Un(O?#h88(s7K+f~fJfBX}n z{<~*L%)c8E-g!d)tyVs04silFpTOKyTzz0kMk!mIQR-xCJ~_q|qoKEt<@S#`BgAP3 zp8I)x(mkN3*0CWab^6~dS_z)+E5zR4UL4?K!`iQvf2&ocsMdz7f!>Z*Xet4&bl_(3 ziABJFVCA}Pq7;KWR|4F|@rpXY#R$d3kAB>$Gze<$~iOgsOU z$0)(F{F^2)x0F<8tt+Zxp@mhBUFq$8l=t~Ca*A-U5w$hrVn@eig z=8|d$!0maI_i9&6@Z_c_xc`YKh4R4wp>=FhT%^!> zaF)Pr3F7AQiri^iic@S4Z?h;x?NaH??I1!ii&IpW)=wu^nI8vksc(wmx}9h?oj5&C zRQP5?{kNAq|Bg$6bgBP|mHgX6389#OS5W@_Wo$+54`VCpSY%m^BSNv~0m&XLS2OIC zj}S+FKV38W$7HehH9=(cv_5+nt%zo$|sZhLS`5zB1l-&74I&%devw~&7~8|%L- zg#6pjLjAXe3Cu~Fz}#3|eT?}gA|38zF%`A8MwDY%8#IBLp&fO})Qz!h?T8n}Cp)_O zCn-Kzg{NS*KD`72eBF8XK`I}l3Y6o|9TLk2XD>dnnup8ug+;jAM|5HWW)-+w?N~UY zXvIdcirk%>x$pVi{9&s5Oo2K#Kv(XUY5Fzg%FVAIpHSz|6-yWJ_{7Vw|K-o&#=Gyg zoPQTsaNXwO`S<3M>XJ1Dm27o>rAt(q1K@T$czmK6W+}RH=hXgjicjjOc~wG(?n*>s z7c7fSg*zXo?t^}Y^1*GJLin5M%g;ZV{rJREbfR?T7AG-n4{nQ5iizX?z+#+Y@;wHS z+j!-s2xleKZCxiWuS$_1t#s!0Ao-Ge3F?I zx%VX_{U|z|YC32?Y;TV5_Y?)7M}%!3sznW>;ZG9z+VL&N2b)fk|O=ui-5j|88yQ4Y`WSWw3PXBAoH1f{0 zN>SwedBI(fW#9bcvnk~V^L#=N6>RuFRd8s0MR^x{WoKGc`i!(fl9}EAzF=}0vz_q* z#kTVy&*-njrOcWqI}!da|KAHhGlGvcmKBuzyID*RfX2xAuu}W37F^U*72P-Lfus-l z@AP3GUlRevdUUW>h*w(tb}LaW?U<1!Z3Q7OcgN6lcC)l9k3jJF7MO3+IgJ-}Hh|M#!)Si6J3!@GZgfBy4btTe|Hd+Yg|qNPjHmls|35S7 zR~1WUa_&?{K&G}5$;NMa^&5RIWbR^RuC!Swmv|!R0rq+xUrm+^q17Kg8Zl_-U9Pnu zt8F#H1qGVA3!0n9sC`UZryA*TYfrw(lSf|m42ZoKd8}#92+bPgj>CgwX;uRNgOa;n zboJewUi|lWFVBpO+~64@TwC?MA1y|D{4|5!MoW0_<*hIfk;z|EuXcv5Q}MAbwQ)qJ zll_!Hz)o6Z3o5)fDg~E5Fd>*0Jd;Lk(rR0bPw)E7yJZ?EHXO-w9!rfVQ(r%&fin|t zQ=nMCi@IYE*h>6?oF2zb2CF>0rs2_hJYEgJRs1%=f=>R4r^kdRT0g@i+BWTA+_aTC z{vRH>R8u>Up-TGsr%Kv5=t2!N4U#Ax4npdfmIft#StIi3;xbVW4t zXZEnqYAN}L%BdtuA6#NI_6^J}S(XA@{1%e+0yt7Ve=rsTWOv;f-b6}b-`=%*V3jOI zFK|^YajpQMh2EYW2(4raHgRs>N3FO2ON`QQ^SF&Q;Fs|YC@#e5;msG2IlGS6 zt!nd$$H-GJABF1^KS3;ojq7Jy^U8|!Em5yiB7vG`*AMBST;+$ZjZE$zXKpKxFUES# z##*)Y{r z?i%VyQB`u<3pN1l;ITX1p?=K$ETT$kC;Pzfm|H~Uq^I@_vfPHIUlclf2$x_JEyNes z_^nF;jEb(@hxR}Iq+J{PJ~x-DNek7#mlDXKlN6@C$ukS;A7`s7#Vx-=CWV%5MzDT} zem#Oe)9W(%7-Zw|PjmdjubpYyr=fU6cJ|jV>;H200?+YO^1fYi`?59xb_eexOVOQN zw|P($Ehhgw3)v++l}wMhQlQZdPHy-DxRsLq^jyo*m9^$}AIt2)XSC~E*~rK?{T}2f zZ(LMm#xd0xuMTsd@x&j;-SM|Ps48MpGj}WAZ^=;b+ddI0I`0nf!FMhssrX4$288{Q z6fMxzrkXY0xa9_!`l75K%%|#F>f&%|3}m_IB~Io3 zum8RP2Gwy*Fb2yT_PMm)<3XZbBf|^KlcpE27o8T7&s&+yQX1HKYR8yRX}5VNXadFI zHCwxTO95hmb5<8*-&6Eb>}Aa&XM8)^o?80EN_uB-U5R>6X`M#sq8JdFH^kMAMiF#x zrTM*CJD&}5pB)d(?QAZG9u!x(9?W9{#0#cXXHb~?=D^Ix}aULoi?fO4tpm73zq)qsfouGJpbi4M1( z=s=p4fcSI5yNB0BDpsNGjzguk}a7_=6}fscwRDvk(N`AheiHHxbI zJ=sxI?;0kLt3C8}0B0ScQul1&oKngIxApyHZTaJ?7sd%*-ms$J30L(}*X+aT#J1u! z+ce*%7e=6QDIvVM0j;aUKX3YF(RPw3nYdJe=nQ!K|^U zphsqc;M$LS79HfHdI^* z6$PK*aDKP4j~wDHvXJHUidDPHfWEx$g57LPkOl$P{}F=p+7g?`T^ z;#;C5fQIh0T+4#*^mwlwd=2AgtDVd=^M9}2SgpHB?^vWL_5v=L;}v<@yISm|UOP!F z>0;5@-KqPy2m_(E+O_yu&(}92I)?BD?ryP(Fz8TMB>)Z2`jIIMnX6LIKu4sQN08`A z*JF^^&}9t{2xmo(@FaOZX!O9_PD) zyd(<=uNp3$q;Zr+$jr)`(2^mpT`hmQqMf3G@T{}T?m=kNJh`Y6@>m`7P$Tgj57 zMP{$D?c%)=o?5ef;H>0Z>b|1Ijh+(aMlJ2yxbF?<`XBx7>NK@yZ9n+|1B6cmoSiDY^#d3m z0)easUJI;G3Nf)ndkv&HKYTw?%05*oPgsI9-gDlOoyechw?7+M}SdDA<*^bd}uN5P)a_Y3gKOFH+4v{4v zfAR>bW@uOc*^;gH%=3P}mtCIzE?p>d$&dJFb}&ogb3gKnBZlY)v>krJyKm*AQY^eO zW~Oa(DS=VR!eJ-0p}Ty~vB~I>*#h$Cu75|_)Mi9vTFvl{oDln`xkF!Vrg;^rOpdX;G%4H`hcH;Jaa&XX;+rDVKY2fF0@N7bgS!KMquLxf#w-+3!(gx{xr)5S&77+*3K6*r-( z5dkVp*M^(ZO2p%4R9sq`+s3pM1=9GHO2q$#=nJuzaG@MRwAP{{r?nZ8_i}W*b-HQq z_>3$pDn3u-dykyS9xATjHlKfyR)`n)a24T)itt-q$1sf8U3B{p@=|;AX_;50%Z!Zn zCWCEq4ET~~)I;EXciET(r*L&%^eFczamxE`E$-7X?(^YhCXj*6TLmr&4LkNvbJ^sux-SAev{QVp=VnOgf5B&%4KSfj=b=`Fuy7(5n z$DxxiuKm#bpXS%1$JYDAQj0y1^xl_hMjM&-U$}jz*I}F>&PEuMX~`^Qf3 z?)>96>Lkp3DQrJ*(eikJoJqEhv2VnYeR!g?QV;8@I3pC_jpFP$gHZk7NAtv^pAg7$ znQcY8NBa4LM_LJ^KZz)gEGa6QrHU9%A!HR|8jLp zFbhLoY)9KB{AF6q*X6R#x4J*_ArsIIZ`R9{2KFa{qnpHQ60|E9$rL zmU+do#A^xzQAq9PYxa-WN`VKuo&2X+7@u02!Aa9g9*Vt(R;xEm3evYI2%-754>6yIXE5X{EI-KK7x!nqA%|w8{|M=(BqovMIN4CFR zY?qG>(ehZ+=1B{NCymi~?jl5uZ_0axFD0rG`00@aTuE7N_}BTmLK==uv9GV&5Q24$2n+6F8nXH7L1rK}&x z-H_0{zL8tLvm6{LQNFf>Vw`-W@Hn&PL^`aWuH$!(eLi&{b)r~r#CFjnPnS6jz;D?+ z2y|V#FdXXxi~h}gE&PG`QXt~Wm?jo3{rC5e=CVv5xZ)i;O&S!X)aJUq*=#S{?VG98 z-!MiLDsQF&+$)unF+QL*z*uE`mUrI&!9d)sc(`deAsQ>dM#C)dI}bh2y<6+!ECfa; z658Hfe4aYJCP9bs1F$K0<#~re=)QiuWpfYyadTaq?^>_sNOeVWq7KL&M|vhmUqNcd zO21pd57k0mG0cp>LYy(chRs@VPSUrTP~5#wJ7-Q^o^-mbb&lsrbb)SvUl_0%dMvyb z(9-%@PVJuiG}WQq{d<_cz!f_ID&(*(^b&yY{~`+GM28(jaT7{(`?lt{f!U9Vj~z(d zod3%hm4^L)QgD_d^*tX2(<&HeN;Nu;#eI9%ho2#~KXO~$n>_ChUYWCzc{ZqOBFOpz zswuHbiF`k2YwEtj_tkXBg=CM9;^ScZhK%RpHox?-F@CeeOCWPw9~i#$JkPlGYhy0s zOV(ERJj#i*nsK%>$n{qO_j$ z<%;#A6bg6zE+z*Cm5g?r3k8o^1QQaX@0XL?Y95q>Oju5WU3`QU|gW8`i+5w&H#HQ{ATN!s7UxtC*j!m=u!)1(=6Rk zFta}#BPfyiT&9MqZ*#Z82ZA?OD?s%7vaJH+gZpQlsHa%jdp#;q58Oght`;=Tdi;S*YWtr16P)|~6O<$A9UH#C9R5|9LeU97RxqOw$1|v5 z82h7Og=^tm&}*dlOme#Vmvaa?AfIp_{z7U(6DU6iPmRiqviYf-&FzV*`}9T z5@AZ|R$J>5Z_3YXS<*7JrApT4ls@}K*VQ_a8Mk&P#?TviG9ji=(%k14O!6_ZH+{O& zcXzt}7uOu_CvE-is2!{M&<)`Og;V|mnLGZ2zzgyZ_kd8rspuUY*>QZ&xr6+@^6H{?=%G*4$A)`g z*^jHALH6Hgw@;BVd6a&u1m}{eWQ6g4)H%4-7{T342%NX1=2XyJ$(`^g@&Zont70%M z4Fc6J$EQ|H=4|0Yuhj5%OvRc*-*ExgETvdSo_U_%oY}Vu_rx zJf%2gXiXJoiC{8*2t|)|ggbpUlozwDqfX(jt`qatpA<93GT;bs@H`Obf|(P^9K8%c z5KK!eyPi+5)64jiN9#u5lOmB1*!hb+tWCEUN~hiViiK=q6! zLw+iwSAzBoi?|6zR1?rj#wRfgYaZn+3=x&Ry5)*6vQNs!kAT#j=mL6hIde4D5Auzo z(;GbYGCzz4U1J68q~B9yyUX`Uvn3G*)953Yiu1q7H78B8+vD@qoA<-m^nZ}W;Fva~1jn>QKw31 zWFT2glQym&TlSy6BSwwj98?Gkf5@^1a{dVYfWnk4Q)%}*FGrPtj{cR6h`pFej z;Zq}$9#gD`HhsLgTgvujFF;2lphK*D3ec`!o>Hcbj0dz)0owim5HCVUGFGl1qCM0D^2h(F-@_#B+BllDRAi}Wm3s^DB zR2?o3V^+Fu3-H>%}hueJlz<< zAIc}jG>qd@8%`$l;n0C5jjC@tM6=^7r7uh27AoDDg?TVW(+sgtO}DdVnkGna%S(yk5PkW1N z!hjpZSZG;vwv1LKKTi&)mUaYxu8=5w1V2G@Ylil3Id-tC8N&UV(68t{Dk_EBQYzea z?pKj;7{hZ<95pi5u;lk-{SyW6tuSUnPsr^lyuaS#7x=AW?yLl1$X*`AkVcv<9)(QA z(h{`pBaz!MpNQ1(i6Wd1T6W<nsEBaHJliHaCNh=Y%Xs}zA!Vq>Q;dWplJSExl$NLg*Ko?eU@@#UEhk;WFoz$!2< zH%3V%DQ;ZkwSjCdELl`1lVK9@uHZzWAJ#8HXpe(9eR*ZFarxPUCh0_iZ-XJ`>8pr8 zI#q>~M0`2XS|99?SC4CZbPsPPALB^X?w|u?8XR}|17uq3y}Wc}+Qr!**_Z6ze?z~K z836ocbqHL|+&AQYMI8@B=o0d^sbIg_Y4^(?UHLUj^bxQZnZ{D%Z(!ynH8)#nccSq# zT3w~3cVb>x3U6A*UGmJ06Ui%CV0(^pq5?Pxx%K_^A)Q={GxFOFnwA{My9wn$E;1AO zAGmq@wASyjkZ2yQZf1+t#oO+F3oKstd-}EgpJt&x>S!o0(nqN~_*!0w_0wl@*Jx<| zgWfD+q)sWE5MB2JfSUMG33$U2#~@#(Q}p3e?Y?9A;yCeoyI;f$iRaX>Z1H-S*3vyG z5GPQ4U>$E;z`c1X87Vnf~oiuer50>0NRJ$m{XPkTi?urhg?Aekim zDT6G|jGrQ+ysq6hqGhi6uL8%b#g`J*bznUoB4>)`HVr+oxl#>1syQ`1RgSr6Pd)4^ zAt$Jh?LRZL)5MIOvzgq?jEKD)Z2yI2l^R!5N*#HoPIj8%_zlbpF+=D%Vyt$!DPti( z)9C&{_x_Tr@-bSaMGaUk>@AudytKc}LHPcdsrEU%!8de+a_1Ra z>Vf7bjYte1Zq(60c8b|&L*{A-aN@T$5SBF;(&K62zViNOPW0EVaplo4j>o*NOK8pd z@WltljpOd-qubfml^pLOFYa;aAiM1M@;@=DoV7${wm*HRclJyiQ6?aG#j{Xfv8X+Os4whwdwvC)^a!-ddh7F2l$kv8nD%>H!cy? z>nanr-0+TzP{usoXFf#n9Mq?c&(h~=B~ORXJcU(wP3^07)kIk(1$PJQR(1> z|A{EH3U(L&#IfxWrfXoMid7p@I2gsh>uCFKvHb2ZZ$b8Lyf$gVS%2oUzbsb zUD#QHk3PDZD7s)j+;Vt9k-ig;1|z}{ADKV%AZ!nNPHfQ}mEAgVh5~0<0US9UsT9aK z8Pswao17JhO%TLi8db^6j;P$M<~|;T?PJt(VGKR%>&zA}Up6L$fvHih%&48v4!TIy zM+Xc0CP{Ab$}{~@l?6sHbIcyk5`~S{D!W_Q+abQx&XVqC9+6Q6-e=$LU({j>`&+)v zkav~-#3)0rMtr0mQ^s%@vHnujN}d7tstgB3H-1C@b5(iVRGI@hp2DcwUw~c5Tbtco z^7ef_Pe$#lka_W~eo-OGAtQSet%CGHXqk!|1?Gw}4$H3~9DkzqCmV>ZA&&_UkBJgM zzGn3Aa+mMK-m(YMJ9c|>)aZrI6on_=4y7eSxOU9)v^%Mcx$Fkllce~Pq%34qQc?cm zH#T)8y4UPdTx@a5u1(MBB9?ea5dr`yOiwdvU#mXjIW@ely&1>C?7vZlnOUr7L^DeYojU}BPv zkt9S1SpA~!!#Q?I2#Z=1spEM{3t}^2YGY1Q8|*!G@u=hD!kisAf;KPuA=?oz=IQfr zviypXX#>=Nml{#|8wP+^uOjNEi2-lMBVQKojPcK>Ws=kz|0YjQAtGoKeCgfBCL_eE zcY4O&oR2X{M8wuuPTmj~&sJ7UZ&t#YWC$U|-7L{D(#0EuZR(hSF>U351=;qG-3s3I z2xC}lx`t_6>_?1M!#6=a6sT(m)F!)X<&il+lwa`Sx#ZA*1K=-mK9NM;Z<8V=m%W9o z=Fj5xs^+k}&F0CwbQWPN@vQEM!-&SxH^oJx-S;<@R(ZiiP-*NdTL$*Uz%cMn;cc3$ zzkk%rd*s1r2MD0F0w++v@5upI5xMURD&8IMdE6o4;a%n71d>U1x^fk5{AC^-rYN&W z8c$`__m03Bdol(N2Y!W^WU(pfQ~D@I0WR{_#fn5R-vNz^OCmACDyyQDc9gNntvyWw z#8U6aILJ*EF)ngR>n{nAAT|tBN@je`qCW(~>sGj!zxl8lW^mp)0fuKOl3ZTCj84F@ z%c9cn%|r4F%OoKAnU$wREuBobUc7s!M2%_e4Iv$Px7~NaL^sfJYKgB)iD|5%#9mB8 zt8C{X@(z}&sO`Xu7#U&fDP$r90`n1-lp4MeB?ljx)Z+yLSO>hI(vI$+Y8kg<&$s{R zhM{~}AKNF$v7ozv_CkDCNySD%{HQvn3&;QVLJAp%P2zr{$iXB#4~RiiBc=VfI}=zI zgVsaDE;RC7tz7DIPNV6U+mcp9=$WXjC@ z6e@X#9#%K}nFk?;GP+eNztqlVvMUu8*%htoLh8?qG864RusiF zG%9Ky1n-jL_+yY`U<{f*dMwu&ly1t9YAm zdF=L#&8awKI3~7E>RR|vf91{MO(KhkR7IWn=NO!Pk0g(ix*EoXW|a@=tsHOVLaLS( zl(ULUswY|S?3^9-4spOPl&3ya6BK_JmUt@`6avmApP|oyY9_f^0P$pdJpGJ$vLs#( z7mN_aI@#^jb=3=-x^p`XwZ*y)Euy#v&II z>L!=l=5i>rI78s&?yIvm{x_DoA840BpD_#}t7z+SjOrK_q}(gk#!V8NeqR?fTkNJM zBH15%{cP6dGT3rJrU;g#vP*9!??o)A%N#TMKF8;kwAWf*m;V-`#wJ=YUz^otB1M(^ ziM>y8@?4!fz@gABfOs!W~A;74U%cqOObc5fCcDcZb=P7W`~LD7#+xz>p$eWT2Wph~Ee;wmKZ}BT*&WSCyHqWCDUO12|{we9mT)ms4J8O z>B%#~lN)ne9W#sdTn6gzXFZ<>xdtB94T7^T9%d6SdOJ>IC#UcY+ehST?G7VeIo}2g zYOjWYj%%aeTZCelezG}?K=`+v-v`hdjbhN{sYBngV+>(_^CMhwDbXiHEDgOS4Zpk6d;Wn%tSpWbEuq3 zr+|{6i2(6@pAV6jt_jsTR})$5le#y6d{^F7g#~`T_yLMEf$8M?*?o@N!*MAB4Bsnx zi-?+c0R#wH?GO)EsbeNx?g56=6xrUaS69I3UF_3U-SIjdVswFiME&~q8_+52~SO2YY}ZW&c? zR(r40NqpqiRv&M^ZH2;XYMTj=o05IAm{+`ufBI*cXk?I;PwHA0_+zpg!H67Bv*vUODPM{&R^ikj5T7$HKW40Bk@8NW~6W0#y;PRz?y4$MK)vY_5yeSm5BPkf`2#gTE(0iT4Z@f6F$&722hfFgu;5NX5* zJYJF0kM{>jL;_Y&H#TH!FLWy@y(&1nBeYcZ~#ezYz<+fY+TltIDmbgFBQ*} zCbJhJgKJ>wZmK}iI`V!Ek{K{7@Gp+UP=3kLxS@L+31}KAEPx>LERSaCc@~Y8LdQXV z#j$$w+>2sQkw6)w`ICvdj=r3?Cc*lwDE9_-sl(j!0e=?<|0YQhwub*gby(dxu#)yG z4E|#nzAN5QM@lE^a7L@;uVpU}fkOLXs zaYh?4zhj4pBOQBKESo>$8qLgORbA|0LjLJ!=R-^k)h)TAjb;?PS>C}q;_;0S!>e-a zlE8dnCWN|_VGD^38ZYyeAT)K%5molH@lWh%!iH{*n;8#J?O|Lt)Q}XAqKowA+D!_YFpns9G$eml!Kfe`PaTe5tajt8!*{ zlyyI1b&BUlXz zDUXpoZ`1Yfn3q9$sfQn=9Aj>Ov)dHBuWkK=PPWo36&|;p+>fTXCz{))jaaSQdGn>m zN!xYpHIB}acMGz7#5E(F?xQPUY~z^@_6VLFs6cfkgWkt4KsbB7HTOaO8W=3z$(P0x z4Hamo?}v}DD+6i?sZN!`&$Y~kNoqFYFEBHw-1gxQtv6mC8xi(q4;#9iU?cz6B)*n{ZtaLkY}R#^`(7> zlbDIut0~x-k6p42MIk3O@`ZY0zt3~bWJBI(fI_yv6*6ZEr`>UaW{adg(J!!aC7>$; zz#|x#a2T<|=k8iyseSdH8dbIcK)seEiYlRyR0{mTGN1I8bl+1G7p7A^qsqDsc&|in zpt=Iv*|yenpTQGBj0}duC8tn)PqA1-&FL*{3FuO; zPvUw$G3BbhbFFk8g{df|x@k(gsEI~glU*xFnj+lUDSswVC=6oP(vrFL{`I*Sb~R$a z5>9q*3BRPODu59E(*cUj^9=%8t!0G1YgyOLNCwr>q$@1(DGdiuC|93b0*RZ@+g*H~ zFU?Vdhc7x;-3<_(&h;a#KHiXg_y`;HqVGM?U_?k^J7~fPn+6XlwwxdVJ31)D%Ah9y zVDoF%CG;yZQ^gOWggvGzMV5W zvzj%yCz2iseFC}F(nwcKKfk^5#XK6t_`_9%HS}7jgNzA!636iJcUKIaalJ6ygncY7 z%IFsxT!Z$VZL|@%Uy`_vuey*OlFSKHi=|Q4A+Bw}Gs>hXl0a6zsQp=w)ePB5!+=)> zb08gaTotOCag0RXz-}w;Vqs6-HK+E!CT&n;{1kyT6cnc7<6q-;eO87TF zr$W~stuj;H>UkV&L+9dc3nD`#^g5osmgnub%3mw?sUdCZj+_Rv3l5~_DKYf8y1Eml zoAkM!xXe+*?2?~wrSb<^!X(6ZBXl)n2%-=oEY6*0*71;H@OAs&u3YQZKq=yFrZkns zzF-p>=??BH4s$M4d4qXa9;pV0Rdk5i}Cpph>j5rw_LeyfxkqSshKC(K| zQ!{#$QK=^X4<8DZDuhwSj3oOX&ILdt!)PxTj!9+##O~+l@DDQxf`qP@%OR4VxSA5H zM(q{Dk7i!#Z~2m6-xIg2Gn6^qZRsd%@DX#l{U+4EYwc@-x@WM^lZw@)%kcC8TE8+f z;GQWLS#`6xqGxksL9yZy)oH3jy>Tvo>qNO&AVXY828AWZkYGw@t(W1i3BHSOj64^? z#R?b(doo0p7Wd9hd&j;UwNx^El1ZMDIT&8k;Kc^w#`oRWQvNcE%Nr1ol$J*Z7_BN) z9u^b~U;6TNSV$ncE5WB*z%sC+v+EWGfzoZ-_I0;cGFDs%2>*UAU$gp^%|*lAdt24C zs5$k&MtRkP%bCVEXX2vwN88}I^(|`TQ?OJE86_Jc??CQ_8!MA`b;?>XR&8xXcY-vV8i^Z|3#R1=h z;nT$P8kRJ<$+*c+ev3~ynxY%xQ$@HL-NCR;807mku39-bn#B=jZi3ZjD?eXJOvpD{ zP+p0JZiAJLeP|4JjD_W#Dy<9;UFXeP866#HwFC|vlCY{{FQ#wN0Jz>(yEKlGj32hKT)0sNSnLL=a2_mY%!7wy zbjCuSiaM-p28yPRj{1B{|uj=4}0hAVAdK~{No$4TEf|Wc+1`z zI5|^>|D#Y06evZuetuH<42xf+lP?DfObLe@kk#=?VO0^r`3n5s)1;ES!zkQgRPNx} zgK$2qnw%FMdybZVA=RXHvhylygW**dyQpqXZ`B?$l6UJ`gn9^bUW*Lg%vyqeM1Rj5j% zIwY|dQk@*S-UV}KJ#d;Q*&Iakd^lGt3mU`xV?7ey&5s<|5Z7Oz*w|fpZ!iC#qRKx> zpIp{+5ZYheD zX>k#T-L7i09|;dYCOnnZHxMZLZkzC`tRP1|5u#1Rg<|^SM0?^iMAdDsuf?y4Y{h2? zb=ptQy2#7c`jTi^;O^he(wBYs`9*K$ua8GPWQ=5PyN40SLQbhY6XjX}TW8)NM%k*iHDL+y4tMLec3`&$uHdt~5xOG*H&V`k!A@TKU+s7%tZ}@6$tf7rU#H^>JS`1Q5-x8U$xKB{CYsar} zYcyCp#W0>fRa#mI=vxc9iJZ}Jh*t#41kR%00V%%mlLBx%%#x_Vu~`uq6g%^(NJFai zXKRQh>cvLk@|EvO}=0X2wza*eI?@H#gbOj+j#>Iq-EWQ@V{90mYuPH856_txjv$ z7zSKr_N0;)GQDJ?Ybxq{yWtyNRo*(*yHHH#DE*Y!dP2cfvu@_F@>O`fUY{I}`A&iy zmYHp)f1O@7o$zaDx+j!w52JRmElttPseF02mA9qn5k2Lewq@uL_8WJh<-klpmgDx( zB+t~-S3-OB)z3Bwzo5$7neUBjU}x5B%Tls$YEgY;;+>TN53QIdpTFvd1(^(|(uo}| z^Hdul*f*ut_Ey!;;EA)yI&)$KA5Q_MVe&O6dF~KaO`n-+;4qjS=T{OO>ttMQb05<%fFGqX zZ!#`vv)iE+1%=ZD4%6h)4VL|C`4NH7a6o?PTaD4;T;`AMuYi4JP3mq4@eKO&UxF*1 ze&*5zpLWA`Vl{iFwHijj7{2zm#;tcgIb!EL=T|>Ivgwr#sz~$wzl+{2u>`Pk2Dp-ihcnt_*CgAShNx_$ z1qb}m%1}GZF#glr43%YyIGIqYct|=*U1+NmT$XfqSnJK?Q_;p|veQagfgh_Mi85)> zEZfnK>%Y54ty=<7J$}EY@Q3OydJ~+|`=8f77G0mDVSHF~_5z-y8SXNz#C#=HvT$L3 z2cA>pBB@y*sQ`DdmFN-IED-#qH&bn5j)2Fuzzh@(JaAuF`_ud&;VoJN7wDl^7#^9X z8&dn2+Kdi$R7CZZ5mmFXn2^9iW;{ayLmWc^nh1C?IZ$R|WXdK!k{qZz8l?k#i&ZT= z95+hb#McmIT(1Ze8`B_eI;F#^HYk92*1`BtBl^SO^8RK%lm=-FA+1Wa=V1W^Q^t;v zgQ$hC*jUKAjs~*2A7u$|b_hhkD4bzM_@=hKo==IJzoPGYY9BWyPBEBBZuy3N2v1wBC$HTXccDWQhwXMBytKj;h{l!+7kbPHUaAt!YEUYgz3Q+}SVKbF!q zKDcf?+xd0&I%DMi7_)1)voq`QLLo#4@9KHCy$cjBs`HhAaGQ9@eRLLQM>_G<6WP+@`kUh;kJ~w9c*9D_8ZLUfGZ3v$ zIUc!O^M+7)L#uoE{dkQRy&gq){qqzNJEqmg0*wB_yC4rNL@VydBD^nPo4^(I9qtwh zAZ}a$zrn8Zj|HQZV;YkB%6XDSpl|QRskvP&_(`1Z2cO)2?5emi3?TaeVPpO#Ib32_3qHsO?3bcZsq(asr6FrTe=L#>$Y95b zXDkzAEQ4#3`7tDLMe`H2eF^vFlT0CMN4xwPe)frxm&a2P)hjgN)ka_5h9|8Ly}+(% zX>dnZ1XmhO&KT2r;tUt9-o^7IxIH_HFOD}U%1jsc#bgq&6u{s)NKIU?3BHf-MFJ}$k9AjLW2M&~$I5?Tveh9p^q`p}loj+&3gl;mfRR}Iy zt!ET?-~1ddI7apb98+S1V$Ic>`!HD?R8*g|lb*a;m{zVAdRI7}qi2pi`rS12oZCYO zN^dcURn;*6j9Q^{1W@GUPD<%RQlHol zDpymU>j1ID*z4WCCePE=Vkdm$zW7z#EleuPY*(OM4$GaEvUs^CMtS=p!x&17X>*U8 zPZ4X}+X4%7IfGQ{X89mpB*osUxe(GQS1D&mW-v4-JBa_HSMqeHA*=n0i24|1L~-57 z2Conwi{nYcHxcP#q{kHdX9;9*RTbxcM!6Mji3C&g1LC7ETh#gsPh3tg@yt{Qkdwnk zMzqb$Y3f70BmYxwS!M^gkS2vbXzljqf7&e|E4Jm?v#`g+X8NouGW5n3u<82`wz8%w=@!;WJ4aC->EVbV_i@p1gmFsbL!EB?idb z(k+&d%yS2%3to%c=0QFWdjk^3{19}%3Nly=#I^V}fzfEK=bfKP5F%gV7LGmUe^732 z=feeY{DXrurg62;uBjK#kINCMi*w4(|NDaKu9aa8oN^c74n|OzNhHMLLR5btD>K>o zn;ao8#Yt+uQbn(U7tc@l((chF5?a*;a`+&QmS&;w03p?t@G##Bpur@;Sa^}jfp9h2 z-wEq2#%q*~6@xM6|DcZ|J3T@ z1PYgBa3AcezCecElLR8b985AzbYDpii;nrK+c>t6Ybokv44z+SzMGJdF}|O%mnE*G z>>|G+$b|WUMKD`t1rG&@ zV5&}SEG8W10mj(kXaIOc9NZ+rrWmlwd~me)sf6qJo=6^97Jy9w`B;$?l@m=`fGMiW zr=tG`x}1q?JbQhy%Ka4(j_MyUiE8=Yt%2nceDQdOFl9kZYO)%>%F1W%mEn_nIpT=Q zK0wWaEkRA??}#<94;sgI*XQCHq193B1RQN?dcV~NwFNmXs;l#EYv*5bRhLXQM0xaf zgEzH5Fo0<-Wq|4ipRJ5c{!Vy|-&r=@&{PiX^U_xg=5y~znhHN>osVzI%*TbkegDS9 zly4lcW}3JLnIzS7V~o#k`OWI|MT-28P7?2xKw#n*tSZthDXNEgZvUW)z8vS&Ka$Yn z$ih3V;h$)JTOkg!vk0pPp2%FmyKu8K8Dw;8`90X`CXsP<7PL~${ppEFQVUt)6A*c+ zHq+~EqXtrHZfH=89y#jm9>()fbqv>VCa*Wb&-M;pfq+vC7CsjE@tjE-fUI`@j|zT$ zh>LQup#()>*$L1z7Dk?Ji(^a>2HDwS`Jyp)wudo2=+gSMo3U+;4*xnTk_C zMCkTS&1X8S=2VPH{{0eQz33{mRnqi*_V&Inpr_yKw&e3=JyyEa;RIRDLTPAfC!>QR zbbA*=$O^-)s+MI1^Q7Z|4b0K}hIZ4?&%{J=5nuDuuH4_GkrrHuW5G@W-m)sG+V?Y(DZCn-A> zvbQo*_AXg*9D5(f2q9EbBs=RMWE|rd86lf&&XCP3bv);_*|Mm->)c{?Lxx6moe>6`M`jzD&1x0&zmZ>E6&r}o(*6ETB zc`}o?lxr_Q`{*S-%-`n*36L3;)FG$$s8?g5u<}1$*bKDMI4P zjmjPsvS>wqKF5B$ry-qI-#&cjzCCaO7?gh0tek6t$l?96u`dr$hb^0!3H@E7?bW&Z zPlwgFfdw7H-25b^xag4^x2`vE0CQ)xS%o$Hsa}nLlf_rM`!oyGfnvgQZSF|Nw9@Tc zHJg0m5RtK5g95A0_T%jZjj)|+ZxO#&OOy7w1`>?64`Mr-o?2Rw=H5SUq`)URbH@SeWsDFDj*y(ZssJ<9dm7CAGZ1liMmo3;WkU(C>G#@Kb{> zIss>hUYZjzaD74<5l!cVAdBWEkG3T{yIbXUlVlu{2%2=Sw?>%$`?JWhVHI-}o^|M& zH98f=s2409j*@tf2suGhZ=^^pTNOdMy9ElRDcaqzzAyUGCBdt&N(Orc>Mmx{oT2)L z{HJk<>Lttc)1eKh{%$vf8C-Q(zcI2NCK<-90n>$~|A5p;02{^Q--N{#r-~zd-Aj(zoeX710 zGTs`_DD)=^Bu{RsWz<2hf~S2U9Fm&tL>e4s|6HCTr6X4vSeLCUpihGLD{tb+!l~zH zW^n2ZK&E=gogq)U9!oY?D%e zDTXmMd$iu%j`kGtVlYIde~1%!#Nc4__W`exNj6{B86a#GPOMJqA9bAyu8La@bo1?A z-jv~{{zgr9X=Q$CB@mfE)nF#wnKNJ>X(F)b4X&;lD%Q`fyNjCWjHv#(vL?{1A_+)R zk@iyIYLh3Vozjzsx#>7IeKulH52!)!l7(Fgp%!ESfu`o=-QTpo^&DlMw2E1i=J8M8 z>>FI4Ez73o(KsUZel?G02r}r<9w+|oLu+3Y(%M9FQ!4!)iVoYBs@Wmk!f;=_tt}>_ zeKi)g+S$`F6u|=tG+LMG?c|okF5!C7mQABKyo!J;&)R$L%jKco&IzKz=0Ay2v8rg9 zk$1(HrQ7^Cv>1l?nz1Lx>}{rlu#P?VTyKc+pnBMB?>Z>^n=WjN=TqUR?u>4bt+5q44J?x^cIJ zV+Zp;S!R~$5?bq8UiBoHB8dBb7S~3cr1)swSAGLz$7o(&XZ&sU{pvf)k2?vNAzbRj zsm|NXg6G5IPrQIpSH#P~$3}nU<)1Y+{gCepo>$+JpkG_s;hvVCCgkg93jgp*n^w;WW9_uW9Cu3x}S1 zv&C9Lrz!4JzEU1BexLQ+|NV@OW*Ox>ZDTT9F>+hCd(ZXm#r^(7rof;mBj9d9^@{HP zGyi8Y|fA#eu;077f$uFK6pbB0@N<8W=$GBX&%!Tsyq&nJOAgLDB=V^Q56edyqvwNIE(wW{8 zbq(VO(y?bryyH*(4pPj|XRVS1;@Do8Rs|Os;x-?behoC;1Q}FFBE7lT}t__+$1srAC|j0rz}GfJry^&%k7sN0NI1 z#`EU%-I?7PRWN!(tsb3cigOc)^F6V&&;REMw?rqy*FK^Xop=!V0v=lLku>Z4>_##eB-m&b=P20FPG91P)jbR zoX*y-b_0qIO()ofhdz%ZS=zq0~L{5@Qm$}L^ zDM62hg!$cVWIZh+PI_Gy{!wo&i)oyu*m$`6Z@0qRx-u;etMlGJ2K7)oy;DF8`%kk^ zf}@71(Q&NcQHZ?)1DpxF5i_Cx^kr#cjKs7X`KPBJY$fj3Yja9GH0u9c8*`o3F1qaB zz+l1fd&0vsjNX|ba~*@F7_DCp^@t4RtcCnwvILjM`B%d(_PSlwU1n|TQp0DZ#*&+d z6uW5#)e!D+*BNPR)bBvZT;<5-T5f(6+A>S;g4rT$@7O=Z`{?p6SH5H;9aucL{g2C2 zqPibZ2uuq;pYFw$8wkcE3BrU3AJNFMa1*~C6RGHwC(r9ta3FZ>*e0m&%Tz)s zmRQXin{TApgNbB{a}Gwcnq_>|R~h}ieej#)eqUL;`2D^6aW*^Gy=dg33;OEqd?Z97 zrSZ>C?X=~`OMImMO2gra|9r6a60PF;XJZ{=q@F$@O)uH@e`ulE@fLGQB5UDvXdTFJ zs)fCA217a?>ekE(DFm62d!tTvrv@B&ortHovZy07*=a-ms*w~9ltw2(=nJvD2f`_m z&RFo7dcxi2&RM-@j>}A%V#497YDrwLA+1QVGq2>U>Yw!#5xD0o zxNNHk|NT{sg?5I(q}3NCf&F-=^p6FxyVtnk*?kRnKdXk#J{DMWlyi50w7w0~#5UvT z35^S&7{q1KRj>su?n6PEoy1wgYCG%A!v>6~;%vuB+opY0S4qVOHOE~QntwMs9C~@~ zK7^atSOA>tVa^baURs4QmY0~vDK(JBs>R})Rb0qYHfihB6(5HACjX82hFnQ%(CaQFkNRx4O&K`DnpwY{jp~jG*iYLRL zm1`tyCZ#7h9evisZ66gaHHKpqS_L~5V%!Ha7Pt&)J&v=XOoCy7!m3lDw_uMv?in+u z7l$8aQr=w7q!e9#P6s0)fN&eO8z+OX_jdrko)(*i&w@QXZZ#|ZRA!0x86W(9I&_GK zj8!o}{6y|Y0u%s3uzFz;$_rT6jr{ODC@V`myUxY0Kc$#$IMg>!iOepF&_?CShXfS- z3%q#PdAT9fI81$YDp}xA{B*Ntv*Jh8t2Zt$s->+k0Vn9n8;YpWXLEJ0`=QNrzOWa6 zt-efa5Lwma$?V1JaaYb3&XasOj&sP!0QWY1A)-+jzJuV8U<7Xz%;jJ`e%HooXr$el zm}8mvaj~=G@t}#_UdF$J49se+-bz;hiXvCP+TxFjI+uzHI(QKE*!R_!K@4hj;UCw< zveQd+qVnI#c8#Bim@|@GP%y`bRp=fqs#((DpXZ-Vv>qiN{#6jw1exqWX2zV>57{ZAB_{l$iyg?jl?RJjU_l?q?11E z#%~F~H&>cUvsjfi{zeJjQzs+*1v4Ex|Kus7()*=Lfqg=S)P>&Wj4@+PQEisKy(386 z@&w4lo|SC@&}r4_I;x-7t-T1367u2#85@y%c;ZWRydG(YHT6lkEIqi7WbOdHzd%q% zxY~dCq+Zdi!(^}f2FkD~5vlk1q3&Ce5t7=iiy9ldLnYBHvZ^n9JW;Rw(2m*c;ax@Q zgV(%8zsu7LXJX(bojaygXwnB;7E|h+5hXj9!1u8ls0J&GaEuxOJ4IQ?*ZoGwQY)Od zDm5M?_7{SZH7{>=_?vq=E9*q>Kli)-3v@~)kmBz|6u_qNOGb-U^)j~Lo&&*Oo_aA_ zHn((F=;Tr^y`)wmn_+l3@uzJul8JJ zAo66Wp-{528(|Aew1T@T0!u}AXlfY~#S@KVF5&!4X3V)%qI1*~6uB|EATJa}=d5a_mE;RPBsRo_GRZ1@o`gOW)_K^8Kpb@(9|JOTy52Oc6O8%_~YuI1=Tw~wKpM!g&-Fx7l?!x>-$a_4U9!XDo<*XLf`J{CgDPYeA(d7%D0zdGBU4j z!Y1LGPfKKtQ6|Fa+#>2pmNIbuK0fyNGfT=1#1tP>q|cT&3g5I^9|TA`<8JGW!KinV z&^SaYHB!h?m`uZi0#8xfW_HaIXA3g7s%~oqO$E`lTh~1=WnnRIe`7CJy=oO_U#D6( zwUKqdHl`*E(0SuWsl>!aPVL>8s>Hfs1~`Yxt4E%ryAIF!e~67uNb?qYI|R=2Y}yDJ zvFXnTY(+e$hX@as%tsj9=E@9BJnMi>my4^05rsV0)5yTbA81kH8U%LL<3m2|Mzvle z0~oMsyrtku&Scm5p<9LNw~u>#)}_o69VlQ z7~7mXmBEDx{aa6<1L-NV7vv|}Z;}+f03V^{!RB$-OPAYupRW4&szH7?Ny0l>pu2G~ zS$!j`0xz6}yB+c}OY293302iSuGKyN;C_JDJymTJPn|b4iFOn%;+|l@RoJxCOYRmXpl^jpD#E$M6tt`pse()16{;^7d0hxImdWFv+7JoI?3bZ$1;{`!!|z9ul>81%+t-BV;C{Ojx)u*UjI z3=m)SiuiT!<+skjz-WiB?U&U!RKgD_5Ze`SPo4hInHDiUs#362BW~qshcve=b=9ln`F)%=u!MEbuzK^D(5e zYhy++L9xM1H|(EDLN8wxkOngy7aU+5gJY+Ji{A?4`%I5McUM=08rAh0{AgkJJA%LV zb)@rCsIpHooTIQ}oso(4Y-MQajIo9aSj@(A!)&eScq4v98y(gJP~A)N@8o=UpXpkv zL{Lr)kDKb3;ZFsbhG0eV+}R!-R{V#!OSA8X`d9mkU2z5Y@mgf*z2}9)YYW(&v+G>Q z4j!p^bH2D50`AR1B2mp{NI9Fshy2Wh>a4MF&~@^_pC~DJ+sdBpMrp!8|NrXb0bM`( zsI@=u%2Dhq*!O^v)Jk^Em19~w^u^l>1e96e`&T^1q`fjL-+a>P>5ZjLZnDoE!1{~N zsLM2pKKT(f$|V_BIr+-&@q8coi(YAa?9lagdB6LN+Vqi$2O4Z~{GgTL2uu2d6F;fGs3?1}!c%Ks(bk{v zM6%`NwS7e)`-FSxE}y4bthMb)1bH3Z>N7Jd-A*TZUca-5*m{b-{+n+dnSOsBkk1aB zHX)OYad;fLFzu<)9zOa;kGf;Fz36F6OL`aX`g8Gap=cssud>$F>ZV4#vpQaUOWutI zrtpFWChw~ZGu4D+DEGlh<}uHSkrQFPM8PKYw-(3`x4S7teTBQ9^b07CX=sZcrlw(H zaE_s`!~o)!p_Pc=uxEhGs#p9=>IL9`SA9~~c-iPPa9cV6P9GtDl>oLTbGF2J^Mj@y z^?I9IqZJUfSlg4f@_|De1x{oc+v|Cmq%1K6f1GsO{O82ff|u*)hAuQ?9e2QwP7TYT z+&k5ojM`9o=SEeLy_@S6S%5Qc~YQY^p!8H`06yOh{RXsbks-qU`(qXn?`JQ)gN=cW!o6|L!ru zyB69uNdQ)NPwI!C7134@uaJzjlVh3IzfI%6B*U{6#&^I#23JC8Z4tJ6iG+*MH@Fnf z5cOBGwaL^aZ@vC|T=+O`u=du&&JO?oxO{CpNV7yO>}UtiutzzLoDPMPoP0QY7*GE8 z6muC{*uT^B4?2k0_0&y!N$;c`+vs#K%%^}2JmYtMzIz)nqaseJRCy5(mDjqOPy&(avmAZGdN)w0}Su%X4O-Vgfq~o z#Mr#4uX%PVoa-oJMD0pB$WcfwXHT97!IW7%p1<-!2tY8{5qA~kqoKJchHn$g3!<0= zBe3ce7+Nn3juJ;CC!~_$hny(4SJ#JK%bvyHvPtJ0YU$tOF{OUaICAX!eJ~?Bepy?K zc=>zzeT4zZyy$o)C~_RSlznULXwa&ezTHRhcX| zy(QNB(Td0nimZ+34axrHhGqg*<1trxK_PppA0WU<<@3K=%8zs+J08JmI-v_PVed#y z6|y6@hmZI5ZmZkPZa%P(`;2s~J-LT>led$-#6OsE`$N<#+qGP5lf|IK9m%V;pmEX$ zfr2mFjjuO4Pgct|+K0@x`dgrd3lDU&JiE}!cigNjHzYv*qh}=PF59rzrErp>70K^Q zJmV!&j%Q?()utDig0R+u=jd}I00DROeTU$Ri^Y2EgO8|3G^>b??|Hyx(RQ%r77{ow zqxyqlziqD?%G%kc4yCek+h91%-O#6R#li&2Sf&9NggZ>oo^jUN-Vtmv>_nFGHt;7ji| zzjLe(u2+;*jSNS?dtfzK)fj3`!@gJ{WYhAsdF3uabvJ&$heS#NgqUJ~dB-D@e{F$T z<*$GZ#N0*kHev@T4*W&|uF-=bjx5f@8+Vk}O5`3{*>6gm*kg)&Q|D^_O^0&aU+JCw z(6vS)jn2$<{vT;nz0FxkOlhYIkB0i>hW&i*qaxq$tvB!oO@?=+N804Pe3+sr{6>L> zT%?cP>Y9GSgzj!%1uTz;KX*I0%4u`l76kzC;ismK02lBAI_Y@*E@(e)10BZ!^MWSZ zhASTa$(6O(!EUUGZ3TZ(>9z+rzM2;X9DTNQIsLUL7v;fNXCiC2uEIP2$^E2IOmn#I zvm1Hi&#ww1qxpe9Ak2^XI0|dZ*8gq;KQO< zdEc_4fN=jf6)C{V?UQyJ(!C`QeQy6MT?&$Jubc(9n2@~EU@eZ*}FO3 zie0QzSGAZo^i-ixp0V;ug$H%&WC6&b=C(`E8S>UF+)`I3+&}zGK0Xrf)9-$6hEHf_ zD+V3X#p14TSNW%4je`(ySegY=HvOwHnL2mdxC31;6_Jluu6<04$amRgpq=q3b(8?4 z0q%o|awKP^`ORf@gzfb0#{UNBgKT??q~<5$VC(vg0{i16(k2{HtFTC$xeOLkCyzMY z_iAJVe1Nj(~=SofnwHH*d5 z6qSV%6YV1DUwq@)!)Zj?xmsKOcC!ki2|Du<1?@T)JLxLmQ_l}6fGI`D!&H60qQL)7 z!#BW5JxBjMNF{IwEX$1tiW1*kAO=F$Z(X{T?oIF{=y@?h^`ZZJI2Fckc}Qa0&UC0R z@;L7x)_h+azC$aTc$!2yINd#O9`8lN(1X3i{J72+rfNC;Q)9oz4p{StAC+vmmk=oK zr6Qbw>r}RTF-6>3(;&l~{DyHc70XKi7Z9i9a8s*f8^97I!uJ20OH;v*eE=9%XQ8wkcB@&pju zO6T{bX^|(gvSvjju2%ZjB116iLjEq;Wv6kGz5_XM!1s(bR29$@ns0`-$9pyqD$Mj^r| z%%i#|Gjny3&z7`3YxZz|Z6A=@m=(^QH@9YuJUxE}SAV;-c`572Y8JXplbLY(ODuKc zMkh2=dX>IA^ydwO$1lH2nHFh*`B0;@R4(npEb5wMUpwF_fJ1f7rQCrUNFT_yrO{4Y zdsrBQE5oXn$=V6t^`L-ET?wNTJr&!2-tj0@E1y zk4WbcuJDpUyLhAT7r#lXO$K87_!RR9@pgn)k544w2^nME*X#U`XfC^+i0yyLnVKYm ztOX<;xa~Aei+H|f)+V^M5`fQ=ooCB2BzK0j_-Nu>TPSZC<~Z>z+pp!|D!5nufF=N# z6>hJUkMsS9OIDGtU*tihSq@0k1PpbDPZ+!xXR)!)7fP4^&Dvs1kyf8S=|xxc}+>jp_F1s{a`KJ-kwa% z?~>xc77B*FOQKRA0ywO7B-PGNTo`}=|3XQ@F{4V2L^H|QO;5eu+&`uo#) z)qjo8Co|_(q%L(mae+@hC(A5RlqKmI84*L$H$Q96j2W1PBts6zj;Qv0S}#ubK~n{nY9bA zkqF+H3)5J<{q|QD#|hfIg$TfL_;6MzBbtM|+fqmt?!bgu(ivC8D6`ja8ucLkUrZj> zP59s3`?+jy4e-hEz@GZ#VhO%8aitEix#O2k{wjcKc6&-db8?a|XI8>X`w=dlhid!j zpQJfy$L+oH!cMvp5{!kE&8peV6nNwgFdkE9=GaTb)z^)D;cov+)srqE0w=848bODh zQ@udMn-Ep*knS{W5kg0Djn9(G8l83w!pGRf&b~bsAzA( zv#|7X)^q`yURqp&G@n&{|8T83@XHv7a}@>{>?uhr@z@sLX|ZgY`Y~Uy%8mvwOJ7iZ zR2n!{*tFZXhyh6130ekyd&?Irg;kKm7%nK>{nKoF8*S7iv%woda$lNR3HfArd(cICCNcNcvF?(%fLOLd^HXbph+~z|UZLs4M08N^lf+r}5HTbi7a40rte_f~A?Y z=M55o)g2FYIb)kuf2+U{fjqOiy2NybG@9*KJFZgsOMXIUs8Kz?E8!2nw_4etyAFzU zZh_rAj*8@)a&c~X&}MoZO_~l~pyQNb-V$E?)$^Nuj2ehL}B4lXBWeg zK^8esFC~CwcqC;D9e{9l@laAzjmG@^S-A6a%H?{;2^!#KPpSN-{c$Jrr7n<k3vstB62b%jX5V>I)@9A0Z+O3g^os()-5iaYA;)3gPS7>R@#+XSfJCI0v=RahC3 zE^IRoE*DI(OBB4T$5fZ{3CPiVh(p}0Y%f3JkI}RUwy>uX-uL4%E7ed z7!tQgS7s)tqZz5@+2%;9`8t#R2wSn|{$ba+HUllct0G8QWzm5U z-yAMiU%58M8Ob@RH8JWb#E^#oHm2FZmt|Fc(R1RGen>6A|?;KR@_I*J@(YM zuiy+u1Y8}nAnBhWl?Z|eKuOQ3fwX%FhOE|q{6<2Oe$G-nS&F_*rpI*>tehME zQ)3=N3!zSS8)?TLJugegI@>L%48i^CgC(7LTukq6{{(2%O zb5(AW$tQa-BQX$Pmn_7};iy(bz4p^V2iH=Uf!5)8-Lw)fgN8@ZI?b!dcZy=D+v^7# z-&=kqkEbf;rhHVbSaM{!Uv5^s9dD*~;6Xzw^hCl+CO9EK@QY^Xv)Ir)g$%1zjFheS zN!MHK;mQvT}ht+2L^nMHv?cf}-}vG@U>v7#Dz}b*gMaAx1jJ?u|rT_S>n zU(V;}B|#9rw;U)%SNYAAB5qq(HZNGpdxCuLR{xP| zA^8_?C-$`zL`9M@2`rPs0r<6RK9wZl77n{GH1CJ6kbjIh#X)G)qCq8(By;wzBD2~5 zo&z;fe?!r}Z>=}wQTM%nq>*~(3b6$y5rX-4MVH_IEX&A7Ao*8|Ylo`LlXCwEbz>K)yTXHptgX_C4;mY<}e6J+sM*TXJ`GuRXSN~~IAipy^5#lS?Yp{FX_j17tOB-OuE5rwl5mwU6qmxu*WbeQ_KFs)IMHTL6 zvH)%JoF{F8Lhsy{Hc6;WVOH+{>=jcsv+7E(ZNN54KpJY6p2{mcFnAmX?eRt^Yp>XW zmLv{p(PUqisB@Q!Zbl-Ylzt9;7vei1^iPh-LR2kRqxS5msxhf5v1%&H$-iVZ2R)AvV&@?Vj2%NP-6ukVQP7HX!)sd zi<&P~XKQ-M7G1a^9%^(Vz5Xpq`Xq|6CVmvso%^D^0s@Rg;CMN@Yi$lY0c1pDsx#`d zzuDnKzsqt!$Pw)#GN5udj~wgXy-?=>qWz90dzIe;Pkq=B)jaGcPwZ&boEk@=o?Hni zzDF8=*5QZhk?2&BYnl|PPw8y3N;K$PU=JJ z5eeri_k>cPsfjay2U^DJJqc1_hxG=igw6ceO}f4U5jF$jWf8A)yhs(aTZL+o^u;Qi z!NrvB)|`ubQ=sl0cOhP$ikxN_BsKvoiR9-y;#-n=3A zoRttvaw>kG4t3Yv_ag>R+}T>H{c;cF(f2<3SmSgB1 zGSyM!q}mSjl=mkC z#^^ytS|VQJ3PvWfy%NH$f3i6a*ZD=iEptS(J){?U0?X z`_IprA9Tlb&$92xs_01$KABEAly6*x8P|LlHjJ$>PY~1=Kg2Uzn9%Yyl_Z_M{vI)vF0fE5 zz&mqmC+7Rr?;H!~8{v#5+HCRTp6CQ8C^5A`~ty$M8iEv&d{JsH@J&$f)`*L10 zEICagI(c1)r09p$<2+IV8Y)?^W9zQ~DOQG*J)q$AAk7KzdcUEkm*KOMcpTjS=DNAr57Efdk_Cr(B=!ZEk3Eoqr=~I6=A}cf#>2tBCuZ z_B$6BMqF^&F02&nY}wgM_RK6gTJ~6k8~2z3t2M09ts+!iG`$&4z+D3o*7+KEr}3Di z2-b4OZ_ndO&Tp2H8mbrP2-cVTL*L#Hnr6t-`)b_DbbfQXF!1HUvYxK+_dKF71@=b$juJ46z1u%q%Wj{UhuSzw-qzT@o+Y}BS1ljD{#-1PZ}g3_ZbGucoA|H(p9 zURU8o#q^A%Q0UDWhjQ8E&WpnaQ)lo=c=@g~cp+I6I?YOKgKy8W5_jHoQU0jr4SEd{$bZSi?Lm7D!ElN zwR#cc2dBjAs9awQl9v6#V&X*Ka#+%Z-BhW0l)-?rS*jpGOQ6e{0LoQ<+}l!--lTb0 zpz)eJnmPJ&Z3kpXhU%_LuDlQiy7Ttvq+Zl#{sG8o;-2Hc$=o@H4H1l<7o;B7xO@O3 z{9(lI7>)ljlEpIlOOG?f$mIwDXFym7bqu1y##*mYBSUR^1u#m%xAJHQzM7aZ^|^=(?Wo zZDWtdVP3Q6>=n;H7^ZGXO+J#K2y)yU8V}MECDtd)O!0Bfh<|xN5sW@E)A)X|`p4h~ zdAz>n4|W$%MD$VVX)UnUYd;skM^^hNTz@J1>&dWmc=1Tzhob@Au%kzA-`2flmEGr_ zXzktWx+m~+`8(Ui8Rm8WlpYt-(HWehjn{jYjJP}^CJwZpz8QM4%7uc_v56sSH7Dt=EC@Ey{~5#+jle^$dm6!ZIPR<}uq5b9$^sLqC?+;M8o+vOkTDR~@sdZPw?D%HuaHsZIEqjMnKE^QGR&7ugBVFvY_643) zA#`rEV@5cnVQ0QgWJ_dY7QgZ2!BLwrg==)td9>$?rA$KRwMYCA$P*1|;yx28yY}+q0)*v{sE2KKXxg79D1A5mP zY#nldfS%7syL#r#Z*CMEg>)JKd%A?Egss*ipJZk5nb!$x^3eiqK6jZBLht6Ud(-9x zstN`F4L@&v-ezj#G0bdfl?i;dd}c9j3;eNa@=h&ZE<_1-xQZycm0C!p`1 z9hiYBR&I~K@k05_(TI=MG8bY6f4;td(q&$vkf24hv`0>MijwGn*jmeWS7SRmd><@Oay_d3kI11-M2Dz)PEr?zzSuQICFTimCIf-1D}(3@~pY#?Cm zAfy-+TabWg_eW=r6!&uxBb5vh=%SgK%bFh(@!glBKWeq1GP2W-*&3HKwJ-W^fU`}> z(nE&c25V6v`AkULn$B>^<08gv9n>$UUewG`VE;}o1%DN$QtJbBBT-jfSJ;#^jsO6( zF(swg1#w;#M^$j#BK4Yd7+oi`_;{~)TkYdDo*<(slP8L*TeOF>mq{7t=kgl%LA|`7 zzF_*`S>BZ(j@Sp2*HP7fYlfMkd@0nS;$b;4KCZ~7Mu<;H@cc+9rMBB9yVJ$V!t+iG zAPe_514f;SF;knGH`9VOR85Y4f9hypmEj>VmOg*^B9JYbDd&<(FK8NSCYSnU_!`S6 zn&pG-lvEzqHLHIdljewBOFBke+`YQ^w0`mP)>7c6Uf%H&d}462v!t&+U05U2LD?Mo zgture7pOTdSj!pHMS;6Qg<_M$^J7CxI9}MQGIrCRk;0-1~W z!rI1c?y&l`B%|L<$KA}G3h9GqvI$j5Go(&E`?&Oi;>zI5_%lDm*=Fb>sT>Zl7g-x> z86!hdEg-%DA)GDjdF*5P!RI#<_>=N7HI?|(x7}*7uYI#-520P7Q2F#rIyuP^)%an? ziLdL!kfM#f(#{Iv*hV!Pj&!vC3Lz z+B}i;LL} z6PaYN@yA>0yP&q1yBCP(kM-0=l>$^Y3fP*QqxP(wqc@Tm!>l!kVKU90pwokXA+~N_ zoAfuAs?U!!L)so?Wj_xtdzvb|N!3|WhPW*ieSMQh#x6XuOj~>})##?hddlSCJ?X?B ziq|gd-j>=lzJAmQN@)9HXicN$jD2SD3qX0v6BNULKUStQJ?}2<4R0?ttB?y8WetuO z=|mY@!Z~$+Tw|t;94JT&*aUM?#Z_XzIc@^&!=}#~xq%9ua2t1H0W(QVG!?P~5kct` zg|a;x8jq&A+K^66NVb&&?S^DOhU}nrDPC;tNIy{j+{7jygX?3!ql>Ul5$06L>IA=! z`|)NhugD5W3K_?d*;{<$HUUlPx7X8hxV`QiecmrVS8o(+(F6^8-)6tDYl{$!q;5!p zj@Quo2)&9~wp&>IVd+R+ZpU}L!$M(C8#k98x6xxCjPCf;94ho+z}NHcL`RS;{}&Y= zy9PV!P>sgM8v~nW{7rHE0IuU-Reu;N1!7Wj+^CSAB`!F2g7ZU_v=MJO;Fc3K2StRG@`Xhc+7Zts z*E-IEve^Y`IUiH22c>B+Idf`O0T(F2*%l-jMG@{e2%Ts@p*BA50%!AboDVL)e+&qD zY_W-)4|y$w-;t>4MD&8Wz8?}$rzo^{FldCq-^=YXJ$9*gr-g27wr0?t44X;OtrpXM z61(4Vu~ElE4sXtC@$ehw4qaN1a?;$dw6>>c_AJ7}y=kx%gT^L>lo2EtV$%X$BF(PP z{uB!iS%60v9w+o3!C%20WUl8{_w6oCdI;sB>-O|t!ms&tu;5s@TI4HnYS=s{tZ4zX zaL(Rwo9rJg;eubv@K0=b{arcHn}WY-b*IqBTi^^F!cat=XVZm)*#^xDzOE!FxTkW% zDPNxTc0K#+Vj}1`v!`#2moc*`WLq6IKx$yq$z%td|0Fbs`!+MfxF>k>IVJa1o(C)1 z)>>vYyOcIMC7>ny1SEje6-zYpEVC&(UA0V@<_5EGkrae?JZOb*T4$$(u)_ zn2?@DufF$9Gr(ZCGEUzfjT!@rWYv#gL z0ekISNU(rfyq(kqzcESU)6>sjrJMUrts9ij^EVx3DdePlRInzC{wprzq{(_|wPcAH zV^dtJpt@X3w?Mt@2mM`kd9lPcW!0SAw#ozYD_QmB9KTeMz$hHG=X&LY*-ZGf_mA>O zc`Apkj4|diA-Ora4<0Skxvy-UB(vX}_}cbo+-Kd0eI-_ZF7s2^1qh2 zym}K@BqEdt9+Ic*t2SH{3~0C6W+LGizL8IdCw%qSr5%RJzH|T?N!cBfqpEbIbx@!8 za#_X!1;i0nQz}bczw(P@Z<7=Lf#A10DvOy>wL-LcsG9E?rp4D@}gz%UDFB+OcP&a6KYeZa{AiLme2o?(kZ8NLM`NZ1)tjS z-B@;#d?$5LMEzoN5jIgV_TnCzB%WlljuStT;Tg%1fIU!^h;KJ+rVzf?8wmS4TPyY! z5k5?%81TSW5}WyY_dA+=Ot9c1kGOQ|CyH+St{WQPl~gqG>Ez3_ZzT)S+rgV5J(Lfe z6UbH5o7q<%ZhRN6uwZ8%oz!^KpvSeilbz&_AXDGm%&^DY?k*uYHDfY(?RYM>`wINVz$uLSvj)^U^d9v99^)GBmG>|7mM1A9?g#f-xsc=8Bl0tAI_wcCn!O#fqRyD*E@q0l zD{XOOQ)MrFxVu@}7;aV2oT<0kK~auWo#e?1IjX{{?0Q|k%nhsT&f}5e{+xVcO^TD6 z7MDV%5l|R=`{C4EM-qyVd7Nd)HH){iU@RgggcFk3ADnIj;t~1ux8P)|yNm)z5pq7S zT_pAwX2SFn6tTn5b=Kd3y%;>GQ|RL7`CZ<-2Y4bEYcb_n;79B?d>#G&S%ApmTfNVI zo%W3S#Ad33DVOLxsPyznng0{|0Q&NO(^HH0iI)u-vV=G?d~Sx!Bm*q1-E96OkGi?z z@RVW3inhhck#F<%zo<4#l+O-VO@9BtM_M_h~{u!#CGImNB- zIJiy(#T&K=c53b=8~uTt`t@_P$CtoUxJN-ChWVG${clb1-A|Fv>4tVyH#-Wh;8hRb z*S^Hw#(3S{)JR92BeKETe^KDF>enh^ficcnWCYfc3#9_GP)c;NrfyM6WD(^o;p}{t zU1P3g9kslK{F{++J$>a>#P~T`r+N|Tv`y~#lOoZn`X`IK7|#LHPfGgZT7eI6Gv8;& z__xt{$&Lsh+AN@>H+U*z>oQ$o0p3Ijmtj*hnVoDmSB3aZ(x!9%9{^ZEr@na#^U^86 zv(geMzz;O;rjfe{TPrVJ+JD6tfwuI8wm%1`J0O1!VAlb!R`J0>9s!O&6MSkJ)UP+S zPx`&mlltKI-P;K+yY2><6%_|>C1nwSC%~le9n=~T{okW>fUmYe&h3?E3UIdm~ND(6(2by)Ch-(4jp7Vh&r$j4scANA|HrrLeQ81Y(Gy3yLAFq=drs zD6in1;P!yH8@La7Po)RFm$<@`fVMxG;QluS@?MpDaKKk>o0i)( z4qsmJ=ACdy4;(Z2^RiOupyj~6FG0VTd(va<|Gw>!Ctx9|zURiK!pv>)Fm7WM^j~cI z-wL>`<1h{CVLy&$>t7z&8MFOY8!-QSeS~jgTjhUS0RQmxHKYRn@#m<(aa#RxQaSH! zYJ@!m7<=~bgWW{+1Q7L&4N%8byAQP&YKW>En5qaMD)%x~?AZ|ru2vr`e zLZvgUuDm>ru2{g;Qril`m5B3G;MAQe#Spe+IL0vX^1nKZH(7rzJu-X@rTr9)k* z)MaR!ARh$4b&%_Rd@I^8IFR`d0`SnaE8xW*-7J7p|N9S@LFXZ(V0lg{%!x^c>09Gq z^twpsw=l%%f3J2GR^M#>%XQ&fhKGdth&n85i~MhW`{;xBt|tI*KA!+T$*b4>hYmng zSv9QADWM9t;j62v>cUD0Jt9I(sWcl)e<0tryB= z3bj;1wLw>232ZcIlciFsuza(^{U}1(w?yIOMi;>qp665;RWZ5gF>TB#va|su-vF}; zt(zYe`M+8#ZhjeTKYwQmt<-uh+k?wo)0RQp-Fi7oKNnWvGpCNHw#k6LFGAm!Uw|jM|2=Hc zDp*4P-d^94LX9TxFfDidu*jDzAl|Ur@>osw%#O~Pab_`%|j8mqUH+4 zq`(`b!a~i7MkT>))DBc4`Qv56E`-;%Cr~f+)orMFn1zaBni&-bGq*BfV%>{#7Q!>* zro*m^Qfh5^R^j?V}m17~SAyv@oOjH4c z5UnCGS&2%|=a2V!?6ICc(vwH|6s9Ev9E+1tS+Iz}Vj+RV!bGM8LIe(POL_}M0g(=G zqT-n5BOoNri%nyIAet-bjh#X%mgb-k7(}y$qM2T|lmxHskd;XFDr&n^vryz0PH3hq z1kAR0>v)ET@KI6MG}IPUtfHwxn`3E(A~XdRDfTh+crw{rieSP&3X>*=qjo5ofC@ux z=X-Iy9ma2xwT)^VYNM_w7%Q}aX$*nwm{6wCp<7_|dZtn9Hp57&NEo>`5=N|zfDvmV zVEF2As$r;*Fc?byfN_!PA-E>uN~S&wR>4D~ro#BQ7sC-!`L<{Vrc2fBZ#q3z+PLN> z=79@< z;{9IfMUK0}_19kuw?FzMEY2vTf7kf;G@kta82#@MBe<>VoBQ8Qc?r?KN{ij@n@!*y zAJ+!?-wuGk|8A%A3-E&$$gwh<8kGRk5ims4I8>%?5n>>jvN@JQW3mtd$0Py_stBfu z2nY^|36>ZT#w%h#80U};hp~#H=z4jwMsGkU*cydkAdsMYqLG#aEH=XkAqowq;X()y zqG4P^IY@>|8WMsEvov@WYLlfwD>u>UzOn|cAo~?;KXAncTgzpIa>>WG1{u!1wVqZq zbT5vH2J2d`?TLnPS;x!8wRP5O=u_$%Ml_sj#0pd>-H#;uk+?^1lk7(cEnf$tR}hi? zm=#>)cgsYjXv`|;Ale5F9Vt4r-F$EaI4+!=pUnZD z!2ph5pH|?XpIg_saX++Y!H%2Q&X_FLM3uH($W|HOt|}9$o1yOyPfD zdfBD$%Ry4m*82k+jG`2j5l zxE>wrjFLqg1(#654uff7+vp6Z;kszkJj)^&p=qR${>URF{ouz?g;9+~tzjA`X*^v` zI-KmoaZytIkD;2h4l@oS(C31wMAJeesitp0ZH5^{GdD8L+PDQ?-LwT>BYHh-E6fg$ zqMAeWMnn|Mjo3ytFLE2qkK7LPH*beGiQd|>1KuWDur(SM5-o~~p<28x29|E$3Cp;a z?}&vJ(Q#BOW8xqrCZ1~b&Ujc8n*eK3afz^wXnlMVRVdMhgk;!Av?(ze!je*`!igf1 zQz0@X4K@>PNlk;Tsp$}vmJZv}GhjQ>j*Lu*MrCF}OlBtR%*uk;tZazO&W8A$97rHa z%*~}r%FBb~{5(j>&!bh#ELDg47EmaNF?XH3P-L+7^ zrxtc|?LqCWgT0b){ZiCE)V_LXq}mPp8*Mc;?tvy;wVvxBu5rpcegYc6lws}XJ>HXe z_R&?=5#V{*DHPy28A%l2IGO332Ql@E+c=ncjsRDxZym_zIEeXIdk_<^VHG}o$~fwO zqkYovt+*63y%0r-Ph zf#b?Kty_T~RE`D28^|9?Vfij7s$eRvD2L+8aww^+fKu{@TSl~t{PC8fYO0`u{NYyC zR+B&AYVrqML;iSc=pSw^`J=7djeoFpu$%mW?%7)pdmB)@p@IBi?jv8Pk!%0{z2py* zsHp)Ca2>=|PY&#(I&_ff@IlsYCnkOzJ!H4!$&*-&J=EHw4SF!vN!lK$=AWNBZi}@Y z^47`YYD?qk6Ni~jGM(|#JE$W}C#7RchS#;vaoS7d`*=^0vjx-93M#i%x=8=oI9e)= zt(6C?UUIk9*PYS3=InB}Y5W#wjk7TWv`<_n^tiSW9^w^vEdh9z4)FZ}4PxpZ`Byr~ z{q~5T6sH_>sAx6%J5d)NMN zM+L6HTlnAK%?ypWc}8f2Z`%5Z_F>!FxP4G;AAk7XV_1QodH48v3bImTV{y&8_x1Je z-chA4w#ru=cUd^qv>>Xz#M$8>mN*N1mZvqj$V2LEOMN1cdBTsU4%_>HWP|zISk4CjnU~=h%57rtBMg!-fC-_pcy3J&Cpt;v^oN!1H3yXQ}^v$K#z9 z|J$wq+c|i-N%g2ePxwkdC+4k|-)1A*Zz?HD7W714Y1%%qU zn0a|jo_%>heZTRz?RDJcT$wt5wCTJ}qYpk4WxsS25&0)gRu+n-pDhDLOue@&VKE*5 z*kSjZ%DHEt$Z&ScKWW)Orpf#EvQiM>xF#m9N>2fvnM4g>RqyKvqUH?+AzDK)P;iCUL68-Pt zAz|$&5_pIIQY!FI&Ytep`T%#@C(8b346-_5?GIS{^Ot!NSSE@M_9m$^m*Cn4V7I63 z?|15F53iE4QUuHoH3pQQ(z;<*9x!+Fx^*AC1=Tm|kOpwvBf!y03bq1w?>0F%U^?yJ9*h6sfWtYM5B_T@x_pnt?|9kXmwS~~^e}}`A zbrFLm@bxd3NB#mP@QCe`kIwY?BL*At~6Z1-41xL00?BR*9%`15k@*Um5`Jl>@G)5FQl(uWJkpof)WpP#qDDt?_oj-A^8JYe>!e@UVsm5$}T$s#$jU%l=J)bgSZrsdTX zxh%n^ysqg4|Ckf}_=J2Mfc%A31rlb3PYCXbga%j#=zn`v;`s3h@cNov)cd9Y&k_JX z1m94Ae{6=eB+tI@*6cL#v`tzTTl<9p@bz+Djo0 zT6ODHvK@qFhhb42WIAMN9~=~t0XbE$ynaL$b>1YOIhf8kAL2O+&IoP*!1e z6%ETOsA6GRG%%~O5_XfXcOuXn6qk;ZKq6)JDfNe%_SgWALx871X;C&Ely|GZU8l$! zd%lC8Vd*+uzLk5vjaB$x4f!YEd;zOhELQyQ?%g`WC6``G{qN=W*P)BNutt2T9*vmw$KANvcczzM+n6SV@s4?2N2a+IXOm zY9Cia6Vu+NeN-57g~EU<8gjL7FAcY%0ap!7)eU=~YA=%rxS}CfyD{KO4Y?}eAy>tQ zkSkNrRjw9vWrtm{z^jZ3rgRLus$gMPEbyuVQg*S>t0WqFRY60q66Me1w-R6!{Xz_LTIN?lKBJzr85S9qT+LVJTRKl=W9*7-;Wrbm7=Ci5xbb5Ur z55W@C>!koJ9)6_+V5Lg4Wij~57=D#)g;6Z@rQGn;*!sEePC`#ph?gN)! z>Hs%dD6KSbDZs4(9KSX$#6ET6XqJD%7jU5KUtV?@j9j)BmShxA|9cAczc(8Dzg_GT zs{@7hf3FX>@=tm#-O$#^RyP9g!RHQe|Nb|^yJr7>2rH_95E^7vLIbQ;3S||;3JkI0 zTAo=%L#&peGVBnkr5OcEkQG&$zd$Q!sWnnjItM$B670%usoL&SIFdEQIEZTRwK6lX+Y^O}qy&xd*-<0bWL@ z(4&Qd052l|fA5{6o)(I3n>cI~3%)J4Q;goX+=bE#ohM@8@=FK6KT`Z}^u7_^!vDUz z(;aZdO}8li_ayFr)AcV`ne$InDgEC+p#P20v6%loj8x*ksEypkM%n;Bcn$z}U++?6 zp=_(DgPj;&RaFmhC@I7$7FAJ41FUwUc!*UD4X|P%R?#%Xs+t8@5p6H6qTy8AN|;1Y z6+QMVJG4p(v+`20ta7R-lZu#3fmdqiRhhLHfme>;t9&LsmCs)ip95-I_!SGllH+OZ zgg!Z?kA+}qVOSZqXtgedVab75YA99?tdv5rtY9n=ilqf(d4*%KfUFElc0iUKj3vUb zQkg^;77xL)g0Of1)*I1DGyrRk6o54@bPIH!H6I4NKA+}ri-|p6-6&p(gMoSA4Xgqu zU$2e=Jb^CgfHN}v0bCup{Me=Iq-B-23TJM+nsNDj4HWeBxeo~j31Ws^U0 zJJ@P*5(~Ft%2YzG?4YX*s<-v9D-m*~NeQ}&vxBabu&bS1v8J#qp=8(KtJysC3Lp2Z z{SGw*3oD7&c$yvyzDkgUAy^4Y2$mXz70-gOxRl_lt#Ou&0azG#wbdDbrG#KvVOTpI zVOUBqmKBO+%L>I(Lb9SQDFIpGOiDmj7?&K9C52&8@c^uG8<@s!*h+y;0q7FujUhtJij+c;JJ zJk7N9%>7m%-trC5`riu->t8xT ztTvha@5m9W!+b;?*0<&A^KKh~_mp!7xD)1Lz*5*JjR*JBu>9#!2{2=u9cU$oTG`=N zu~xX%6f4|H3b=}t0`6Kw1=vD(4tXc~b!qaB@V`I)@I9D3ek7eX&(^n{@EXJ)o8z@3(gsKVolN?_EQa2QPf$cL;T;(I(7V%Ijn zP)!(sB_sl{9AQ_AzqOG{{O63}8tW2r#R9I>kSiyX0arCF z;7SR(s$;^StLl2D8Xk5f09Pi?sV(y)UC`Lzdwb2u4A|>-ufUH8fLE#j-$ela{(C2kiyF(e ziQN9Y&HAe z#sN%c{`ZFkaqY`fqJ3{{jP%9D{sQv9^^E|0-Y2aBa8o-W%LA8ZU}88GhFQrvW0DeX zb;PWbJnYICbj73xT{(lV4%s@c%In|hZ`!`U8JcRal^Sjp=!*4@8I(twj58uVXGOY7 z3bnFkQ0}*8MC$ui)j=V9He^d=`dE2}rD@jXVg2I*fwl|01MfUBSSXDM@Dc*>I0|rF znFj%mOCQPrH&4=Wvr1alapKy2(hB|Fj$Utv@9p%zu>xPYYykr}pFWTN_wO&c1iFu# z0?V>XB>y{t`QIyq{~bsbZsmVRl4IYf)nOfaFKgq~=iRnXKRUC3Rp3XyZ@o4`6?C$d z;s~%Zgg@!m^r`6n-fM!T37($U#B_Hz@VZI^vdBAWzMPauA_aE>*V$??dijcOAqe0Iwkc&p?333xMarhiBe#0Nj{)(h9jJj@CdO-k<9L zZ<+UPuENh6CH(J6<3=d{_oI(I02lw^58VGQN#@HoU{o zRh!xx)#i-=eCfv@p2i6REdaP&aT_M{{7ivWu5qtc28z(npIT@^od;RT`=2kU%9&w) z+=4cr3UAHOl=QQJT%-)D354e#+@|zFw{rum-Hs2MuLonF9F+l{B30led2sgqQ}8tf zcmQ1|U$hL|x^426UwF4p6>j#vKXP=RG}KpFYhR-OjX_p--FX}Jzu$;Wqm#R+{~fj+ z1}!!C-|hgH`@jD+Gc@9+nLPh{>yD_lMzwh(0AGoBw3Y*0^Sw2wpYN1G`}}}2s7iCp;O=LhrTyR3|Bi~Mt)l%Fg_!eC%pSPxe; zZUA?OIJHkay<(5>s-yC`8eZjQp`3H5l`P2yQBwYn9^k=N=Rb^!dDu;$=a#g1QHM5{ zJ+RAQF2i2U1D99DId(`s*Wc4}9p{pdWgU|sACPt8$0`Z5jZgr*ngBdK83Dcn3Ubq- zyfhy^`ruvo`b)bDrPZPRxdGa(IZ*kT4)eg^%>d5)@1=|8!%HtbOXFj40J9tSzn>d7 zm9Bp|J35KZQy3}yZ*Bd{0R8WX5j_8U^1407(7XTuAOJ~3K~!+xmhDk(jcW7u$wy~G zZGd~V5t;(4%v~pL06!6An3ZS1)p?WN*XjL6E?0MIOd@OfT*wW7flL*8*byOTT z8Ff^Cb;h^CmS$wHGp#ujRn51wlM@ZIwJ0wdE%fhAg8Z^nl zSwa||C98h#ZrYu6oc|jXh|9n>Ro{oq01svm^FU)gRF@k7{viVV)7FKxGAP-~og{{V z$d(B06a3!KzW)wP7&Dx$e~HVd_3i9C{ls5wKFsT9$!Zva5Jdr^zSKbKVL!^2XVODaWl^trek4g@;LhUAh zpu2gv6%DxJAy;leS9;i0CHaG_*a29)y)71!1u;tX-B^ z7*-j?7MIZ=tet!xT~umm2M@%ep;!ea5G84Aelcv}qM=xMA{48LDOU}~V&PbYmS{j$ zwjGeQA-e!VvzYAZ`1!Dohh$k{S=LniJRX`QPr(;Y_6b(sd+I7FwCUjG%P&ChUfsF> zeH+Z#nF?F6sBhCL_AJGoJD{X5`yKkSI zJsrgX9%LJ#Y5Kgm2VB6rV9#C%E!YKXa!aUI(@?8o2+3wzl~qKw5|vp9E4Y?t*nw6{ z(+jKsC_6055IU8b2aCvlQL0%BsdD+=q+G)>+q->Elf?J3IMw+*F5!}ooys@t$-m!H z9^1QxW4UO#q5}IkgJ}f~(8_lNXweWYU71|ucvYsV5c2;Q!XpycaUl=W!srC9ELCe< zv=)_ZQjvO|<&^XD6)DWz_XRm0P>dgf)jx6;{Z>R z0A5x=0gj6q3m_W@7+Vw4QXYxh;Nm$~*BY!%`t0NPX?$!#>^A82d{-J^g&^?YC@;LV){zQ7iE1+b3tw z?4$rcarg&!nYDb$=3TWk#45J3o`qLg0akS^z>0@h#fT6q9%L1* z1zFJ$t1=#BCBm$vP%DSzz^f7wcvZo#1sG%{!mJ#jRu$$zD=FA&t3$h7Wd~iU+Kho$ zLdM`L9)2aH1z<6iurMqw2ulvb3d>akv1}F5KrC4_6f3((im8>tv9h#qtV|w|mC2-3 z*TqGKz;{C1qM#EJCmnSOC^S48V%F^>$nu)jR@% zG3z4X>B+Cd?2xtOcUS_rTP1Grz}>2Fcc60%1p&URkO4e_0ld-z_$TM&KP%O1P>9G;In+v2NvnCN6$`e?w}P!i9<`N2%|or^U@IXExDv90uH3?|lJu}E zBARUH9(pCq3cjMrcWFxal@)>&o8}&XMU|q2U{M)Du&gjF9)5*`HS*pZgq5i1)$O_x z6sdt&@me^R8j7V$3CW6z^Ana83)8p6vOPaG1!h^nSz1t*9-3tg%928{tZ=OG9hR`o zOlZQUZMHD{3Og9yUI7mbp9rfWH>&{mN+0wHv^|66RN0#Ezs0|D^X={}Js@Cbkx*4M+U zJ5#NMJPfp&fx%W%sMYkX@hkyPmm&3Tikl*tlyo~yEc_~3+B+q}uqK6z;~k1bD3-15 zmd0;VC4#ZWZ8Qr5vZyww8iR>>LZPZya28L|6MHK-YqPC&Om=`)B#c}eY3)ZSihvP3 zG;4$vpcQWKrSL4OkT9|jQ-ZTpZBn($T|-uFB>RnYKV&7Bd`z`L+HatlIr8yfDOYFE zvh`e2*cA=JS_1ndq0reh$}PcQhn zv=KJ#t78C9lmNa<0(dKV&d$L?0b=?1-1Jus#=+`StiHeelrC_A(8h^7uaN2+J5lbq z{TBG+t+$inC7BdU>9kP5C}nCKL$U5sa4^}%pN$te(dN$2uVt(GoywZG{PkE0~Z?UBJm$%^10kJTGndq*b2RJ zYMdT^MKl4mmT4lD2)+u3$y`&`NugIn)1=@l5q>peLnIHrij+dHHd~=rLNxqJgkA~p z@GB93^+tpgf)&X$e=`fg5)xrpLKujJ!B`8oM$=HNMSPFpSRxo}>9(D)bUO>k5+Pa3 zc}NyjG=^odz^qj<7?x#=24>OFtauifMMJX^U_B8F%}Rs~L>QX2F>)M%4Xee%9?j!_@q ze*FdP+_4#Ybbs2azI$|k2Clm5O1P&>cUYK?>4VHZ!6;z784srZx7j{13}RaO-?7nA zzY34q>cdGqn}4b8gJL59FANOe-tg9^%^r2Z&%dYAMN!$^)*1HbwiJzdoY&w`lJW#J#YKe z*Bo_SgERo)&oQ7r@Iy9?1NFiERp1pA;L(smRD=L8FQNcPOGE|qxm3ogWpS<$)`4t+ zSO#iyH7y-5L zzg-JCHG!~M>i@R#zoWMQ0^?)#jr?#*1FygX>;XS!4{FN2;CStf7G&ibY$d|1PMHF& z3;|b;Kr1!W%73`kA!&a|4Y@J|T{%Oq3_puws{GF|J;1~#CY=mo=BSl+7{E+V$IA6b z)JZ}C2Vfm)v_r1MzBR+F#6%i-)+7g|zmO|Er0U2)?;tCt24ldLXKZY%BoI2)L@Ix5 z8^r26l>@w50Q|GFs%LDfj0KEa8OU~(`~j_$TLNVhq(A%k3_m}kfE$Hh8&@J4IdlNL z)bm+VeLqiE;(6$S`)U5k$QA41t)y%^j)IGKpmk={NmH)jiy#2!PUts>XzL6hP&A9>Gr3d_&b0%in=zwzU$V$-w zelkG#w_Ht@tg6|np3N{m(duxQA+H19o=qvwtkh>%o_~0oMFD=^L#~2^xJPJJODpmH z1mKu`A_KgpqJ#pib;0|-1zz2@I5(Z9-nBTV$7k6!A^qGW79H>@?ARI(-Mc(VXJBF# z-o4vXaMd5LgicRC3vVUoz^te^+I=#DfEeu)qyHVE!`re??ELTixb{`4F}}H*B7fQK zgJS#S?3q0nkaOz9p&$n_b?Zbdqo&yhh8dYZ2dEW0LbE2?Monf(p0o^cH<-72g|7JI z=4;0et6)EW5DyIK0^-L!U>+Rg-5?zR#9cB`&UG+ze?u(?_zv1iNC95S0R9>6%s68P zacfn-8i)mq{Q);Hy=MvkJzhe9fBxwQFn9J0c&=M#Qhh%MFZSpPou7OJF8=V)d9XX2UfA?Lsp{>yz*hT=}NCAHQ&`&L^z73M9 z@1L&%KcLC!D_i@Y6WT{SpsihZgKg`;zUbZsG61A(u*-nI1s*N65V z|BY0HOLzl8h71|_3cT=K7rKZ;&*z?jzubQ>T>OX2Vc3$@FgGq8rjY6z?GtPtH0GbU z_J41(@=qqO3m-`Hzt@Cyn6UO2-aaTc@*i>-0samHcz{#sow?tpirWP5^9OVp+&auv zS$4^JjF(lbZbJnw*&}iV{_|AdT!%G)yXo+L*RZPAwNTt)u23#Y99lFQB zD%6K(PQVwReF$YmIkfwP!u$Cyv=YDdmK$mQ3HE)zij#LXZG(|G`w|zZHuZmN1DSUJ zHx;%9TlwG9*N3;yPK<7AGzYeQ{Nd>XAD*!)@BjerthRM{>mK;e18wd4Q4QQjrRw{< zfZLe|?gY1VZdKt2lylklZe8!&;CCxl2^;8?D{tLKX&o=z-16wR8rPxSs+G7~#jTwm z)Q%07Nz1`)+b0;FwY#<)ax;@5K4vRqro}@^VKy}EuCn0l53&x>8X+4bY$YLJ8E}a> za9gI6T;%x7NlPCRz5m{E3h>CVb=XmM&#ULHb*H#`--e3&{8!)-tX;tE2H`fT z!sUwFV<0p50nA!Di3k1fgq>R_XWVy{)a$9N2c|y%TdjIQDP3lVgXS=dJ67djMR2 z{gAykf&1J*9w4*>Od!;&a{rZi12pZchq~%A$jwTIxaiH+Bp#ebfBMu>3S$OOCt%fz zR+0wZ;6Z!B0a{t6Yi1qSj#XjBjrxG@kHJ}T)4`k8fIhvTd)Ftajq+UAr{GWbb%Kj7 zy$l8|TuH;L#)od9v$b*c9Z&z;8Du5<--EFKd&1iA4v9OX+8WD&Zv-?qo<4Q#2O_M( zn>oM(sKoj4F|`+5hI!kx5}K=Td2)=YBcia{M^ld{alb;-*_*a@clipI~Yv?LK*XrJeunvIZurz{4c}I}8ZG|21nv z#Pu^bMEItMMzr&dSlZTD4tyh(w~s(zBY`&p{5ymoflsrfme~dxs9Fvy{jp!I81={d zz$-+LK{Eqvf*UOJQ@t6gF#iCOvobUtuyr^f?UnYDnlx$PacYl$?cYP-#P;IYUAt8^ za`EE>jrO$zit4?!PZd_VcpX14{yXsJW>?lO|9^%XhF1s5QSN2qgq+4bHPE=Xh5{PZ zXzkf`e0^_SC7q~)z`|AN_sJ`z4RfkT= zI_g)arP{V20R-LrxBELIM z)k^!?a=OO>IiqTv!V1(=)k0;|YH+AZRw>k)R9Q;ji{Bsq{P2cAA+Fzm{Z;55Aji*% zKQCOE7~28Mh_H_vzdr5})|hRA)(FnHEG^82oXjLTaVIf$8>A-fguLuj`tNv;RHF#p zzO+|E*Iej)A8hdyrZu-AMIK<70n! zF+4SN49wb|2xHepz_67Y>C|}yIQ75X1~Anbm{@^Z{x{42-qd0KMx4O2qph(V_(uMS z+mk;GUwLW%)#R7uu=qnE$3KxjfFEj2s3bHH}OM6%4XId&UDKC>g^6M&eD4kZ9vI^XklV)bs!+}ZQs1{ z|B_$o#pDm;WATfgEC14K*DM+TXv{MIf!VLA5`UnEKU}T?!?FHHUzAJLTulC8iwQ_d z3o_{+mjD?4u^^00pIZTnrb6vl5eJt8ZZ04!)}?{8M3)BUQfW`+0($$#z;77hSh|ty z(vBTBBQAOaQ~ANUln0Pem$HH&rPrq7|&QH>lcDv8oDNq6)^U7$JU~w|2Th z++|SGvQS7Rk54xEb475+?$``TaocGxH~!t=zZJhOR_6FMX;qF-1Xb**U@v)kIkbN_ zg&2a{6`-EMY=@O#HXEde%|UGfs2*T_$1S+cUw4``KBX_S=r(qR*60WCoghE6I9h#o z?abi))DsWGjW=8eSKM?fj9D8A6GFF8V59H-@|(-t{couPx0g@bWaWR)42`%RtrG(B zcGLge0N%8(9xW6f`K4+f7rn(tVBt%O-|=fwC3Gd#!qlA1lsCvP-W;OYM6VOQh9bb7 zMKqIZ2GLZm$y^gr1cc*>#u1GvK;@>7&d*67N%kX%h7%1V8jK>~8$>jafNua%f3AL{ z%Iizihk))CqL;Z|B6^X0zb_W$XZ0%1&+18zUm$SnLH5rRn4zA<VA}H4Fn-D;Shi>$EP8tm%%3w8c0`5K8EhY(!I6A1!9eYo{rCfEQpAU1Ia>Y@WE+Wb}N>vC+c_%KWgu>>hqGz zWA%HY8a$~zV$1J2Dc+~OZg{U+T^`k{PqWS#j&*y$whxX_u;CaD+8*fri@|OM;s?zj z*9R@pS4SXYRlRdZB(12iI6-jZ7z+KG^3RVSzsE(7$F$I#&mD- z^_T=_np@#Ir@~_}-y==}g-=5GySrlP+wkxM_dyo|aP+<(d*lJQ{PN4-w#Pctg;@~F zLrC?Fl{W$$EAf%m1Rev#Z3{)}{|;}gPL1iXGiDp@{oe9R&;Qmp0!|-!{PqzTqS}$l zszYMjc3)AU>n`7bLzQdt&m#1OO@cuA# z&@1qAuV?9i5&ZNo`1Ws~!#}_I(x5N6^z$$1Vyp78rLVuBLG<5#{W<&{^|!ymH>j^r zpV5#W6sE0xg_2ec*B5)$1B~=3)9M6{Q->qN@kQ|Xppi7VYWRv!tNMQBP1*nU zSj>f0G^9Ka3hafd0~a|BtUJQ2$N<8=O8<&JoVCzW(wv4r&$F4A}NU zvNEh?VC$hmYK1N;@^`Gs7GjcwTNSPkdb#tm0WDtH&do5NEc#>}H#-Ffo7oijZPfop+X}~&tdKGpn8t}*>f#%Y z4y-_94~&zs8np>o0cOxR`tSEiU0M62?kqn8zOFVD>!uPG6#lz$u(x~Hr{IZ4AAlzb zyq|dVLFjbnZSdPmE`=9gdlSa3-wZ>RuBFxYOY@f4{9+rHl|JRr0rgGw=WIa<1qrxyn{6Z3^(uKe6Hc zR~z1c)hcasm2HDtRM^JKTI;=Kz}7ntoYk^i6$^RA1-ng}@|=yTSA9p-icf$2xZAk_ zdfruIfDpv?R6d|7AdY}K;$ox702di1=zrrNB?26~a#+i20KoKYXAQJ(-2r$=i*|vQv2k|#~z{(fArx$!wuJ81An;TCYm%j zg1~ygp&{O_>uF#mfx&;MQ?vAM0$bzzH2PWG+N$ZNMQJ=eE3J?Eko zSw$Z&P0xon6ElCBxjnJ@iLuk+$!=X?;+P?{^6uZKCq!-D06%{BclZXYZx?Wzfc>o` z>pfBhZdKk2ya~8Jw`~#&-iE4Mw@2h03fmHqCSJ%Dwy3TJunpFRWm#y0Q+h0cE0A?S zx=g?Ko@p6a`d}c_>}A+F&JQ;l`uJtYnE{FaPW)LMr{1i;3cP`~a2Dqyz_-&36AJL! z3J%U7AgO~=gQa{f_xJk+rbpjD_U-G({(AhCf-MmE}wS) zy>}6SKM0RK{1+rYT!L54PqSAg} zhxR)IySz#|Xc5BCw6U-aAG!b5!r(}_F% z7p#Dn=PiX^a~9Gn+}QuE+b4EA;SZx_|2t$;hfxdvP4d70)3-UfmA>U!MIDxB7yDLb z7KR|e7pCO=FlT2f3?h$Sow_^+BZu^ZF(U@T@WFjx;<(||L;ly_zqITVx60cDash9z z%3HQfzLYH!sp^*P5(@4Q)QVfFw&gC8Q^zzrL;(Ac0&E%9asr}WLF?773}-#^)UNg# zl!}f)CU7`eAG7})VP@)0YpVbNAOJ~3K~$;+-GJA$$F2~YScT{YJp4B+ohjO&rVMaw zA;j$NBn{w)ar zUc>p`YKI!R~NR7|s8l_3x5C_@BJRBqsRQrsw*~B0_v$j(*Cw zBCBZMvWxaDn;Zal!28n{ z!CS0UB0O$&Q1YY=ZpqJ$w0awg#%b?b@IUd z_rP`6Tm_e2djs@+YdH)c!0tVFF}(2l+XUbXZU5UPfpD}9aXJ6{pR+>4I}*|S@5e4w z;BCJx&7`(Tdm>**M*htN;6I}OJwG9%dD_;v<_8ClfoGrZ&iwCT17JX(o^*mm^Y{ON zufO=zZ`JL1U5EEqTDOVYV5Pw_QM*ds;qjbmtDg;S)yqDmbbQzqwp?A?Aydw3+7;6J zqqYTJ9eNsww2E!Nbl#*~3jkKBGdhNKrg73v~g>{URjl@1UmBU{0G(z{{ zSQ5q~93mC?>{(Oc?z?WIl{dosPxp3$%P#pHbo|RBFbE@K=PiL3N#)(+)i>eAHx^O< z+Y8_>{`UcBNN;yEE7te=h6vvq8~+U!F#b>97G)O6{`XkXKKKT<53b(=ot}FM2KIj$ z#*Q2WBZl^)779Y^`+t5-0gOH1ISdYMMz<=w(fQE24J<7l{HmXD2G=~8*}>gyj8YnlsdvgkY{ zr6JG1@Y%E*`bySaP0bYY2tl0c)x-0}Rq8fDt8RiW4Uz^}Bj+k#?l|9k<8hP9l}v7Y zf8;z`HDw!9^6bY;d^)q?(C|a7l9CS3JQJwuHcnHS%5m-r|4B8}36aB;;DzC6dHwxN zrnYMy^Yp-*Uixe=2r>otK?Sga9*G~yO_=GLJ`#5+Lmn~0;g^lO17nvNeL{lB)p`P* z%rlVK^aJdhkYtFg>M65LoyG~68C6g-0(^&_d%@Dbk z^c(XW$xu|eN-0V&j(uBXZuFV{iN1|ps6JpNLnHrP?o%!Pr`KIC0*qq?VCN5+W-Y3j zn^S{Mg3=$9EUtvudkH<~sKOGsFM`CyvFYHF@{Z!ZXpL*=+RySxKI^~B>MI|Z)A&#! zw~os#pih0y zqCg6NIWao{Y?Q7m$Ubb2rk{)h`7vxCDQo%T-{NgYUG?aQ>T2=&a~EdKi6?9QIAGVC zBD9UIlSrM!eEej;=2cwWn-lC!lsCFgSIBhr7L8H+X>?^voNMmL`pcKAQN|krXU4}A zuf)sEIU2P3`6&q8o~__$D4+6)|1w;_SUj}({_V-sRcWHy3>tPGk$P@dtUhIkewc4< zkqXMwNc(LVgY$F48H=r!<$Uku3QzToV&TB7{%7$N+{P{s<4=sWe3;QCL|O<_3`a7E zxBPs{xapQ|qOZ%35l`}V0URSK!$A&9Xn;tjY9z>xeyKXD^R(@!@dn;G;>XLRATGO_T@z~w zSGTIznzSTQmfeHP8M!9ELcXWN=elmMcH_urCg9!DcvivZ*qK5rIN~@$e@`M`H(9RY zfo9R%>a@3I0f5!*A1gE?oE!VTf4LoX^|4zmTvshwFIb9x*V*Tr`F9gk{bBDRa^j_E zS&K1m?k1&q$A%#~edM#~!#VO5mR2!%&%=4FxfFq3(98*;cpU8~9WG-a8tDJUKQ7nz z=gV6hf+290e7TaaczdJ)&hKZ%&*h2bMgH=?sZu9>&bt&jY$y>iD#ZF@ZU4;A?XdWj zJA$84q6-$*3F}}Kczpchz8(S$&)5@;ru{S#d5X2MUOE|L)kwQ?$C*bcZi-+&_kYN$ zdyH*>uGpR8qqhN+<`-LrmVodUVeXCAmomexe4WLZ|_9@ro*z z2}}*3N_h26-??2(|4+Z<0Y7l)+p_-bE~)&L^)JsoyyYCAD05M;U8+jf)QYh60|~QQygqv4UAtnzn@buCYC1~^Lz{s ztl>}{4Js?f8f^%^w$P}c(i^|ZJPwjwqCRcAerXnfnzn`vySD10ocvF_Av*yY5D5%e zO{#Sf8cZwf^a^C@`s33KQpVQR^tSGsR@;+(Y_u&cj^Jvrd2Zg3($OF;BxsAUH+)>C zDntk|yi}OFdAGC?1F}ItxHe?}AvsLDAjFmMRV?S$zmh|tfIpI(k?Cf5X;NJ}TxX&t z>)(e@2;5fL$R9h6OZa^_ZPF&X>{biOM8k=k|KxAi5f-aUVH;YL48dR7cfU8B?RdE~59X_R_LJxb_(gQWx)O~y+Cb&d>$9T-ftcZ##7J6e zAYoqag{1e-D;{a7M`Gk7*y)GMCD#=w;0Yh4a--j{J&i%xyu0=+9RCY@@X#XY-%zb61o3`@$w!X}VLcHrlLA{dk z>@2hrTld+IHNo&zUDvTiyy%u~_Oa>oaMwPw3W{}JQR0^uBG{Uz)VXHY)LGUBvJM5C zNBawQ1(qC=vSkD^Vssshyi0fx_hj8+A6}1X3ffP-GTH^h`T73&8Jf!nqRN+VGIw#Y z^w>4+e|Pj6TDd51R1$tW)4bbaK!~HI(b!jREnka!HMca-84FmVwQj7X7;ogBc2S>p zK#kk(lTCVIwH-JeS^>m)oYSZ3kjL@C_ugm*Hy}$~A*GK%66jiYE|10&;B z8^+lr5#PgBTVJD6m3F=!9M zcJMfacR)E<3hii+e&YtC=EEShWos~ zE?1f-(qhbeO5)GNK{v)K3*_rF#N;(d_jRdM)+@d1Vwp4egYD8>T5*9vC*{Po=0DKf zbl-E7WDc2J1)x%@7IIG`nXvw?lWkCb>Yq~<$MpI#i|kfw*4=)9k(D4j>$zQ35f8Vn zJxhx0!BQVunnij9TuP+agEbm8Rs<)w-y)?v+Sg_ALTIWYg7Qvr>|#iZQPCO-wY}rz z&`m-N)A3``_gq8Vmnuif1i$-hD7k5jZ#Sqm98Q+gCP!D9s+u-K!pvW4cPh84Q)NdX zRu<8U(N{Vcw{To8+3N|tBf?UzvyS$@n_yhrO24eT3opbE3uoTTWaUl=8OZuUjJPp> z|JEipswns%f^HNxhh=iKMyjdh&ObQ?8NO+kquwdw9X1SL8XY#On*DV&r_;+Xwl2>L zh=NzQu3>@hCTcg69P%QWg!dFO@P&U}wjG=ip$EVMT97AY_oZmeB|AV$pR+qAXJ>EA zf4(m`3X$t>A!aQAOQ%KTH=c(``>qi8#iZihNlNSJ;o_S<^pK#w((6hHZdK2#;ngWf zN!YDe&4M4x;@?i=;kfL*>ihK$`$FS&W3jk59x*E~3cGb$RsBm&>Xbj)czsTA(znVm zuuL_;PP+F$Hr|wwOFl?h379}UmgIr6(F4ORycitXjf*+Ve9Q_fSqxB4hd~h$JgI0^ zL}vF{XyxcFM5WKZ&z6J)+SKjvG~GDPHoqa*l8=78z?LY#+M{fgi7?*qTk{nThfjEe z&+nZ#muM}qNU!K|*2^Yi%7(Qf%Z4e38tsW;5~@wG?cnuy*rNTX+BRGWm!?}Jc7^kEE=w1H zv*U1dY;%jZHewQM#WX}tf%ni>WHzad=p_Ne|7`#ivbT_ETheZX zUZ?Z_4_@?-Q|tm8uloL=ss%h&qTW%+d*S8&d^0W){XFi_R|Y)xn5&YxeUFnqSkGg2 zQOGoZ-Kflwa&oLaDk}#z;b4LSqxc)aW}?+yj^@8)3}&-x1R}HjzR!EP^Dc=I-J0#p9@->Tu+KjJFrW**nz#W4F820Z{fD|hrQb@_tWp%_Fm!X zQIy#}P2G6vO@Jf1NuzdeX)|4ucm7FKRUsdWFYT)O=x2{|K(UYzhiHVtVu(*k#Vq_p znze-j&O{3}Lj7JnoF}0spB#!0aeAqn<@Ix)zbufcKE*k6#%BTbnZP9K(2z?pm0OA} z!EIpcLCg)lc0SA(LJuCi_Y2`|AaI_R?OX7(O3-#YJ-^4ey_~bO>6({qgG?-KGFt;r zS6sKy0)=G2-+kB`x)>wV%aYy`9=!Hve$%@;$u-mM=9J-{Z;sQt1;|KPSbX0aWuN?R z@k>~X|1r%s{YsG&X_Fv}#fomW9lNV!9j`6{xrpqIN|W@-DZuSN3q(*eeAc7piit5x zLHeoF3}e)z!dn2{Kn_l5Qk}JsEW=}AXqC=~zDULS(FgKLax;P2%T0x1mCzomCg-cN zIo5_hzZ5@HUhso$TRGH+2({LVCkDN`vqlQ8-7A~yOWqmzd(OY`58hVZmk!0b%4vSf)1rl}@2+~L%l>mSQVAD)Ap!#Oa z5dLuo4hdAWxS~my{rs8v&2<>!tFnJl4e0ba$_c{?3l3+(oBEnhl8nkxPA2#H`H+~pT>1|v|RqE8^d(I>U4cUQN!LFl)aCNtzZOa@DMuo;}T`RjiHD`v@HVDk5hqhz= z9c=#EsUpKH{-^>yh2R=Kz3vtFad_27j@vDdQdOfP;~n*1K4B)fmAp}u65hlREgi$~ zV{~ibFv@5Ca}-tGom+{cn$6LAlbLJc$V3yAD^+dbf|%liF~*sk)j4k4{sr%5y)9Jj zTILxO`=5VM_LqwA13+)@pM4+z)qy64KEmD?kc(~g6ALfKwi4olgfJVmTK5OBz#UBt z;H|ZW8x5~9_wy~f`uoY_-13PK+Ul5~ywG$33+b#@Qtfb1D?D7prc9sRy|W-TC3L@=_$b>Ol`q?QKf3dZ#(hkFw@`bZc|uI1 zgBB2w?{;>vm*$i|5K*|gN3wm%_3KBaF~Y3oCeK1_RlY+7OfO{9&9nXjzd=p(qdnvk z-tUSao!ip#v|1qE@Z7buJ() zL!T^n5sM{zw~J+;p5*jHK*KAzjh_(^;cdO683D^5SA9OL8k@1eid4TfKB^F-fad!f z@ay0A8!@QwFJjeee&xScTwe0UE*yCkuYB37I~g zMBYtYLWQ$9RZm@dKvTN=%VTcL%E(R@PU6t}C-c~ltr6Lo&Bu~CNrkYv<@9tPPZh^! zO(6i;_o^`QO<}%zqqA>BFr3bd76?D7AwjLVce;4RDc>KS6n=^j7WMLr7yfM#!__=* zjN+cHKsyX=d0=AFlY65u;a(w=ds)wBV5IpUrx0WwQuZ2}yHI_4GHO(d1%9)B*~|;& zlcRPo4XbvMqT{g<{_$w?XE8utD5?2|sv}R{c=M||v~XChLg<(fC?L)mX}pfYN^U#rf$SYp8HJ z%KOa36BT)+Pz0&pgl=y3VL=9lX3%(7klnM%NJh3hFzY<>DbH|yX@VsU-gLcr5-338 z>Kygx2iOmRZvCmHUA)_+USjX%MaA_oTPLf9qin%r5c#K0&7>r!NQ$nzA-)W3`ZdVO zYxldKxo`HkPSN3`1O~iqpQ!Wer%rn?r_bg?-aR;H#f|GT^EV| zjdmO(sL2m*U0s9qXo@tI1N)tQ^ML~yjp|6u!~o**`KJHqJnc2DDSOi@?J zOln7X?xkvaEimQ;;ezy@qB&i*C$t;r z5%b{TpKfS}@D+ViDLLbssD-I&jMYFOnrO6Gm8G=30SBY9eXhWJ`YUOP^kqi$@NA=n z{;e~t)`E(3UT3E`Je$r4sVoAh?+kp%8DFZkUy1Y~P8)(U%SOLVWUMWE1dGW&yuiL4 zC?){-w#IjjfsNO?WqxXO;T0Gm1k5p z(78PzT-RGBE$SeR3eU$+DUQEKghhI#j>$|i5$7dZLZoP0rSa0@Aj!pub|c5J3oMCN zHHrm0ld!qNAgM=Lr6qx~>7F>k~9uxq0qN&41shykjnAp&Of&F|LPXL{;glj>B zjv4(f`(fRS2gN79Y=9+w&&Ntw-Bq7!@HL|gbJSD9Qt$ddS@Cf<=A75IFR-goK<6d| zcx^IuaN%}j{=5>Py7yN>#8$UKXa6Ik?AyEmuuGuy$#soBdXh(t%F*DA{r9S-mIKT* zi7Z^#=e^zl1L2_girQ14{QSw$&kg8J`?yud>Cd2CDFB6=SYEp6tHOJ+_pkXGqr46G z6#O9sXP7NUAECmDDLn>eqYEemH=q1Z6l1$`kC%m%@k6CBv>vo@NG!C9vQM>gi_EpY zl6XXZKSWTOhj1R1nfSdB@%t%>%M@BlsQIJ6(zw~Oz?CkKO7izKWYNKjfNk`CBCWo12l zbj<+Ti%asdT>Mp|YVvhy;$7%OK#>q}gCy>kM;Y!B-wboy_>KFr`=f9(;rbzGPm%mh zvjq)zG2_!iw3koxRsrR>s0BXid0B-pJ8Bfcvg!yHGX|4Vgvm(;V_bq9pW<@l_szn` z9>Ix7t|Vvh4{~UBH!Eu2th2kC{07{8UXywge7+@D6w>fU1{4sgsB-yZLTXcRdvd*K z50#PWPUp-#xKph;x955^h@^1jPl#VA9lzw5srq7Cju^yfE8jEEXA(qnYbIKW%s|at zvWh9EUF7HHUFPbSJ~AfDvx96^V;r}GvS^k^1D{k%0Zx|8;i_ zF1x_XtG;EIdudnZs7>d(kUGx)l<5HGV-(eSU9^bZLKB$@larabNXB!EV~_^NCvujj#||U>=DcDQbO0RaJL9oy#buPTS_|$)A1|CAN8p6Bq(?=LvxJ8Ua4mq z( z{T-oGq6P*4i6-YpY?CK@K=CYSgv^4Ym7L-WOr)87l<>7_!mDkk1R-%+**X(f4}niM z9lI_2;Y%Oz?mg;#UGB3++3@d&;}`6!-coEIU0~n~@J`>pzaR5K$5zE@YvD6xsa(88 zvCc9d#M;`-_OxEMWupx7t?u-B3PXYT?h6BvDszXc7od_SfERYp%qB3|oU(-(V$R&F2Yw)2=5z&ZHU)5p)QO?EG7qcZ zz{^{$)oc`1mfI`*RSQyH&J~`oc@oJ0Nvf+rlhPTK%(!rpqJrpS3w*Ex&)~dz%iNYH z&9&H4Y}B@<{(GX|+uX<@qlqZX8oSZWPS;s_Wh`65vyqoQ_nX%4 z7QU<=hODmi;#ITM$(`v3!31NzYO-Q5q$=A$m(Z-(S&YRooM3=>FvtU+pLZRq_Ey?s zWVn<*iko4g<{#znkndS!#H4cma+cw$nnj@c|Hj&=hJ0e6+%)_DYXRi?4le&8AIZXR zQ{A5Y!cdwkCDA*TC>JL=--+nkf1>LjD51dx2NFFT%O#BaTYuh1lNW}#PfpJ7qH8S8 z-1O-wA?p7m;KIXEz7@U8!mwV@(^HyA$VT(tYW2M@`Yk60r1-uC?J1A2_l{5V7*j6P zG*@NHh3fKSUUv*O{q_Qsk#`tjUf(@9MQ~g)Yh_(+Y4z9gE;Be|DvkM{h-_M-&svyT{>c4ZwC@+-5W{jsCw#VVnn=56FK_x8Z_Sr*?5QV>ldRzhmH_FYMa&%oa=I?hzP(aMw#tUb zGIk=ssY@|%M$pS~Ri1N_1cAZfmXns3GE=RR?BLc{B6GCqnHNCgPt=T!E4W3e1*=zL zkb<&&y~Q4j`fdK($$8n^w17knxc%%Ju8`b4gt0t&TIh?T+2!m--voIB8`7Llzlu+{ zs+LbjUO;s;o_e>^!qD;CsK_Ya+nsxdm{2 z!TUr5-2>%2e>+;anNk4#j7xA6X2-kPIJa@Oj}+D3KtWGbXTD_TeSC$&-LHLBnnn6i zmz&YS8=pFvdkE{ZJNWsHLhnsqx%r1|Dq90Y#g9&isX>Xqfo&>?mNdnR z)gMa@vH;*r3%56JV)w;rz~D($MZZV)}YW zB{$|b-g#f%XOM)^;|Lj%TI3B5@VGm(7T8 zx%)8nD3V4>QuLnnSJdR>AHldYUgRz{KxH1FT0tJiz5>>8-azR0sb*-F z=k@Nc$1xd*ykcpz%K3UrJTsePW29p2IQzR#Hy+3x%F z3y>K19XJ(ZR}~5_A4>g{n^?=6ez?taJp0&MV~k)~ z;mjUbe7|X=0yD4I(R^wRA}j#XN1JTI&O+URWPbm+yPgB8T6sM6(qMbKWzP0lg9^1u z%*piCM@EK-7e6QI)1Xc}*ItWmC;uow667bszZF);V1RD`6cwfo+I(fi)lW|$Wo*65 z+s!mhtlRVVubA@5r=5U-3XhFC-y)b-ZEN( z-bMw~ zke%zlcIa21+alNhSk@2Cgv;BxQFh#cc>tlijmZkL&l1uFmQSNk#)KQHcHt@o)O3Z1ylaRg#^;)}%5>#?ki?OZXX@8?U!*Ci`+YLsvRjK zVv&;gha|r=E@|r6hL>(!MB7jYMU-eQ z6L}&Tc7S%5+&27>8grF-<1xdBl-fe|a;t8DPiYqme(KXmlGGJkTS&w8^uf>5dHB#x z-)1DDH|mv=Bgfa1NboyGE^x4YX28K#_?RVEAoVHsd1HE7;oW8z@7q)2vNZAQ!8<-J z0?$r1IW`*sh1~GmzY$$Ej}}_9Ry{QbzuMHu4)!`o0=j6LZne}F+>QgTl2=+Sgg z&ml0I^PCIS3nKICMEQcTj*zEyJf2=CstXjfnv(PG5mt>t$iM$(TBDG$WRr9e8qEuP z+aTNTBD+th?Jnlz1MRVJYcC@NoHzF=DwZEAbIzFl9X8&>}6^p#gY&6Nm+9K zeoH*&A+SC|BIV{Z=>;X80w>m}ts>h0&SWQrqI4+(1Y4h)YA0{EIl%rHffWrk%Q_lc zrJHRBBfhy0gY}*2&mzg?{d#l47^>4`wy!f?Q``m7;URutg&V(K)M?SC6@Hq435J)c z=)}b2bfG)k>qSMlHL1gqxP_}wg&;qCl=q!L4%?tWwN}+D_}sw zXZ4(vi0tQbNQoqS$K_B64a{A#3R=36tbIj?O*Gltg`5lNzdD!;`SfB!B9=$X#Ajlh zJZQ;}KQDB5X$sNv*@E&^_TLSA5gZ>%ky_DTY}q#2|2HD95v)&}W$i2=a_}+Uc`%En z{9UwcQ>I2ll6d>z=)t4d&66?(@Y*Q!W|?y(e`ZQ{A^0im-_@S>X>vJyyEJbmmg?xI zDgriG8C;iwYnegXo%|0$IkCuOh!m2nlHCR@^+9*hW?ddzxd#9`gRP7wVmYAEjKje{ z_dzRCbQd2i+X;2e6j)eQwHX+(%tdQrhM9Vpaby=r^A5qdc2t8PKnG0WtH#SO7_z>9 z&FDDdZ*QsTSwER~eAO`(7WzrTa1H}!>{6{4T_HChM@Uzgr=eI;snO_FZnP81R7d^Y z$O``BkY-foZ!!_tFF4}CS5M~dcdZ)YvLlr4tpYipHop>TWl;JFZUu_fPi}`X^VI$!o86rIBUXQ-faK-?(bGKgkT>l5BLr-EQRQ@^>&3LZ@WMiAY4Z!t7+( zNg8yX#b&GGK0Eq$A0?eh)T7oe5%yHD4AX!3=sZ?v%>}*dW3JsEz6C*-Hm?9kVPDwHIjuRNgx4@*t&tukor$-Zo+?E5!`#Ect2~xSA zTy<3hcR+LQ$W*`0Ml(78$KQ35t?#&Gy1;JuM?FXH4p><`8?64#-)4aqUotRPWk4e{ z^x%Epi2t5_?0uK{jJaqCH$yNF)3tE=DX>0Krgsy=e6ZO=k)T9ZdyVU7zcLT_yW-PN zjS=owCM{9#E!y5Lo9?HXB;O1l_CX|H{CKSI02Rs}-8c*$ISe}7KeH>s9Pwdk?{VeI zKNwJNluHwXwRhd&=5#70Nsf#>a>IUoV6?bm9g_X(A3MEwO2T%ZJtyanOLUhbX=oZd zF*HL{B}p% ztgW86XL&#kX5A|IVR(sLn`FZsE>(!>ISJ3>=9N|~Nr4U>xbUe!B5Y(rD%b-2-J-Tb zX?Q}6MTdlXB3uDj^hYjn7d3`wMQFpX7kC>jyjy8qNsZRD`3PMG7*xBtRp0h&X{Ql{Qp z0#DUbVFs9qYEO^hENd^(g4wFZcqwQ;(fs4LTlcd!7Qs6Z(dy4*w^#go$|%FoJd8{# zgZ)^rdfx*g8WLDV!;B?f8pLgNF~tU1ITGjwSFDT?yoEA~zZVp8qb=DQ!=d32C5`i~2*|oh< z9_*Wc_VQv_Bl99Nto(5}b)WV+j%)_UqlMUmIDOa1vl$A*0F=4@uLny%9$kQO(lRqr z!lowpM&91R${p`y$W)fQfwk+e7eh=`>@g1||6yu@)hgYB-;~_kE)-Y1lt1r#+o_Q= zrJaXfH1zjeVLn8NkBo#CrdI}Y&xK>F&*P(uRn2~UVL0+5p3^O7qxd(ytJzseI7L-t zZ#IJW1F$-vmVxg$a`^gZ=&9t79`DPIMid?_hC6h5-cExJc?#Vot?Q`pWSa(pToFzK}e^Pp1S)ORkE zvh2LlZXqk*)%U#52SbBhgp^fdY+NF?BI{ojoIObadUwEr_1F&>s=eheP4ePzvBlUX zx1gt3-IeC#!T0Vgz>Sp1f$UYE+b`y!K8z}sGN1jYZezbb*|3s+pA0!VKW(KR5=#Sg z#?Nt4eR7xQ>aS5#*PFCBIZ+~z@Ia4Oe(0=~jjXzQ;s5lL({`{>=3?+&NL zwE1-E#y5!f(+1tTm62256r)CPoAu7G5B3oW@NXS;dv?^rt9mNi*8Sw2JQ$Nfj;!fF z@4L7k`;D;qH$=5BH%`s0yw&ahr1_aVnw*uYIrs_n8pLzlf#ge@Ka81Zmp%=?^aJglxeJ@B$wUWJR)Yn55P*nxa zi*4kTUeH5MCBmlMYyY@J2=5Q>%vEk17X$M+jZQ!bT+F06@f*QXw3l*Dq~SYJ0SV9Q z%(>1#iM{6CQ~8KVpE|PGugkH-muUB!<{}Grhhntn^0z5ZzFRv={fsn6YqkZCYj;W! zeyWNI5+|e0T{)VAEDA`o2Z@eBB2p&Ofw!AX)Mpe#%=c{4*B|9>figk;Q5==Fo0A{j zy%YR~W%1^dEj>AMa)$cMUEp;t0aE1=1l7Nc{x=_tTxgH(c>?>^Y_Cu%5w%rBX6>!?qZYJ{uwheY%8#KtFQ8n?@TE52l+9rnC#G_ zwT6c48C4zEDwC^Teol@93aWl7l=(DBMkf=MK|w#^)B@FX9dCWdgaL%xjkYh4E2 zh{Ar&gi@xEQc!|&bIPoIaHE$D<5&~v47Q@>_rBE3(A>0eX=rQX*{;aEeA~_2nRr>17!1q{2CUmE09SvJ zlHcd`Rw*g?(JC;}+;+!-StkFk5;a{#wvt8wwkO)QKjF7Wn2b;nr8p^MVn4R;Xza$- zAh7u$cB&-d8CJnGf!Bxlg36jP)VO1|+BGjApWT)AW41}oVA2gpco0ygqii?@v-9j> zEEfU)Ux6wy5@UCnWjA_m^&qc)az6Gk`0VcAd!Y}b@JkEts~Jo{%jMYF~V%o zD-+4Iv)UFu(63GLoSnHep%bj`>5^EV%K($;w%+d3=9k1uA+=ijnLhHLNeJ)EG42xk zQ#-$CGgFj;)pT(qGE!0^5~LO6G*u^m^Qe4CnkI~=R*A*!`=_U5kIqbhi7Op<=lAb$ zg5~*ZKFFLhdh$wE(g1$_-{q*VJ*Tb6xgR{5SwIJxZSF@9oZ;X9@Km%Xm}C%CavIsV zeIUgpizn>qs|2cNC8H)MYNRMWjZ7_4axXxOC$)MpwkK8R;Z&l;6>WVsK;>mLt)>Ud znfCK-^~!5*)sIyrZ1#CK(lt<+c%BzR=MUG_?IE6yji828j0142WY8?ce_z7!17l!Y z+h)c|q7-Mw=h+i~cg^U;oai*^#4s?1Nn&3WhRNNZMY=;};I^Aq9c5U%+b7|-O&AQU zU)TEo0(rNpC!#v^KWQp3f<2tR3Z=9<|6zqp zeggj-u91B;;MnRw@y%pcu@PSR41x^&+(^$9k1D2!B8AptYdz~rsS zY<1^afmM@3qRdVPD+bv$YUZza5k$kHx0g!^`sYckbE0Ivq&e++&86BS)UU*-d@mYP z_WhoOAdDny0DRXUXLI@OTj0BaFj+KHFiF$Dk**-@dwMkPhv&-0%ehimX83(ewk(1P zJy~3Zc|LKleEa4&cUGG16%#@0sQNfI$UsaNnoQ7jRDl77jin<$AD<*zqcW!~hXgLC zuCB;Sjjm@(4D%20s;?1nv>qx*x07vkEwZ(nx2VEu7yS8N`;rVdp43>x>g{=7z+2oL zooKBXdk!t#Mkf-I7xJS9>yua`w(dak3Rt1Os$o{pP{u z7YM(uhvRb(ev^J@BIlVUSttSWTWmN9a{rXPWB0y2V|dT86)chhk9xFIFvdm_)lY0b zj5=(T@KCs4c^OU%bG#&q7)l((U_zml#wls+rRyH_527#oItCU@dmVON$*6q*oRMv4Ri#NcjMG>|qqkj(n za2&B+P$-QbIBdV&naVP$uAAGc_JV$`uHG#clvh(Iiv~G=(CG{=oep9C%g}ZQr0?oNoyWh zb-?G44;K#V#mnR79;-ESQ=VWZ{6MMejns*UM(F}r+i&`Izs3BW4-6MZet4!MXT*Z8 z6XXH8L1I(^Fv4!OLo-}}wxlX-W0_4SUi{v{j6JIo-%j-%2Gbjy7*hJEJNVh{`?`__ z{Pa_S@BnPYJfS8n(l;BO^9~MgV*i#qh3xqo8n}W2#?xA(&VY~D8eaYCtj*j^plJhwZ2T{nFf~<| zl2;Nrp}<*g_9P?L$O3S3>S1BRcp_{d2zdmZm<6OYEBYGcelrDDsOmp*qmY$eDXfY| zAofeO<1}FZT_)3BJn3Y%2sJ$H=|sOXn*knB`mJ%zM^(A2F`Hvw^QxcXI7vJ}@Qe6V znirDjWW)z=X#ZkizuS-O>#l>QEj-D&ETO@F$_QOFveQ|>@Lv@3+8&{D3(X*0 z+2E|YigR;j6w_#$pz$m6{v$qb<#) z_53trNSN~dl`{Xv&XJ}=O`C^c=f$N1k{I;3M$#GY>Fy%LBaJ6@)?3f+{?u9fxt~n- zeaJ5&>yL$m<6kDqosg8R99QKvPn?Be$R573v(u90=>Dx^3_05?noj#Fgg~re$g&b@ z6v7q#g>(|^F@5Ll&-ay-A)%90JN3@b=Z~#Q@Ha+G?{;?@9NV~N9}MkF&)uojL;>aX zc7WNqqwNieo9zc$8Y^2Bw(h;20RKPJAzqf^yqJJlj`9qGENPG3lcsM$f5X|oMmzz{ zI-T%+A$qpo!;%?f=>o4$iHl07qLt5KH=`k{HhoEvWcgNM=W+d@07ks>TL|@)BriJ> z^L9HE9M_=KhV+XEU?hj|Hh1W4fl))8i7&vS(@19$BY6um^ee_!OdsNISyn!u=9%?g zQmzJE4z?9#d`~Z;icjeDfzWbomdg3fgdml>FTTagu6t^auhi`Qe=UIEKS|lsN2&x? z_OeP-AD6X}06)tSk%)Emt`_~NaWVigJ>2)>dC&vwW^76>yxf3|mFg83o9pg;`rvgq4 zZ10Yc^6R+Z-Z{UdMa%aAkl(`Y*T()%|J*Z0Tq%Y)4GNWPb{g*76&^T{J7vZg0sGJh zzRizut!WW89S4L&DZ6c+Q-j$wpY#0v7}Dr$DH$>M+Ff&@yAmfg_>yBjM{BJrZT23n zMSqrqPR*Cx!uok!a<&+~6``rVjI!rRnMH(}Z-|f5QngU$7pHK5Q&IUdOB7b(p9e%s zEK|4~qr=xKK~;*Nr^xDbSk{U|BhBrh2gM4%kbW5X%E0c%zly3MerVVRPBa zFpG?(1#=MG)_ws3en2Ayho+)!i!A2+$Yht_XO@)eSolX7brtO`e@eK1JLFK5pq86C z$MuK3=0v+#DppO}bNQsH(|5Q%ku7$E+_RM*vn^$yrqeYGn7WposP*n@Q9y=3~I z^1z>|Akq>Rbdy`Lik`1=ctaRTr87kjaOl8r@68IduBDA3{g}ItI+NVo|3QkDjyCh- z69Ue$9PP(H&O@fm3OE0;L+QS1tnyZ7ImG?@>k!;OxDGof(Zj>B3jUwTd?Bd6ig4US zM?~!opmO&xMFe-{e9ek&Np7j1^RxeS(kJMZb-d}157?koQytGngy;Qqv zxXXu;*{3GkC;Y(DWwwUg<^H1KXsddAU` z$V}HO-T|MI6Qm#~fvu1JYRS-&AZ)`ys57hcoZ)lAyd_uH@4Dl9+u7~sSWfAp`1@zgJ%&<~ zVBKJjFL>8l<@KvLDZ?$}-tOV<_3O_wP|D|N{;mI1_Zr^Ubf(b&E(t=tk2|A>I5svR znZN{OXW@fb){p2YDIOP$p5EZi_Hg(0M6o{2841pKaFxla-~erAeW6Y2gVe^au-HD( z<(9!Ewg-Y)>d+3{QhhucIFB;AC@Rz*kv4k-F*XnPDC}Hjk2;~ys5JpQY6Z|C7TYGc zunjiI@62&tI+)?R?A?>S@S~z~GACNY6d1!jzrV*fw9X1Yk(s&KF8uzC`icuSp`Pt+ zIq0Za=&@Fn-nrKH3%({wm`m3Qxctuf;M=j$+2wr>^A!)M(%u4-e@Cc<=;|U(Ba_cz{}gc()p!q(KJJU zPBtqnk_Dz1u3pF8$(`if(T98vOX9PiC3R6!m2&Sx*cXIqV;@H5{8L+>y?zv6NDJWl zkz5ZsMaavdA4eA{OZlNStv5#-YB*o)&aV#dvQqNb5~knpBz=M0zj`N~ArHX5p0jF6 zap*=+H=Lg|zBO0Jm-I~n z&8aFtk@=-dxScMeOQ-*|tsi7a<-X9$lWF;7yY*qlRw_afJ*dF_=}>>h0S+-DimZL} zt6EYVoC;n>aX%?-sY1_j=C#K1F|>te7fT>Dqde^kA2g=UNhWF3POtZK$oE$%DD=o| z0xueUWq#qxr-*z4{C;1;5n3mp*JuOXo+P`84xc2!U#YKN4!JeeRr2p2N?CsXmY&++ zqV7W5F`T6Rp7=%*vtz>q*L;#gsUM;(ctcoe4OjGfC!?F1thWA8%eh4%v>x-CQW%UMPxDozxw36v*SgX6H#)H+X&*5A%7v&K8Ksa z1WAh@nEYn&Zrc-3z+_x|_jp4I8U4j-j$dkoR^h|TwS;qtoBuubd9l;bW2CgvM)SI1DR-=QUZs7B;MVn%ztLzZ>hRo zeZ*0;?Vz^T)F4%~Rc+CY;3T``7BlOwS&<_v#t{LCbK5Y_`LJ8HI^{1~J zZqZlT9Q&3mfsmh)@217;jY%I6w+@5;jvI}n+6dwI`(8QMu18mIe)kvAO_gcA8wGy- z9}B_noo+xrMvyNc)-KuVJ)ySQiK~FDqqzM_?*_Ar3rgIQZ(l>YaQnXSoGMG{wlXTYq?pSQ3l8`i_!Oxow<(^gror!d`XaoM1i5uJlaA-I zP9#3QFWjte_RRtI1v4(djuJ45&||&yf$Q6YH%-#jtO4j|k3Bs{aj$f$GB;PT^?VzW zg2~ z?rV4lGaVPX7|Q2*zpZ7cNDPVM^n06O_ANXz-uw>F*yp%~S^`hrANCRkJs z6rl&?4;HcuB+mjvkQF6h2;t+yF-jsz$^um&nnv8_wgL`IDrukB)+ZrWb7~b>&cqMC zw|s3~rlqYQxU*-o*lKbAmQB83b*LDDeDsOv?)5!P-MX8$k#xvNX7s%_iOOU-8pmXn zL4Kw=wd!#DiNgKX+ou9oqwvwTMASRxcxSe1HSXtOi-B`9_q{3tmlsxEKFIpU%CCNV z16@NI13u414cGfhyC6z7Uq@sSVc=7>eW)@Eo-#dhj<6&$g#C76r|8P#un+2hz{Y|u zmd`#MJ8KF5hs47WE)_>;7m$}_%;(_cWGYm-0e^mMaiqgo=EXJ@ROGdv*Kw*BikjM- zLOfAMm9DMyz01J&67j((WBKk<38b70cThyW_|L6}7iOk{+{psw2iPV5E}Alafm`bc zmNgRmE5)leh2)gYDndSAYW_XY#Y*8?hNE>R=JxVG?sue5Ff(@Kg%14OL=gP6Pq;aR zw2g*nOF@fb10chc!8=ynvm0XU*kPQ{zY{;Oms!&_itQec1tEFGQNrb_GjY3L#r%BP zw$eLIMEsczJXo%aizEn+&}d1lgwX0&#kN$$HEhyuuXkFf_=zM7Law) zwws2UQR#}Th;9GqQlp-B`x!@4^T|z+p`6Q;x*XI)z4X|@!Vjte)I(0@-o9?C;_V2V zwW$hXZ|Yh?<&9~v$Q*UI*S)N+yh{8m3T5Kemd$f7S9083hPAxuZpc^}Y;~JH?;YZJ z`Z_T3$ft9^GrZsx&~#)TSCElS)Mdl{Qy_3z7>)=jhT(eOq^d}*+)>&p2PwF7RJ?t2 za(*TGqS_%9XbUkjsHYbrByN(lf-{=uFb*D$`|JB?@!k=rZkM-hB<9Eo=f=|2Zo=e+{#OF%{~* z+t>#4HIY<}g963omvpJI-M1zZa$uA@}+ckZRLVpf;MdFz(x5 z!&6+#_CR1KTMN#8T}iLJMLG?WY;yH>ubvSpQYD)ue_(s~smIEfe+pHWIfal--cnq% zFs<;wowU1MyV5mJjg8X7QcBzL^3om4RN>l7a?-2xnv8G5@B`K(eMRl-vd75Me?_`6>Pf)_pAAp?%l=6_P@Ih~14mj(=k$bG4HEZU_Mp7&u1^ zN|N{3!B=4Kb`HikL*mj-@uzb!uz5jt+jS0xNEQMnp{>3m{fTfxRYywu^IW_g@S#O! zJ1y>g?R9=09VX)}fd&TkU%FxLmgOdg{nH2jWre{iXu*eFX+GSKX1({O={u~J?05^n zqVfJTua8?AGg?KyXwG_T95UP3yw0%>Y49lGM`{aKADU{dj!u0Rzox5?Sb{|n8Xq;s zD`{F0@c%(@=qSd?G3l>3thq6%IL%TXnB6t5oSs&+uaN7^xve8a{5ArzDO7-ZunJl3bcXgw7bBV*f-zg}oAhpQvN!nlv8`4#x4t zEM@n^5%5aQMEB7%z%)JzF4VZ;n8hMrsKPWIL*bl$EnSe3@9fyj-~RkfVMZ^GIl%nR=~T`4A` zS>v!>>3(NI;QbO!u`5nYV8m$+eH&2 zDsOeLb(6y#q@n}nIXKd8vdF<70!6*OnRdFJ$l+DRr#2bsG|^df@ya7MAJtlA;N53f zPk+aBn_e)v)zVgbKfy9yA~P;U=mi1)xmmM>~J>+Z*4 z$__!tpyc-t(m;^t+ei#3nGZ74F$Gz^v*34izf9vPPC+i5aC6Zm7xMVWXZ9e4k&9O> zN;viz8(P=e8l7DOQJRUK39-QHsPj zz5dXfcb1|hhb?#rEbrWQ_Hl5VPtN|;% zE?}H_rE*8N-N#4JnSAaeE9<(poSAXgTLAKIs=cC=(z^0f@rt_`jkn)F@P(B)B+y1Y4^nV^D>PV?Cd7uDTvbWh2+qs<1M{jyKWVraoEBz6;l+vPvxvx9Avwel-(*Dx=i||@2&dAS|ry{7^^y=eK zy8@x)v^5hCauyC<2t~6%jw7j5*-x<=%9QN&g8*ADXL%T+;sC30g(hBdo&0Rq9`52` z!&I^Be`Lrb)==A9Ex95Wc9zXA#IO96zMEAMn2c;O2~taHD?m28>vYVny}Ds;sCEe- z%XP~)T8X#AMibL4Cr!ltOX1ULunm^0{wi*xrgsK70+|eyW*+aBstNzRMqHq)50x+Z z4SkW{Z8S%5T1C&?p&LHz554|(zW70-P5+YwzqfyZS>@{y)GglyED?laRAD3;fP(k( zoA*18jPRw7bH5cV(N{$CW+o2%2hOJ@;vZaiUy{nlNRY!88Z&bB4+~mjt>_$dW!suvl)2ln;@Qvn!XhvzcON5 za@x`rft$##ycM(_i6~R3r*&aKJbRE%OvFo@`mzzJi#t)?=_0c^1@r>iMXjx0Kv_sV z&3k;C@=_+tz~#{2!^%4@7w%KAY`t*4Fe^&?F;=3S;0|nw-qIVmx(u0;m%|@yqEm9> zzMFa|>ge)fs&Bd{#z)A8iR#{}zSDlWWVhXc`&B*6VY_=d4br8>rd9xnw0*bs*!he0 zyNWDoWobn@R&P^TEv zI&cv2$pPF<8T$iPv;;JGB1i05A2z zT6DX%rA@#PNK)UgZ6OLo$)yOE z3b^ShRy_~8RYOP|LwtA=xVBx*9;Y7{g`AdVjT8n2^QiB1 z->8`GZg2f}=<%v8+G(cKK_vTtK4_(;GI;#N{51*Rt~9us?-Y>i6F+dZGHxB+)f8rS z8i1ivnF@`2JcKCl;zo8T*8K};!?1Ai>M#Gj@cLFBmVm36gy2-do8X8O`E4~-9+9CB zp0|PX^Q7tyYG!K;vF_`L?tWZi;O6|I;!a>-&#mIfqW8PvqpW_VHEtKFrUjBVZM%Ey zYS!9h%Wy?9>#FO$k2m)Wq+8n^6Rl(BkFXjl7)4d9|EjplhcebSPn~!3z+^GoXvq3u z4XttM+|v0ppa_b%cwl$IRZqHpRG#BR=+7~wEsFF0{K|g95})g#nQs)$Ay%3;n`Obp zRf=rJytE!0W0*V`G8-;2Wc1)fC-RJga57XlTK1G9di(wEg+7Uc zpd$pfddEok*lJj;D;&klc=W99+;Wp!ppT?=XA^xpG551XjeUw_WdQ+Bh_Q%>DI>T7 znwkTGb5~`3WaCih%XXr>w@pv3l>?q~6CW*K`I%FQU)ASIHj6ajnz#sEo1bGAQ8r9Q zdGw~lAF-;DqJaF1@Pnfl8>2;%8vr@&yjmqOhND5=JMm*y_0R~w?|H~=t~ihQ-OxOB z4MI~>bR!7=P-pSQ72BJhTN)200Lj95Z8C?id_b(ZNo^>pxPW4NVA^dsgV=hwo&sD< zLFd(`|N73CXF~i^mgtUVGB_{TfAzxF%kr03!2|ZQp_ZSSwUtA<35?A`063uH{F_?W z!vmBrs`eYVr|RLE9X9tp5r8jck#fpPw3UjC&)P?a1V{F!vv#Ytw~_4~oCRLt-Hb4M zsE28A06T1jdfakLIB+*YyAQaNYUn7CHaCCTNcGMs95gE`GMOsSL=sJcenQXqLtM{l#2$o~?@q zW4Ry$e$iA$7_`qSF#y3jl|PBtAmN*Y6$V0kBJ=^R`7t%c!i1!C1sA}rTaHP1+=!=t zdq6fvmqDddB1h;qj?t?C$A7%;2B(uGy>#kPt9$(B1>K&kQ|9o=Q+3!-Hs*-G&Q*^ z_u>-J4q?_KKo-OE&}if#U?d$Je!zT2XHYHiv0a>?eh z-X|;1X-=EB1b1$J)wL@#ac++ust3Ki1X9^@XnU08gdJ#5D6M7;n}(gM?VEbDFCsC@%&Rfv8zOJ?Vo}IdwRQP5)aHd{}e)vL95K+NQ=ZymY*%n(z{;dEKI@_ zy%)a!ibhvC`a3Hf3zM}#SO|ey9d$q9RE<5hkwG=fOmnj@>q~0Kw38^t&v;;Of8gtO z2fno3{|;}IWtIn6l3T$;Zls()lA^UZf@p9v8NUst**r-uh`grSotfCp zPfutARGD?mf}zO)rU@~ICjT1vUc2^YN9*OFM?}=+sPhldFa_OPX&pXkpr4P6gX6|P zzQ;Nru9rz|%9aeU2Vy(@7u+vJf55g}`n{yPy0G?2$af67TPHuGn0(`V&fPB*V|4Vn z#$=gb#z>XaDYo3ub?6)+YU?*dioCIj9#*DUSe?R^lgfr9elp%kf^Joi@R9Kc75`9T z9PFjj3F2-vRmUM(sWlc*V~451Uh2vp)6`vnj*+(skbZ?vHXlyR$lYX2Kpuiv`M(|4sZ`*^`J;$9jPq2%&b0YdiM6&pQ%CY8)yQr*Rr7{KTpAHAQ?GK7=S5 z)&^_>it`leV@j`&Y4hJ&^q zL=^tRhkgLc9Ee}b`ZFeWyRUm2Ow}GPfgMAL7KlDU zJf#j`y;XrUeQcNjWt!;c@T_0pHU(Srj=yW8o+vj@q|TdxYC!5)PgDS6!im`~ij~UF zFHQm+rDzPeI}!&fPE`&vd)yS--uwS37D0W?xD%|HCShQXVK0^0YQ_d<`Yc?#TgdEe z=NAs(zakQi0Ze9$no{3YjcDmZD!6@j6%?Fy?Bby_sW9qQNdq3PM7I>?@C%K*%ZwEZ zzR9mTLCO^Gb;P|tglqc6luPkIdj}hb_5As#vybE1-qHhjNhsntWg<||pBCw`E)ejZL!ZW2&|QC-#D`(ueNN9< z?7ZHsCjV0j9o-eYPD-{ZQ}@HBbu1Cw>y95K=9q=`^qLB*jbzO!>GxbL;AwwBAx}J& zaQUx$t5c#SWaWP<9AeMCC?Gp>%uDo`(*Yxe*B(kQMdGp|HP(TW4mv;>$j~FMgP)RfS0(TJ9Wu79-rg* z+>U_n@6nnkOITB|vtUXzzVF;p@1m15?*>`Ik!*fK5r0lUhL{a@=mW6U=R(S~hX86s zi7)N_leSS;)6LKkApDVhKj+=qy;NvHJ0@WRP;UvGF$OTfkr} z=NUR({8>D?WXa{{P!w%r@RH_Xn_wPKnkMAy^os5q7Q-C)mU)R&=3wV$Sq`ZUQP5*o%uDq*p zw}(fh$@U5qhnh0B39FVXs5k&y(XY*P)tm%A)rRKh;lYRWt3$_hN$aSEbhu!#BD;jD zFy~3GCvZU>B#qepxhdq6I!mJ#&bO;*!%K)*BJAde<%&H@sq33nG!IPi2z}V-ZL1y~ z58%ZcJsAYGC?|#bNqN@WW+y-7e3k=*4~;i)M+X@F(P#;~8!pS>_Hhm9i2l|bTcDyh ziN~f7Fp`~jFXN&b8HBZ#;+7&h$Vh z7~7iBqCmxGS_vcbL^U@(ngS?dh!ec<@L>wFeZ)v>Gow8@39ckB(=j>(Iy}*(Y<|A9 zBsnWi?*8@|Br3d^L14K_HGIjr;_3a+gv6!nWa54o z?SAChmG6!}ZUTNoMk}ZHBsF$0Cv5%E8B~Jx+>$+&{I{#0OZZN;0kbDs^S-0Vy3GQ8 zh8y{=eehW{hY*RetQXMFo0NiV0|pQKiw>=$SU+W#s%Z%V(B=)Y(ax=?FOTd$E(L`f zTEUYce9GV)qY|#C!3qlDR5O`OPug^7v_I$NudCX9`Q(6A(bQjzX>+Xs5T;f1?xO5q zLH;#L@8M^@mC70^c8cv8%nSSK6w>KLZWx1VDN@J}P1}HKN)~jZfF|rz0Y~WXg7jo= zJ2jLP13}^FkH8j2C#6)uqL? zvAZFpuBqc+y3&sXjaMrz!ePK+voZVgQS>4qfDPSC9WI0blw zfFDf^GEYYL6O^n^qt-S;#qtzo0u;0bd6Iw7C!qd-pgj-;}gC`t9e=KYDvJy%E00iW`o2!fSe&)}z3(+ZA1NR_RmRX-aJfh&%@H*)% zye?iZqAlj%rHzo5N_Y1=+vk{(OW7ScOE-inm|xp3d@2@*cSGwi(B5V+JD z`!asnQwT3U>^ug=qMkGAuT_%K(v)7jf0+9UPLnLqaf3-@gQTX>r@w(db0}<&HQA>K zR81o8$o}CxuVPRd;m;e-ne@=#Qb^$rcygS| zVcI8tXNk?`TW&JHokZ7_4fH8|jV>Mb8|dfCl-||PeD2^7esx}#bIU3pY+{qSlr;q; zK=D2?&?nsdOQ_NVQd@@=ykk;8)a#9>Za=K9tpNUApXWr2_x?ft>dt#5h_~N0t_DeG z3aSA-fJjtxo#c|D?)TM ze~N#{lvW7+V08-7P4vH|ypBFQEuf|dcHWOgsI8DCmZF)FXGsM3d^9VI0_x2jv_o*s zz!jJkU9<^}!5uHU$ya>#!#An>cNK(20F4ZVzOMLc>2)QqwNmNgYBzH)v@um<@Uk|5 z`~n-e%UNQ9!N-L-nSpw?(2Qm@^0C%@Bz@8Md!vRY#C+X}X<~N<6s9}-k1*&KS;ux0 z4H-Pr5o_uh_(qAe_T+j?F_lL|*WcHr{NI>~A){qlqQ4d7D_leEd@~=YwbSEJg~b3G zFE<-Zf(#3PQra$iIVE@XNtB|$HP2)b8zY6h=_Y87_HeP~HKIQy759m8Z*QR>%k}-2 z1v>)a-|`m@0$lo;?b?A6fJ=nK_Hj2e%zgy1oJRVzfOlehmITF)&U~Fj+$0fEk^Au} zWqj02wZ-2~3tHGHs2Ag_=yk;h0+e259UBZ9fZt4ePd+Xv@JL?0fH#!$nycgW=cFO| zi0QU_0jguOIqp6)NnJ^Z(9M0Vz==+a9E-Oq=z>SHC)-plqMpA6tkk;S%}43_yuZt* z5#Ry?8M67%!|_JQrnRdY56fgwTsZ$ya7zjNJi0FrB{9DBZGzjBnLo=CL=!bx;{jeX zR~yJJe4qRCk8*th4n5cM%pGrz3$X5cFRMO=fI7Xl0c#mZFe>BDZ|cLHraRFFfMyHu zl5a|epH1h5irH9%XyRGY6VpH!J)RACA={;uWm%r6LfIhjSbQx2td)~2P%yrNPKe!Y^8Q{wju|NBy4`NGwP(>P2VUKBn4yD2Gr7OA zH745M=Zvm+ZySOJXy`7=TJ*~2E^HEKDinlMc%V*lN@IDVpfW~AccenMhB6u>pFC-# z?CW&x<+tp^b9bj}pRfky*wSfKno!Ju#_(=O>;Dubj@?|Bn3?XbCH&QW{;1F(a9^HJRQuq~X%F9vrB4|#0?_G3KstvIe9WiG+)lmCfTRRw0ifRATYo7P8ZAHp_qMvf=HuIMN8x}(d(;$= z)0&g{wcNe|!`vGFl4qb1VrpXb42=DOyWt zj{sSpyK@pJ&jj8HsB2KH!(DpAt(;qjO=ux7%@bDA|JvHhZx`k}P)8e^ z$36n&MQ5-QZQDf;^4??V;TFQ1P^xLpV1qZIkA??41#&*pbHBCEFyG$MjMy~SYe9wc z(RUDqKQ9CZ9OWn)Pa}W zumZB4d`Qk3ass^98$DUqssBj~?MO2C;Q_k{kJ_;N#!#GnJ{++7QSIghy%=em*S!hA zR=IL)3ak(=uAj}BM-r?MWDKnI_M5P4NLio8a7#@vj-XZ-$9b=&Xu$84u?Kw@WT@=f zatH(9DwLB)24>vh@$}z)6>ga5i6Aa85b$7f$q=HLulA}s_!YmvT`^wWsTDYjdu9S>RGyr2G8%mL|6hCYZ2a@a)o1FMlXMG_Y4gm{*pC%U+&;4j>8 zVh?_@On*IkYy51`W?F-W_y&6S6^BrX{4gyWMK=np=Dg#M*I#%jrV{6wYEl0XEi2() z`0uJ_;8Uga&*3UAYCEk{Q<0I~kF*`NAeML25|D$zuM$KMU{EUSBG**JcRg%x;nqon?$QqUFvMShlaiAQ1)c4YY& za9Xb!Ra{INx~&~Oa^>YKrs(9X&xRS*BPMHrRW9xbwe(>Sh6v{p@-kmk8jvUeY{7$) z?-CocAL|ji_YbG#-zIQWkXD=(fGN+%c0^VtLu6X0t14nOG5+S zYx<*PTGH}{8=X?jIm*2?uutFeg6OLzo;%54>Q{%a8CYQwvOaMt1_Dh!MVdq`BOb0? zN`nd|0T!>T5s{Z9D0@Me`%$dXwgkxLeG}lbeJ^(Pv_##$cR_QOUo7<4u9XQGMC^SO zeEeyIl@^1F$?lNDG~s<(yT7iEN%CM*B1|o@p3ozOPpx=^OkQ%#KP^dec@CVn&4|IMHsYI z5)|;gkbq5SKX$~G_mb%+iTh+7nE;l=fZHDH2vc&y!_}Zu5+@)r-E^A<`WKFbgJ4_# z_R*hKu43xHEJ!JYyxX_xw0dRDISv3v{`KgQqTElQvutL-_3bbR_$Vu4)xOz0lhz#_ zkkIrUc(CH%(M~g(2wrTh!D+ELCRo`Q1*~mf&50|63n&P0go#4(rSt%t%G)M-AW>B;LreJ{+r) z&KO}g-!WjW1^!yJlzI1-K3?14k@=2xi(ma&u*0nzbi@1B5o6JB5n4h}g1mgGNslE5 z`5ePI(+Bv9{+VN+>(~FImu5belzW_ZnOypI1N~aI{WT@VjJO8Dx;aqw(j7g(SF1409%4u)3;Jy4nUzk4N&Xa+mKnR(6n?eHpl zIQu@UXDkn$TzY#Ho~4LG!f#kOi>}uLAyTix;6JV+jp;UcZ^5-JO5S^%s}4B z$4_~c?OwXCSJ3BYx(sS);y+ye$`pZ5asn)h;-_j-D_%-DNN)ZPtX?%h-n=8Dr8>w@ zgQE)y@;?mJY6^eaPeimQwfxas=r3XJ!tV6x%}fYHQesiS4=8&~fxEm|^uL|Fspl7fLgc#6ukM*+S8_R&SeVqIj&3#$0S>*C16>a^Wqd=!)Evf&!pCO>jf06b9qiV zT~T-TC}1qmQj7-qjT;bg1De$45(6Z~i6cl4=n>uNIr$9X-?9u$O+SJ|>^xYkx+#sX zWAkY2 zEeu~s!i~K9A^KC6%}!qW+l+vL_$FPaKbN=?&icGQaO1>3Dm)yOM?*0hY^FE zIM@W(Bl9Rw0n>)K(JAhw9wE*)s{4N$0_SVtrsMGjf7Y+N z*?3m9bhZ=II=!8n8@RtUc3EuNN8CJx?SXNBcM&@!JDZNmaIV)0?WQW>9-qX zXt8_z=+oPZ+pI=QZpeyUSfNC(LC_6ANZ0@8cj*_O5Z0T3c3|LI=$VE2ut)nZkJIkw zxMz`%!~1WwhhrP`r8EWix$^8&EqIp1)_u|@ZgWxEl2djWA%OP1_j0>My%SwX1t_3v zm=yWxqVTT?*z0a1(G^L?Yyt!=EPAza_0=nDr$ zwi(3aC_V)u{ddOxl%3DTsAY7)(l_Fhi8byi@LOwuaFjhxCOcbhJ9R^~DgYw|&i55v zH|20P@?hjc*)XjR8^j+codXY-E#VXP^586sg%^vWx@*k@bgeF_^K=G0Em6M$3ems{ z{ac{>SS)F2vvva4y4$7zbm&jauu<;9Z5aMH-mSme;ZT#jTnAC$(RzB}om$5cdQO=^ zIBfY@>JPxb;mZJ9XO-11-~bOHpboEH!bULl29t=FfK=_NoxXWOt`!8S(9-5GTL1W0 zkt_7b1ZcqgKm+~@l>%{12L^p$df1Th!1^|;{U={tvRR77X`?aijbSZW@}AX??vCl= zG;{4|D<|(P3tebUY5j2{)vAw;lFu&rqjqV58z;$Kr~z!R@T7j6k=Ut% zN3`qn<)FXPk+1B+J>*1$)UkPLWmGwnWomZT?1Cu}p`z<}0EQ5f=gk4mK z4oc$)sEVDV+I2bHJSKW~VpVU?GZ9PdOSH@N;GG~adtITB)U}L|M<&zzp`JPh9_i{? zHrKxoq1u|$iMl!CTTuTLK&TNEr3gSQ(ZEQ4;9(DKAOA*q2iCjkZ~EYG8#a%6=Hgv@ zjsUHb(KVSUxU4HtMmljmd5-)(tJ+9duPBLH`#pmtI?y6;eU;#j^wI$K1gHshe_eI) zYLEm?Ns)Sak(wMzQ_1HrAQ%wW>aBTzN)1b$=A8IY(HZl{TOQI{X zv$mybY4_)67POZqtsBuPkn;DS;ICPK<)E8G4%5ZMT@Knv`*y!5|%2v}g)TT$wUu`YM2w?*P$C z7*Kv#S2K_(@?o4r-1@7#s~}5cG&7KHGJSOV+PN4{OD)_&4$GN51Kk=GvItNQzwwC+ zI8=F5@b}Z->sMG6d53A&nqox(iuR!Z>DhaMQIwbfo1d)$xRG(|2n^w=+|72@zjmG2 zdy5f1LS><=a;0dSx?4ucfbnLj2L5X=b-Hfgz%PnqtU>^^RzJh z!6Bd!)TaFYr=46??BV@HeiJQeoJzoZO(NctAnCTPQc>}zkZvS}n4GkfNO|311z4vg z>n9KMzBqNB*xqM&%v4Ppmh+m2m54H^OT!SERoKbVAA7%5j7evI6D&aDbsIPn7A*GQ zkHBE9*-^)(@?4DXP``uczKhy)@K*9%*zeDh4QDfFWQmi_zMXNip4cURp?B2IoKN_2 z(=eUK@r_uhb;KiBU9@lEBtj^X2Zv=csTKZMaRGk;W*7F4h-$SbSwLb2ai6*bMg!QT zjAK5}&uatt>Xx2f%fH|EfCjPr)4@i@>ze>Kd$AkN%siZ)w(H9u0ZSqjH&i^_*Wr(Rdp#W@&~7rYEOpo>Z&Aay31+%U7mjHdk&r!X zvz-rRs&l+`-xJElvNxH>FzHvk_=MLUSR9CZa03e4gT7g?;{;;yC21)%?L7!AmWCPa z2c|=I3bXzx_Q#b|a#m$8m7v+;Spk~6c{ls?;o=R(A2)!l4h8--(yICRZ2IW@;dFUR z!2k}BRHZDd@s_sv&iX#m!Rz?HSd%hXh@MNAFTQ zt3_|spXi)U-o6k}ezRn!chCII_MCVtAKb9!xY0RqbsIVXh2k_OZx>Rn_OETwd0frB z4ETBiwwczv6%sQae5gIe68=z4A|%*O14=J0Hi0uOfoO^Jl8U8*Ee`sO7KZbE$6rl< z@9_8se^zB)i!&ehs31=uK4+yy<5}o~$63MT?1cX`dy0>=C-as@Dt5HO9hlnz4JFnB zy?WrkC|0HQY5)|36}#8ofqe$qU*c!0E&_a1-|$|-mVB$-OOLqy%W_+i)gECIC$$MT zlJ7Y_QbJrRfs<+vuy9n^l?+I0GE^_?6#qMus)GV>(Gp@0frdeCFk5-I)s$lr;ZwQM zBl@T0YM)xbn+u-}ep;ZZ1>M=D9a>3lwbD-w=;O&vx)*=&Sse| z5zm_uy`VSiy!3uY%lP+_qV=|w0teQJo{3nRYcR#R7yNUfnJX9!8RTo%>64S+oHe4m zGO#xwBb(`2&bVmf<{BxI-3E~F0^h{|Zxoq0Ya$fCB(!spFX#T#BS54X@Cxu*{A(qn zM1LsG>!iU+*3lBxlVJwT4eMtClXx39$IkKb+li#t#uvWO{$tf=*;DMQkT>%|S{{<^ z^pU=dNBipA_acKyo_>BUfT3uziek$bl*-$1cWs`V8FJl!M$#(#tPX3M4G z?E4;M9Tgw$eO;c)RrDo!XZC;&irOZ+9H-0xreHsH^fKHrvy1V2nfn7=Vd6b#3KX&- zL%<@RM!@GcYi_XvNP;p5D77=`gB!RSJbv?7W~D&>)imEQor7d$Fx_xu{Ip#07QjJE zmWKn|?cHs`mCoCDEEAVBJr@7yJgz)U)4?>b1u7fYbOsPz)UHU~q-ezuH>wq*pJZ|f z-<0z*yy$VW&+JPJpdWT@n#`lv67Y^`&=IAfVuh7PGCHHVk}NUN0tlqc7EwpHh2I{w zBHDr0bwlnV4!b!a>3LlRqW0$sNOqXET9j5$jx3Uy!hTriV0S?O5;7Nk_i~-W6r#_| z)~Rg=y4f3-r*+u267*8)`#!tmCNAK0!fs*v=Rl`o`b8TT_9Zctk1S$n-4X@?qCNWK z7hQF;Ga%sOO5i|Wp5l@9BDXjZ4`oiVrfKrzsoSteis|u|)?Vb&GKFIbnfTbl!Qy!n zKK4WGNVAROvs>TqImoHMcH4XYlT<6YUOleD`|jxUMv8PP@GYcT-2~vGz6g75@_;s* zT@p(^z5%#X&FrHzMNyL(6VDpL+>UOwE(ZoEG##k+)I5!Vg`Ba^b<+vM<2Y3)<{Epd zyP}CmzyTHpe=UpLI-Pl(S;5dHkX?-XP5J?SK<){!yI?FXO=0F`%+V%YMIPF_eZOy; za_JR_v{ZgVdFJ9C#L6&?*z#KU0mS$)=kShsf74yprzXJowG19mfRo#Erxe4u{=XK$ zX_17kh=szk$G0YSKLAx=a8ot`a4h$cir97ae_)e>K`SFF==AESV(C_w0m;2rVRQ1! z4ZF|qKePq?qsmPgK1pyFm4ZV287lM6Ckw-uKtk6ZBx+_>1gbp3S4TL;)ah3_H#0?_m6m`?g7F=C@kMvB3?CzI^z<6oe@#i_i(XGrEqOTEP`~ZTIHvNyYa@-*Wy< zjQ`qO+hJxm0HmilJi9;ItR;wC=o z<4G-DPiHYsqBU@_x#E1@@?ZlefWc_5dTR#Z_*E_YIxM;kw}-l@V&Wo>OA-Lb%h~mG z5#*f^&+P%Z`hoTK!>8qiDMJ!~fW4!&I!Eo+zLPx61g8MILg4t*y`fqNYq@B>dyU)! z_E8$T=B<2$PL|@ZqhSA#;7Qw|@rvN=rjLCEx*tRK-q*4E;q}TR+gITk#qdpH?lmo&H`b zt-;MnEVz0#ce4Jf`T~D3y+p9_65S96}s4Q9<_=>s@CF1t)!rNc>u>8=Q65 zsl)dImtW;yKM5Qa!Fc)d<>!D|S=#>N2M%w5btm8#uHWuE<}Z1+qD*0aohN@xas8FS z;@FkVuM=-A0fg)v&I9qrKq**z&b#%S)HB`t!0@VUh)7xQ%c~F}q(foSS^{@ZqUGrJ zo9wvY=kzQsg%H4nx$?_rnWjp%inrdgF;>NCv@Pg`B(IX*Zd_QT<#)hlQ=0mcF6pzB zt&NNIo~HxP@boGZ@JBnaSU@Q010ykcJ{V{M1B;~l_Wzt44hA@ER2o#m+xj#>j<$Np zX^+yQU46hD$OsGxB;N5Trg~W?T50LTk~5HX)WP?sxB6JFl1qV6@zs5U`L@epzN2)` zbczC@S8s9`vgsf2mh}eHYYrkhhBdW&r@H!D%V`B!UJ0{Z)mS<*{I=qc+uW!xo*_^mgaXS1-!*Xu&Kg|2ge zGuqWb1qaf~eqfaIY_Dxe`_t6HW}{&6Z1w zfdsyzP-%*5JOLt&K`&h+`+?(3LjYL+6zgWY&b8cj8BdWvU_|CWfWHfc**MyYaD1C* zT*^W06oehgg*-oHkcL^-`*t^<-AxL{{M`G3t@QZ1QR%FkBdv&rZZSFQqOGDZ%*A2( z+Dbua)D}Q^`f&YHOe*2B4^ArCX=f_7{V{|1!HjgFfN(}X>8iIS4!NfucGZ3u1O&MMF6g`>9B05DzQc^4uOD z_;T|?^n!&|cgs4#-S#}q36LVEj&A`0pbr66YC_diioU3EAIagK&7o_zd)554-ivb( zP1#@mG71gBXnz4n$}+q|9=Z4Z`c$xG(h|Q?fKT_Y7Ibsi*J-4*SCFd=Qa&^2()T2- zlhjV-A^XSfd8^+q>90ATBMike<7kE2S@xqb{|{n8oxW+i_+XTeFmF|O~xO~3m*cCK=XO8$UwqIa4goI4M z(|45N4cQq<@W-#(;+@W56qftGM2mNaE;79@+B|$hKIfOspVPj!vqarI7p`e1iv*Gu zbe$6?#oAi;&7OOC?G)}X-M1k+v8kz*oc%s`<{OwlJ3;P17=#6U+~@$zzn>3|#N*S* z{5Kk(rtoif4jhX&k^f$hSukO4Mn3NUo#+#AYggmpJwjU3EBgWP!J|V)!nC+(n4!c6MFDTBuY{`|oIdZV>t;If4kb{`yR2j(6}BjQnmRH05|ez- z6>LJ>Z9*nG5pSX2|3F=ATF1Ki;!R&%vYfZ|BCZTC{@~p=v2dg8x6=Q6*pL_Dx?a5? zYV{__XnI-Y-*KsVTK>(vykrWv-2bHTmc?@a?=`*w4%RKyIu_->Q5V7;6*d2v*?9V& z8Mu7D{>sXO<<3!y*TB<517P0FSd33l={yqgfBo|#`282pr|X${F}wSS(lmCrB0aqTZd8Xb>rIN9ZztH#l68r_pR{n%CbYQ@o8Za z|9<+Z{&2$`cfqoq2hogMm48QXlliyO|AcXY$q?`>NWf>M=l?~RvQ|`+M}(C*g~Ea2 zeRj)Q_gTwd{!qwrbsv0O6mUqZJC5Uni*}bd2SiPSkz>bb%IDXuT8u@ES3d7fusuqm zbf|F0Iw!7k-7F#Jino2~6FUFxV&b%bTaQhQT)86FuJ^R-wuyz)!rfw@fV)cPUHlvU z-AviO(KS9z6!72)qv3)3?}Y~jJO@cN$6;$(Ev!0F26OWFLfD36%)t5hL|4Qk@oxv_ z->C^{c|t;Jp8wq|GVGSL?zLdfgJ}BBe`HAA2bX3xs?&Fz)3bNNVeUZ%WjuOgOW7m5mrh(}j=~ zA5(J3MA*b%Ru>I8AekmvaiUhoooW2vX zAqn~p4uDzHr0h3x;AsBkUtT+j%jYk)bv-_4DCYD(PkSZ)s#R=m(k!8UT+tt?kJCQ*Bz>W#k)&jiYUkv*KUK!bpD%zQDl5_Rp#Fpmgf}Sg8H8< z$|~^7+~w>4ZP`i_T{oJ(lU090$gVqfeP-k7HdH>pwY>i7^8IDbAu|`l3&V%Y@xdsF zn-m6fXU2)A`xl)mpZ5rx@I;y=+81cywvc_(_{7k0TZd0*A?FtIw4O6y;^v8V#{`|m zC4`VO1>QQ0qKamVy%(1BM&&Vv%Nm17hKK-+d=MHfR{6)SrYcr8Tfp z6!O`5dqnY0f{0BHZT_1h;PI}COoe|ZOY<*t{q5GXZnv`Qk4y2vCLAA3LHs+Vy6I0m zeJ3>^9t#))ag!rm(|5uGq3rN}xZ>sbprLTfU-`>Y2Tn5f_ z-#YQO&V?HZw~A3{F>j^Co9E2UbKEQuZ`ZkRdrInC2?0mHkDveZLx`Oe?rI+^3i#-e zL!tK#yi<;#TCxLRa@YRApy8}2eEIo(e(NE-hN#-ecsao9v1hef5yDT z}R^}Gov?{kySejMf2Ok`@ThhAM%4s;^m)&pzP2ago6!2f<@_Fad zeWlJ9rp|$(qee;bL3R54bU63@*IwyB=(h9V1$QFuPT0NA!#&D?bKSSOD1~`>Njq;O zlBCnt3A**z#B-Elv2areg~TP-nsAc>{)_l`Gb=4olm8B#I2QUm_AuQ3$YZdvv<4C@ z8u0kEd4>BSVzUE6Hzcw9f9uNWv!(P2;@>Hlf4}y^T8Hr1vhBjM>_Q=_$j87fT^Wt1 z{WF^I^qnY~e_uxB^Rwmh`OwfHm?JxI#J?R$n>sc7(p~`( zjoi3N7nyAg;noSbIoPDbBCcy*#mj!%mjT!D?^YV0Sj)Y+{2K{o3ro!H&3`NLK@{-~ zNAbb%iE8=$ke8l^o;TeDaa$cOe6qU)g|Mfz^gl%R{YhqnG<|+mak+E!lC>~EEuW8q_}EAsA^h8We}zAPyVzj| z&P|}S6Y)Xnl^HAK@^Ev7TZc^;{QH`z!eogx@yZl%w@%ypqOO~J$=XaeZms*Kk%~Tf zLW-$P9SBtcZ-dO#?Jj&0D&dp9eIAB89_<4gj?|#P<0?Kum6w|Gc}1w1S#XtqEB#L{ ztjaCwjrxBt%qsAkot|g6oOQn?m(M>Y3b+&TZ!~>=$=)N*=cde5%je^j_ObJ4sHeQw z+;_WP;N7AW-7{;@2^Xb!#KG-x-a3rJ6mA5M zpMQc4S42plJiJ({zP$OCn_x(EtTcV6q*ATEMD82m6FUDLr*q#L7p~;LPY+m~BK*hn z^}>>@LSct*e46zuLz=!bDXR(b@8g#@mDa#q@nr5lAp)WzL-5Q?rTZZ2E8NxQRYr*v zrf_?7c}a_|cbzzEm;))$7Yzmcoc?EC7HUtP>xy=Cf^NQO8=(_bz*!MOi;)S9PjuY} zb)s$`_g1#jysEThpR0HWRbPgThi9L83VPjgE6m9(1czwS(D33#yQJa8L94gIr0p4^ zfM zf0rEC1y}#C4xVJ}Dn52lCi&6}Q zoc!EQi#MH0F-Ndz@#YG;POxn%;^7T&&u0baDyKZH-oK>>ll@J^#XTP!g zR(hY@0FkRULK^CQBD(LTdrBbAkp~l2ZNbAE6!9iEN5FyTf6}%R^Y21I6mmb`00)~^ zW^MET&1yRRZC1l6lnuR#3V22@SqB4$1;7G%d>YzQVnX4aH(!zFUy1_s^M#JJk!4)rojAE{MGew)_#&wsMHm6SvD=$5D`fS%uCn=bZ0M#Sj32-+cJqeQzoo zudmftu@wasBlJzJ?BK!S@xO;;s=aW13@0PF!D#bhRP}lj$s%CWG zM({UQi12m-aE)4UY5ebm>ZSs8;SA-HT-`j>82i6F)n2@@t`7gX)fcYc6)R9+abOf| z+PayKKu7?O2=V1v_%GjoPaJ{p!Bn8g`bY(HW!~LyBj&@&!tZ$~*?X!$c{m{Ncd#lI z;D@^VyhHA-<-|W6OlIJ{ zclZpMGw!~VTKDlmtK4%B7a^r-}J@(~5*D8vmqmB+ZAXA)0C~-HhY_ zKYy*yaO|8lrQ;CH^9q7(J6s_#He9a%PKt|!-`qzRdS_#Q%g*~F`)xzfNoO$eNx#v_ zfX-WM{lUOnYhAPBj)M!=a^DXJ-kN2D1Kz~=(K~LZFt-DFe>Ze^bng4_fBhpIIoO53 z-V8zhw#t*$tCqpzPd))&X*p1FNpjzZ1^1n8M2MFOjh7{Ac-tVZicpl}fB&kmx&2Eh z>OMcBWw-)m=q3bsPW_dapz7Q;-i1C9uh28Md4Z?L4nFR;GzQ9^0uwb@w-Tm1h3kujAIr!XJL-?ErDD{CiL?{1Ii~ zb^!kX?CQep!1`!lF5R^F`)_{>zn?zBsDonV$qv_zFmC)K*-& zv)1_LZkW1p2Y7q!Q~^Aew{|~>PCS|wC>qjs^UP;lQoKB;kxPc$-d`3^kg^}Q6IBvdyg?h@~R8Cfyh`*KL9+Do_g zi2$d2U_yLz4@}vx9lSi<>;Rsc6a&Be^)Gl=-FtE1{S9KJEE$xS2c3DV;r!roa7|bb zu+MqLi5lDwF9UaoPqYB;EI#?eqXoJ1Zu45e9-1DQ>M9hQ`*x;B19qv?&Y}H#`Ar(6 z=!C{R*|>f+JoWU`u*}03$}ZmGgI4AA2sdq@suS6Li}|;ta5+xV1h`cMI3TzowYGU) zN^LWh4~{&vf4KT&NGEjQCmL)3w+aB?2HqmTr3^eSCJa9K#ZTbxfBESCBNQi)zxQEd zA70tuV1TX(Zp|3w!Gqf&_x{j+F6Z7(qZDOi@@T=Wj#3 zfJ+e9YS2{X-?5dA?=^RKf4;V}i_twWX&|fNX$U6-`0<9Tw`G7QwC>{(irbE@kVsW1 zVhJIM?(%UzUFkLNyrU&Gq@8BskETJ>0px=kv`Q;Zd3YJPUH!MZlu!-sKPcxz9G^IK z;m%z7&^2t@XWx&`aVz0X5#~GJ`zC%L1HcynF5NDTZr(6w&Mf%qGov8FTnT08uY>O3 z3CI-hxI@v2S3xm%-ys&Y1Fx|GT*HNn8F(+{-*Ht<-NB{xETE)*WE#5go?!<*v{UWn zTPGS3;8o{^M$DAGhhUbQFKpPj4wB;{Ik+iC2?_9oH(t57awVzL!dr z`_H{K8!-RixZXd^)lte226Wv+CvxBoaKx9#JR$@X*|Z@3ILSBU_xmSYqSa4m@20lfY$RiRM#`MieKC$bw_ zS!!+bh{gF;LyfQDsp{g*3IcfT#T$31BTv@;6F@yNXUw0^9XPpf8Ve=Z-vdngoQGP4 z;^4>!>`t$Q_=5$w8rV+ZO|Vo0T+@v|JdmrQZI^*Nt@j?9+Hb9G+U0|v4S+j1?MDc3 zsx*-@@BjYJTd+Gi)CO;{(Q?DORq)KHQ80bw8Ynz=o^FT8bMHO)OF9$*ye+)|ybFrC z`*s9)wIUB!1KgH>3-JjbKK8g@NgeYlt{q8t->K^87;1bCPgNIgq!Yj!F5l`cK6%la zd+-!^=`1jQ)?9uk9#WLpot}DRQvUXjzukX#dd)`5K{sUf=g1$D^X|9fjyf)RxUtEg z>%jXh8|=@4KYUl-|JWz$%=^(-p*T8j)$&8G|CUMxd4uKcYxw>17h)5svkt*~{VI6w z`R91OcP<()^QlXGuqvs;&h`vFxaSxlz*NBjPIsLTE*2p!Y5;)C@dJY!8O7CaNIb#Zu(z-{HNc;(Suz)CZUl9ZDV}9!TNP8VbpWaBD@#zhRWhompQz% z=suVD{dLPSzz(W9F_b|d0z60pIEQ$(406GRYm^n*04~HQ6%D`EH?{p|eq$StPvVEW z&wn52owgd}PUDnE3vqQBp|%4bx+q1n6ORaO z8R&Lk|3J0v-bKADCD;A_PksO;Wy7aCcHag|=nN_ccaT2Af={x zNm5NS)qRf~YGw^jimCMS%dF!3^@Gg_@RqB$drNqXath*GdSL95Rj_`|3P=%Mc%%sN z0ADvad-5HbC>956m{2J?qJ2FhSFaji~1LvY%--T(j~ z07*naR9$s4V2q;ayoas>kA0)1qYHmfIX8iuK3`;r-udn~pxBtt$MmKeZw_xCcYbI2 zo!d9VtXb3f%^B7NhJg{mjb@7vQbq8NMR-#$%dM%oyxyDKw*>G&X8^Zz;UdHZfLp~1 zls<}2Vk;Y7{(Q8aG2cv9(Adh1&8Hg$RA$zZ3l5B*zXhK60~Vf88?CZhwpv| zni~+Nf!^}CCNwN8Id96psj+hG*fH?**m2;Mo(sk2u7mODSq|^4?jsOW*Um>6bR~G_ zo55FK0)A?MOLB1Gj-`bHz&XVGA`#%|y1nU+^Sdh>U5qX5LyfHANjX^#9cQHnkA1Q7 z!i^8wZ@x;6nRiQ0U*e6KN$m$=!isgUXu(`aOO6$)Q3&Gb!fAXIst^C>*I$+IlgT5M zfdKxIB0>>?tXYvVU^f2na_|8Mv2p;p7MLGhBc{{H!~x>Y8ZaM?D|a57D58}iE+15a zTseHKb9na;a;chxLmSuWvr4_0>Hqevw_bP|3DARsBNafOMU0fS9@zN z;1&M(d0tW&WT}O(jh(=6&y<`HEjMUN5U29O8&}Rl-#U5{|EJ* zkf8m;cfJE>P8bVrXkgLh z4KC>PSytWf-FH4yQ|XEGBa4rmW|kwTW>uWOez)`1YtVM>wzd4s6{<*qY=roRxIOUX zs8JA(P9Z@WA4P#A~N3hc$tly2KN_eR*86n%~Fr ziDyQ^yiMC60bO_T*=t}pdX{&O=RGW2d(cf+!WMMh+YsPtcuN59*M&<_ilVd-0d5sD z@IJcHaddh8yZiQaf3B&slcm=*vGB^_(!tN%bhM$ASuWmoF`c`?N={zfOIdi&ORx7f zUcLpEQ(A{MIc8`rG|g`)9+=V zD8~~Sa3HGzDd;14E`gKoQbYPgE&M$G!-;4g-S1U8Rz4T%Zy$f8_SE(w(lEN9q#fA*%(@84l1M^BG5 zA2`NJ4jh|gIeode?Z&GJ@z<<%7jIapcP2qRW8Vo_=oN$zf0j3{(3lKV6E3-Ns!j&AT?yP zU?T$OFMp8d_TUlWAj9I18t@Up;sBjL!$1Bm=#H$v*z}2@-cM}HcI*5&;c+s=IJg9O zDPhH5lL#y6!fCs3DI<|zYeosb`_0ecw;#L@|MS7mIOu-;%b)V0iGTI;AHy%-{}Feo z@BjGw@YDC+fuH>79r*DN-sUj;!GC`n-hKO<@ZaBk3qMQ$1>gDRoAB+oUgzyDZ@u|4 z!tyq6NPpwioABDpH~0{%FW5>J!f%3^` zpMz;D)<9rEkr0=hxx&Ztro6jA91@myjYnv2PRs|nNyvcoQ0bI+4`>SFUI~R`d z78^2qDMCT_{W|kbV{Ehs%dKx_5oPs5jjG{EYpOVLmPG-uqEnY$3Xh# zT`#?Ur{~sdPxRbdNgdtpL%hz5fHa4RPJgoW#a^L8vKgJ z5zkIfgx1DtxO(Xf?}krbU;-jRgrH8nI(sz$(`%=Xwe=4t+r@MC+5t;~)t?oxvbigz zqmlq6#Q|z4QBOIFi~fg0>3t0-y$8P_DE;II@G}I{&)$322Bzk^o5BABjUf}2+_!1c@L;M%3L{7&Qq zrVD3}!}-$)rc(%}6Nlgwf$7LTICco3bf6Os?dyO8B9yvCD0Q^fLwj=_v>}*U5KPVW zmC#sQj&Lf4+R75BE;mC}SrL?53{X~F2qi^2UgB0%m@G|0ea#k@Tos`fba|O6adJxVh_2oPZ}45U`YTa$4faf-Q<@_@@V`J za=$d>D#aHZusb$$xo=l#hae9-2|y-!atY_6bJDq~i#v6&@fRB*g9AiZOLLUe1>Oz+ z#){>OVanu5@XWKL;Ms{U!jhfd5MErx!Cj2tHXJzv1_U?3J4B6?ybq$ursR= zJaUYJ`&Iy4j!`6t7m5&<0IsMDw~JEDRo39*Dr*Rbc#Sopv=)-88WzQ&>)u^aKQgtt ziB+_<4K=EUC#|Xb&;eGqWgatk9T;J*YhV@i_5Wr(eCj6^7jD45+i&!7h?5gPbrEzl z%Gr^#;E5le7pBjG8Pg{74`p0TIP8uN;VxVPIW0%vG7UpZFsBYc1oV`IXaqnO)K!(h zJ_HImq01Le@y-i3uAb*}a!j=C;yKAN9kw~9Bm3dl;T|}0pbNpY7adbO?C)xo9n)S8 zrdkdr4yBqh8_;Hn&8iiOmKU66u+qF*G5ctK0R_d+VWjNyO^KtKs_ia;oZBap&GD1`=) zydVU>+>(L`00=08R1jsP)C&*aV^RR!_Ygrvu<}Px`SUK;D1;S>z~xIYK@q%s5H6Cu z5jIMBiBfO(Ry>9zollVPH?JQ1wd5_2@oy@+H&0I_;| zQY0ttn1x%>g09T}(lLyH4$NP)m2~bLYPByp%$@1W!waEq$0mk-UYzfvJ+^8^x)a%;v5fr4Dqrw$ZuWQR! zlu-{R?Uub&@D|P! zO0N^&hY+08HVM?8c(L2IbpxzhvmBNzoD0*YzR07IQO`dIqsEPg7Z)ytrJjD^omqg; z?t#LSm-x`H)ES4MZ8~xqjHrBSq-^Pdkdj(n9!TIO*S#aX0NilheIS6}Ym_1YoO19! zYRE+Q{ZmVG>lchoEi9#~VFci>^SwR8-R3{j)1gB>%y94oOE~u`%jr4hlGVPS6}0zM zQLSnDg&TKzUV0r4z4E5D_3CYF#o4QT$jZWF=b+&D1&FL@ghe}jVD!XEy!Ct){ye0g zuLSN`bmipC3G7rePEeOR14&TlkPlVNr8@wHh*Bdas1d|^|~+LCdhZt z3fEW;*O0UApY}K{g{ej0m6s(6AX1CKB*+nh!GSiY1xfN36v)fq1O<@r0_RV{i=Q9Y zP7XR>yfFHBk#_LLJ8yLLUL-UCo;zK+JltHt-EAv(uRFJI;jx3;Hgv40?XDYP`__#d zmabdYgX`vXuyxZq*s^ggY~HvAHf=zyUkw}AuYwKhR>JzVD-f!v)yrY+s%5Zd)lyi! zaw)7@u>@A)XLaSWMX&<3eCa}1wqyY;T|6I_ESiT9o(GE�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 + + + diff --git a/shinkai-app/public/shinkai-logo.svg b/shinkai-app/public/shinkai-logo.svg new file mode 100644 index 000000000..7ffc86d17 --- /dev/null +++ b/shinkai-app/public/shinkai-logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/shinkai-app/src/App.test.tsx b/shinkai-app/src/App.test.tsx new file mode 100644 index 000000000..4d57a1d7f --- /dev/null +++ b/shinkai-app/src/App.test.tsx @@ -0,0 +1,31 @@ +import React from "react"; +import { act } from 'react-dom/test-utils'; +import { render } from "@testing-library/react"; +import App from "./App"; +import { sha512 } from "@noble/hashes/sha512"; +import * as ed from "@noble/ed25519"; +import { vi } from 'vitest' + +// Enable synchronous methods +ed.etc.sha512Sync = (...m) => sha512(ed.etc.concatBytes(...m)); + +const { Crypto } = require("@peculiar/webcrypto"); +const crypto = new Crypto(); +globalThis.crypto = crypto; + +// Mock getUserMedia +Object.defineProperty(window.navigator, 'mediaDevices', { + value: { + getUserMedia: vi.fn(), + }, + writable: true, +}); + +HTMLMediaElement.prototype.play = () => Promise.resolve(); + +test("renders without crashing", async () => { + await act(async () => { // wrap the render function in act + const { baseElement } = render(); + expect(baseElement).toBeDefined(); + }); +}); diff --git a/shinkai-app/src/App.tsx b/shinkai-app/src/App.tsx new file mode 100644 index 000000000..a293b272e --- /dev/null +++ b/shinkai-app/src/App.tsx @@ -0,0 +1,72 @@ +import { Redirect, Route } from "react-router-dom"; +import { IonApp, IonRouterOutlet, setupIonicReact } from "@ionic/react"; +import { IonReactRouter } from "@ionic/react-router"; +import Home from "./pages/Home"; +import Chat from "./pages/Chat"; +import Settings from "./pages/Settings"; +import Connect from "./pages/Connect"; +import CreateChat from "./pages/CreateChat"; +import AddAgent from "./pages/AddAgent"; +import CreateJob from "./pages/CreateJob"; +import AdminCommands from "./pages/AdminCommands"; +import { Provider } from "react-redux"; +import { PersistGate } from "redux-persist/integration/react"; +import { store, persistor } from "./store"; + +import "./theme/global.css"; + +/* Core CSS required for Ionic components to work properly */ +import "@ionic/react/css/core.css"; + +/* Basic CSS for apps built with Ionic */ +import "@ionic/react/css/normalize.css"; +import "@ionic/react/css/structure.css"; +import "@ionic/react/css/typography.css"; + +/* Optional CSS utils that can be commented out */ +import "@ionic/react/css/padding.css"; +import "@ionic/react/css/float-elements.css"; +import "@ionic/react/css/text-alignment.css"; +import "@ionic/react/css/text-transformation.css"; +import "@ionic/react/css/flex-utils.css"; +import "@ionic/react/css/display.css"; + +/* Theme variables */ +import "./theme/variables.css"; +import JobChat from "./pages/JobChat"; + +setupIonicReact(); + +const App: React.FC = () => { + const setupComplete = localStorage.getItem("setupComplete") === "true"; + console.log(`Setup complete: ${setupComplete}`); + + return ( + + + + + + + + + + + + + + + {!setupComplete ? ( + + ) : ( + + )} + + + + + + ); +}; + +export default App; diff --git a/shinkai-app/src/api/api_config.ts b/shinkai-app/src/api/api_config.ts new file mode 100644 index 000000000..3e65d8e63 --- /dev/null +++ b/shinkai-app/src/api/api_config.ts @@ -0,0 +1,23 @@ +export class ApiConfig { + private static instance: ApiConfig; + private API_ENDPOINT: string; + + private constructor() { + this.API_ENDPOINT = ""; + } + + public static getInstance(): ApiConfig { + if (!ApiConfig.instance) { + ApiConfig.instance = new ApiConfig(); + } + return ApiConfig.instance; + } + + public setEndpoint(endpoint: string) { + this.API_ENDPOINT = endpoint; + } + + public getEndpoint() { + return this.API_ENDPOINT; + } + } \ No newline at end of file diff --git a/shinkai-app/src/api/index.ts b/shinkai-app/src/api/index.ts new file mode 100644 index 000000000..e2394e829 --- /dev/null +++ b/shinkai-app/src/api/index.ts @@ -0,0 +1,484 @@ +import axios from "axios"; +import { AppDispatch } from "../store/index"; +import { + getPublicKey, + useRegistrationCode, + pingAll, + createRegistrationCode, + registrationError, + receiveLastMessagesFromInbox, + addMessageToInbox, + receiveAllInboxesForProfile, + receiveLoadMoreMessagesFromInbox, + addAgents, +} from "../store/actions"; +import { AppThunk } from "../types"; +import { ShinkaiMessageBuilderWrapper } from "../lib/wasm/ShinkaiMessageBuilderWrapper"; +import { MergedSetupType } from "../pages/Connect"; +import { ApiConfig } from "./api_config"; +import { SetupDetailsState } from "../store/reducers"; +import { ShinkaiMessage } from "../models/ShinkaiMessage"; +import { ShinkaiNameWrapper } from "../lib/wasm/ShinkaiNameWrapper"; +import { InboxNameWrapper } from "../pkg/shinkai_message_wasm"; +import { SerializedAgent } from "../models/SchemaTypes"; +import { SerializedAgentWrapper } from "../lib/wasm/SerializedAgentWrapper"; + +// Helper function to handle HTTP errors +export const handleHttpError = (response: any) => { + if (response.status < 200 || response.status >= 300) { + const error = response.data; + throw new Error( + `HTTP error: ${error.code}, ${error.error}, ${error.message}` + ); + } +}; + +export const fetchPublicKey = () => async (dispatch: AppDispatch) => { + const apiEndpoint = ApiConfig.getInstance().getEndpoint(); + try { + const response = await axios.get(`${apiEndpoint}/get_public_key`); + dispatch(getPublicKey(response.data)); + } catch (error) { + console.error("Error fetching public key:", error); + } +}; + +export const createChatWithMessage = + ( + sender: string, + sender_subidentity: string, + receiver: string, + receiver_subidentity: string, + text_message: string, + setupDetailsState: SetupDetailsState + ) => + async (dispatch: AppDispatch) => { + const senderShinkaiName = new ShinkaiNameWrapper( + sender + "/" + sender_subidentity + ); + const receiverShinkaiName = new ShinkaiNameWrapper( + receiver + "/" + receiver_subidentity + ); + + const senderProfile = senderShinkaiName.extract_profile(); + const receiverProfile = receiverShinkaiName.extract_profile(); + + let inbox = InboxNameWrapper.get_regular_inbox_name_from_params( + senderProfile.get_node_name, + senderProfile.get_profile_name, + receiverProfile.get_node_name, + receiverProfile.get_profile_name, + true + ); + + try { + const messageStr = ShinkaiMessageBuilderWrapper.create_chat_with_message( + setupDetailsState.my_device_encryption_sk, + setupDetailsState.my_device_identity_sk, + setupDetailsState.node_encryption_pk, + sender, + sender_subidentity, + receiver, + receiver_subidentity, + text_message, + inbox.get_value + ); + + const message: ShinkaiMessage = JSON.parse(messageStr); + // console.log("Message:", message); + + const apiEndpoint = ApiConfig.getInstance().getEndpoint(); + const response = await axios.post(`${apiEndpoint}/v1/send`, message); + + handleHttpError(response); + if (message.body && "unencrypted" in message.body) { + const inboxId = message.body.unencrypted.internal_metadata.inbox; + dispatch(addMessageToInbox(inboxId, message)); + return inboxId; + } else { + console.error("Error: message body is null or encrypted"); + } + } catch (error) { + console.error("Error sending text message:", error); + } + }; + +export const sendTextMessageWithInbox = + ( + sender: string, + sender_subidentity: string, + receiver: string, + text_message: string, + inbox_name: string, + setupDetailsState: SetupDetailsState + ) => + async (dispatch: AppDispatch) => { + try { + const messageStr = + ShinkaiMessageBuilderWrapper.send_text_message_with_inbox( + setupDetailsState.my_device_encryption_sk, + setupDetailsState.my_device_identity_sk, + setupDetailsState.node_encryption_pk, + sender, + sender_subidentity, + receiver, + "", + inbox_name, + text_message + ); + + const message: ShinkaiMessage = JSON.parse(messageStr); + console.log("Message:", message); + + const apiEndpoint = ApiConfig.getInstance().getEndpoint(); + const response = await axios.post(`${apiEndpoint}/v1/send`, message); + + handleHttpError(response); + if (message.body && "unencrypted" in message.body) { + const inboxId = message.body.unencrypted.internal_metadata.inbox; + dispatch(addMessageToInbox(inboxId, message)); + return inboxId; + } else { + console.error("Error: message body is null or encrypted"); + } + } catch (error) { + console.error("Error sending text message:", error); + } + }; + +export const getAllInboxesForProfile = + ( + sender: string, + sender_subidentity: string, + receiver: string, + target_shinkai_name_profile: string, + setupDetailsState: SetupDetailsState + ) => + async (dispatch: AppDispatch) => { + try { + const messageStr = + ShinkaiMessageBuilderWrapper.get_all_inboxes_for_profile( + setupDetailsState.my_device_encryption_sk, + setupDetailsState.my_device_identity_sk, + setupDetailsState.node_encryption_pk, + sender, + sender_subidentity, + receiver, + target_shinkai_name_profile + ); + + const message = JSON.parse(messageStr); + console.log("Message:", message); + + const apiEndpoint = ApiConfig.getInstance().getEndpoint(); + const response = await axios.post( + `${apiEndpoint}/v1/get_all_inboxes_for_profile`, + message + ); + + handleHttpError(response); + console.log("GetAllInboxesForProfile Response:", response.data); + dispatch(receiveAllInboxesForProfile(response.data)); + } catch (error) { + console.error("Error getting all inboxes for profile:", error); + } + }; + +export const getLastMessagesFromInbox = + ( + inbox: string, + count: number, + lastKey: string | undefined, + setupDetailsState: SetupDetailsState, + previous: boolean = false + ) => + async (dispatch: AppDispatch) => { + try { + console.log("lastKey: ", lastKey); + let sender = + setupDetailsState.shinkai_identity + "/" + setupDetailsState.profile; + + const messageStr = + ShinkaiMessageBuilderWrapper.get_last_messages_from_inbox( + setupDetailsState.profile_encryption_sk, + setupDetailsState.profile_identity_sk, + setupDetailsState.node_encryption_pk, + inbox, + count, + lastKey, + sender, + "", + setupDetailsState.shinkai_identity + ); + + const message = JSON.parse(messageStr); + console.log("Message:", message); + + const apiEndpoint = ApiConfig.getInstance().getEndpoint(); + const response = await axios.post( + `${apiEndpoint}/v1/last_messages_from_inbox`, + message + ); + + handleHttpError(response); + let results = response.data; + if (previous) { + console.log("receiveLoadMoreMessagesFromInbox Response:", results); + dispatch(receiveLoadMoreMessagesFromInbox(inbox, results)); + } else { + console.log("receiveLastMessagesFromInbox Response:", results); + dispatch(receiveLastMessagesFromInbox(inbox, results)); + } + } catch (error) { + console.error("Error getting last messages from inbox:", error); + } + }; + +export const submitRequestRegistrationCode = + ( + identity_permissions: string, + code_type = "profile", + setupDetailsState: SetupDetailsState + ) => + async (dispatch: AppDispatch) => { + try { + // TODO: refactor the profile name to be a constant + // maybe we should add ShinkaiName and InboxName to the wasm library (just ADDED them this needs refactor) + let sender_profile_name = + setupDetailsState.profile + + "/device/" + + setupDetailsState.registration_name; + console.log("sender_profile_name:", sender_profile_name); + console.log("identity_permissions:", identity_permissions); + console.log("code_type:", code_type); + + const messageStr = ShinkaiMessageBuilderWrapper.request_code_registration( + setupDetailsState.my_device_encryption_sk, + setupDetailsState.my_device_identity_sk, + setupDetailsState.node_encryption_pk, + identity_permissions, + code_type, + sender_profile_name, + setupDetailsState.shinkai_identity + ); + + const message = JSON.parse(messageStr); + console.log("Message:", message); + + const apiEndpoint = ApiConfig.getInstance().getEndpoint(); + const response = await axios.post( + `${apiEndpoint}/v1/create_registration_code`, + message + ); + + handleHttpError(response); + dispatch(createRegistrationCode(response.data.code)); + } catch (error) { + console.error("Error creating registration code:", error); + } + }; + +export const submitRegistrationCode = + (setupData: MergedSetupType): AppThunk => + async (dispatch: AppDispatch) => { + try { + const messageStr = + ShinkaiMessageBuilderWrapper.use_code_registration_for_device( + setupData.my_device_encryption_sk, + setupData.my_device_identity_sk, + setupData.profile_encryption_sk, + setupData.profile_identity_sk, + setupData.node_encryption_pk, + setupData.registration_code, + setupData.identity_type, + setupData.permission_type, + setupData.registration_name, + "", // sender_profile_name: it doesn't exist yet in the Node + setupData.shinkai_identity + ); + + const message = JSON.parse(messageStr); + console.log( + "submitRegistrationCode registration_name: ", + setupData.registration_name + ); + console.log( + "submitRegistrationCode identity_type: ", + setupData.identity_type + ); + console.log( + "submitRegistrationCode permission_type: ", + setupData.permission_type + ); + console.log("submitRegistrationCode Message:", message); + + // Use node_address from setupData for API endpoint + let response = await axios.post( + `${setupData.node_address}/v1/use_registration_code`, + message + ); + + handleHttpError(response); + + // Update the API_ENDPOINT after successful registration + ApiConfig.getInstance().setEndpoint(setupData.node_address); + + dispatch(useRegistrationCode(setupData)); + + return true; + } catch (error) { + console.log("Error using registration code:", error); + if (error instanceof Error) { + dispatch(registrationError(error.message)); + } + return false; + } + }; + +export const pingAllNodes = () => async (dispatch: AppDispatch) => { + const apiEndpoint = ApiConfig.getInstance().getEndpoint(); + try { + const response = await axios.post(`${apiEndpoint}/ping_all`); + handleHttpError(response); + dispatch(pingAll(response.data.result)); + } catch (error) { + console.error("Error pinging all nodes:", error); + } +}; + +export const createJob = async ( + scope: any, + sender: string, + receiver: string, + receiver_subidentity: string, + setupDetailsState: SetupDetailsState +) => { + try { + const messageStr = ShinkaiMessageBuilderWrapper.job_creation( + setupDetailsState.profile_encryption_sk, + setupDetailsState.profile_identity_sk, + setupDetailsState.node_encryption_pk, + scope, + sender, + receiver, + receiver_subidentity + ); + + const message = JSON.parse(messageStr); + + const apiEndpoint = ApiConfig.getInstance().getEndpoint(); + const response = await axios.post(`${apiEndpoint}/v1/create_job`, message); + handleHttpError(response); + console.log("createJob Response:", response.data); + const jobId = response.data; + return jobId; + } catch (error) { + console.error("Error creating job:", error); + } +}; + +export const sendMessageToJob = + ( + jobId: string, + content: string, + sender: string, + receiver: string, + receiver_subidentity: string, + setupDetailsState: SetupDetailsState + ) => + async (dispatch: AppDispatch) => { + try { + const messageStr = ShinkaiMessageBuilderWrapper.job_message( + jobId, + content, + setupDetailsState.profile_encryption_sk, + setupDetailsState.profile_identity_sk, + setupDetailsState.node_encryption_pk, + sender, + receiver, + receiver_subidentity + ); + + const message = JSON.parse(messageStr); + // console.log("Message:", message); + + const apiEndpoint = ApiConfig.getInstance().getEndpoint(); + const response = await axios.post( + `${apiEndpoint}/v1/job_message`, + message + ); + + handleHttpError(response); + dispatch(response.data); + } catch (error) { + console.error("Error sending message to job:", error); + } + }; + +export const getProfileAgents = + ( + sender: string, + sender_subidentity: string, + receiver: string, + setupDetailsState: SetupDetailsState + ) => + async (dispatch: AppDispatch) => { + try { + const messageStr = ShinkaiMessageBuilderWrapper.get_profile_agents( + setupDetailsState.my_device_encryption_sk, + setupDetailsState.my_device_identity_sk, + setupDetailsState.node_encryption_pk, + sender, + sender_subidentity, + receiver + ); + + const message = JSON.parse(messageStr); + // console.log("Message:", message); + + const apiEndpoint = ApiConfig.getInstance().getEndpoint(); + const response = await axios.post( + `${apiEndpoint}/v1/available_agents`, + message + ); + + console.log("getProfileAgents Response:", response.data); + handleHttpError(response); + dispatch(addAgents(response.data)); + return response.data; + } catch (error) { + console.error("Error sending message to job:", error); + } + }; + +export const addAgent = async ( + sender_subidentity: string, + node_name: string, + agent: SerializedAgent, + setupDetailsState: SetupDetailsState +) => { + try { + let agent_wrapped = SerializedAgentWrapper.fromSerializedAgent(agent); + const messageStr = ShinkaiMessageBuilderWrapper.request_add_agent( + setupDetailsState.profile_encryption_sk, + setupDetailsState.profile_identity_sk, + setupDetailsState.node_encryption_pk, + node_name + "/" + sender_subidentity, + "", + node_name, + agent_wrapped + ); + + const message = JSON.parse(messageStr); + // console.log("Message:", message); + + const apiEndpoint = ApiConfig.getInstance().getEndpoint(); + const response = await axios.post(`${apiEndpoint}/v1/add_agent`, message); + + console.log("addAgent Response:", response.data); + handleHttpError(response); + return response.data; + } catch (error) { + console.error("Error sending message to add agent:", error); + } +}; diff --git a/shinkai-app/src/components/ExploreContainer.css b/shinkai-app/src/components/ExploreContainer.css new file mode 100644 index 000000000..c2c47cfa2 --- /dev/null +++ b/shinkai-app/src/components/ExploreContainer.css @@ -0,0 +1,24 @@ +#container { + text-align: center; + position: absolute; + left: 0; + right: 0; + top: 50%; + transform: translateY(-50%); +} + +#container strong { + font-size: 20px; + line-height: 26px; +} + +#container p { + font-size: 16px; + line-height: 22px; + color: #8c8c8c; + margin: 0; +} + +#container a { + text-decoration: none; +} \ No newline at end of file diff --git a/shinkai-app/src/components/ExploreContainer.tsx b/shinkai-app/src/components/ExploreContainer.tsx new file mode 100644 index 000000000..1b68a3c19 --- /dev/null +++ b/shinkai-app/src/components/ExploreContainer.tsx @@ -0,0 +1,14 @@ +import './ExploreContainer.css'; + +interface ContainerProps { } + +const ExploreContainer: React.FC = () => { + return ( +

+ ); +}; + +export default ExploreContainer; diff --git a/shinkai-app/src/components/ui/Avatar.tsx b/shinkai-app/src/components/ui/Avatar.tsx new file mode 100644 index 000000000..762f27127 --- /dev/null +++ b/shinkai-app/src/components/ui/Avatar.tsx @@ -0,0 +1,25 @@ +import { IonAvatar } from "@ionic/react"; +import { cn } from "../../theme/lib/utils"; + +export default function Avatar({ + url, + className, +}: { + url?: string; + className?: string; +}) { + return ( + + + + ); +} diff --git a/shinkai-app/src/components/ui/Button.css b/shinkai-app/src/components/ui/Button.css new file mode 100644 index 000000000..15f4106ab --- /dev/null +++ b/shinkai-app/src/components/ui/Button.css @@ -0,0 +1,42 @@ +.ion-button-custom { + @apply h-[50px] capitalize font-bold; + + &.variant-primary { + --box-shadow: none; + --background: theme("colors.brand.400"); + --color: white; + --ripple-color: theme("colors.brand.600"); + @media (prefers-color-scheme: dark) { + --color: theme("colors.white"); + } + } + &.variant-secondary { + --box-shadow: none; + --background: transparent; + --background-hover: theme("colors.slate.400"); + --background-activated: theme("colors.slate.50"); + --background-focused: theme("colors.slate.50"); + --color: theme("colors.slate.800"); + --border-color: theme("colors.slate.300"); + --border-style: solid; + --border-width: 1px; + --ripple-color: theme("colors.slate.200/50"); + @media (prefers-color-scheme: dark) { + --background-hover: theme("colors.slate.50"); + --color: theme("colors.white"); + --ripple-color: theme("colors.white/50"); + } + } + &.variant-tertiary { + --box-shadow: none; + --background: transparent; + --background-hover: theme("colors.slate.50"); + --background-activated: theme("colors.slate.50"); + --background-focused: theme("colors.slate.50"); + --color: theme("colors.slate.800"); + --ripple-color: theme("colors.white/50"); + @media (prefers-color-scheme: dark) { + --color: theme("colors.white"); + } + } +} diff --git a/shinkai-app/src/components/ui/Button.tsx b/shinkai-app/src/components/ui/Button.tsx new file mode 100644 index 000000000..48f1b9a7b --- /dev/null +++ b/shinkai-app/src/components/ui/Button.tsx @@ -0,0 +1,33 @@ +import React from "react"; +import { IonButton } from "@ionic/react"; +import { cn } from "../../theme/lib/utils"; +import "./Button.css"; + +export default function Button({ + onClick, + disabled, + children, + className, + variant = "primary", +}: { + onClick: () => void; + disabled?: boolean; + children: React.ReactNode; + className?: string; + variant?: "primary" | "secondary" | "tertiary"; +}) { + return ( + + {children} + + ); +} diff --git a/shinkai-app/src/components/ui/Input.css b/shinkai-app/src/components/ui/Input.css new file mode 100644 index 000000000..122390e96 --- /dev/null +++ b/shinkai-app/src/components/ui/Input.css @@ -0,0 +1,26 @@ +.ion-input-item-custom { + @apply h-[44px]; + --background: theme("colors.slate.100"); + --color: theme("colors.slate.900"); + --border-color: theme("colors.slate.100"); + --background-focused: transparent; + --border-width: 1px; + @media (prefers-color-scheme: dark) { + --background: theme("colors.slate.900"); + --color: theme("colors.slate.800"); + --border-color: theme("colors.slate.900"); + } + &::part(native) { + height: 100%; + } +} +.native-input { + --highlight-color-focused: theme("colors.slate.900"); + --placeholder-color: theme("colors.slate.800"); + --color: theme("colors.slate.900"); + @media (prefers-color-scheme: dark) { + --highlight-color-focused: theme("colors.white"); + --placeholder-color: theme("colors.slate.300"); + --color: theme("colors.white"); + } +} diff --git a/shinkai-app/src/components/ui/Input.tsx b/shinkai-app/src/components/ui/Input.tsx new file mode 100644 index 000000000..7b6337526 --- /dev/null +++ b/shinkai-app/src/components/ui/Input.tsx @@ -0,0 +1,37 @@ +import { InputCustomEvent } from "@ionic/core/dist/types/components/input/input-interface"; +import { InputChangeEventDetail, IonInput, IonItem } from "@ionic/react"; +import { cn } from "../../theme/lib/utils"; +import React from "react"; +import "./Input.css"; + +export default function Input({ + onChange, + value, + label, + className, +}: { + onChange: (event: InputCustomEvent) => void; + value: string; + label: string; + className?: string; +}) { + return ( + + + + ); +} diff --git a/shinkai-app/src/components/ui/Layout.css b/shinkai-app/src/components/ui/Layout.css new file mode 100644 index 000000000..bfab83ed6 --- /dev/null +++ b/shinkai-app/src/components/ui/Layout.css @@ -0,0 +1,19 @@ +.ion-header-custom { + --background: theme("colors.slate.900"); + --color: white; + @apply min-h-[60px] md:min-h-[100px]; + @apply flex items-center; + @media (prefers-color-scheme: dark) { + --color: theme("colors.slate.200"); + } +} + +.ion-content-custom { + --background: theme("colors.slate.900"); +} +.ion-toolbar-custom { + --background: theme("colors.white"); + @media (prefers-color-scheme: dark) { + --background: theme("colors.slate.900"); + } +} diff --git a/shinkai-app/src/components/ui/Layout.tsx b/shinkai-app/src/components/ui/Layout.tsx new file mode 100644 index 000000000..91942de65 --- /dev/null +++ b/shinkai-app/src/components/ui/Layout.tsx @@ -0,0 +1,53 @@ +import React from "react"; +import { + IonBackButton, + IonButtons, + IonContent, + IonFooter, + IonHeader, + IonTitle, + IonToolbar, +} from "@ionic/react"; +import "./Layout.css"; + +export const IonHeaderCustom = ({ + children, +}: { + children: React.ReactNode; +}) => { + return ( + + + {children} + + + ); +}; +export const IonContentCustom = ({ + children, +}: { + children: React.ReactNode; +}) => { + return ( + +
{children}
+
+ ); +}; + +export const IonFooterCustom = ({ + children, +}: { + children: React.ReactNode; +}) => { + return ( + + + {children} + + + ); +}; diff --git a/shinkai-app/src/features/chat/chatSlice.ts b/shinkai-app/src/features/chat/chatSlice.ts new file mode 100644 index 000000000..5f860122e --- /dev/null +++ b/shinkai-app/src/features/chat/chatSlice.ts @@ -0,0 +1,27 @@ +// src/features/chat/chatSlice.ts +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { RootState } from '../../store/main'; + +interface ChatState { + messages: any[]; // Replace any with the type of your messages +} + +const initialState: ChatState = { + messages: [], +}; + +export const chatSlice = createSlice({ + name: 'chat', + initialState, + reducers: { + addMessage: (state, action: PayloadAction) => { // Replace any with the type of your messages + state.messages.push(action.payload); + }, + }, +}); + +export const { addMessage } = chatSlice.actions; + +export const selectMessages = (state: RootState) => state.chat.messages; + +export default chatSlice.reducer; diff --git a/shinkai-app/src/hooks/usetSetup.ts b/shinkai-app/src/hooks/usetSetup.ts new file mode 100644 index 000000000..21afda9ce --- /dev/null +++ b/shinkai-app/src/hooks/usetSetup.ts @@ -0,0 +1,14 @@ +// hooks/useSetup.ts +import { useEffect } from "react"; +import { useSelector } from "react-redux"; +import { RootState } from "../store"; +import { ApiConfig } from "../api/api_config"; + +export const useSetup = () => { + const { setupDetailsState } = useSelector((state: RootState) => state); + + useEffect(() => { + console.log("Redux State:", setupDetailsState); + ApiConfig.getInstance().setEndpoint(setupDetailsState.node_address); + }, [setupDetailsState]); +}; \ No newline at end of file diff --git a/shinkai-app/src/lib/wasm/InboxNameWrapper.test.ts b/shinkai-app/src/lib/wasm/InboxNameWrapper.test.ts new file mode 100644 index 000000000..a9e9fb966 --- /dev/null +++ b/shinkai-app/src/lib/wasm/InboxNameWrapper.test.ts @@ -0,0 +1,88 @@ +import { InboxNameWrapper } from "./InboxNameWrapper"; +import { test } from "vitest"; + +test("InboxNameWrapper", () => { + const validNames = [ + "inbox::@@node.shinkai::true", + "inbox::@@node1.shinkai/subidentity::false", + "inbox::@@alice.shinkai/profileName/agent/myChatGPTAgent::true", + "inbox::@@alice.shinkai/profileName/device/myPhone::true", + "inbox::@@node1.shinkai/subidentity::@@node2.shinkai/subidentity2::false", + "inbox::@@node1.shinkai/subidentity::@@node2.shinkai/subidentity::@@node3.shinkai/subidentity2::false", + ]; + + const invalidNames = [ + "@@node1.shinkai::false", + "inbox::@@node1.shinkai::falsee", + "@@node1.shinkai", + "inbox::@@node1.shinkai", + "inbox::node1::false", + "inbox::node1.shinkai::false", + "inbox::@@node1::false", + "inbox::@@node1.shinkai//subidentity::@@node2.shinkai::false", + "inbox::@@node1/subidentity::false", + ]; + + for (const name of validNames) { + const wrapper = new InboxNameWrapper(name); + expect(wrapper.get_value).toBe(name.toLowerCase()); + } + + for (const name of invalidNames) { + expect(() => new InboxNameWrapper(name)).toThrow(); + } +}); + +test("InboxNameWrapper get_identities", () => { + const namesWithIdentities = [ + { + name: "inbox::@@alice.shinkai/profileName::true", + identity: "@@alice.shinkai/profileName", + }, + { + name: "inbox::@@alice.shinkai/profileName/agent/myChatGPTAgent::true", + identity: "@@alice.shinkai/profilename/agent/mychatgptagent", + }, + { + name: "inbox::@@alice.shinkai/profileName/device/myPhone::true", + identity: "@@alice.shinkai/profilename/device/myphone", + }, + ]; + + for (const { name, identity } of namesWithIdentities) { + const wrapper = new InboxNameWrapper(name); + expect(wrapper.get_identities).toStrictEqual([identity.toLowerCase()]); + } +}); + +test("InboxNameWrapper get_regular_inbox_name_from_params", () => { + const params = [ + { + sender: "@@alice.shinkai", + sender_subidentity: "profileName", + recipient: "@@bob.shinkai", + recipient_subidentity: "profileName", + is_e2e: true, + expected: "inbox::@@alice.shinkai/profilename::@@bob.shinkai/profilename::true", + }, + ]; + + for (const { sender, sender_subidentity, recipient, recipient_subidentity, is_e2e, expected } of params) { + const wrapper = InboxNameWrapper.get_regular_inbox_name_from_params(sender, sender_subidentity, recipient, recipient_subidentity, is_e2e); + expect(wrapper.get_value).toBe(expected.toLowerCase()); + } +}); + +test("InboxNameWrapper get_job_inbox_name_from_params", () => { + const params = [ + { + unique_id: "123", + expected: "job_inbox::123::false", + }, + ]; + + for (const { unique_id, expected } of params) { + const wrapper = InboxNameWrapper.get_job_inbox_name_from_params(unique_id); + expect(wrapper.get_value).toBe(expected.toLowerCase()); + } +}); \ No newline at end of file diff --git a/shinkai-app/src/lib/wasm/InboxNameWrapper.ts b/shinkai-app/src/lib/wasm/InboxNameWrapper.ts new file mode 100644 index 000000000..46a10c18a --- /dev/null +++ b/shinkai-app/src/lib/wasm/InboxNameWrapper.ts @@ -0,0 +1,51 @@ +import { InboxNameWrapper as InboxNameWrapperWASM } from "../../pkg/shinkai_message_wasm.js"; + +export class InboxNameWrapper { + private wasmWrapper: InboxNameWrapperWASM; + + constructor(inbox_name_js: any) { + this.wasmWrapper = new InboxNameWrapperWASM(inbox_name_js); + } + + free(): void { + this.wasmWrapper.free(); + } + + to_jsvalue(): any { + return this.wasmWrapper.to_jsvalue(); + } + + to_json_str(): string { + return this.wasmWrapper.to_json_str(); + } + + static get_regular_inbox_name_from_params(sender: string, sender_subidentity: string, recipient: string, recipient_subidentity: string, is_e2e: boolean): InboxNameWrapper { + const wasmWrapper = InboxNameWrapperWASM.get_regular_inbox_name_from_params(sender, sender_subidentity, recipient, recipient_subidentity, is_e2e); + return new InboxNameWrapper(wasmWrapper.get_value); + } + + static get_job_inbox_name_from_params(unique_id: string): InboxNameWrapper { + const wasmWrapper = InboxNameWrapperWASM.get_job_inbox_name_from_params(unique_id); + return new InboxNameWrapper(wasmWrapper.get_value); + } + + get get_identities(): any { + return this.wasmWrapper.get_identities; + } + + get get_is_e2e(): boolean { + return this.wasmWrapper.get_is_e2e; + } + + get get_unique_id(): any { + return this.wasmWrapper.get_unique_id; + } + + get get_value(): any { + return this.wasmWrapper.get_value; + } + + get to_string(): any { + return this.wasmWrapper.to_string; + } +} \ No newline at end of file diff --git a/shinkai-app/src/lib/wasm/JobCreationWrapper.test.ts b/shinkai-app/src/lib/wasm/JobCreationWrapper.test.ts new file mode 100644 index 000000000..0e407c373 --- /dev/null +++ b/shinkai-app/src/lib/wasm/JobCreationWrapper.test.ts @@ -0,0 +1,45 @@ +import { JobCreationWrapper } from './JobCreationWrapper'; + +const jobCreationJson = `{ + "scope": { + "buckets": ["inbox::@@node.shinkai::true", "job_inbox::my_job::false"], + "documents": ["doc1", "doc2"] + } +}`; + +describe('JobCreationWrapper', () => { +// it('should correctly convert from and to JSON string', () => { +// const wrapper = JobCreationWrapper.from_json_str(jobCreationJson); +// const jsonString = wrapper.to_json_str(); + +// expect(JSON.parse(jsonString)).toEqual(JSON.parse(jobCreationJson)); +// }); + +// it('should correctly convert from and to JsValue string', () => { +// let jobCreation = JSON.parse(jobCreationJson); +// const wrapper = JobCreationWrapper.from_jsvalue(jobCreation); +// const jsonString = wrapper.to_json_str(); + +// expect(JSON.parse(jsonString)).toEqual(JSON.parse(jobCreationJson)); +// }); + +// it('should correctly instantiate it from a JobCreation Typescript object', () => { +// let jobCreation: any = JSON.parse(jobCreationJson); +// const wrapper = JobCreationWrapper.from_jsvalue(jobCreation); +// const jsonString = wrapper.to_json_str(); + +// expect(JSON.parse(jsonString)).toEqual(JSON.parse(jobCreationJson)); +// }); + + it('should correctly instantiate an empty JobCreationWrapper', () => { + const wrapper = JobCreationWrapper.empty(); + const jsonString = wrapper.to_json_str(); + + expect(JSON.parse(jsonString)).toEqual({ + scope: { + buckets: [], + documents: [] + } + }); + }); +}); \ No newline at end of file diff --git a/shinkai-app/src/lib/wasm/JobCreationWrapper.ts b/shinkai-app/src/lib/wasm/JobCreationWrapper.ts new file mode 100644 index 000000000..8ae099f07 --- /dev/null +++ b/shinkai-app/src/lib/wasm/JobCreationWrapper.ts @@ -0,0 +1,38 @@ +import { JobCreationWrapper as JobCreationWrapperWASM } from "../../pkg/shinkai_message_wasm.js"; + +export class JobCreationWrapper { + private wasmWrapper: JobCreationWrapperWASM; + + constructor(scope_js: any) { + this.wasmWrapper = new JobCreationWrapperWASM(scope_js); + } + + to_jsvalue(): any { + return this.wasmWrapper.to_jsvalue(); + } + + to_json_str(): string { + return this.wasmWrapper.to_json_str(); + } + + static from_json_str(s: string): JobCreationWrapper { + let js_value = JSON.parse(s); + return new JobCreationWrapper(js_value.scope); + } + + static from_jsvalue(js_value: any): JobCreationWrapper { + return new JobCreationWrapper(js_value.scope); + } + + static empty(): JobCreationWrapper { + return new JobCreationWrapper(JobCreationWrapperWASM.empty().get_scope); + } + + free(): void { + this.wasmWrapper.free(); + } + + get get_scope(): any { + return this.wasmWrapper.get_scope; + } +} \ No newline at end of file diff --git a/shinkai-app/src/lib/wasm/JobMessageWrapper.ts b/shinkai-app/src/lib/wasm/JobMessageWrapper.ts new file mode 100644 index 000000000..c599a2ec1 --- /dev/null +++ b/shinkai-app/src/lib/wasm/JobMessageWrapper.ts @@ -0,0 +1,34 @@ +import { JobMessageWrapper as JobMessageWrapperWASM } from "../../pkg/shinkai_message_wasm.js"; + +export class JobMessageWrapper { + private wasmWrapper: JobMessageWrapperWASM; + + constructor(job_id_js: any, content_js: any) { + this.wasmWrapper = new JobMessageWrapperWASM(job_id_js, content_js); + } + + to_jsvalue(): any { + return this.wasmWrapper.to_jsvalue(); + } + + to_json_str(): string { + return this.wasmWrapper.to_json_str(); + } + + static from_json_str(s: string): JobMessageWrapper { + let js_value = JSON.parse(s); + return new JobMessageWrapper(js_value.job_id_js, js_value.content_js); + } + + static from_jsvalue(js_value: any): JobMessageWrapper { + return new JobMessageWrapper(js_value.job_id_js, js_value.content_js); + } + + static fromStrings(job_id: string, content: string): JobMessageWrapper { + return new JobMessageWrapper(job_id, content); + } + + free(): void { + this.wasmWrapper.free(); + } +} diff --git a/shinkai-app/src/lib/wasm/JobScopeWrapper.ts b/shinkai-app/src/lib/wasm/JobScopeWrapper.ts new file mode 100644 index 000000000..71fa5fbbd --- /dev/null +++ b/shinkai-app/src/lib/wasm/JobScopeWrapper.ts @@ -0,0 +1,34 @@ +import { JobScopeWrapper as JobScopeWrapperWASM } from "../../pkg/shinkai_message_wasm.js"; + +export class JobScopeWrapper { + private wasmWrapper: JobScopeWrapperWASM; + + constructor(buckets_js: any, documents_js: any) { + this.wasmWrapper = new JobScopeWrapperWASM(buckets_js, documents_js); + } + + to_jsvalue(): any { + return this.wasmWrapper.to_jsvalue(); + } + + to_json_str(): string { + return this.wasmWrapper.to_json_str(); + } + + static from_json_str(s: string): JobScopeWrapper { + let js_value = JSON.parse(s); + return new JobScopeWrapper(js_value.buckets_js, js_value.documents_js); + } + + static from_jsvalue(js_value: any): JobScopeWrapper { + return new JobScopeWrapper(js_value.buckets_js, js_value.documents_js); + } + + static empty(): JobScopeWrapper { + return new JobScopeWrapper({}, {}); + } + + free(): void { + this.wasmWrapper.free(); + } +} \ No newline at end of file diff --git a/shinkai-app/src/lib/wasm/SerializedAgentWrapper.test.ts b/shinkai-app/src/lib/wasm/SerializedAgentWrapper.test.ts new file mode 100644 index 000000000..4ade796e1 --- /dev/null +++ b/shinkai-app/src/lib/wasm/SerializedAgentWrapper.test.ts @@ -0,0 +1,75 @@ +import { test } from "vitest"; +import { SerializedAgentWrapper } from "./SerializedAgentWrapper"; +import { ShinkaiNameWrapper } from "./ShinkaiNameWrapper"; +import { SerializedAgent } from "../../models/SchemaTypes"; + +test("SerializedAgentWrapper conversion", async () => { + // Create a SerializedAgentWrapper using fromStrings + const serializedAgentWrapper = SerializedAgentWrapper.fromStrings( + "test_agent", + "@@node.shinkai/main/agent/test_agent", + "false", + "http://example.com", + "123456", + "openai:chatgpt3-turbo", + "permission1,permission2", + "bucket1,bucket2", + "sender1,sender2" + ); + + // Get the inner SerializedAgent + const agent = serializedAgentWrapper.inner; + + // Create a ShinkaiNameWrapper from the full_identity_name + const fullIdentityNameWrapper = new ShinkaiNameWrapper( + agent.full_identity_name.full_name + ); + + // Check that the fields are correctly converted + expect(agent.id).toBe("test_agent"); + expect(fullIdentityNameWrapper.get_full_name).toBe("@@node.shinkai/main/agent/test_agent") + expect(agent.perform_locally).toBe(false); + expect(agent.external_url).toBe("http://example.com"); + expect(agent.api_key).toBe("123456"); + expect(agent.model.openai.model_type).toBe("chatgpt3-turbo"); + expect(agent.toolkit_permissions).toEqual(["permission1", "permission2"]); + expect(agent.storage_bucket_permissions).toEqual(["bucket1", "bucket2"]); + expect(agent.allowed_message_senders).toEqual(["sender1", "sender2"]); +}); + +test("SerializedAgent to SerializedAgentWrapper conversion", async () => { + // Create a SerializedAgent + const serializedAgent: SerializedAgent = { + id: "test_agent", + full_identity_name: "@@node.shinkai/main/agent/test_agent", + perform_locally: false, + external_url: "http://example.com", + api_key: "123456", + model: { OpenAI: { model_type: "chatgpt3-turbo" } }, + toolkit_permissions: ["permission1", "permission2"], + storage_bucket_permissions: ["bucket1", "bucket2"], + allowed_message_senders: ["sender1", "sender2"] + }; + + // Convert the SerializedAgent to a SerializedAgentWrapper + const serializedAgentWrapper = SerializedAgentWrapper.fromSerializedAgent(serializedAgent); + + // Get the inner SerializedAgent + const agent = serializedAgentWrapper.inner; + + // Create a ShinkaiNameWrapper from the full_identity_name + const fullIdentityNameWrapper = new ShinkaiNameWrapper( + agent.full_identity_name.full_name + ); + + // Check that the fields are correctly converted + expect(agent.id).toBe("test_agent"); + expect(fullIdentityNameWrapper.get_full_name).toBe("@@node.shinkai/main/agent/test_agent") + expect(agent.perform_locally).toBe(false); + expect(agent.external_url).toBe("http://example.com"); + expect(agent.api_key).toBe("123456"); + expect(agent.model.openai.model_type).toBe("chatgpt3-turbo"); + expect(agent.toolkit_permissions).toEqual(["permission1", "permission2"]); + expect(agent.storage_bucket_permissions).toEqual(["bucket1", "bucket2"]); + expect(agent.allowed_message_senders).toEqual(["sender1", "sender2"]); +}); \ No newline at end of file diff --git a/shinkai-app/src/lib/wasm/SerializedAgentWrapper.ts b/shinkai-app/src/lib/wasm/SerializedAgentWrapper.ts new file mode 100644 index 000000000..d8fbfa8ec --- /dev/null +++ b/shinkai-app/src/lib/wasm/SerializedAgentWrapper.ts @@ -0,0 +1,97 @@ +import { SerializedAgent } from "../../models/SchemaTypes.js"; +import { SerializedAgentWrapper as SerializedAgentWrapperWASM } from "../../pkg/shinkai_message_wasm.js"; + +export class SerializedAgentWrapper { + private wasmWrapper: SerializedAgentWrapperWASM; + + constructor(serialized_agent_js: any) { + this.wasmWrapper = new SerializedAgentWrapperWASM(serialized_agent_js); + } + + free(): void { + this.wasmWrapper.free(); + } + + to_jsvalue(): any { + return this.wasmWrapper.to_jsvalue(); + } + + to_json_str(): string { + return this.wasmWrapper.to_json_str(); + } + + static fromSerializedAgent(agent: SerializedAgent): SerializedAgentWrapper { + let modelStr = ""; + if (agent.model && agent.model.OpenAI && agent.model.OpenAI.model_type) { + modelStr = "openai:" + agent.model.OpenAI.model_type; + } else if (agent.model && agent.model.SleepAPI) { + modelStr = "sleep"; + } else { + throw new Error("Invalid model: " + JSON.stringify(agent.model)); + } + const toolkitPermissionsStr = + agent.toolkit_permissions.length > 0 + ? agent.toolkit_permissions.join(",") + : ""; + const storageBucketPermissionsStr = + agent.storage_bucket_permissions.length > 0 + ? agent.storage_bucket_permissions.join(",") + : ""; + const allowedMessageSendersStr = + agent.allowed_message_senders.length > 0 + ? agent.allowed_message_senders.join(",") + : ""; + + const wasmWrapper = SerializedAgentWrapperWASM.fromStrings( + agent.id, + agent.full_identity_name, + agent.perform_locally.toString(), + agent.external_url || "", + agent.api_key || "", + modelStr, + toolkitPermissionsStr, + storageBucketPermissionsStr, + allowedMessageSendersStr + ); + return new SerializedAgentWrapper(wasmWrapper.to_jsvalue()); + } + + static fromStrings( + id: string, + full_identity_name: string, + perform_locally: string, + external_url: string, + api_key: string, + model: string, + toolkit_permissions: string, + storage_bucket_permissions: string, + allowed_message_senders: string + ): SerializedAgentWrapper { + const wasmWrapper = SerializedAgentWrapperWASM.fromStrings( + id, + full_identity_name, + perform_locally, + external_url, + api_key, + model, + toolkit_permissions, + storage_bucket_permissions, + allowed_message_senders + ); + return new SerializedAgentWrapper(wasmWrapper.to_jsvalue()); + } + + static fromJsValue(j: any): SerializedAgentWrapper { + const wasmWrapper = SerializedAgentWrapperWASM.fromJsValue(j); + return new SerializedAgentWrapper(wasmWrapper.to_jsvalue()); + } + + static from_json_str(s: string): SerializedAgentWrapper { + const wasmWrapper = SerializedAgentWrapperWASM.from_json_str(s); + return new SerializedAgentWrapper(wasmWrapper.to_jsvalue()); + } + + get inner(): any { + return this.wasmWrapper.inner; + } +} diff --git a/shinkai-app/src/lib/wasm/ShinkaiMessageBuilderWrapper.test.ts b/shinkai-app/src/lib/wasm/ShinkaiMessageBuilderWrapper.test.ts new file mode 100644 index 000000000..5825787c3 --- /dev/null +++ b/shinkai-app/src/lib/wasm/ShinkaiMessageBuilderWrapper.test.ts @@ -0,0 +1,185 @@ +import { test } from "vitest"; +import { ShinkaiMessageBuilderWrapper } from "./ShinkaiMessageBuilderWrapper"; +import { sha512 } from "@noble/hashes/sha512"; +import { generateKeyPair } from "curve25519-js"; +import * as ed from "@noble/ed25519"; +import { + EncryptionMethod, + MessageSchemaType, +} from "../../models/SchemaTypes"; +import { toHexString } from "../../utils/wasm_helpers"; + +// Enable synchronous methods +ed.etc.sha512Sync = (...m) => sha512(ed.etc.concatBytes(...m)); + +const { Crypto } = require("@peculiar/webcrypto"); +const crypto = new Crypto(); +globalThis.crypto = crypto; + +const generateKeys = async () => { + const seed = new Uint8Array(32); + let encryptionKeys = generateKeyPair(seed); + let my_encryption_sk_string = toHexString( + new Uint8Array(encryptionKeys.private) + ); + let my_encryption_pk_string = toHexString( + new Uint8Array(encryptionKeys.public) + ); + + const privKey = ed.utils.randomPrivateKey(); // Secure random private key + const pubKey = await ed.getPublicKeyAsync(privKey); + + let my_identity_sk_string = toHexString(new Uint8Array(privKey)); + let my_identity_pk_string = toHexString(new Uint8Array(pubKey)); + + let receiver_public_key_string = my_encryption_pk_string; + + return { + my_encryption_sk_string, + my_encryption_pk_string, + my_identity_sk_string, + my_identity_pk_string, + receiver_public_key_string, + }; +}; + +test("ShinkaiMessageBuilderWrapper should construct correctly and create a new ack message", async () => { + const keys = await generateKeys(); + + const messageBuilder = new ShinkaiMessageBuilderWrapper( + keys.my_encryption_sk_string, + keys.my_identity_sk_string, + keys.receiver_public_key_string + ); + + expect(messageBuilder).toBeTruthy(); + expect(messageBuilder).toBeInstanceOf(ShinkaiMessageBuilderWrapper); + + const sender = "@@sender_node.shinkai"; + const receiver = "@@receiver_node.shinkai"; + + const ackMessage = ShinkaiMessageBuilderWrapper.ack_message( + keys.my_encryption_sk_string, + keys.my_identity_sk_string, + keys.receiver_public_key_string, + sender, + receiver + ); + + expect(ackMessage).toBeTruthy(); + expect(typeof ackMessage).toBe("string"); +}); + +test("ShinkaiMessageBuilderWrapper should set body content correctly", async () => { + const keys = await generateKeys(); + + const messageBuilder = new ShinkaiMessageBuilderWrapper( + keys.my_encryption_sk_string, + keys.my_identity_sk_string, + keys.receiver_public_key_string + ); + + // Pass the enum value directly + await messageBuilder.message_raw_content("Hello world!"); + await messageBuilder.body_encryption(EncryptionMethod.None); + await messageBuilder.message_schema_type(MessageSchemaType.TextContent); + await messageBuilder.internal_metadata( + "sender_user2", + "recipient_user1", + "", + "None" + ); + await messageBuilder.external_metadata_with_schedule( + "@@other_node.shinkai", + "@@my_node.shinkai", + "2023-07-02T20:53:34Z" + ); + + const message = messageBuilder.build_to_string(); + + expect(message).toContain("Hello world!"); +}); + +test("ShinkaiMessageBuilderWrapper should create a use code registration message", async () => { + const device_keys = await generateKeys(); + const profile_keys = await generateKeys(); + + const registrationCode = "sample_registration_code"; + const identityType = "profile"; + const permissionType = "admin"; + const registrationName = "sample_registration_name"; + const shinkaiIdentity = "@@my_node.shinkai"; + + const codeRegistrationMessage = + ShinkaiMessageBuilderWrapper.use_code_registration_for_device( + device_keys.my_encryption_sk_string, + device_keys.my_identity_sk_string, + profile_keys.my_encryption_sk_string, + profile_keys.my_identity_sk_string, + device_keys.receiver_public_key_string, + registrationCode, + identityType, + permissionType, + registrationName, + "", // sender_profile_name: it doesn't exist yet in the Node + shinkaiIdentity + ); + + expect(codeRegistrationMessage).toBeTruthy(); + expect(typeof codeRegistrationMessage).toBe("string"); +}); + +test("ShinkaiMessageBuilderWrapper should create a new request code registration message", async () => { + const keys = await generateKeys(); + + const messageBuilder = new ShinkaiMessageBuilderWrapper( + keys.my_encryption_sk_string, + keys.my_identity_sk_string, + keys.receiver_public_key_string + ); + + const permissionType = "admin"; + const codeType = "profile"; + const senderProfileName = "sample_sender_profile_name"; + const shinkaiIdentity = "@@my_node.shinkai"; + + const requestCodeRegistrationMessage = + ShinkaiMessageBuilderWrapper.request_code_registration( + keys.my_encryption_sk_string, + keys.my_identity_sk_string, + keys.receiver_public_key_string, + permissionType, + codeType, + senderProfileName, + shinkaiIdentity + ); + + expect(requestCodeRegistrationMessage).toBeTruthy(); + expect(typeof requestCodeRegistrationMessage).toBe("string"); +}); + +test("ShinkaiMessageBuilderWrapper should get last messages from inbox", async () => { + const keys = await generateKeys(); + + const inbox = "inbox::@@node.shinkai::true"; + const count = 10; + const offset = "offset_string"; + const senderProfileName = "sample_sender_profile_name"; + const shinkaiIdentity = "@@my_node.shinkai"; + + const lastMessages = + ShinkaiMessageBuilderWrapper.get_last_messages_from_inbox( + keys.my_encryption_sk_string, + keys.my_identity_sk_string, + keys.receiver_public_key_string, + inbox, + count, + offset, + shinkaiIdentity, + senderProfileName, + shinkaiIdentity + ); + + expect(lastMessages).toBeTruthy(); + expect(typeof lastMessages).toBe("string"); +}); diff --git a/shinkai-app/src/lib/wasm/ShinkaiMessageBuilderWrapper.ts b/shinkai-app/src/lib/wasm/ShinkaiMessageBuilderWrapper.ts new file mode 100644 index 000000000..ea616cbc3 --- /dev/null +++ b/shinkai-app/src/lib/wasm/ShinkaiMessageBuilderWrapper.ts @@ -0,0 +1,484 @@ +import { + EncryptionMethod, + ShinkaiMessageBuilderWrapper as ShinkaiMessageBuilderWrapperWASM, + ShinkaiMessageWrapper, +} from "../../pkg/shinkai_message_wasm.js"; +import { + MessageSchemaType, + SerializedAgent, + EncryptionMethod as TSEncryptionMethod, +} from "../../models/SchemaTypes.js"; +import { SerializedAgentWrapper } from "./SerializedAgentWrapper.js"; + +export class ShinkaiMessageBuilderWrapper { + private wasmBuilder: ShinkaiMessageBuilderWrapperWASM; + + constructor( + my_encryption_secret_key: string, + my_signature_secret_key: string, + receiver_public_key: string + ) { + this.wasmBuilder = new ShinkaiMessageBuilderWrapperWASM( + my_encryption_secret_key, + my_signature_secret_key, + receiver_public_key + ); + } + + body_encryption(encryption: TSEncryptionMethod): void { + this.wasmBuilder.body_encryption(encryption); + } + + no_body_encryption(): void { + this.wasmBuilder.no_body_encryption(); + } + + message_raw_content(content: string): void { + this.wasmBuilder.message_raw_content(content); + } + + message_schema_type(content: any): void { + this.wasmBuilder.message_schema_type(content); + } + + internal_metadata( + sender_subidentity: string, + recipient_subidentity: string, + inbox: string, + encryption: any + ): void { + this.wasmBuilder.internal_metadata( + sender_subidentity, + recipient_subidentity, + encryption + ); + } + + internal_metadata_with_schema( + sender_subidentity: string, + recipient_subidentity: string, + inbox: string, + message_schema: any, + encryption: any + ): void { + this.wasmBuilder.internal_metadata_with_schema( + sender_subidentity, + recipient_subidentity, + inbox, + message_schema, + encryption + ); + } + + empty_encrypted_internal_metadata(): void { + this.wasmBuilder.empty_encrypted_internal_metadata(); + } + + empty_non_encrypted_internal_metadata(): void { + this.wasmBuilder.empty_non_encrypted_internal_metadata(); + } + + external_metadata(recipient: string, sender: string): void { + this.wasmBuilder.external_metadata(recipient, sender); + } + + external_metadata_with_other( + recipient: string, + sender: string, + other: string + ): void { + this.wasmBuilder.external_metadata_with_other(recipient, sender, other); + } + + external_metadata_with_schedule( + recipient: string, + sender: string, + scheduled_time: string + ): void { + this.wasmBuilder.external_metadata_with_schedule( + recipient, + sender, + scheduled_time + ); + } + + build(): ShinkaiMessageWrapper { + const wasmWrapper = this.wasmBuilder.build(); + return ShinkaiMessageWrapper.fromJsValue(wasmWrapper.to_jsvalue()); + } + + build_to_jsvalue(): any { + return this.wasmBuilder.build_to_jsvalue(); + } + + build_to_string(): string { + return this.wasmBuilder.build_to_string(); + } + + static ack_message( + my_encryption_secret_key: string, + my_signature_secret_key: string, + receiver_public_key: string, + sender: string, + receiver: string + ): string { + return ShinkaiMessageBuilderWrapperWASM.ack_message( + my_encryption_secret_key, + my_signature_secret_key, + receiver_public_key, + sender, + receiver + ); + } + + static use_code_registration_for_profile( + profile_encryption_sk: string, + profile_signature_sk: string, + receiver_public_key: string, + code: string, + identity_type: string, + permission_type: string, + registration_name: string, + sender_profile_name: string, + receiver: string + ): string { + return ShinkaiMessageBuilderWrapperWASM.use_code_registration_for_profile( + profile_encryption_sk, + profile_signature_sk, + receiver_public_key, + code, + identity_type, + permission_type, + registration_name, + receiver, + sender_profile_name, + receiver, + "" + ); + } + + static use_code_registration_for_device( + my_device_encryption_sk: string, + my_device_signature_sk: string, + profile_encryption_sk: string, + profile_signature_sk: string, + receiver_public_key: string, + code: string, + identity_type: string, + permission_type: string, + registration_name: string, + sender_profile_name: string, + node_name: string + ): string { + return ShinkaiMessageBuilderWrapperWASM.use_code_registration_for_device( + my_device_encryption_sk, + my_device_signature_sk, + profile_encryption_sk, + profile_signature_sk, + receiver_public_key, + code, + identity_type, + permission_type, + registration_name, + node_name, + sender_profile_name, + node_name, + "" + ); + } + + static request_code_registration( + my_subidentity_encryption_sk: string, + my_subidentity_signature_sk: string, + receiver_public_key: string, + permission_type: string, + code_type: string, + sender_profile_name: string, + receiver: string + ): string { + return ShinkaiMessageBuilderWrapperWASM.request_code_registration( + my_subidentity_encryption_sk, + my_subidentity_signature_sk, + receiver_public_key, + permission_type, + code_type, + receiver, + sender_profile_name, + receiver, + "" + ); + } + + static ping_pong_message( + message: string, + my_encryption_secret_key: string, + my_signature_secret_key: string, + receiver_public_key: string, + sender: string, + receiver: string + ): string { + return ShinkaiMessageBuilderWrapperWASM.ping_pong_message( + message, + my_encryption_secret_key, + my_signature_secret_key, + receiver_public_key, + sender, + receiver + ); + } + + static get_all_inboxes_for_profile( + my_encryption_sk: string, + my_signature_sk: string, + receiver_public_key: string, + sender: string, + sender_subidentity: string, + receiver: string, + target_shinkai_name_profile: string + ): string { + const builder = new ShinkaiMessageBuilderWrapperWASM( + my_encryption_sk, + my_signature_sk, + receiver_public_key + ); + + builder.message_raw_content(target_shinkai_name_profile); + builder.message_schema_type(MessageSchemaType.TextContent.toString()); + builder.internal_metadata( + sender_subidentity, + "", + EncryptionMethod.None.toString() + ); + builder.external_metadata(receiver, sender); + builder.body_encryption( + EncryptionMethod.DiffieHellmanChaChaPoly1305.toString() + ); + + const message = builder.build_to_string(); + + return message; + } + + static get_last_messages_from_inbox( + my_subidentity_encryption_sk: string, + my_subidentity_signature_sk: string, + receiver_public_key: string, + inbox: string, + count: number, + offset: string | undefined, + sender: string, + sender_profile_name: string, + receiver: string + ): string { + return ShinkaiMessageBuilderWrapperWASM.get_last_messages_from_inbox( + my_subidentity_encryption_sk, + my_subidentity_signature_sk, + receiver_public_key, + inbox, + count, + offset, + sender, + sender_profile_name, + receiver, + "" + ); + } + + static job_creation( + my_encryption_secret_key: string, + my_signature_secret_key: string, + receiver_public_key: string, + scope: any, + sender: string, + receiver: string, + receiver_subidentity: string + ): string { + return ShinkaiMessageBuilderWrapperWASM.job_creation( + my_encryption_secret_key, + my_signature_secret_key, + receiver_public_key, + scope, + sender, + receiver, + receiver_subidentity + ); + } + + static job_message( + job_id: string, + content: string, + my_encryption_secret_key: string, + my_signature_secret_key: string, + receiver_public_key: string, + sender: string, + receiver: string, + receiver_subidentity: string + ): string { + return ShinkaiMessageBuilderWrapperWASM.job_message( + job_id, + content, + my_encryption_secret_key, + my_signature_secret_key, + receiver_public_key, + sender, + receiver, + receiver_subidentity + ); + } + + static terminate_message( + my_encryption_secret_key: string, + my_signature_secret_key: string, + receiver_public_key: string, + sender: string, + receiver: string + ): string { + return ShinkaiMessageBuilderWrapperWASM.terminate_message( + my_encryption_secret_key, + my_signature_secret_key, + receiver_public_key, + sender, + receiver + ); + } + + static error_message( + my_encryption_secret_key: string, + my_signature_secret_key: string, + receiver_public_key: string, + sender: string, + receiver: string, + error_msg: string + ): string { + return ShinkaiMessageBuilderWrapperWASM.error_message( + my_encryption_secret_key, + my_signature_secret_key, + receiver_public_key, + sender, + receiver, + error_msg + ); + } + + static request_add_agent( + my_encryption_secret_key: string, + my_signature_secret_key: string, + receiver_public_key: string, + sender: string, + sender_subidentity: string, + recipient: string, + agent: SerializedAgentWrapper + ): string { + let agentJson = agent.to_json_str(); + return ShinkaiMessageBuilderWrapperWASM.request_add_agent( + my_encryption_secret_key, + my_signature_secret_key, + receiver_public_key, + agentJson, + sender, + sender_subidentity, + recipient, + "" + ); + } + + + static get_profile_agents( + my_encryption_secret_key: string, + my_signature_secret_key: string, + receiver_public_key: string, + sender: string, + sender_subidentity: string, + receiver: string, + ): string { + const builder = new ShinkaiMessageBuilderWrapperWASM( + my_encryption_secret_key, + my_signature_secret_key, + receiver_public_key + ); + + builder.message_raw_content(""); + builder.message_schema_type(MessageSchemaType.Empty.toString()); + builder.internal_metadata( + sender_subidentity, + "", + EncryptionMethod.None.toString() + ); + builder.external_metadata(receiver, sender); + builder.body_encryption( + EncryptionMethod.DiffieHellmanChaChaPoly1305.toString() + ); + const message = builder.build_to_string(); + return message; + } + + static create_chat_with_message( + my_encryption_secret_key: string, + my_signature_secret_key: string, + receiver_public_key: string, + sender: string, + sender_subidentity: string, + receiver: string, + receiver_subidentity: string, + text_message: string, + inbox: string + ): string { + const builder = new ShinkaiMessageBuilderWrapperWASM( + my_encryption_secret_key, + my_signature_secret_key, + receiver_public_key + ); + + builder.message_raw_content(text_message); + builder.message_schema_type(MessageSchemaType.TextContent.toString()); + builder.internal_metadata_with_inbox( + sender_subidentity, + receiver_subidentity, + inbox, + EncryptionMethod.None.toString() + ); + builder.external_metadata(receiver, sender); + builder.body_encryption( + EncryptionMethod.DiffieHellmanChaChaPoly1305.toString() + ); + + const message = builder.build_to_string(); + + return message; + } + + static send_text_message_with_inbox( + my_encryption_secret_key: string, + my_signature_secret_key: string, + receiver_public_key: string, + sender: string, + sender_subidentity: string, + receiver: string, + receiver_subidentity: string, + inbox: string, + text_message: string + ): string { + const builder = new ShinkaiMessageBuilderWrapperWASM( + my_encryption_secret_key, + my_signature_secret_key, + receiver_public_key + ); + + builder.message_raw_content(text_message); + builder.message_schema_type(MessageSchemaType.TextContent.toString()); + builder.internal_metadata_with_inbox( + sender_subidentity, + receiver_subidentity, + inbox, + EncryptionMethod.None.toString() + ); + builder.external_metadata(receiver, sender); + builder.body_encryption( + EncryptionMethod.DiffieHellmanChaChaPoly1305.toString() + ); + + const message = builder.build_to_string(); + + return message; + } +} diff --git a/shinkai-app/src/lib/wasm/ShinkaiMessageWrapper.test.ts b/shinkai-app/src/lib/wasm/ShinkaiMessageWrapper.test.ts new file mode 100644 index 000000000..e6b304aa4 --- /dev/null +++ b/shinkai-app/src/lib/wasm/ShinkaiMessageWrapper.test.ts @@ -0,0 +1,57 @@ +import { ShinkaiMessage } from '../../models/ShinkaiMessage'; +import { ShinkaiMessageWrapper } from './ShinkaiMessageWrapper'; + +const messageJson = `{ + "body": { + "unencrypted": { + "message_data": { + "unencrypted": { + "message_raw_content": "hey!", + "message_content_schema": "TextContent" + } + }, + "internal_metadata": { + "sender_subidentity": "main/device/main_device", + "recipient_subidentity": "", + "inbox": "inbox::@@node1.shinkai/main/device/main_device::@@node2.shinkai::false", + "signature": "", + "encryption": "None" + } + } + }, + "external_metadata": { + "sender": "@@node1.shinkai", + "recipient": "@@node2.shinkai", + "scheduled_time": "2023-08-25T22:44:01.132Z", + "signature": "c6d0115c0878fbf2279f98aab67c0e9cb1af63825f49dca48d6e4420eba0ceb973e00488ba0905c9afd09254f0dac48c468fdcb1d6c5ab5ca4c5dd70a440b903", + "other": "" + }, + "encryption": "DiffieHellmanChaChaPoly1305", + "version": "V1_0" + }`; + + +describe('ShinkaiMessageWrapper', () => { + it('should correctly convert from and to JSON string', () => { + const wrapper = ShinkaiMessageWrapper.from_json_str(messageJson); + const jsonString = wrapper.to_json_str(); + + expect(JSON.parse(jsonString)).toEqual(JSON.parse(messageJson)); + }); + + it('should correctly convert from and to JsValue string', () => { + let message = JSON.parse(messageJson); + const wrapper = ShinkaiMessageWrapper.fromJsValue(message); + const jsonString = wrapper.to_json_str(); + + expect(JSON.parse(jsonString)).toEqual(JSON.parse(messageJson)); + }); + + it('should correctly instatiate it from a ShinkaiMessage Typescript object', () => { + let message: ShinkaiMessage = JSON.parse(messageJson); + const wrapper = ShinkaiMessageWrapper.fromJsValue(message); + const jsonString = wrapper.to_json_str(); + + expect(JSON.parse(jsonString)).toEqual(JSON.parse(messageJson)); + }); +}); \ No newline at end of file diff --git a/shinkai-app/src/lib/wasm/ShinkaiMessageWrapper.ts b/shinkai-app/src/lib/wasm/ShinkaiMessageWrapper.ts new file mode 100644 index 000000000..f48522f10 --- /dev/null +++ b/shinkai-app/src/lib/wasm/ShinkaiMessageWrapper.ts @@ -0,0 +1,49 @@ +import { EncryptionMethod, ShinkaiMessageBuilderWrapper, ShinkaiMessageWrapper as ShinkaiMessageWrapperWASM } from '../../pkg/shinkai_message_wasm.js'; +import { ExternalMetadata, ShinkaiMessage } from '../../models/ShinkaiMessage'; +import { mapEncryptionMethod } from '../../utils/wasm_helpers.js'; + +export class ShinkaiMessageWrapper { + private wasmWrapper: ShinkaiMessageWrapperWASM; + + constructor(message: ShinkaiMessage) { + this.wasmWrapper = ShinkaiMessageWrapperWASM.fromJsValue(message); + } + + static fromJsValue(j: any): ShinkaiMessageWrapper { + const message: ShinkaiMessage = j; + return new ShinkaiMessageWrapper(message); + } + + to_jsvalue(): any { + return this.wasmWrapper.to_jsvalue(); + } + + to_json_str(): string { + return this.wasmWrapper.to_json_str(); + } + + calculate_hash(): string { + return this.wasmWrapper.calculate_hash(); + } + + static time_now(): string { + return ShinkaiMessageWrapperWASM.generate_time_now(); + } + + static from_json_str(s: string): ShinkaiMessageWrapper { + const message: ShinkaiMessage = JSON.parse(s); + return new ShinkaiMessageWrapper(message); + } + + get body(): Body { + return this.wasmWrapper.message_body; + } + + get encryption(): string { + return this.wasmWrapper.encryption; + } + + get external_metadata(): ExternalMetadata { + return this.wasmWrapper.external_metadata; + } +} diff --git a/shinkai-app/src/lib/wasm/ShinkaiNameWrapper.test.ts b/shinkai-app/src/lib/wasm/ShinkaiNameWrapper.test.ts new file mode 100644 index 000000000..09f942df8 --- /dev/null +++ b/shinkai-app/src/lib/wasm/ShinkaiNameWrapper.test.ts @@ -0,0 +1,49 @@ +import { ShinkaiNameWrapper } from "./ShinkaiNameWrapper"; +import { test } from "vitest"; + +test("ShinkaiNameWrapper", () => { + const validNames = [ + "@@alice.shinkai", + "@@alice.shinkai/profileName", + "@@alice.shinkai/profileName/agent/myChatGPTAgent", + "@@alice.shinkai/profileName/device/myPhone", + ]; + + const invalidNames = [ + "@@alice.shinkai/profileName/myPhone", + "@@al!ce.shinkai", + "@@alice.shinkai//", + "@@node1.shinkai/profile_1.shinkai", + ]; + + for (const name of validNames) { + const wrapper = new ShinkaiNameWrapper(name); + expect(wrapper.get_full_name).toBe(name.toLowerCase()); + } + + for (const name of invalidNames) { + expect(() => new ShinkaiNameWrapper(name)).toThrow(); + } +}); + +test("ShinkaiNameWrapper get_profile_name", () => { + const namesWithProfiles = [ + { + name: "@@alice.shinkai/profileName", + profile: "@@alice.shinkai/profileName", + }, + { + name: "@@alice.shinkai/profileName/agent/myChatGPTAgent", + profile: "@@alice.shinkai/profileName", + }, + { + name: "@@alice.shinkai/profileName/device/myPhone", + profile: "@@alice.shinkai/profileName", + }, + ]; + + for (const { name, profile } of namesWithProfiles) { + const wrapper = new ShinkaiNameWrapper(name); + expect(wrapper.extract_profile().get_full_name).toBe(profile.toLowerCase()); + } +}); diff --git a/shinkai-app/src/lib/wasm/ShinkaiNameWrapper.ts b/shinkai-app/src/lib/wasm/ShinkaiNameWrapper.ts new file mode 100644 index 000000000..ef25f499a --- /dev/null +++ b/shinkai-app/src/lib/wasm/ShinkaiNameWrapper.ts @@ -0,0 +1,45 @@ +import { ShinkaiNameWrapper as ShinkaiNameWrapperWASM } from "../../pkg/shinkai_message_wasm.js"; + +export class ShinkaiNameWrapper { + private wasmWrapper: ShinkaiNameWrapperWASM; + + constructor(shinkai_name_js: any) { + this.wasmWrapper = new ShinkaiNameWrapperWASM(shinkai_name_js); + } + + to_jsvalue(): any { + return this.wasmWrapper.to_jsvalue(); + } + + to_json_str(): string { + return this.wasmWrapper.to_json_str(); + } + + get get_full_name(): string { + return this.wasmWrapper.get_full_name; + } + + get get_node_name(): string { + return this.wasmWrapper.get_node_name; + } + + get get_profile_name(): string { + return this.wasmWrapper.get_profile_name; + } + + get get_subidentity_name(): string { + return this.wasmWrapper.get_subidentity_name; + } + + get get_subidentity_type(): string { + return this.wasmWrapper.get_subidentity_type; + } + + extract_profile(): ShinkaiNameWrapper { + return new ShinkaiNameWrapper(this.wasmWrapper.extract_profile().get_full_name); + } + + extract_node(): ShinkaiNameWrapper { + return new ShinkaiNameWrapper(this.wasmWrapper.extract_node().get_full_name); + } +} \ No newline at end of file diff --git a/shinkai-app/src/main.tsx b/shinkai-app/src/main.tsx new file mode 100644 index 000000000..fbff6c812 --- /dev/null +++ b/shinkai-app/src/main.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './App'; + +const container = document.getElementById('root'); +const root = createRoot(container!); +root.render( + + + +); \ No newline at end of file diff --git a/shinkai-app/src/models/QRSetupData.ts b/shinkai-app/src/models/QRSetupData.ts new file mode 100644 index 000000000..735f9f737 --- /dev/null +++ b/shinkai-app/src/models/QRSetupData.ts @@ -0,0 +1,12 @@ +export type Base58String = string; + +export interface QRSetupData { + registration_code: string; + profile: string; + identity_type: string; + permission_type: string; + node_address: string; + shinkai_identity: string; + node_encryption_pk: Base58String; + node_signature_pk: Base58String; +} \ No newline at end of file diff --git a/shinkai-app/src/models/SchemaTypes.ts b/shinkai-app/src/models/SchemaTypes.ts new file mode 100644 index 000000000..32f9d4ca2 --- /dev/null +++ b/shinkai-app/src/models/SchemaTypes.ts @@ -0,0 +1,85 @@ +export enum EncryptionMethod { + DiffieHellmanChaChaPoly1305 = "DiffieHellmanChaChaPoly1305", + None = "None", +} + +export enum MessageSchemaType { + JobCreationSchema = "JobCreationSchema", + JobMessageSchema = "JobMessageSchema", + PreMessageSchema = "PreMessageSchema", + CreateRegistrationCode = "CreateRegistrationCode", + UseRegistrationCode = "UseRegistrationCode", + APIGetMessagesFromInboxRequest = "APIGetMessagesFromInboxRequest", + APIReadUpToTimeRequest = "APIReadUpToTimeRequest", + APIAddAgentRequest = "APIAddAgentRequest", + TextContent = "TextContent", + Empty = "", +} + +export interface JobScope { + buckets: string[]; + documents: string[]; +} + +export interface JobCreation { + scope: JobScope; +} + +export interface JobMessage { + job_id: string; + content: string; +} + +export interface JobToolCall { + tool_id: string; + inputs: Record; +} + +export enum JobRecipient { + SelfNode = "SelfNode", + User = "User", + ExternalIdentity = "ExternalIdentity", +} + +export interface JobPreMessage { + tool_calls: JobToolCall[]; + content: string; + recipient: JobRecipient; +} + +export interface APIGetMessagesFromInboxRequest { + inbox: string; + count: number; + offset?: string; +} + +export interface APIReadUpToTimeRequest { + inbox_name: string; + up_to_time: string; +} + +export interface SerializedAgent { + id: string; + full_identity_name: string; // ShinkaiName + perform_locally: boolean; + external_url?: string; + api_key?: string; + model: AgentAPIModel; + toolkit_permissions: string[]; + storage_bucket_permissions: string[]; + allowed_message_senders: string[]; +} +export interface AgentAPIModel { + OpenAI?: OpenAI; + SleepAPI?: SleepAPI; +} + +export interface OpenAI { + model_type: string; +} + +export interface SleepAPI {} + +export interface APIAddAgentRequest { + agent: SerializedAgent; +} diff --git a/shinkai-app/src/models/ShinkaiMessage.ts b/shinkai-app/src/models/ShinkaiMessage.ts new file mode 100644 index 000000000..8ba500b5c --- /dev/null +++ b/shinkai-app/src/models/ShinkaiMessage.ts @@ -0,0 +1,52 @@ +import { EncryptionMethod, MessageSchemaType } from "./SchemaTypes"; + +export interface InternalMetadata { + sender_subidentity: string; + recipient_subidentity: string; + inbox: string; + encryption: EncryptionMethod; +} + +export interface ExternalMetadata { + sender: string; + recipient: string; + scheduled_time: string; + signature: string; + other: string; +} + +export interface EncryptedShinkaiData { + content: string; +} + +export interface ShinkaiData { + message_raw_content: string; + message_content_schema: MessageSchemaType; +} + +export type MessageData = { encrypted: EncryptedShinkaiData } | { unencrypted: ShinkaiData }; + +export interface EncryptedShinkaiBody { + content: string; +} + +export interface ShinkaiBody { + message_data: MessageData; + internal_metadata: InternalMetadata; +} + +export type MessageBody = { encrypted: EncryptedShinkaiBody } | { unencrypted: ShinkaiBody }; + +export interface ShinkaiMessage { + body: MessageBody | null; + external_metadata: ExternalMetadata | null; + encryption: EncryptionMethod; +} + +export interface RegistrationCode { + code: string; + profileName: string; + identityPk: string; + encryptionPk: string; + permissionType: string; +} diff --git a/shinkai-app/src/pages/AddAgent.tsx b/shinkai-app/src/pages/AddAgent.tsx new file mode 100644 index 000000000..77bcd45ac --- /dev/null +++ b/shinkai-app/src/pages/AddAgent.tsx @@ -0,0 +1,201 @@ +// pages/AddAgent.tsx +import { + IonPage, + IonHeader, + IonToolbar, + IonTitle, + IonContent, + IonButton, + IonInput, + IonLabel, + IonItem, + IonGrid, + IonRow, + IonCol, + IonButtons, + IonBackButton, + IonSelect, + IonSelectOption, + IonTextarea, + InputChangeEventDetail, + IonCheckbox, +} from "@ionic/react"; +import { useEffect, useState } from "react"; +import { IonContentCustom, IonHeaderCustom } from "../components/ui/Layout"; +import Button from "../components/ui/Button"; +import Input from "../components/ui/Input"; +import { useDispatch, useSelector } from "react-redux"; +import { RootState } from "../store"; +import { SerializedAgent, AgentAPIModel } from "../models/SchemaTypes"; +import { addAgent } from "../api"; +import { useSetup } from "../hooks/usetSetup"; + +const AddAgent: React.FC = () => { + useSetup(); + const dispatch = useDispatch(); + const setupDetailsState = useSelector( + (state: RootState) => state.setupDetailsState + ); + const [agent, setAgent] = useState>({ + perform_locally: false, + toolkit_permissions: [], + storage_bucket_permissions: [], + allowed_message_senders: [], + }); + const [openaiModelType, setOpenaiModelType] = + useState("gpt-3.5-turbo"); + + const handleInputChange = (event: CustomEvent) => { + const inputElement = event.target as HTMLInputElement; + const { name } = inputElement; + const { value } = event.detail; + // const { shinkai_identity, profile } = setupDetailsState; + // const node_name = shinkai_identity; + // const base = node_name + "/" + profile; + // setAgent({ ...agent, full_identity_name: `${base}/${value}` }); + setAgent((prevState) => ({ + ...prevState, + [name]: value, + })); + }; + + const handleAgentNameChange = ( + event: CustomEvent + ) => { + const base = `${setupDetailsState.shinkai_identity}/${setupDetailsState.profile}/agent`; + setAgent({ + ...agent, + full_identity_name: `${base}/${event.detail.value}`, + id: event.detail.value ?? "", + }); + }; + + const handleSubmit = () => { + const { shinkai_identity, profile } = setupDetailsState; + let node_name = shinkai_identity; + + if (agent.model?.OpenAI) { + setAgent({ + ...agent, + model: { OpenAI: { model_type: openaiModelType } }, + }); + } + + console.log("Submitting agent:", agent); + dispatch( + addAgent( + profile, + node_name, + agent as SerializedAgent, + setupDetailsState + ) + ); + }; + + return ( + + + + + + Add Agent + + + + + +

+ New Agent Details +

+ + + Agent Name + + + + + Perform Locally + + setAgent((prevState) => ({ + ...prevState, + perform_locally: e.detail.checked, + })) + } + /> + + + + External URL + + + + + API Key + + + + + Model + + setAgent((prevState) => ({ + ...prevState, + model: e.detail.value as AgentAPIModel, + })) + } + > + + OpenAI + + + SleepAPI + + + + {agent.model?.OpenAI && ( + + OpenAI Model Type + setOpenaiModelType(e.detail.value!)} + /> + + )} + +
+ +
+
+
+
+
+
+ ); +}; + +export default AddAgent; diff --git a/shinkai-app/src/pages/AdminCommands.tsx b/shinkai-app/src/pages/AdminCommands.tsx new file mode 100644 index 000000000..d1d742897 --- /dev/null +++ b/shinkai-app/src/pages/AdminCommands.tsx @@ -0,0 +1,183 @@ +import { + IonModal, + IonButton, + IonPage, + IonHeader, + IonToolbar, + IonTitle, + IonContent, + IonList, + IonItem, + IonLabel, + IonButtons, + IonBackButton, + IonActionSheet, + IonToast, +} from "@ionic/react"; +import React, { useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { submitRequestRegistrationCode } from "../api"; +import { RootState } from "../store"; +import { clearRegistrationCode } from "../store/actions"; +import { useSetup } from "../hooks/usetSetup"; + +const AdminCommands: React.FC = () => { + useSetup(); + const setupDetailsState = useSelector( + (state: RootState) => state.setupDetailsState + ); + const [showCodeRegistrationActionSheet, setShowCodeRegistrationActionSheet] = + useState(false); + const [showCodeRegistrationModal, setCodeRegistrationShowModal] = + useState(false); + const [showIdentityTypeActionSheet, setShowIdentityTypeActionSheet] = + useState(false); + const [identityType, setIdentityType] = useState(""); + const [profileName, setProfileName] = useState(""); + const dispatch = useDispatch(); + const registrationCode = useSelector( + (state: RootState) => state.registrationCode + ); + const commands = [ + "Get Peers", + "Ping All", + "Connect To", + "Get Last Messages", + "Create Registration Code", + "Get All Subidentities", + ]; + + const handleCommandClick = (command: string) => { + console.log(`Command selected: ${command}`); + + if (command === "Create Registration Code") { + setShowIdentityTypeActionSheet(true); + } + }; + + const copyToClipboard = () => { + navigator.clipboard.writeText(registrationCode); + }; + + const handleIdentityTypeClick = (type: string) => { + setIdentityType(type); + setShowIdentityTypeActionSheet(false); + if (type === "device") { + // Prompt the user to enter a profile name when "Device" is selected + const profile = prompt("Please enter a profile name"); + setProfileName(profile || ""); + } + if (type !== "Cancel") { + setShowCodeRegistrationActionSheet(true); + } + }; + + const handleIdentityClick = async (permissionsType: string) => { + let finalCodeType = identityType; + if (identityType === "device") { + // Serialize permissionsType as "device:PROFILE_NAME" when "Device" is selected + finalCodeType = `device:${profileName}`; + } + await dispatch(submitRequestRegistrationCode(permissionsType, finalCodeType, setupDetailsState)); + setCodeRegistrationShowModal(true); + return true; + }; + + return ( + <> + setShowIdentityTypeActionSheet(false)} + buttons={[ + { + text: "Profile", + handler: () => handleIdentityTypeClick("profile"), + }, + { + text: "Device", + handler: () => handleIdentityTypeClick("device"), + }, + { + text: "Cancel", + role: "cancel", + handler: () => handleIdentityTypeClick("Cancel"), + }, + ]} + /> + setShowCodeRegistrationActionSheet(false)} + buttons={[ + { + text: "Admin", + handler: () => handleIdentityClick("admin"), + }, + { + text: "Standard", + handler: () => handleIdentityClick("standard"), + }, + { + text: "None", + handler: () => handleIdentityClick("none"), + }, + { + text: "Cancel", + role: "cancel", + }, + ]} + /> + + + + Code Registration Successful + + + + Code: {registrationCode} +
+ + Copy + + setCodeRegistrationShowModal(false)}> + Dismiss + +
+
+
+ + + + + + + Admin Commands + + + + + {commands.map((command) => ( + handleCommandClick(command)} + > + {command} + + ))} + + + + + ); +}; + +export default AdminCommands; diff --git a/shinkai-app/src/pages/Chat.css b/shinkai-app/src/pages/Chat.css new file mode 100644 index 000000000..568147509 --- /dev/null +++ b/shinkai-app/src/pages/Chat.css @@ -0,0 +1,38 @@ +.ion-item-chat, +.ion-list-chat { + --ion-item-background: theme("colors.slate.100"); + --background: theme("colors.slate.100"); + @media (prefers-color-scheme: dark) { + --ion-item-background: theme("colors.slate.800"); + --background: theme("colors.slate.800"); + } + &.isLocalMessage { + --ion-item-background: theme("colors.white"); + --background: theme("colors.white"); + @media (prefers-color-scheme: dark) { + --ion-item-background: theme("colors.slate.900"); + --background: theme("colors.slate.900"); + } + } +} + +.ion-textarea-chat { + --border-radius: 4px; + --padding-top: 16px; + --padding-bottom: 16px; + --padding-left: 16px; + --border-width: 0; + --border-color: theme("colors.slate.300/20"); + --background: theme("colors.slate.100"); + --highlight-color: theme("colors.slate.400"); + --highlight-color-focused: theme("colors.gray.300"); + --color: theme("colors.slate.800"); + --placeholder-color: theme("colors.slate.800"); + @media (prefers-color-scheme: dark) { + --background: theme("colors.slate.800"); + --color: theme("colors.slate.200"); + --border-color: theme("colors.slate.800/20"); + --placeholder-color: theme("colors.slate.300"); + --highlight-color: theme("colors.gray.300"); + } +} diff --git a/shinkai-app/src/pages/Chat.tsx b/shinkai-app/src/pages/Chat.tsx new file mode 100644 index 000000000..75a54df86 --- /dev/null +++ b/shinkai-app/src/pages/Chat.tsx @@ -0,0 +1,278 @@ +import { + IonBackButton, + IonButton, + IonButtons, + IonContent, + IonFooter, + IonHeader, + IonIcon, + IonInput, + IonItem, + IonLabel, + IonList, + IonPage, + IonText, + IonTextarea, + IonTitle, + IonToolbar, +} from "@ionic/react"; +import { useParams } from "react-router-dom"; +import React, { useEffect, useRef, useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { + getLastMessagesFromInbox, + createChatWithMessage, + sendTextMessageWithInbox, +} from "../api/index"; +import { RootState } from "../store"; +import { useSetup } from "../hooks/usetSetup"; +import { + extractReceiverShinkaiName, + getOtherPersonIdentity, +} from "../utils/inbox_name_handler"; +import { ShinkaiMessage } from "../models/ShinkaiMessage"; +import { calculateMessageHash } from "../utils/shinkai_message_handler"; +import Avatar from "../components/ui/Avatar"; +import { cn } from "../theme/lib/utils"; +import { send } from "ionicons/icons"; +import "./Chat.css"; +import { + IonContentCustom, + IonFooterCustom, + IonHeaderCustom, +} from "../components/ui/Layout"; + +const parseDate = (dateString: string) => { + return new Date(dateString); +}; + +const Chat: React.FC = () => { + console.log("Loading Chat.tsx"); + useSetup(); + + const dispatch = useDispatch(); + const setupDetailsState = useSelector( + (state: RootState) => state.setupDetailsState + ); + + const { id } = useParams<{ id: string }>(); + const bottomChatRef = useRef(null); + const deserializedId = decodeURIComponent(id).replace(/~/g, "."); + const [lastKey, setLastKey] = useState(undefined); + const [hasMoreMessages, setHasMoreMessages] = useState(true); + const [prevMessagesLength, setPrevMessagesLength] = useState(0); + + const reduxMessages = useSelector( + (state: RootState) => state.inboxes[deserializedId] + ); + + const [messages, setMessages] = useState([]); + const [inputMessage, setInputMessage] = useState(""); + const otherPersonIdentity = getOtherPersonIdentity( + deserializedId, + setupDetailsState.shinkai_identity + ); + + useEffect(() => { + console.log("deserializedId:", deserializedId); + dispatch( + getLastMessagesFromInbox(deserializedId, 10, lastKey, setupDetailsState) + ); + }, [id, dispatch, setupDetailsState]); + + useEffect(() => { + if (reduxMessages && reduxMessages.length > 0) { + console.log("Redux Messages:", reduxMessages); + const lastMessage = reduxMessages[reduxMessages.length - 1]; + console.log("Last Message:", lastMessage); + const timeKey = lastMessage.external_metadata.scheduled_time; + const hashKey = calculateMessageHash(lastMessage); + const lastMessageKey = `${timeKey}:${hashKey}`; + setLastKey(lastMessageKey); + setMessages(reduxMessages); + + if (reduxMessages.length - prevMessagesLength < 10) { + setHasMoreMessages(false); + } + setPrevMessagesLength(reduxMessages.length); + } + }, [reduxMessages]); + + useEffect(() => { + // Check if the user is at the bottom of the chat + const isUserAtBottom = + bottomChatRef.current && + bottomChatRef.current.getBoundingClientRect().bottom <= + window.innerHeight; + + // If the user is at the bottom, scroll to the bottom + if (isUserAtBottom) { + bottomChatRef.current?.scrollIntoView({ behavior: "smooth" }); + } + }, [messages]); + + const sendMessage = () => { + console.log("Sending message: ", inputMessage); + + // Local Identity + const { shinkai_identity, profile, registration_name } = setupDetailsState; + // let sender = shinkai_identity; + let sender = `${shinkai_identity}/${profile}/device/${registration_name}`; + + console.log("Sender:", sender); + + const receiver = extractReceiverShinkaiName(deserializedId, sender); + console.log("Receiver:", receiver); + + dispatch( + sendTextMessageWithInbox( + sender, + "", + receiver, + inputMessage, + deserializedId, + setupDetailsState + ) + ); + setInputMessage(""); + }; + + return ( + + + + + +
+ + {otherPersonIdentity} + + {/**/} +
+
+ + +
+ {hasMoreMessages && ( + + dispatch( + getLastMessagesFromInbox( + deserializedId, + 10, + lastKey, + setupDetailsState, + true + ) + ) + } + > + Load More + + )} + + {messages && + messages + .slice() + .reverse() + .map((message, index) => { + const { shinkai_identity, profile, registration_name } = + setupDetailsState; + + const localIdentity = `${profile}/device/${registration_name}`; + // console.log("Message:", message); + let isLocalMessage = false; + if (message.body && "unencrypted" in message.body) { + isLocalMessage = + message.body.unencrypted.internal_metadata + .sender_subidentity === localIdentity; + } + + return ( + +
+ + +

+ {message.body && "unencrypted" in message.body + ? "unencrypted" in + message.body.unencrypted.message_data + ? message.body.unencrypted.message_data + .unencrypted.message_raw_content + : message.body.unencrypted.message_data.encrypted + .content + : message.body?.encrypted.content} +

+ {message?.external_metadata?.scheduled_time && ( + + {parseDate( + message.external_metadata.scheduled_time + ).toLocaleTimeString()} + + )} +
+
+ ); + })} +
+
+
+ + +
{ + e.preventDefault(); + if (inputMessage.trim() !== "") { + sendMessage(); + } + }} + > +
+ setInputMessage(e.detail.value!)} + placeholder="Type a message" + > + + +
+
+
+ + ); +}; + +export default Chat; diff --git a/shinkai-app/src/pages/Connect.tsx b/shinkai-app/src/pages/Connect.tsx new file mode 100644 index 000000000..a2698e0e7 --- /dev/null +++ b/shinkai-app/src/pages/Connect.tsx @@ -0,0 +1,397 @@ +import React, { useEffect, useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { + IonContent, + IonHeader, + IonPage, + IonTitle, + IonToolbar, + IonButton, + IonInput, + IonLabel, + IonItem, + IonToast, + InputChangeEventDetail, + IonIcon, + IonSpinner, +} from "@ionic/react"; +import { submitRegistrationCode } from "../api"; +import { BrowserQRCodeReader } from "@zxing/browser"; +import { Camera, CameraResultType, CameraSource } from "@capacitor/camera"; +import { useHistory } from "react-router-dom"; +import { toast } from "react-toastify"; +import type { AppDispatch, RootState } from "../store"; +import { QrScanner, QrScannerProps } from "@yudiel/react-qr-scanner"; +import { BarcodeScanner } from "@capacitor-community/barcode-scanner"; +import { isPlatform } from "@ionic/react"; +import { + generateEncryptionKeys, + generateSignatureKeys, +} from "../utils/wasm_helpers"; +import { QRSetupData } from "../models/QRSetupData"; +import { SetupDetailsState } from "../store/reducers"; +import { InputCustomEvent } from "@ionic/core/dist/types/components/input/input-interface"; +import { cn } from "../theme/lib/utils"; +import Button from "../components/ui/Button"; +import { IonHeaderCustom } from "../components/ui/Layout"; +import Input from "../components/ui/Input"; +import { scan, cloudUpload, checkmarkSharp } from "ionicons/icons"; + +export type MergedSetupType = SetupDetailsState & QRSetupData; + +const Connect: React.FC = () => { + const [setupData, setSetupData] = useState({ + registration_code: "", + profile: "main", + registration_name: "main_device", + identity_type: "device", + permission_type: "admin", + node_address: "", + shinkai_identity: "", + node_encryption_pk: "", + node_signature_pk: "", + profile_encryption_sk: "", + profile_encryption_pk: "", + profile_identity_sk: "", + profile_identity_pk: "", + my_device_encryption_sk: "", + my_device_encryption_pk: "", + my_device_identity_sk: "", + my_device_identity_pk: "", + }); + const [status, setStatus] = useState< + "idle" | "loading" | "error" | "success" + >("idle"); + const [error, setError] = useState(null); + const dispatch = useDispatch(); + const history = useHistory(); + const errorFromState = useSelector((state: RootState) => state.error); + + // Generate keys when the component mounts + useEffect(() => { + // Assuming the seed is a random 32 bytes array. + // Device Keys + let seed = crypto.getRandomValues(new Uint8Array(32)); + generateEncryptionKeys(seed).then( + ({ my_encryption_sk_string, my_encryption_pk_string }) => + setSetupData((prevState) => ({ + ...prevState, + my_device_encryption_pk: my_encryption_pk_string, + my_device_encryption_sk: my_encryption_sk_string, + })) + ); + generateSignatureKeys().then( + ({ my_identity_pk_string, my_identity_sk_string }) => + setSetupData((prevState) => ({ + ...prevState, + my_device_identity_pk: my_identity_pk_string, + my_device_identity_sk: my_identity_sk_string, + })) + ); + + // Profile Keys + seed = crypto.getRandomValues(new Uint8Array(32)); + generateEncryptionKeys(seed).then( + ({ my_encryption_sk_string, my_encryption_pk_string }) => + setSetupData((prevState) => ({ + ...prevState, + profile_encryption_pk: my_encryption_pk_string, + profile_encryption_sk: my_encryption_sk_string, + })) + ); + generateSignatureKeys().then( + ({ my_identity_pk_string, my_identity_sk_string }) => + setSetupData((prevState) => ({ + ...prevState, + profile_identity_pk: my_identity_pk_string, + profile_identity_sk: my_identity_sk_string, + })) + ); + }, []); + + const updateSetupData = (data: Partial) => { + setSetupData((prevState) => ({ ...prevState, ...data })); + }; + + const handleScan = async (data: any) => { + if (data) { + const result = JSON.parse(data); + console.log("Prev. QR Code Data:", setupData); + updateSetupData(result); + console.log("New QR Code Data:", setupData); + } + }; + console.log(isPlatform("desktop")); + const handleImageUpload = async () => { + try { + const image = await Camera.getPhoto({ + quality: 90, + allowEditing: true, + resultType: CameraResultType.DataUrl, + source: isPlatform("desktop") + ? CameraSource.Photos + : CameraSource.Prompt, + }); + const codeReader = new BrowserQRCodeReader(); + const resultImage = await codeReader.decodeFromImageUrl(image.dataUrl); + const json_string = resultImage.getText(); + const parsedData: QRSetupData = JSON.parse(json_string); + updateSetupData(parsedData); + } catch (error) { + console.error("Error uploading image:", error); + } + }; + + const handleError = (err: Error) => { + console.error(err); + }; + + const handleQRScan = async () => { + if (isPlatform("capacitor")) { + const result = await BarcodeScanner.startScan(); + if (result.hasContent) { + handleScan(result.content); + } + } + }; + + const finishSetup = async () => { + setStatus("loading"); + const success = await dispatch(submitRegistrationCode(setupData)); + + if (success) { + setStatus("success"); + localStorage.setItem("setupComplete", "true"); + history.push("/home"); + } else { + setStatus("error"); + + console.log("Error from state:", errorFromState); + toast.error(errorFromState); + } + }; + + return ( + + {/**/} + {/* */} + {/* Connect*/} + {/* */} + {/**/} + + + {error && } +
+
+
+
+ AI AGENT OS THAT UNLOCKS THE POTENTIAL OF LLMS +
+
+ For devices, identities, and digital money +
+
+
+ +
+
+
+
+ + + + +
+ + {isPlatform("capacitor") ? ( + + ) : ( + + )} +
+
+
+ + updateSetupData({ registration_code: e.detail.value! }) + } + label="Registration Code" + /> + + updateSetupData({ registration_name: e.detail.value! }) + } + label="Registration Name (Your choice)" + /> + + updateSetupData({ node_address: e.detail.value! }) + } + label="Node Address (IP:PORT)" + /> + + updateSetupData({ shinkai_identity: e.detail.value! }) + } + label="Shinkai Identity (@@IDENTITY.shinkai)" + /> + + updateSetupData({ node_encryption_pk: e.detail.value! }) + } + label="Node Encryption Public Key" + /> + + updateSetupData({ node_signature_pk: e.detail.value! }) + } + label="Node Signature Public Key" + /> + + updateSetupData({ + profile_encryption_pk: e.detail.value!, + }) + } + label="Profile Encryption Public Key" + /> + + updateSetupData({ profile_identity_pk: e.detail.value! }) + } + label="Profile Signature Public Key" + /> + + updateSetupData({ + my_device_encryption_pk: e.detail.value!, + }) + } + label="My Encryption Public Key" + /> + + updateSetupData({ my_device_identity_pk: e.detail.value! }) + } + label="My Signature Public Key" + /> + {status === "error" && ( +

+ Something went wrong. Please check your inputs and try again +

+ )} + +
+
+
+
+
+
+ ); +}; + +export default Connect; + +function CustomQrScanner({ + onError, + onDecode, + scanDelay, + containerStyle, +}: { + onError: QrScannerProps["onError"]; + onDecode: QrScannerProps["onDecode"]; + containerStyle: React.CSSProperties; + scanDelay: number; +}) { + const [showScanner, setShowScanner] = useState(false); + const [status, setStatus] = useState< + "idle" | "loading" | "error" | "success" + >("idle"); + + return showScanner ? ( +
+ { + setStatus("success"); + setShowScanner(false); + }} + /> + + +
+ ) : ( + + ); +} diff --git a/shinkai-app/src/pages/CreateChat.tsx b/shinkai-app/src/pages/CreateChat.tsx new file mode 100644 index 000000000..a84666f3e --- /dev/null +++ b/shinkai-app/src/pages/CreateChat.tsx @@ -0,0 +1,123 @@ +// pages/CreateChat.tsx +import { + IonPage, + IonHeader, + IonToolbar, + IonTitle, + IonContent, + IonButton, + IonInput, + IonLabel, + IonItem, + IonGrid, + IonRow, + IonCol, + IonButtons, + IonBackButton, + IonTextarea, +} from "@ionic/react"; +import { useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { createChatWithMessage } from "../api"; +import { useSetup } from "../hooks/usetSetup"; +import { RootState } from "../store/reducers"; +import { useHistory } from "react-router-dom"; +import { History } from "history"; +import { IonContentCustom, IonHeaderCustom } from "../components/ui/Layout"; +import Input from "../components/ui/Input"; +import Button from "../components/ui/Button"; + +const CreateChat: React.FC = () => { + useSetup(); + const setupDetailsState = useSelector( + (state: RootState) => state.setupDetailsState, + ); + const [shinkaiIdentity, setShinkaiIdentity] = useState(""); + const [messageText, setMessageText] = useState(""); + const dispatch = useDispatch(); + const history: History = useHistory(); + + const handleCreateChat = async () => { + // Perform your API request here + console.log("Creating chat with Shinkai Identity:", shinkaiIdentity); + + // Split shinkaiIdentity into sender and the rest + let [receiver, ...rest] = shinkaiIdentity.split("/"); + + // Join the rest back together to form sender_subidentity + let receiver_subidentity = rest.join("/"); + + // Local Identity + const { shinkai_identity, profile, registration_name } = setupDetailsState; + + let sender = shinkai_identity; + let sender_subidentity = `${profile}/device/${registration_name}`; + // console.log("Sender:", shinkai_identity); + // console.log("Sender Subidentity:", `${profile}/device/${registration_name}`); + + // Send a message to someone + let inboxId = await dispatch( + createChatWithMessage( + sender, + sender_subidentity, + receiver, + receiver_subidentity, + messageText, + setupDetailsState, + ), + ); + + if (inboxId) { + // Hacky solution because react-router can't handle dots in the URL + const encodedInboxId = inboxId.toString().replace(/\./g, "~"); + history.push(`/chat/${encodeURIComponent(encodedInboxId)}`); + } + }; + + return ( + + + + + + Create Chat + + + + + +

+ New Chat Details +

+
+ setShinkaiIdentity(e.detail.value!)} + /> + + setMessageText(e.detail.value!)} + /> +
+ +
+ +
+
+
+
+
+
+ ); +}; + +export default CreateChat; diff --git a/shinkai-app/src/pages/CreateJob.tsx b/shinkai-app/src/pages/CreateJob.tsx new file mode 100644 index 000000000..a8c98f252 --- /dev/null +++ b/shinkai-app/src/pages/CreateJob.tsx @@ -0,0 +1,176 @@ +// pages/CreateJob.tsx +import { + IonPage, + IonHeader, + IonToolbar, + IonTitle, + IonContent, + IonButton, + IonInput, + IonLabel, + IonItem, + IonGrid, + IonRow, + IonCol, + IonButtons, + IonBackButton, + IonSelect, + IonSelectOption, + IonTextarea, +} from "@ionic/react"; +import { useEffect, useState } from "react"; +import { IonContentCustom, IonHeaderCustom } from "../components/ui/Layout"; +import Button from "../components/ui/Button"; +import Input from "../components/ui/Input"; +import { createJob, getProfileAgents, sendMessageToJob } from "../api"; +import { useSetup } from "../hooks/usetSetup"; +import { useDispatch, useSelector } from "react-redux"; +import { RootState } from "../store"; +import { History } from "history"; +import { useHistory } from "react-router-dom"; +import { SerializedAgent } from "../models/SchemaTypes"; +import { JobScopeWrapper } from "../lib/wasm/JobScopeWrapper"; +import { + InboxNameWrapper, + JobCreationWrapper, +} from "../pkg/shinkai_message_wasm"; + +const CreateJob: React.FC = () => { + useSetup(); + const dispatch = useDispatch(); + const setupDetailsState = useSelector( + (state: RootState) => state.setupDetailsState + ); + const [jobContent, setJobContent] = useState(""); + const [selectedAgent, setSelectedAgent] = useState( + null + ); + const agents = useSelector((state: RootState) => state.agents); + const history: History = useHistory(); + + useEffect(() => { + const fetchAgents = async () => { + const { shinkai_identity, profile, registration_name } = + setupDetailsState; + let node_name = shinkai_identity; + let sender_subidentity = `${profile}/device/${registration_name}`; + + await getProfileAgents( + node_name, + sender_subidentity, + node_name, + setupDetailsState + )(dispatch); + }; + + fetchAgents(); + }, [dispatch, setupDetailsState]); + + const handleCreateJob = async () => { + console.log("Creating job with content:", jobContent); + + const { shinkai_identity, profile } = setupDetailsState; + let sender = shinkai_identity + "/" + profile; + + const job_creation = JobCreationWrapper.empty().get_scope; + console.log("buckets: ", job_creation.buckets); + console.log("scope:", job_creation); + + const scope = new JobScopeWrapper( + job_creation.buckets, + job_creation.documents + ); + console.log("scope:", scope.to_jsvalue()); + + console.log("Selected agent:", selectedAgent); + + const receiver = shinkai_identity; + const receiver_subidentity = `${profile}/agent/${selectedAgent?.id}`; + + // Call createJob + const jobId = await createJob( + scope.to_jsvalue(), + sender, + receiver, + receiver_subidentity, + setupDetailsState + ); + console.log("Job created with id:", jobId); + + if (jobId) { + // Now message job + const _ = await dispatch( + sendMessageToJob( + jobId.toString(), + jobContent, + sender, + receiver, + receiver_subidentity, + setupDetailsState + ) + ); + + // Hacky solution because react-router can't handle dots in the URL + const jobInboxName = InboxNameWrapper.get_job_inbox_name_from_params( + jobId.toString() + ); + const encodedJobId = jobInboxName.get_value.replace(/\./g, "~"); + history.push(`/job-chat/${encodeURIComponent(encodedJobId)}`); + } + }; + + return ( + + + + + + Create Job + + + + + +

+ New Job Details +

+ + + Select Agent + setSelectedAgent(e.detail.value)} + > + {Object.values(agents).map((agent, index) => ( + + {agent.id} + + ))} + + + + + Tell me the job to do + setJobContent(e.detail.value!)} + /> + + +
+ +
+
+
+
+
+
+ ); +}; + +export default CreateJob; diff --git a/shinkai-app/src/pages/Home.css b/shinkai-app/src/pages/Home.css new file mode 100644 index 000000000..f2b4db7c0 --- /dev/null +++ b/shinkai-app/src/pages/Home.css @@ -0,0 +1,27 @@ +.ion-item-home { + --ion-item-background: theme("colors.slate.100"); + --background: theme("colors.slate.100"); + --box-shadow: none; + --inner-border-width: 0; + @apply rounded-lg; + &::part(native) { + @apply h-[60px] md:h-[80px]; + } + @media (prefers-color-scheme: dark) { + --ion-item-background: theme("colors.slate.900"); + --background: theme("colors.slate.900"); + --background-hover: theme("colors.slate.800"); + } +} + +.ion-actionSheet-custom { + --max-width: 100%; + @apply md:rounded-[1.5rem]; + --button-background: theme("colors.white"); + @media (prefers-color-scheme: dark) { + --button-background: theme("colors.slate.800"); + } + .action-sheet-container { + @apply bg-white rounded-t-[1.25rem] py-6 pb-2 dark:bg-slate-800; + } +} diff --git a/shinkai-app/src/pages/Home.tsx b/shinkai-app/src/pages/Home.tsx new file mode 100644 index 000000000..fc936f118 --- /dev/null +++ b/shinkai-app/src/pages/Home.tsx @@ -0,0 +1,211 @@ +import { + IonActionSheet, + IonAlert, + IonAvatar, + IonButton, + IonButtons, + IonContent, + IonHeader, + IonIcon, + IonItem, + IonList, + IonPage, + IonText, + IonTitle, + IonToolbar, +} from "@ionic/react"; +import { addOutline, arrowForward, cloudUpload } from "ionicons/icons"; +import "./Home.css"; +import { useHistory } from "react-router-dom"; +import { RootState } from "../store"; +import { useDispatch, useSelector } from "react-redux"; +import React, { useEffect, useState } from "react"; +import { ApiConfig } from "../api/api_config"; +import { clearStore } from "../store/actions"; +import { getAllInboxesForProfile } from "../api"; +import Avatar from "../components/ui/Avatar"; +import { IonContentCustom, IonHeaderCustom } from "../components/ui/Layout"; + +const Home: React.FC = () => { + const { setupDetailsState } = useSelector((state: RootState) => state); + const history = useHistory(); + const dispatch = useDispatch(); + + const { shinkai_identity, profile, registration_name, permission_type } = + setupDetailsState; + const displayString = ( + <> + {`${shinkai_identity}/${profile}/device/${registration_name}`}{" "} + (Device) + + ); + const [showActionSheet, setShowActionSheet] = useState(false); + const [showLogoutAlert, setShowLogoutAlert] = useState(false); + const inboxes = useSelector((state: RootState) => state.inboxes); + console.log("Inboxes:", inboxes); + + useEffect(() => { + console.log("Redux State:", setupDetailsState); + ApiConfig.getInstance().setEndpoint(setupDetailsState.node_address); + }, []); + + useEffect(() => { + console.log("Redux State:", setupDetailsState); + ApiConfig.getInstance().setEndpoint(setupDetailsState.node_address); + + // Local Identity + const { shinkai_identity, profile, registration_name } = setupDetailsState; + let sender = shinkai_identity; + let sender_subidentity = `${profile}/device/${registration_name}`; + + // Assuming receiver and target_shinkai_name_profile are the same as sender + let receiver = sender; + let target_shinkai_name_profile = `${sender}/${profile}`; + + dispatch( + getAllInboxesForProfile( + sender, + sender_subidentity, + receiver, + target_shinkai_name_profile, + setupDetailsState, + ), + ); + }, []); + + return ( + + + + {displayString} + + + {" "} + {/* Add the "+" button to the right side of the toolbar */} + setShowActionSheet(true)}> + + + + + + + + {displayString} + + + {/* */} + + +
+
+ {Object.entries(inboxes).map(([position, inboxId]) => ( + { + const encodedInboxId = position.toString().replace(/\./g, "~"); + if (encodedInboxId.startsWith("inbox")) { + history.push(`/chat/${encodeURIComponent(encodedInboxId)}`); + } else if (encodedInboxId.startsWith("job_inbox")) { + history.push(`/job-chat/${encodeURIComponent(encodedInboxId)}`); + } + }} + > + + + {JSON.stringify(position)} + + + + ))} +
+
+
+
+ {/* Action Sheet (popup) */} + setShowActionSheet(false)} + buttons={[ + { + text: "Admin Commands", + role: permission_type !== "admin" ? "destructive" : undefined, + handler: () => { + if (permission_type === "admin") { + history.push("/admin-commands"); + } else { + console.log("Not authorized for Admin Commands"); + } + }, + }, + { + text: "Create Job", + handler: () => { + history.push("/create-job"); + }, + }, + { + text: "Create Chat", + handler: () => { + history.push("/create-chat"); + }, + }, + { + text: "Add Agent", + handler: () => { + history.push("/add-agent"); + }, + }, + { + text: "Logout", + role: "destructive", + handler: () => { + setShowLogoutAlert(true); + }, + }, + { + text: "Cancel", + role: "cancel", + handler: () => { + console.log("Cancel clicked"); + }, + }, + ]} + > + setShowLogoutAlert(false)} + header={"Confirm"} + message={ + "Are you sure you want to logout? This will clear all your data." + } + buttons={[ + { + text: "Cancel", + role: "cancel", + handler: () => { + console.log("Cancel clicked"); + }, + }, + { + text: "Yes", + handler: () => { + dispatch(clearStore()); + history.push("/connect"); + }, + }, + ]} + /> +
+ ); +}; + +export default Home; diff --git a/shinkai-app/src/pages/JobChat.tsx b/shinkai-app/src/pages/JobChat.tsx new file mode 100644 index 000000000..fcc7f5c7b --- /dev/null +++ b/shinkai-app/src/pages/JobChat.tsx @@ -0,0 +1,285 @@ +import { + IonBackButton, + IonButton, + IonButtons, + IonContent, + IonFooter, + IonHeader, + IonIcon, + IonInput, + IonItem, + IonLabel, + IonList, + IonPage, + IonText, + IonTextarea, + IonTitle, + IonToolbar, +} from "@ionic/react"; +import { useParams } from "react-router-dom"; +import React, { useEffect, useRef, useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { + getLastMessagesFromInbox, + createChatWithMessage, + sendTextMessageWithInbox, + sendMessageToJob, +} from "../api/index"; +import { RootState } from "../store"; +import { useSetup } from "../hooks/usetSetup"; +import { + extractJobIdFromInbox, + extractReceiverShinkaiName, + getOtherPersonIdentity, +} from "../utils/inbox_name_handler"; +import { ShinkaiMessage } from "../models/ShinkaiMessage"; +import { calculateMessageHash } from "../utils/shinkai_message_handler"; +import Avatar from "../components/ui/Avatar"; +import { cn } from "../theme/lib/utils"; +import { send } from "ionicons/icons"; +import "./Chat.css"; +import { + IonContentCustom, + IonFooterCustom, + IonHeaderCustom, +} from "../components/ui/Layout"; + +const parseDate = (dateString: string) => { + return new Date(dateString); +}; + +const JobChat: React.FC = () => { + console.log("Loading Chat.tsx"); + useSetup(); + + const dispatch = useDispatch(); + const setupDetailsState = useSelector( + (state: RootState) => state.setupDetailsState + ); + + const { id } = useParams<{ id: string }>(); + const bottomChatRef = useRef(null); + const deserializedId = decodeURIComponent(id).replace(/~/g, "."); + const [lastKey, setLastKey] = useState(undefined); + const [hasMoreMessages, setHasMoreMessages] = useState(true); + const [prevMessagesLength, setPrevMessagesLength] = useState(0); + + const reduxMessages = useSelector( + (state: RootState) => state.inboxes[deserializedId] + ); + + const [messages, setMessages] = useState([]); + const [inputMessage, setInputMessage] = useState(""); + const otherPersonIdentity = getOtherPersonIdentity( + deserializedId, + setupDetailsState.shinkai_identity + ); + + const extractContent = (messageBody: any) => { + if (messageBody && "unencrypted" in messageBody) { + if ("unencrypted" in messageBody.unencrypted.message_data) { + return JSON.parse( + messageBody.unencrypted.message_data.unencrypted.message_raw_content + ).content; + } else { + return JSON.parse( + messageBody.unencrypted.message_data.encrypted.content + ).content; + } + } else if (messageBody?.encrypted) { + return JSON.parse(messageBody.encrypted.content).content; + } + return ""; + }; + + useEffect(() => { + console.log("deserializedId:", deserializedId); + dispatch( + getLastMessagesFromInbox(deserializedId, 10, lastKey, setupDetailsState) + ); + }, [id, dispatch, setupDetailsState]); + + useEffect(() => { + if (reduxMessages && reduxMessages.length > 0) { + console.log("Redux Messages:", reduxMessages); + const lastMessage = reduxMessages[reduxMessages.length - 1]; + console.log("Last Message:", lastMessage); + const timeKey = lastMessage.external_metadata.scheduled_time; + const hashKey = calculateMessageHash(lastMessage); + const lastMessageKey = `${timeKey}:${hashKey}`; + setLastKey(lastMessageKey); + setMessages(reduxMessages); + + if (reduxMessages.length - prevMessagesLength < 10) { + setHasMoreMessages(false); + } + setPrevMessagesLength(reduxMessages.length); + } + }, [reduxMessages]); + + useEffect(() => { + // Check if the user is at the bottom of the chat + const isUserAtBottom = + bottomChatRef.current && + bottomChatRef.current.getBoundingClientRect().bottom <= + window.innerHeight; + + // If the user is at the bottom, scroll to the bottom + if (isUserAtBottom) { + bottomChatRef.current?.scrollIntoView({ behavior: "smooth" }); + } + }, [messages]); + + const sendMessage = () => { + console.log("Sending message: ", inputMessage); + + // Local Identity + const { shinkai_identity, profile, registration_name } = setupDetailsState; + // let sender = shinkai_identity; + let sender = `${shinkai_identity}/${profile}`; + + console.log("Sender:", sender); + + dispatch( + sendMessageToJob( + extractJobIdFromInbox(deserializedId.toString()), + inputMessage, + sender, + shinkai_identity, + "", + setupDetailsState + ) + ); + setInputMessage(""); + }; + + return ( + + + + + +
+ + {otherPersonIdentity} + + {/**/} +
+
+ + +
+ {hasMoreMessages && ( + + dispatch( + getLastMessagesFromInbox( + deserializedId, + 10, + lastKey, + setupDetailsState, + true + ) + ) + } + > + Load More + + )} + + {messages && + messages + .slice() + .reverse() + .map((message, index) => { + const { shinkai_identity, profile, registration_name } = + setupDetailsState; + + const localIdentity = `${profile}/device/${registration_name}`; + // console.log("Message:", message); + let isLocalMessage = false; + if (message.body && "unencrypted" in message.body) { + isLocalMessage = + message.body.unencrypted.internal_metadata + .sender_subidentity === localIdentity; + } + + return ( + +
+ + +

{extractContent(message.body)}

+ {message?.external_metadata?.scheduled_time && ( + + {parseDate( + message.external_metadata.scheduled_time + ).toLocaleTimeString()} + + )} +
+
+ ); + })} +
+
+
+ + +
{ + e.preventDefault(); + if (inputMessage.trim() !== "") { + sendMessage(); + } + }} + > +
+ setInputMessage(e.detail.value!)} + placeholder="Type a message" + > + + +
+
+
+ + ); +}; + +export default JobChat; diff --git a/shinkai-app/src/pages/Settings.tsx b/shinkai-app/src/pages/Settings.tsx new file mode 100644 index 000000000..de86ee563 --- /dev/null +++ b/shinkai-app/src/pages/Settings.tsx @@ -0,0 +1,18 @@ +import { IonContent, IonHeader, IonPage, IonTitle, IonToolbar } from '@ionic/react'; + +const Settings: React.FC = () => { + return ( + + + + Settings + + + + {/* Your settings UI goes here */} + + + ); +}; + +export default Settings; diff --git a/shinkai-app/src/setupTests.ts b/shinkai-app/src/setupTests.ts new file mode 100644 index 000000000..87988d6bd --- /dev/null +++ b/shinkai-app/src/setupTests.ts @@ -0,0 +1,14 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom/extend-expect'; + +// Mock matchmedia +window.matchMedia = window.matchMedia || function() { + return { + matches: false, + addListener: function() {}, + removeListener: function() {} + }; +}; diff --git a/shinkai-app/src/store/actions.ts b/shinkai-app/src/store/actions.ts new file mode 100644 index 000000000..9f5a49754 --- /dev/null +++ b/shinkai-app/src/store/actions.ts @@ -0,0 +1,96 @@ +import { SerializedAgent } from "../models/SchemaTypes"; +import { SetupDetailsState } from "./reducers"; +import { + GET_PUBLIC_KEY, + USE_REGISTRATION_CODE, + PING_ALL, + REGISTRATION_ERROR, + CREATE_REGISTRATION_CODE, + RECEIVE_LAST_MESSAGES_FROM_INBOX, + CLEAR_REGISTRATION_CODE, + CLEAR_STORE, + ADD_MESSAGE_TO_INBOX, + RECEIVE_ALL_INBOXES_FOR_PROFILE, + RECEIVE_LOAD_MORE_MESSAGES_FROM_INBOX, + GET_AVAILABLE_AGENTS, + CLEAR_MESSAGES, + ADD_AGENTS, +} from "./types"; + +export const getPublicKey = (publicKey: string) => ({ + type: GET_PUBLIC_KEY, + payload: publicKey, +}); + +export const useRegistrationCode = (setupData: SetupDetailsState) => ({ + type: USE_REGISTRATION_CODE, + payload: setupData, +}); + +export const createRegistrationCode = (result: string) => ({ + type: CREATE_REGISTRATION_CODE, + payload: result, +}); + +export const receiveLastMessagesFromInbox = ( + inboxId: string, + messages: any[] +) => ({ + type: RECEIVE_LAST_MESSAGES_FROM_INBOX, + payload: { inboxId, messages }, +}); + +export const receiveLoadMoreMessagesFromInbox = ( + inboxId: string, + messages: any[] +) => ({ + type: RECEIVE_LOAD_MORE_MESSAGES_FROM_INBOX, + + payload: { inboxId, messages }, +}); + +export const registrationError = (error: string) => ({ + type: REGISTRATION_ERROR, + payload: error, +}); + +export const pingAll = (result: string) => ({ + type: PING_ALL, + payload: result, +}); + +export const clearStore = () => { + return { + type: CLEAR_STORE, + }; +}; + +export const clearMessages = () => ({ + type: CLEAR_MESSAGES, +}); + +export const addMessageToInbox = (inboxId: string, message: any) => ({ + type: ADD_MESSAGE_TO_INBOX, + payload: { inboxId, message }, +}); + +export const clearRegistrationCode = () => ({ + type: CLEAR_REGISTRATION_CODE, +}); + +export const receiveAllInboxesForProfile = (inboxes: string[]) => ({ + type: RECEIVE_ALL_INBOXES_FOR_PROFILE, + payload: inboxes, +}); + +export interface AddAgentsAction { + type: typeof ADD_AGENTS; + payload: SerializedAgent[]; +} + +export function addAgents(agents: SerializedAgent[]): AddAgentsAction { + return { + type: ADD_AGENTS, + payload: agents, + }; +} \ No newline at end of file diff --git a/shinkai-app/src/store/index.ts b/shinkai-app/src/store/index.ts new file mode 100644 index 000000000..5859f738b --- /dev/null +++ b/shinkai-app/src/store/index.ts @@ -0,0 +1,28 @@ +import { createStore, applyMiddleware, Store } from 'redux'; +import thunk, { ThunkAction } from 'redux-thunk'; +import storage from 'redux-persist/lib/storage'; +import { persistStore, persistReducer } from 'redux-persist'; +import rootReducer, { RootState as RootStateFromReducer } from './reducers'; +import { Action } from 'redux'; + +export type RootState = RootStateFromReducer; + +export type AppDispatch = Store['dispatch']; + +export type AppThunk = ThunkAction< + ReturnType, + RootState, + unknown, + Action +>; + +const persistConfig = { + key: 'root', + storage, + whitelist: ['registrationStatus', 'setupDetailsState'] +}; + +const persistedReducer = persistReducer(persistConfig, rootReducer); + +export const store = createStore(persistedReducer, applyMiddleware(thunk)); +export const persistor = persistStore(store); diff --git a/shinkai-app/src/store/main.ts b/shinkai-app/src/store/main.ts new file mode 100644 index 000000000..1bb10ff48 --- /dev/null +++ b/shinkai-app/src/store/main.ts @@ -0,0 +1,12 @@ +// src/store/main.ts +import { configureStore } from '@reduxjs/toolkit'; +import chatReducer from '../features/chat/chatSlice'; + +export const store = configureStore({ + reducer: { + chat: chatReducer, + }, +}); + +export type RootState = ReturnType; +export type AppDispatch = typeof store.dispatch; diff --git a/shinkai-app/src/store/reducers.ts b/shinkai-app/src/store/reducers.ts new file mode 100644 index 000000000..c20358dcc --- /dev/null +++ b/shinkai-app/src/store/reducers.ts @@ -0,0 +1,229 @@ +import { Base58String } from "../models/QRSetupData"; +import { SerializedAgent } from "../models/SchemaTypes"; +import { ShinkaiMessage } from "../models/ShinkaiMessage"; +import { calculateMessageHash } from "../utils/shinkai_message_handler"; +import { + Action, + GET_PUBLIC_KEY, + USE_REGISTRATION_CODE, + PING_ALL, + REGISTRATION_ERROR, + CREATE_REGISTRATION_CODE, + CLEAR_REGISTRATION_CODE, + RECEIVE_LAST_MESSAGES_FROM_INBOX, + CLEAR_STORE, + ADD_MESSAGE_TO_INBOX, + RECEIVE_ALL_INBOXES_FOR_PROFILE, + RECEIVE_LOAD_MORE_MESSAGES_FROM_INBOX, + ADD_AGENTS, +} from "./types"; + +export type SetupDetailsState = { + profile: string; + permission_type: string; + registration_name: string; + node_address: string; + shinkai_identity: string; + node_encryption_pk: Base58String; + node_signature_pk: Base58String; + profile_encryption_sk: Base58String; + profile_encryption_pk: Base58String; + profile_identity_sk: Base58String; + profile_identity_pk: Base58String; + my_device_encryption_sk: Base58String; + my_device_encryption_pk: Base58String; + my_device_identity_sk: Base58String; + my_device_identity_pk: Base58String; +}; + +const setupInitialState: SetupDetailsState = { + profile: "", + permission_type: "", + registration_name: "", + node_address: "", + shinkai_identity: "", + node_encryption_pk: "", + node_signature_pk: "", + profile_encryption_sk: "", + profile_encryption_pk: "", + profile_identity_sk: "", + profile_identity_pk: "", + my_device_encryption_sk: "", + my_device_encryption_pk: "", + my_device_identity_sk: "", + my_device_identity_pk: "", +}; + +export interface RootState { + registrationCode: string; + publicKey: string; + registrationStatus: boolean; + pingResult: string; + setupDetailsState: SetupDetailsState; + error: string | null; + inboxes: { + [inboxId: string]: any[]; + }; + messageHashes: { + [inboxId: string]: Set; + }; + agents: { + [agentId: string]: SerializedAgent; + }; +} + +const initialState: RootState = { + publicKey: "", + registrationStatus: false, + pingResult: "", + setupDetailsState: setupInitialState, + registrationCode: "", + error: null, + inboxes: {}, + messageHashes: {}, + agents: {}, +}; + +const rootReducer = (state = initialState, action: Action): RootState => { + switch (action.type) { + case GET_PUBLIC_KEY: + return { ...state, publicKey: action.payload }; + case USE_REGISTRATION_CODE: + return { + ...state, + registrationStatus: true, + setupDetailsState: action.payload, + }; + case RECEIVE_LOAD_MORE_MESSAGES_FROM_INBOX: { + const { inboxId, messages } = action.payload; + const currentMessages = state.inboxes[inboxId] || []; + const currentMessageHashes = state.messageHashes[inboxId] || new Set(); + + const uniqueNewMessages = messages.filter((msg: ShinkaiMessage) => { + const hash = calculateMessageHash(msg); + if (currentMessageHashes.has(hash)) { + return false; + } else { + currentMessageHashes.add(hash); + return true; + } + }); + + return { + ...state, + inboxes: { + ...state.inboxes, + [inboxId]: [...currentMessages, ...uniqueNewMessages], + }, + messageHashes: { + ...state.messageHashes, + [inboxId]: currentMessageHashes, + }, + }; + } + case RECEIVE_LAST_MESSAGES_FROM_INBOX: { + const { inboxId, messages } = action.payload; + const currentMessages = state.inboxes[inboxId] || []; + const currentMessageHashes = state.messageHashes[inboxId] || new Set(); + + const uniqueNewMessages = messages.filter((msg: ShinkaiMessage) => { + const hash = calculateMessageHash(msg); + if (currentMessageHashes.has(hash)) { + return false; + } else { + currentMessageHashes.add(hash); + return true; + } + }); + + return { + ...state, + inboxes: { + ...state.inboxes, + [inboxId]: [...currentMessages, ...uniqueNewMessages], + }, + messageHashes: { + ...state.messageHashes, + [inboxId]: currentMessageHashes, + }, + }; + } + case ADD_MESSAGE_TO_INBOX: { + const { inboxId, message } = action.payload; + const currentMessages = state.inboxes[inboxId] || []; + const currentMessageHashes = state.messageHashes[inboxId] || new Set(); + + const hash = calculateMessageHash(message); + if (currentMessageHashes.has(hash)) { + // If the message is a duplicate, don't add it + return state; + } else { + // If the message is unique, add it to the inbox and the hash to the set + currentMessageHashes.add(hash); + return { + ...state, + inboxes: { + ...state.inboxes, + [inboxId]: [message, ...currentMessages], + }, + messageHashes: { + ...state.messageHashes, + [inboxId]: currentMessageHashes, + }, + }; + } + } + case RECEIVE_ALL_INBOXES_FOR_PROFILE: { + const newInboxes = action.payload; + if (typeof newInboxes !== "object") { + console.error( + "Invalid payload for RECEIVE_ALL_INBOXES_FOR_PROFILE: ", + newInboxes + ); + return state; + } + return { + ...state, + inboxes: { + ...state.inboxes, + ...Object.keys(newInboxes).reduce( + (result: { [key: string]: any[] }, key) => { + if (!state.inboxes[key]) { + console.log("value for key: ", newInboxes[key]); + result[newInboxes[key]] = []; + } + return result; + }, + {} + ), + }, + }; + } + case ADD_AGENTS: { + const newAgents = action.payload; + const updatedAgents = { ...state.agents }; + newAgents.forEach((agent: SerializedAgent) => { + updatedAgents[agent.id] = agent; + }); + return { + ...state, + agents: updatedAgents, + }; + } + case CREATE_REGISTRATION_CODE: + return { ...state, registrationCode: action.payload }; + case REGISTRATION_ERROR: + return { ...state, error: action.payload }; + case CLEAR_REGISTRATION_CODE: + return { ...state, registrationCode: "" }; + case PING_ALL: + return { ...state, pingResult: action.payload }; + case CLEAR_STORE: + state = initialState; + return state; + default: + return state; + } +}; + +export default rootReducer; diff --git a/shinkai-app/src/store/types.ts b/shinkai-app/src/store/types.ts new file mode 100644 index 000000000..ffea88d27 --- /dev/null +++ b/shinkai-app/src/store/types.ts @@ -0,0 +1,19 @@ +export const GET_PUBLIC_KEY = 'GET_PUBLIC_KEY'; +export const USE_REGISTRATION_CODE = 'USE_REGISTRATION_CODE'; +export const CREATE_REGISTRATION_CODE = 'CREATE_REGISTRATION_CODE'; +export const REGISTRATION_ERROR = 'REGISTRATION_ERROR'; +export const PING_ALL = 'PING_ALL'; +export const CLEAR_REGISTRATION_CODE = 'CLEAR_REGISTRATION_CODE'; +export const RECEIVE_LAST_MESSAGES_FROM_INBOX = "RECEIVE_LAST_MESSAGES_FROM_INBOX"; +export const RECEIVE_LOAD_MORE_MESSAGES_FROM_INBOX = "RECEIVE_LOAD_MORE_MESSAGES_FROM_INBOX"; +export const CLEAR_STORE = 'CLEAR_STORE'; +export const ADD_MESSAGE_TO_INBOX = 'ADD_MESSAGE_TO_INBOX'; +export const RECEIVE_ALL_INBOXES_FOR_PROFILE = 'RECEIVE_ALL_INBOXES_FOR_PROFILE'; +export const GET_AVAILABLE_AGENTS = 'GET_AVAILABLE_AGENTS'; +export const CLEAR_MESSAGES = "CLEAR_MESSAGES"; +export const ADD_AGENTS = 'ADD_AGENTS'; + +export interface Action { + type: string; + payload?: any; + } \ No newline at end of file diff --git a/shinkai-app/src/theme/global.css b/shinkai-app/src/theme/global.css new file mode 100644 index 000000000..b1904d464 --- /dev/null +++ b/shinkai-app/src/theme/global.css @@ -0,0 +1,28 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@font-face { + font-family: "Newake"; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url("/fonts/newake.otf") format("truetype"); +} + +/*add inter variable font*/ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 400 700; + font-display: optional; + src: url(/fonts/inter-var-latin.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, + U+2215, U+FEFF, U+FFFD; +} + + +body { + @apply font-inter; +} diff --git a/shinkai-app/src/theme/lib/utils.ts b/shinkai-app/src/theme/lib/utils.ts new file mode 100644 index 000000000..ec79801fe --- /dev/null +++ b/shinkai-app/src/theme/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/shinkai-app/src/theme/variables.css b/shinkai-app/src/theme/variables.css new file mode 100644 index 000000000..05cfd7604 --- /dev/null +++ b/shinkai-app/src/theme/variables.css @@ -0,0 +1,236 @@ +/* Ionic Variables and Theming. For more info, please see: +http://ionicframework.com/docs/theming/ */ + +/** Ionic CSS Variables **/ +:root { + /** primary **/ + --ion-color-primary: rgb(28, 58, 58); + --ion-color-primary-rgb: 56, 128, 255; + --ion-color-primary-contrast: #ffffff; + --ion-color-primary-contrast-rgb: 255, 255, 255; + --ion-color-primary-shade: #3171e0; + --ion-color-primary-tint: #4c8dff; + + /** secondary **/ + --ion-color-secondary: #3dc2ff; + --ion-color-secondary-rgb: 61, 194, 255; + --ion-color-secondary-contrast: #ffffff; + --ion-color-secondary-contrast-rgb: 255, 255, 255; + --ion-color-secondary-shade: #36abe0; + --ion-color-secondary-tint: #50c8ff; + + /** tertiary **/ + --ion-color-tertiary: #5260ff; + --ion-color-tertiary-rgb: 82, 96, 255; + --ion-color-tertiary-contrast: #ffffff; + --ion-color-tertiary-contrast-rgb: 255, 255, 255; + --ion-color-tertiary-shade: #4854e0; + --ion-color-tertiary-tint: #6370ff; + + /** success **/ + --ion-color-success: #2dd36f; + --ion-color-success-rgb: 45, 211, 111; + --ion-color-success-contrast: #ffffff; + --ion-color-success-contrast-rgb: 255, 255, 255; + --ion-color-success-shade: #28ba62; + --ion-color-success-tint: #42d77d; + + /** warning **/ + --ion-color-warning: #ffc409; + --ion-color-warning-rgb: 255, 196, 9; + --ion-color-warning-contrast: #000000; + --ion-color-warning-contrast-rgb: 0, 0, 0; + --ion-color-warning-shade: #e0ac08; + --ion-color-warning-tint: #ffca22; + + /** danger **/ + --ion-color-danger: #eb445a; + --ion-color-danger-rgb: 235, 68, 90; + --ion-color-danger-contrast: #ffffff; + --ion-color-danger-contrast-rgb: 255, 255, 255; + --ion-color-danger-shade: #cf3c4f; + --ion-color-danger-tint: #ed576b; + + /** dark **/ + --ion-color-dark: #222428; + --ion-color-dark-rgb: 34, 36, 40; + --ion-color-dark-contrast: #ffffff; + --ion-color-dark-contrast-rgb: 255, 255, 255; + --ion-color-dark-shade: #1e2023; + --ion-color-dark-tint: #383a3e; + + /** medium **/ + --ion-color-medium: #92949c; + --ion-color-medium-rgb: 146, 148, 156; + --ion-color-medium-contrast: #ffffff; + --ion-color-medium-contrast-rgb: 255, 255, 255; + --ion-color-medium-shade: #808289; + --ion-color-medium-tint: #9d9fa6; + + /** light **/ + --ion-color-light: #f4f5f8; + --ion-color-light-rgb: 244, 245, 248; + --ion-color-light-contrast: #000000; + --ion-color-light-contrast-rgb: 0, 0, 0; + --ion-color-light-shade: #d7d8da; + --ion-color-light-tint: #f5f6f9; +} + +@media (prefers-color-scheme: dark) { + /* + * Dark Colors + * ------------------------------------------- + */ + + body { + --ion-color-primary: rgb(28, 58, 58); + --ion-color-primary-rgb: 66,140,255; + --ion-color-primary-contrast: #ffffff; + --ion-color-primary-contrast-rgb: 255,255,255; + --ion-color-primary-shade: #3a7be0; + --ion-color-primary-tint: #5598ff; + + --ion-color-secondary: #50c8ff; + --ion-color-secondary-rgb: 80,200,255; + --ion-color-secondary-contrast: #ffffff; + --ion-color-secondary-contrast-rgb: 255,255,255; + --ion-color-secondary-shade: #46b0e0; + --ion-color-secondary-tint: #62ceff; + + --ion-color-tertiary: #6a64ff; + --ion-color-tertiary-rgb: 106,100,255; + --ion-color-tertiary-contrast: #ffffff; + --ion-color-tertiary-contrast-rgb: 255,255,255; + --ion-color-tertiary-shade: #5d58e0; + --ion-color-tertiary-tint: #7974ff; + + --ion-color-success: #2fdf75; + --ion-color-success-rgb: 47,223,117; + --ion-color-success-contrast: #000000; + --ion-color-success-contrast-rgb: 0,0,0; + --ion-color-success-shade: #29c467; + --ion-color-success-tint: #44e283; + + --ion-color-warning: #ffd534; + --ion-color-warning-rgb: 255,213,52; + --ion-color-warning-contrast: #000000; + --ion-color-warning-contrast-rgb: 0,0,0; + --ion-color-warning-shade: #e0bb2e; + --ion-color-warning-tint: #ffd948; + + --ion-color-danger: #ff4961; + --ion-color-danger-rgb: 255,73,97; + --ion-color-danger-contrast: #ffffff; + --ion-color-danger-contrast-rgb: 255,255,255; + --ion-color-danger-shade: #e04055; + --ion-color-danger-tint: #ff5b71; + + --ion-color-dark: #f4f5f8; + --ion-color-dark-rgb: 244,245,248; + --ion-color-dark-contrast: #000000; + --ion-color-dark-contrast-rgb: 0,0,0; + --ion-color-dark-shade: #d7d8da; + --ion-color-dark-tint: #f5f6f9; + + --ion-color-medium: #989aa2; + --ion-color-medium-rgb: 152,154,162; + --ion-color-medium-contrast: #000000; + --ion-color-medium-contrast-rgb: 0,0,0; + --ion-color-medium-shade: #86888f; + --ion-color-medium-tint: #a2a4ab; + + --ion-color-light: #222428; + --ion-color-light-rgb: 34,36,40; + --ion-color-light-contrast: #ffffff; + --ion-color-light-contrast-rgb: 255,255,255; + --ion-color-light-shade: #1e2023; + --ion-color-light-tint: #383a3e; + } + + /* + * iOS Dark Theme + * ------------------------------------------- + */ + + .ios body { + --ion-background-color: #000000; + --ion-background-color-rgb: 0,0,0; + + --ion-text-color: #ffffff; + --ion-text-color-rgb: 255,255,255; + + --ion-color-step-50: #0d0d0d; + --ion-color-step-100: #1a1a1a; + --ion-color-step-150: #262626; + --ion-color-step-200: #333333; + --ion-color-step-250: #404040; + --ion-color-step-300: #4d4d4d; + --ion-color-step-350: #595959; + --ion-color-step-400: #666666; + --ion-color-step-450: #737373; + --ion-color-step-500: #808080; + --ion-color-step-550: #8c8c8c; + --ion-color-step-600: #999999; + --ion-color-step-650: #a6a6a6; + --ion-color-step-700: #b3b3b3; + --ion-color-step-750: #bfbfbf; + --ion-color-step-800: #cccccc; + --ion-color-step-850: #d9d9d9; + --ion-color-step-900: #e6e6e6; + --ion-color-step-950: #f2f2f2; + + --ion-item-background: #000000; + + --ion-card-background: #1c1c1d; + } + + .ios ion-modal { + --ion-background-color: var(--ion-color-step-100); + --ion-toolbar-background: var(--ion-color-step-150); + --ion-toolbar-border-color: var(--ion-color-step-250); + } + + + /* + * Material Design Dark Theme + * ------------------------------------------- + */ + + .md body { + --ion-background-color: #121212; + --ion-background-color-rgb: 18,18,18; + + --ion-text-color: #ffffff; + --ion-text-color-rgb: 255,255,255; + + --ion-border-color: #222222; + + --ion-color-step-50: #1e1e1e; + --ion-color-step-100: #2a2a2a; + --ion-color-step-150: #363636; + --ion-color-step-200: #414141; + --ion-color-step-250: #4d4d4d; + --ion-color-step-300: #595959; + --ion-color-step-350: #656565; + --ion-color-step-400: #717171; + --ion-color-step-450: #7d7d7d; + --ion-color-step-500: #898989; + --ion-color-step-550: #949494; + --ion-color-step-600: #a0a0a0; + --ion-color-step-650: #acacac; + --ion-color-step-700: #b8b8b8; + --ion-color-step-750: #c4c4c4; + --ion-color-step-800: #d0d0d0; + --ion-color-step-850: #dbdbdb; + --ion-color-step-900: #e7e7e7; + --ion-color-step-950: #f3f3f3; + + --ion-item-background: #1e1e1e; + + --ion-toolbar-background: #1f1f1f; + + --ion-tab-bar-background: #1f1f1f; + + --ion-card-background: #1e1e1e; + } +} diff --git a/shinkai-app/src/types.d.ts b/shinkai-app/src/types.d.ts new file mode 100644 index 000000000..e8e550d94 --- /dev/null +++ b/shinkai-app/src/types.d.ts @@ -0,0 +1,7 @@ +export type AppThunk = ThunkAction< + ReturnType, + RootState, + unknown, + Action +>; + diff --git a/shinkai-app/src/utils/inbox_name_handler.test.ts b/shinkai-app/src/utils/inbox_name_handler.test.ts new file mode 100644 index 000000000..03acdb47f --- /dev/null +++ b/shinkai-app/src/utils/inbox_name_handler.test.ts @@ -0,0 +1,51 @@ +import { assert, suite } from 'vitest'; +import { extractReceiverShinkaiName, getOtherPersonIdentity, ShinkaiNameError } from './inbox_name_handler'; + +suite('extractReceiverShinkaiName', () => { + test('returns correct receiver name', () => { + const result = extractReceiverShinkaiName( + 'inbox::@@node1.shinkai/main::@@node1.shinkai/main/device/main_device::false', + '@@node1.shinkai' + ); + assert.equal(result, '@@node1.shinkai', 'Returned the correct receiver name'); + }); + + test('throws error for invalid format (too few parts)', () => { + assert.throws(() => { + extractReceiverShinkaiName('inbox::@@node1.shinkai', '@@node1.shinkai'); + }, ShinkaiNameError, 'InvalidFormat'); + }); + + test('throws error for invalid format (too many parts)', () => { + assert.throws(() => { + extractReceiverShinkaiName('inbox::' + '@@node1.shinkai::'.repeat(100), '@@node1.shinkai'); + }, ShinkaiNameError, 'InvalidFormat'); + }); + + test('throws error for invalid format (regex mismatch)', () => { + assert.throws(() => { + extractReceiverShinkaiName('inbox::@@invalid_node/main::@@node1.shinkai/main/device/main_device::false', '@@node1.shinkai'); + }, ShinkaiNameError, 'InvalidFormat'); + }); +}); + +describe('getOtherPersonIdentity', () => { + it('should return the other person identity', () => { + const inboxName = 'inbox::@@node1.shinkai/main::@@node1.shinkai/main/device/main_device::false'; + const myIdentity = '@@node1.shinkai/main/device/main_device'; + const expectedIdentity = '@@node1.shinkai/main'; + + const result = getOtherPersonIdentity(inboxName, myIdentity); + + expect(result).toBe(expectedIdentity); + }); + + it('should return empty string if no other identity is found', () => { + const inboxName = 'inbox::@@node1.shinkai/main/device/main_device::false'; + const myIdentity = '@@node1.shinkai/main/device/main_device'; + + const result = getOtherPersonIdentity(inboxName, myIdentity); + + expect(result).toBe(undefined); + }); +}); \ No newline at end of file diff --git a/shinkai-app/src/utils/inbox_name_handler.ts b/shinkai-app/src/utils/inbox_name_handler.ts new file mode 100644 index 000000000..da02c42f4 --- /dev/null +++ b/shinkai-app/src/utils/inbox_name_handler.ts @@ -0,0 +1,60 @@ +export class ShinkaiNameError extends Error { + constructor(public type: "InvalidFormat" | "ReceiverNotFound") { + super(`Shinkai Name Error: ${type}`); + this.name = "ShinkaiNameError"; + Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain + } +} + +export const getOtherPersonIdentity = (inboxName: string, myIdentity: string) => { + const parts = inboxName.split("::"); + const otherPersonIdentity = parts.filter(part => part !== myIdentity && part !== 'inbox' && part !== 'false'); + return otherPersonIdentity[0]; +}; + +export const extractReceiverShinkaiName = ( + deserializedId: string, + senderShinkaiName: string +): string => { + const parts: string[] = deserializedId.split("::"); + if (parts.length < 3 || parts.length > 101) { + throw new ShinkaiNameError("InvalidFormat"); + } + + const nodeRegex = /^@@[a-zA-Z0-9\_]+\.shinkai.*$/; + let receiverShinkaiName = ""; + let hasSeenSender = false; + + for (let i = 1; i < parts.length - 1; i++) { + const part = parts[i].split("/")[0]; // Extract base part of the shinkai name + if (!nodeRegex.test(part)) { + throw new ShinkaiNameError("InvalidFormat"); + } + + // Skip the sender's shinkai name + if (part === senderShinkaiName && hasSeenSender === false) { + hasSeenSender = true; + continue; + } + + // Assign the receiver's shinkai name and break the loop + receiverShinkaiName = part; + break; + } + + if (receiverShinkaiName === "") { + throw new ShinkaiNameError("ReceiverNotFound"); + } + + return receiverShinkaiName; +}; + +export const extractJobIdFromInbox = (deserializedId: string): string => { + const parts: string[] = deserializedId.split("::"); + if (parts.length < 3 || parts[0] !== 'job_inbox') { + throw new ShinkaiNameError("InvalidFormat"); + } + + const jobId = parts[1]; + return jobId; +}; \ No newline at end of file diff --git a/shinkai-app/src/utils/shinkai_message_handler.ts b/shinkai-app/src/utils/shinkai_message_handler.ts new file mode 100644 index 000000000..702d71cfd --- /dev/null +++ b/shinkai-app/src/utils/shinkai_message_handler.ts @@ -0,0 +1,7 @@ +import { ShinkaiMessage } from "../models/ShinkaiMessage"; +import { ShinkaiMessageWrapper } from "../lib/wasm/ShinkaiMessageWrapper"; + +export function calculateMessageHash(message: ShinkaiMessage): string { + const messageWrapper = new ShinkaiMessageWrapper(message); + return messageWrapper.calculate_hash(); +} diff --git a/shinkai-app/src/utils/validation.test.ts b/shinkai-app/src/utils/validation.test.ts new file mode 100644 index 000000000..db154749f --- /dev/null +++ b/shinkai-app/src/utils/validation.test.ts @@ -0,0 +1,10 @@ +import { test } from 'vitest'; +import { validateInboxName } from './validation'; + +test('Validates inbox names correctly', () => { + expect(validateInboxName("part1|part2::part3|part4::part5|part6::true")).toBe(true); + expect(validateInboxName("part1|part2::part3::part4::false")).toBe(false); + expect(validateInboxName("part1|part2::part3|part4::part5|part6::maybe")).toBe(false); + expect(validateInboxName("part1|part2|part3|part4::part5|part6::true")).toBe(false); + expect(validateInboxName("part1::part2|part3::part4|part5|part6::false")).toBe(false); +}); diff --git a/shinkai-app/src/utils/validation.ts b/shinkai-app/src/utils/validation.ts new file mode 100644 index 000000000..d3fb695d1 --- /dev/null +++ b/shinkai-app/src/utils/validation.ts @@ -0,0 +1,18 @@ +export function validateInboxName(s: string): boolean { + const parts = s.split("::"); + + if (parts.length !== 4) { + return false; + } + + const isE2e = parts[3] === "true" || parts[3] === "false"; + + const senderParts = parts[1].split("|"); + const recipientParts = parts[2].split("|"); + + if (senderParts.length !== 2 || recipientParts.length !== 2) { + return false; + } + + return isE2e; +} diff --git a/shinkai-app/src/utils/wasm_helpers.test.ts b/shinkai-app/src/utils/wasm_helpers.test.ts new file mode 100644 index 000000000..265fc6153 --- /dev/null +++ b/shinkai-app/src/utils/wasm_helpers.test.ts @@ -0,0 +1,51 @@ +import { sha512 } from '@noble/hashes/sha512'; +import { generateEncryptionKeys, generateSignatureKeys, test_util_generateKeys } from './wasm_helpers'; +import * as ed from '@noble/ed25519'; + +// Enable synchronous methods +ed.etc.sha512Sync = (...m) => sha512(ed.etc.concatBytes(...m)); + +const { Crypto } = require("@peculiar/webcrypto"); +const crypto = new Crypto(); +globalThis.crypto = crypto; + +describe('Key generation functions', () => { + + test('should generate valid encryption keys', async () => { + const seed = new Uint8Array(32); + const keys = await generateEncryptionKeys(seed); + + expect(keys).toHaveProperty('my_encryption_sk_string'); + expect(keys).toHaveProperty('my_encryption_pk_string'); + + expect(typeof keys.my_encryption_sk_string).toBe('string'); + expect(typeof keys.my_encryption_pk_string).toBe('string'); + }); + + test('should generate valid signature keys', async () => { + const keys = await generateSignatureKeys(); + + expect(keys).toHaveProperty('my_identity_sk_string'); + expect(keys).toHaveProperty('my_identity_pk_string'); + + expect(typeof keys.my_identity_sk_string).toBe('string'); + expect(typeof keys.my_identity_pk_string).toBe('string'); + }); + + test('should generate all required keys', async () => { + const keys = await test_util_generateKeys(); + + expect(keys).toHaveProperty('my_encryption_sk_string'); + expect(keys).toHaveProperty('my_encryption_pk_string'); + expect(keys).toHaveProperty('receiver_public_key_string'); + expect(keys).toHaveProperty('my_identity_sk_string'); + expect(keys).toHaveProperty('my_identity_pk_string'); + + expect(typeof keys.my_encryption_sk_string).toBe('string'); + expect(typeof keys.my_encryption_pk_string).toBe('string'); + expect(typeof keys.receiver_public_key_string).toBe('string'); + expect(typeof keys.my_identity_sk_string).toBe('string'); + expect(typeof keys.my_identity_pk_string).toBe('string'); + }); + +}); diff --git a/shinkai-app/src/utils/wasm_helpers.ts b/shinkai-app/src/utils/wasm_helpers.ts new file mode 100644 index 000000000..bf47fd001 --- /dev/null +++ b/shinkai-app/src/utils/wasm_helpers.ts @@ -0,0 +1,60 @@ + +import { generateKeyPair } from 'curve25519-js'; +import * as ed from '@noble/ed25519'; + +type HexString = string; + +export function toHexString(byteArray: Uint8Array) { + return Array.from(byteArray, function(byte) { + return ('0' + (byte & 0xFF).toString(16)).slice(-2); + }).join('') +} + +export const generateEncryptionKeys = async (seed: Uint8Array): Promise<{my_encryption_sk_string: HexString, my_encryption_pk_string: HexString}> => { + const encryptionKeys = generateKeyPair(seed); + const my_encryption_sk_string: string = toHexString(encryptionKeys.private); + const my_encryption_pk_string: string = toHexString(encryptionKeys.public); + + return { + my_encryption_sk_string, + my_encryption_pk_string, + } +} + +export const generateSignatureKeys = async (): Promise<{my_identity_sk_string: HexString, my_identity_pk_string: HexString}> => { + const privKey = ed.utils.randomPrivateKey(); + const pubKey = await ed.getPublicKeyAsync(privKey); + + const my_identity_sk_string: string = toHexString(privKey); + const my_identity_pk_string: string = toHexString(pubKey); + + return { + my_identity_sk_string, + my_identity_pk_string, + } +} + +export const test_util_generateKeys = async (): Promise<{my_encryption_sk_string: HexString, my_encryption_pk_string: HexString, receiver_public_key_string: HexString, my_identity_sk_string: HexString, my_identity_pk_string: HexString}> => { + const seed = new Uint8Array(32); + + const encryptionKeys = await generateEncryptionKeys(seed); + const signatureKeys = await generateSignatureKeys(); + + return { + ...encryptionKeys, + receiver_public_key_string: encryptionKeys.my_encryption_pk_string, + ...signatureKeys + } +} + +export function mapEncryptionMethod(encryption: String): number { + switch (encryption) { + case "DiffieHellmanChaChaPoly1305": + return 0; + case "None": + return 1; + default: + throw new Error("Unknown encryption method"); + } + } + \ No newline at end of file diff --git a/shinkai-app/src/vite-env.d.ts b/shinkai-app/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/shinkai-app/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/shinkai-app/tailwind.config.js b/shinkai-app/tailwind.config.js new file mode 100644 index 000000000..a7ac48196 --- /dev/null +++ b/shinkai-app/tailwind.config.js @@ -0,0 +1,35 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + // darkMode: ["class"], + content: ["./src/**/*.tsx", "./src/**/*.html", "./src/**/*.css"], + theme: { + container: { + center: true, + padding: ["1rem", "1.5rem", "2rem"], + screens: { + "2xl": "1400px", + }, + }, + extend: { + backgroundImage: { + hero: 'url("https://shinkai.com/assets/bg-hero.webp")', + }, + fontFamily: { + inter: ["Inter", "sans-serif"], + newake: ["Newake", "sans-serif"], + }, + colors: { + primary: "var(--ion-color-primary)", + secondary: "var(--ion-color-secondary)", + brand: { + 200: "#FFD9D9", + 400: "#FE6062", + 600: "#FE5153", + }, + accent: "rgb(9, 9, 11)", + muted: "rgb(114, 113, 122)", + }, + }, + }, + plugins: [require("tailwindcss-animate")], +}; diff --git a/shinkai-app/tsconfig.json b/shinkai-app/tsconfig.json new file mode 100644 index 000000000..ccfdf1283 --- /dev/null +++ b/shinkai-app/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": false, + "jsx": "react-jsx", + "sourceMap": true, + "noImplicitAny": true, + "outDir": "./dist/", + "paths":{ + "crypto":["./node_modules/crypto-js"] + } + }, + "include": ["src", "types.d.ts"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/shinkai-app/tsconfig.node.json b/shinkai-app/tsconfig.node.json new file mode 100644 index 000000000..9d31e2aed --- /dev/null +++ b/shinkai-app/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/shinkai-app/vite.config.ts b/shinkai-app/vite.config.ts new file mode 100644 index 000000000..c7ba00cf5 --- /dev/null +++ b/shinkai-app/vite.config.ts @@ -0,0 +1,15 @@ +import legacy from "@vitejs/plugin-legacy"; +import wasm from "vite-plugin-wasm"; +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), legacy(), wasm()], + test: { + watch: false, + globals: true, + environment: "jsdom", + setupFiles: "./src/setupTests.ts", + }, +});