From a3d0e624c780cf79df833be4d5acb17095061a07 Mon Sep 17 00:00:00 2001 From: Carlos Eduardo Ferreyra Date: Wed, 7 Aug 2024 16:56:03 -0300 Subject: [PATCH] Initial commit --- .github/workflows/FrontCi.yml | 31 + .gitignore | 44 + CurrentDefault.code-profile | 1 + Dockerfile | 34 + FrontAdmin/.env.production | 1 + FrontAdmin/.eslintrc.cjs | 21 + FrontAdmin/index.html | 13 + FrontAdmin/package-lock.json | 4973 +++++++++++++++++ FrontAdmin/package.json | 38 + FrontAdmin/public/TUP.png | Bin 0 -> 35595 bytes FrontAdmin/src/API/DatosEstadistica.ts | 48 + FrontAdmin/src/API/Login.ts | 21 + FrontAdmin/src/App.tsx | 62 + .../src/components/NavBar/LinksItems.tsx | 12 + .../src/components/NavBar/MobileNav.tsx | 39 + FrontAdmin/src/components/NavBar/NavBar.tsx | 26 + FrontAdmin/src/components/NavBar/NavItem.tsx | 22 + .../src/components/NavBar/SidebarContent.tsx | 41 + FrontAdmin/src/components/Pages/Error404.tsx | 29 + .../Pages/Estadisticas/Chars/Donut.tsx | 53 + .../Pages/Estadisticas/Estadisticas.tsx | 36 + .../Estadisticas/SubPages/Calendario.tsx | 77 + .../Estadisticas/SubPages/Cuatrimestral.tsx | 92 + .../Pages/Estadisticas/SubPages/Mensual.tsx | 91 + .../src/components/Pages/Login/LoginPage.tsx | 146 + FrontAdmin/src/components/icons/alumno 1.png | Bin 0 -> 2455 bytes .../components/icons/burbuja-de-chat 1.png | Bin 0 -> 1308 bytes .../src/components/icons/configuracion 1.png | Bin 0 -> 1620 bytes .../components/icons/grafico-de-barras 1.png | Bin 0 -> 555 bytes FrontAdmin/src/main.tsx | 10 + FrontAdmin/src/vite-env.d.ts | 1 + FrontAdmin/tsconfig.json | 25 + FrontAdmin/tsconfig.node.json | 11 + FrontAdmin/vite.config.ts | 7 + LICENSE | 21 + README.md | 247 + SECURITY.md | 21 + backend/api/__init__.py | 0 .../api/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 169 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 0 -> 1224 bytes backend/api/__pycache__/tests.cpython-312.pyc | Bin 0 -> 213 bytes backend/api/__pycache__/urls.cpython-312.pyc | Bin 0 -> 1155 bytes backend/api/admin.py | 3 + backend/api/apps.py | 11 + backend/api/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 180 bytes backend/api/models.py | 3 + backend/api/schemas.py | 6 + backend/api/serializers.py | 22 + backend/api/signals.py | 25 + backend/api/tests.py | 3 + backend/api/urls.py | 33 + backend/api/views.py | 3 + backend/core/__init__.py | 0 .../core/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 170 bytes .../core/__pycache__/admin.cpython-312.pyc | Bin 0 -> 250 bytes backend/core/__pycache__/apps.cpython-312.pyc | Bin 0 -> 472 bytes .../core/__pycache__/models.cpython-312.pyc | Bin 0 -> 15324 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 0 -> 5601 bytes .../core/__pycache__/tests.cpython-312.pyc | Bin 0 -> 214 bytes backend/core/__pycache__/urls.cpython-312.pyc | Bin 0 -> 1610 bytes .../core/__pycache__/views.cpython-312.pyc | Bin 0 -> 5828 bytes backend/core/admin.py | 25 + backend/core/apps.py | 6 + backend/core/migrations/0001_initial.py | 138 + backend/core/migrations/0002_initial.py | 100 + backend/core/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 5549 bytes .../__pycache__/0002_initial.cpython-312.pyc | Bin 0 -> 4634 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 181 bytes backend/core/models.py | 327 ++ backend/core/serializers.py | 97 + backend/core/tests.py | 3 + backend/core/urls.py | 24 + backend/core/views.py | 113 + backend/manage.py | 22 + backend/schema.yml | 3783 +++++++++++++ backend/server/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 172 bytes .../server/__pycache__/urls.cpython-312.pyc | Bin 0 -> 1858 bytes .../server/__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 663 bytes backend/server/asgi.py | 16 + backend/server/db.sqlite3 | Bin 0 -> 356352 bytes backend/server/settings/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 181 bytes .../settings/__pycache__/base.cpython-312.pyc | Bin 0 -> 7505 bytes .../settings/__pycache__/dev.cpython-312.pyc | Bin 0 -> 1863 bytes backend/server/settings/base.py | 330 ++ backend/server/settings/dev.py | 85 + backend/server/settings/production.py | 713 +++ backend/server/urls.py | 39 + backend/server/wsgi.py | 16 + backend/users/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 171 bytes .../users/__pycache__/admin.cpython-312.pyc | Bin 0 -> 672 bytes .../users/__pycache__/apps.cpython-312.pyc | Bin 0 -> 729 bytes .../__pycache__/backends.cpython-312.pyc | Bin 0 -> 2396 bytes .../users/__pycache__/models.cpython-312.pyc | Bin 0 -> 2800 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 0 -> 1859 bytes .../users/__pycache__/tests.cpython-312.pyc | Bin 0 -> 5245 bytes .../users/__pycache__/urls.cpython-312.pyc | Bin 0 -> 472 bytes .../users/__pycache__/views.cpython-312.pyc | Bin 0 -> 263 bytes backend/users/admin.py | 16 + backend/users/apps.py | 14 + backend/users/backends.py | 63 + backend/users/migrations/0001_initial.py | 44 + .../migrations/0002_alter_customuser_email.py | 18 + .../0003_alter_customuser_options.py | 17 + backend/users/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 3631 bytes ...002_alter_customuser_email.cpython-312.pyc | Bin 0 -> 805 bytes ...3_alter_customuser_options.cpython-312.pyc | Bin 0 -> 699 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 182 bytes backend/users/models.py | 65 + backend/users/permissions.py | 0 backend/users/serializers.py | 84 + backend/users/tests.py | 110 + backend/users/urls.py | 23 + backend/users/views.py | 1 + docs/.obsidian/app.json | 1 + docs/.obsidian/appearance.json | 3 + docs/.obsidian/core-plugins-migration.json | 30 + docs/.obsidian/core-plugins.json | 20 + docs/.obsidian/workspace.json | 156 + docs/Notas de Clase/2024-05-22.md | 42 + docs/Notas de Clase/2024-06-12.md | 89 + docs/Notas de Clase/2024-06-26.md | 20 + docs/notas/Resumen de Informes.md | 22 + mysql_schema.pdf | Bin 0 -> 39536 bytes nixpacks.toml | 0 package-lock.json | 6 + requirements.txt | 47 + 132 files changed, 13131 insertions(+) create mode 100644 .github/workflows/FrontCi.yml create mode 100644 .gitignore create mode 100644 CurrentDefault.code-profile create mode 100644 Dockerfile create mode 100644 FrontAdmin/.env.production create mode 100644 FrontAdmin/.eslintrc.cjs create mode 100644 FrontAdmin/index.html create mode 100644 FrontAdmin/package-lock.json create mode 100644 FrontAdmin/package.json create mode 100644 FrontAdmin/public/TUP.png create mode 100644 FrontAdmin/src/API/DatosEstadistica.ts create mode 100644 FrontAdmin/src/API/Login.ts create mode 100644 FrontAdmin/src/App.tsx create mode 100644 FrontAdmin/src/components/NavBar/LinksItems.tsx create mode 100644 FrontAdmin/src/components/NavBar/MobileNav.tsx create mode 100644 FrontAdmin/src/components/NavBar/NavBar.tsx create mode 100644 FrontAdmin/src/components/NavBar/NavItem.tsx create mode 100644 FrontAdmin/src/components/NavBar/SidebarContent.tsx create mode 100644 FrontAdmin/src/components/Pages/Error404.tsx create mode 100644 FrontAdmin/src/components/Pages/Estadisticas/Chars/Donut.tsx create mode 100644 FrontAdmin/src/components/Pages/Estadisticas/Estadisticas.tsx create mode 100644 FrontAdmin/src/components/Pages/Estadisticas/SubPages/Calendario.tsx create mode 100644 FrontAdmin/src/components/Pages/Estadisticas/SubPages/Cuatrimestral.tsx create mode 100644 FrontAdmin/src/components/Pages/Estadisticas/SubPages/Mensual.tsx create mode 100644 FrontAdmin/src/components/Pages/Login/LoginPage.tsx create mode 100644 FrontAdmin/src/components/icons/alumno 1.png create mode 100644 FrontAdmin/src/components/icons/burbuja-de-chat 1.png create mode 100644 FrontAdmin/src/components/icons/configuracion 1.png create mode 100644 FrontAdmin/src/components/icons/grafico-de-barras 1.png create mode 100644 FrontAdmin/src/main.tsx create mode 100644 FrontAdmin/src/vite-env.d.ts create mode 100644 FrontAdmin/tsconfig.json create mode 100644 FrontAdmin/tsconfig.node.json create mode 100644 FrontAdmin/vite.config.ts create mode 100644 LICENSE create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 backend/api/__init__.py create mode 100644 backend/api/__pycache__/__init__.cpython-312.pyc create mode 100644 backend/api/__pycache__/serializers.cpython-312.pyc create mode 100644 backend/api/__pycache__/tests.cpython-312.pyc create mode 100644 backend/api/__pycache__/urls.cpython-312.pyc create mode 100644 backend/api/admin.py create mode 100644 backend/api/apps.py create mode 100644 backend/api/migrations/__init__.py create mode 100644 backend/api/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 backend/api/models.py create mode 100644 backend/api/schemas.py create mode 100644 backend/api/serializers.py create mode 100644 backend/api/signals.py create mode 100644 backend/api/tests.py create mode 100644 backend/api/urls.py create mode 100644 backend/api/views.py create mode 100644 backend/core/__init__.py create mode 100644 backend/core/__pycache__/__init__.cpython-312.pyc create mode 100644 backend/core/__pycache__/admin.cpython-312.pyc create mode 100644 backend/core/__pycache__/apps.cpython-312.pyc create mode 100644 backend/core/__pycache__/models.cpython-312.pyc create mode 100644 backend/core/__pycache__/serializers.cpython-312.pyc create mode 100644 backend/core/__pycache__/tests.cpython-312.pyc create mode 100644 backend/core/__pycache__/urls.cpython-312.pyc create mode 100644 backend/core/__pycache__/views.cpython-312.pyc create mode 100644 backend/core/admin.py create mode 100644 backend/core/apps.py create mode 100644 backend/core/migrations/0001_initial.py create mode 100644 backend/core/migrations/0002_initial.py create mode 100644 backend/core/migrations/__init__.py create mode 100644 backend/core/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 backend/core/migrations/__pycache__/0002_initial.cpython-312.pyc create mode 100644 backend/core/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 backend/core/models.py create mode 100644 backend/core/serializers.py create mode 100644 backend/core/tests.py create mode 100644 backend/core/urls.py create mode 100644 backend/core/views.py create mode 100755 backend/manage.py create mode 100644 backend/schema.yml create mode 100644 backend/server/__init__.py create mode 100644 backend/server/__pycache__/__init__.cpython-312.pyc create mode 100644 backend/server/__pycache__/urls.cpython-312.pyc create mode 100644 backend/server/__pycache__/wsgi.cpython-312.pyc create mode 100644 backend/server/asgi.py create mode 100644 backend/server/db.sqlite3 create mode 100644 backend/server/settings/__init__.py create mode 100644 backend/server/settings/__pycache__/__init__.cpython-312.pyc create mode 100644 backend/server/settings/__pycache__/base.cpython-312.pyc create mode 100644 backend/server/settings/__pycache__/dev.cpython-312.pyc create mode 100644 backend/server/settings/base.py create mode 100644 backend/server/settings/dev.py create mode 100644 backend/server/settings/production.py create mode 100644 backend/server/urls.py create mode 100644 backend/server/wsgi.py create mode 100644 backend/users/__init__.py create mode 100644 backend/users/__pycache__/__init__.cpython-312.pyc create mode 100644 backend/users/__pycache__/admin.cpython-312.pyc create mode 100644 backend/users/__pycache__/apps.cpython-312.pyc create mode 100644 backend/users/__pycache__/backends.cpython-312.pyc create mode 100644 backend/users/__pycache__/models.cpython-312.pyc create mode 100644 backend/users/__pycache__/serializers.cpython-312.pyc create mode 100644 backend/users/__pycache__/tests.cpython-312.pyc create mode 100644 backend/users/__pycache__/urls.cpython-312.pyc create mode 100644 backend/users/__pycache__/views.cpython-312.pyc create mode 100644 backend/users/admin.py create mode 100644 backend/users/apps.py create mode 100644 backend/users/backends.py create mode 100644 backend/users/migrations/0001_initial.py create mode 100644 backend/users/migrations/0002_alter_customuser_email.py create mode 100644 backend/users/migrations/0003_alter_customuser_options.py create mode 100644 backend/users/migrations/__init__.py create mode 100644 backend/users/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 backend/users/migrations/__pycache__/0002_alter_customuser_email.cpython-312.pyc create mode 100644 backend/users/migrations/__pycache__/0003_alter_customuser_options.cpython-312.pyc create mode 100644 backend/users/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 backend/users/models.py create mode 100644 backend/users/permissions.py create mode 100644 backend/users/serializers.py create mode 100644 backend/users/tests.py create mode 100644 backend/users/urls.py create mode 100644 backend/users/views.py create mode 100644 docs/.obsidian/app.json create mode 100644 docs/.obsidian/appearance.json create mode 100644 docs/.obsidian/core-plugins-migration.json create mode 100644 docs/.obsidian/core-plugins.json create mode 100644 docs/.obsidian/workspace.json create mode 100644 docs/Notas de Clase/2024-05-22.md create mode 100644 docs/Notas de Clase/2024-06-12.md create mode 100644 docs/Notas de Clase/2024-06-26.md create mode 100644 docs/notas/Resumen de Informes.md create mode 100644 mysql_schema.pdf create mode 100644 nixpacks.toml create mode 100644 package-lock.json create mode 100644 requirements.txt diff --git a/.github/workflows/FrontCi.yml b/.github/workflows/FrontCi.yml new file mode 100644 index 0000000..5c91c10 --- /dev/null +++ b/.github/workflows/FrontCi.yml @@ -0,0 +1,31 @@ +name: ForntCI Pipeline + +on: + push: + branches: + - main # Es pora que se ejecute en main + pull_request: + branches: + - '**' # Es pora que se ejecute en todas las ramas + +jobs: + lint: + name: Linter de Código + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setear Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Instalar dependencias + run: npm install + working-directory: ./FrontAdmin + + - name: Correr linter de codigo + run: npm run lint + working-directory: ./FrontAdmin + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6d1d446 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ + +# Python Envirioment +.venv +/venv +.env +env +/env + + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + + +# carpeta obsidian +.obsidian/ + +# API Docs +#schema.yml +logs/ + +# sql files +*.sql diff --git a/CurrentDefault.code-profile b/CurrentDefault.code-profile new file mode 100644 index 0000000..dbc35c6 --- /dev/null +++ b/CurrentDefault.code-profile @@ -0,0 +1 @@ +{"name":"CurrentDefault","settings":"{\"settings\":\"{\\n // json settings\\n \\\"[json]\\\": {\\n \\\"editor.defaultFormatter\\\": \\\"vscode.json-language-features\\\",\\n \\\"editor.formatOnSave\\\": true\\n },\\n // python settings\\n \\\"python.languageServer\\\": \\\"Pylance\\\",\\n \\\"[python]\\\": {\\n \\\"editor.formatOnType\\\": true,\\n \\\"editor.formatOnSave\\\": true,\\n \\\"editor.comments.insertSpace\\\": true,\\n \\\"editor.defaultFormatter\\\": \\\"ms-python.black-formatter\\\",\\n \\\"editor.codeActionsOnSave\\\": {\\n \\\"source.organizeImports\\\": \\\"always\\\",\\n \\\"source.fixAll\\\": \\\"explicit\\\",\\n \\\"source.fixAll.eslint\\\": \\\"explicit\\\",\\n \\\"source.fixAll.stylelint\\\": \\\"explicit\\\"\\n },\\n \\\"editor.suggestSelection\\\": \\\"first\\\",\\n \\\"editor.suggest.insertMode\\\": \\\"insert\\\",\\n \\\"editor.suggest.showKeywords\\\": true,\\n \\\"editor.bracketPairColorization.enabled\\\": true,\\n \\\"editor.parameterHints.enabled\\\": true,\\n \\\"editor.quickSuggestions\\\": {\\n \\\"other\\\": true,\\n \\\"comments\\\": true,\\n \\\"strings\\\": true\\n }\\n },\\n // python docstring settings\\n \\\"autoDocstring.docstringFormat\\\": \\\"google\\\",\\n \\\"autoDocstring.generateDocstringOnEnter\\\": true,\\n \\\"autoDocstring.startOnNewLine\\\": true,\\n \\\"autoDocstring.guessTypes\\\": true,\\n \\\"autoDocstring.includeName\\\": true,\\n \\\"autoDocstring.quoteStyle\\\": \\\"'''\\\",\\n \\\"python.testing.unittestEnabled\\\": true,\\n \\\"python.testing.promptToConfigure\\\": true,\\n \\\"python.testing.pytestEnabled\\\": true,\\n \\\"python.testing.autoTestDiscoverOnSaveEnabled\\\": true,\\n \\\"python.analysis.enablePytestSupport\\\": true,\\n \\\"python.analysis.autoSearchPaths\\\": true,\\n \\\"python.globalModuleInstallation\\\": false,\\n \\\"python.analysis.indexing\\\": true,\\n \\\"python.analysis.typeCheckingMode\\\": \\\"standard\\\",\\n \\\"python.analysis.diagnosticMode\\\": \\\"workspace\\\",\\n \\\"python.analysis.useLibraryCodeForTypes\\\": true,\\n \\\"python.analysis.autoImportCompletions\\\": true,\\n \\\"python.analysis.completeFunctionParens\\\": false,\\n \\\"python.terminal.activateEnvironment\\\": false,\\n \\\"python.analysis.logLevel\\\": \\\"Information\\\",\\n\\n // git settings\\n \\\"git.autofetch\\\": true,\\n \\\"git.confirmSync\\\": false,\\n \\\"git.enableSmartCommit\\\": true,\\n \\\"git.detectSubmodules\\\": true,\\n \\\"git.showPushSuccessNotification\\\": true,\\n\\n // editor settings\\n \\\"debug.saveBeforeStart\\\": \\\"allEditorsInActiveGroup\\\",\\n \\\"task.saveBeforeRun\\\": \\\"always\\\",\\n \\\"editor.formatOnSaveMode\\\": \\\"file\\\",\\n \\\"window.clickThroughInactive\\\": true,\\n \\\"window.autoDetectColorScheme\\\": true,\\n \\\"workbench.preferredDarkColorTheme\\\": \\\"Default Dark Modern\\\",\\n \\\"window.closeWhenEmpty\\\": false,\\n \\\"editor.suggestSelection\\\": \\\"first\\\",\\n \\\"editor.formatOnSave\\\": true,\\n \\\"security.workspace.trust.untrustedFiles\\\": \\\"prompt\\\",\\n \\\"files.autoSave\\\": \\\"afterDelay\\\",\\n \\\"files.autoSaveDelay\\\": 60000,\\n \\\"editor.minimap.enabled\\\": true,\\n \\\"workbench.colorTheme\\\": \\\"Default Dark Modern\\\",\\n \\\"workbench.colorCustomizations\\\": {\\n \\\"[Default Dark+]\\\": {\\n // defaults\\n }\\n },\\n\\n //copilot settings\\n \\\"github.copilot.editor.enableCodeActions\\\": true,\\n \\\"github.copilot.editor.enableAutoCompletions\\\": true,\\n \\\"github.copilot.chat.scopeSelection\\\": true,\\n \\\"github.copilot.chat.welcomeMessage\\\": \\\"first\\\",\\n \\\"github.copilot.enable\\\": {\\n \\\"*\\\": true,\\n \\\"plaintext\\\": true,\\n \\\"markdown\\\": false,\\n \\\"scminput\\\": false\\n },\\n \\\"github.copilot.preferredAccount\\\": \\\"carlosferreyra\\\",\\n\\n \\\"redhat.telemetry.enabled\\\": true,\\n // shell and terminal settings\\n \\\"terminal.integrated.defaultProfile.windows\\\": \\\"zsh\\\",\\n \\\"debug.terminal.clearBeforeReusing\\\": true,\\n \\\"terminal.external.linuxExec\\\": \\\"bash\\\",\\n \\\"terminal.integrated.allowMnemonics\\\": true,\\n \\\"terminal.integrated.confirmOnExit\\\": \\\"hasChildProcesses\\\",\\n \\\"terminal.integrated.copyOnSelection\\\": true,\\n \\\"terminal.external.osxExec\\\": \\\"zsh\\\",\\n \\\"terminal.integrated.defaultProfile.osx\\\": \\\"zsh\\\",\\n \\\"[jsonc]\\\": {\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\n },\\n \\\"vs-kubernetes\\\": {\\n \\\"vscode-kubernetes.kubectl-path-mac\\\": \\\"/Users/carlosferreyra/.vs-kubernetes/tools/kubectl/kubectl\\\",\\n \\\"vscode-kubernetes.helm-path-mac\\\": \\\"/Users/carlosferreyra/.vs-kubernetes/tools/helm/darwin-arm64/helm\\\",\\n \\\"vscode-kubernetes.minikube-path-mac\\\": \\\"/Users/carlosferreyra/.vs-kubernetes/tools/minikube/darwin-arm64/minikube\\\"\\n },\\n \\\"[css]\\\": {\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\n },\\n \\\"[typescriptreact]\\\": {\\n \\\"editor.defaultFormatter\\\": \\\"vscode.typescript-language-features\\\"\\n },\\n \\\"[html]\\\": {\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\n },\\n\\n // file nesting settings\\n \\\"explorer.fileNesting.patterns\\\": {\\n \\\"*.ts\\\": \\\"${capture}.js\\\",\\n \\\"*.js\\\": \\\"${capture}.js.map, ${capture}.min.js, ${capture}.d.ts\\\",\\n \\\"*.jsx\\\": \\\"${capture}.js\\\",\\n \\\"*.tsx\\\": \\\"${capture}.ts\\\",\\n \\\"tsconfig.json\\\": \\\"tsconfig.*.json\\\",\\n \\\"package.json\\\": \\\"package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb\\\",\\n \\\"*.sqlite\\\": \\\"${capture}.${extname}-*\\\",\\n \\\"*.db\\\": \\\"${capture}.${extname}-*\\\",\\n \\\"*.sqlite3\\\": \\\"${capture}.${extname}-*\\\",\\n \\\"*.db3\\\": \\\"${capture}.${extname}-*\\\",\\n \\\"*.sdb\\\": \\\"${capture}.${extname}-*\\\",\\n \\\"*.s3db\\\": \\\"${capture}.${extname}-*\\\"\\n }\\n}\\n\"}","keybindings":"{\"keybindings\":\"// Place your key bindings in this file to override the defaultsauto[]\\n[\\n {\\n \\\"key\\\": \\\"cmd+t cmd+t\\\",\\n \\\"command\\\": \\\"workbench.action.terminal.toggleTerminal\\\"\\n },\\n {\\n \\\"key\\\": \\\"cmd+e cmd+t\\\",\\n \\\"command\\\": \\\"workbench.action.terminal.openNativeConsole\\\",\\n \\\"when\\\": \\\"!terminalFocus\\\"\\n },\\n {\\n \\\"key\\\": \\\"shift+cmd+c\\\",\\n \\\"command\\\": \\\"-workbench.action.terminal.openNativeConsole\\\",\\n \\\"when\\\": \\\"!terminalFocus\\\"\\n },\\n {\\n \\\"key\\\": \\\"alt+cmd+'\\\",\\n \\\"command\\\": \\\"workbench.action.terminal.new\\\",\\n \\\"when\\\": \\\"terminalProcessSupported || terminalWebExtensionContributedProfile\\\"\\n },\\n {\\n \\\"key\\\": \\\"ctrl+shift+`\\\",\\n \\\"command\\\": \\\"-workbench.action.terminal.new\\\",\\n \\\"when\\\": \\\"terminalProcessSupported || terminalWebExtensionContributedProfile\\\"\\n }\\n]\",\"platform\":1}","tasks":"{\"tasks\":\"{}\"}","extensions":"[{\"identifier\":{\"id\":\"aaron-bond.better-comments\",\"uuid\":\"7a0110bb-231a-4598-aa1b-0769ea46d28b\"},\"displayName\":\"Better Comments\"},{\"identifier\":{\"id\":\"alexcvzz.vscode-sqlite\",\"uuid\":\"eaee103c-e866-4b73-87f8-3749cab64da2\"},\"displayName\":\"SQLite\"},{\"identifier\":{\"id\":\"christian-kohler.npm-intellisense\",\"uuid\":\"dff6b801-247e-40e9-82e8-8c9b1d19d1b8\"},\"displayName\":\"npm Intellisense\"},{\"identifier\":{\"id\":\"christian-kohler.path-intellisense\",\"uuid\":\"a41c1549-4053-44d4-bf30-60fc809b4a86\"},\"displayName\":\"Path Intellisense\"},{\"identifier\":{\"id\":\"codezombiech.gitignore\",\"uuid\":\"3e891cf9-53cb-49a3-8d01-8f0b1f0afb29\"},\"displayName\":\"gitignore\"},{\"identifier\":{\"id\":\"dbaeumer.vscode-eslint\",\"uuid\":\"583b2b34-2c1e-4634-8c0b-0b82e283ea3a\"},\"displayName\":\"ESLint\"},{\"identifier\":{\"id\":\"donjayamanne.githistory\",\"uuid\":\"5960f38e-0bbe-4644-8f9c-9c8824e82511\"},\"displayName\":\"Git History\"},{\"identifier\":{\"id\":\"donjayamanne.python-environment-manager\",\"uuid\":\"0c9f60fd-5588-42f7-9176-e80c3ae111ec\"},\"displayName\":\"Python Environment Manager\"},{\"identifier\":{\"id\":\"ecmel.vscode-html-css\",\"uuid\":\"aaee577c-f062-495a-9816-0cbd442f1d25\"},\"displayName\":\"HTML CSS Support\"},{\"identifier\":{\"id\":\"esbenp.prettier-vscode\",\"uuid\":\"96fa4707-6983-4489-b7c5-d5ffdfdcce90\"},\"displayName\":\"Prettier - Code formatter\"},{\"identifier\":{\"id\":\"figma.figma-vscode-extension\",\"uuid\":\"bff510dc-dcac-4daf-925c-299ee91fb135\"},\"displayName\":\"Figma for VS Code\"},{\"identifier\":{\"id\":\"formulahendry.auto-rename-tag\",\"uuid\":\"6e440e71-8ed9-4f25-bb78-4b13096b8a03\"},\"displayName\":\"Auto Rename Tag\"},{\"identifier\":{\"id\":\"formulahendry.code-runner\",\"uuid\":\"a6a0c5b2-d078-4bf5-a9ee-4e37054414b3\"},\"displayName\":\"Code Runner\"},{\"identifier\":{\"id\":\"github.copilot\",\"uuid\":\"23c4aeee-f844-43cd-b53e-1113e483f1a6\"},\"displayName\":\"GitHub Copilot\"},{\"identifier\":{\"id\":\"github.copilot-chat\",\"uuid\":\"7ec7d6e6-b89e-4cc5-a59b-d6c4d238246f\"},\"displayName\":\"GitHub Copilot Chat\"},{\"identifier\":{\"id\":\"github.remotehub\",\"uuid\":\"fc7d7e85-2e58-4c1c-97a3-2172ed9a77cd\"},\"displayName\":\"GitHub Repositories\"},{\"identifier\":{\"id\":\"github.vscode-github-actions\",\"uuid\":\"04f49bfc-8330-4eee-8237-ea938fb755ef\"},\"displayName\":\"GitHub Actions\"},{\"identifier\":{\"id\":\"github.vscode-pull-request-github\",\"uuid\":\"69ddd764-339a-4ecc-97c1-9c4ece58e36d\"},\"displayName\":\"GitHub Pull Requests\"},{\"identifier\":{\"id\":\"googlecloudtools.cloudcode\",\"uuid\":\"5e8803a2-3dc8-42b3-9c5f-ea9d37828c03\"},\"displayName\":\"Gemini Code Assist + Google Cloud Code\",\"disabled\":true},{\"identifier\":{\"id\":\"jock.svg\",\"uuid\":\"4ae6dc82-7981-4f10-bd81-2d72aec37f39\"},\"displayName\":\"SVG\"},{\"identifier\":{\"id\":\"mhutchie.git-graph\",\"uuid\":\"438221f8-1107-4ccd-a6fe-f3b7fe0856b7\"},\"displayName\":\"Git Graph\"},{\"identifier\":{\"id\":\"ms-azuretools.vscode-docker\",\"uuid\":\"0479fc1c-3d67-49f9-b087-fb9069afe48f\"},\"displayName\":\"Docker\"},{\"identifier\":{\"id\":\"ms-kubernetes-tools.vscode-kubernetes-tools\",\"uuid\":\"4837e4f3-1b01-4732-b1a6-daa57ef64cab\"},\"displayName\":\"Kubernetes\"},{\"identifier\":{\"id\":\"ms-python.black-formatter\",\"uuid\":\"859e640c-c157-47da-8699-9080b81c8371\"},\"displayName\":\"Black Formatter\"},{\"identifier\":{\"id\":\"ms-python.debugpy\",\"uuid\":\"4bd5d2c9-9d65-401a-b0b2-7498d9f17615\"},\"displayName\":\"Python Debugger\"},{\"identifier\":{\"id\":\"ms-python.python\",\"uuid\":\"f1f59ae4-9318-4f3c-a9b5-81b2eaa5f8a5\"},\"displayName\":\"Python\"},{\"identifier\":{\"id\":\"ms-python.vscode-pylance\",\"uuid\":\"364d2426-116a-433a-a5d8-a5098dc3afbd\"},\"displayName\":\"Pylance\"},{\"identifier\":{\"id\":\"ms-vscode-remote.remote-containers\",\"uuid\":\"93ce222b-5f6f-49b7-9ab1-a0463c6238df\"},\"displayName\":\"Dev Containers\"},{\"identifier\":{\"id\":\"ms-vscode-remote.remote-ssh\",\"uuid\":\"607fd052-be03-4363-b657-2bd62b83d28a\"},\"displayName\":\"Remote - SSH\"},{\"identifier\":{\"id\":\"ms-vscode-remote.remote-ssh-edit\",\"uuid\":\"bfeaf631-bcff-4908-93ed-fda4ef9a0c5c\"},\"displayName\":\"Remote - SSH: Editing Configuration Files\"},{\"identifier\":{\"id\":\"ms-vscode-remote.vscode-remote-extensionpack\",\"uuid\":\"23d72dfc-8dd1-4e30-926e-8783b4378f13\"},\"displayName\":\"Remote Development\"},{\"identifier\":{\"id\":\"ms-vscode.cmake-tools\",\"uuid\":\"7c889349-8749-43d4-8b5e-08939936d7f4\"},\"displayName\":\"CMake Tools\"},{\"identifier\":{\"id\":\"ms-vscode.cpptools\",\"uuid\":\"690b692e-e8a9-493f-b802-8089d50ac1b2\"},\"displayName\":\"C/C++\",\"preRelease\":true},{\"identifier\":{\"id\":\"ms-vscode.cpptools-extension-pack\",\"uuid\":\"3957b2f6-f086-49b5-a7b4-5da772123130\"},\"displayName\":\"C/C++ Extension Pack\"},{\"identifier\":{\"id\":\"ms-vscode.makefile-tools\",\"uuid\":\"e09cf600-90a1-414e-92a0-031f1a5391c6\"},\"displayName\":\"Makefile Tools\"},{\"identifier\":{\"id\":\"ms-vscode.remote-explorer\",\"uuid\":\"11858313-52cc-4e57-b3e4-d7b65281e34b\"},\"displayName\":\"Remote Explorer\"},{\"identifier\":{\"id\":\"ms-vscode.remote-repositories\",\"uuid\":\"cf5142f0-3701-4992-980c-9895a750addf\"},\"displayName\":\"Remote Repositories\"},{\"identifier\":{\"id\":\"ms-vscode.remote-server\",\"uuid\":\"105c0b3c-07a9-4156-a4fc-4141040eb07e\"},\"displayName\":\"Remote - Tunnels\"},{\"identifier\":{\"id\":\"ms-vscode.test-adapter-converter\",\"uuid\":\"47210ec2-0324-4cbb-9523-9dff02a5f9ec\"},\"displayName\":\"Test Adapter Converter\"},{\"identifier\":{\"id\":\"njpwerner.autodocstring\",\"uuid\":\"2d6fea35-f68e-461d-9b7b-5cd05be99451\"},\"displayName\":\"autoDocstring - Python Docstring Generator\"},{\"identifier\":{\"id\":\"oderwat.indent-rainbow\",\"uuid\":\"eaa2127d-cb69-4ab9-8505-a60c9ee5f28b\"}},{\"identifier\":{\"id\":\"oracle.mysql-shell-for-vs-code\",\"uuid\":\"54ddcd76-0b30-4937-8030-143a59ca2f3c\"},\"displayName\":\"MySQL Shell for VS Code\"},{\"identifier\":{\"id\":\"qwtel.sqlite-viewer\",\"uuid\":\"94fef082-6c2d-43ac-9540-6617b51a3a12\"},\"displayName\":\"SQLite Viewer\"},{\"identifier\":{\"id\":\"redhat.vscode-yaml\",\"uuid\":\"2061917f-f76a-458a-8da9-f162de22b97e\"},\"displayName\":\"YAML\"},{\"identifier\":{\"id\":\"ritwickdey.liveserver\",\"uuid\":\"b63c44fd-0457-4696-99e9-dbfdf70d77de\"},\"displayName\":\"Live Server\"},{\"identifier\":{\"id\":\"streetsidesoftware.code-spell-checker\",\"uuid\":\"f6dbd813-b0a0-42c1-90ea-10dde9d925a7\"},\"displayName\":\"Code Spell Checker\"},{\"identifier\":{\"id\":\"twxs.cmake\",\"uuid\":\"2be7cf14-2603-402e-9771-fd79df83cdf8\"},\"displayName\":\"CMake\"},{\"identifier\":{\"id\":\"waderyan.gitblame\",\"uuid\":\"2335b326-c334-4e81-bc51-c408fcec6e7c\"},\"displayName\":\"Git Blame\"},{\"identifier\":{\"id\":\"xabikos.javascriptsnippets\",\"uuid\":\"a2cec723-5349-460d-9de9-0fd1f8d3456f\"},\"displayName\":\"JavaScript (ES6) code snippets\"},{\"identifier\":{\"id\":\"yzhang.markdown-all-in-one\",\"uuid\":\"98790d67-10fa-497c-9113-f6c7489207b2\"},\"displayName\":\"Markdown All in One\"}]","globalState":"{\"storage\":{\"workbench.panel.markers.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.markers.view\\\",\\\"isHidden\\\":false}]\",\"workbench.panel.output.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.output\\\",\\\"isHidden\\\":false}]\",\"terminal.hidden\":\"[{\\\"id\\\":\\\"terminal\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.panel.chat.view.copilot\\\",\\\"isHidden\\\":false}]\",\"workbench.explorer.views.state.hidden\":\"[{\\\"id\\\":\\\"outline\\\",\\\"isHidden\\\":false,\\\"order\\\":3},{\\\"id\\\":\\\"timeline\\\",\\\"isHidden\\\":false,\\\"order\\\":4},{\\\"id\\\":\\\"workbench.explorer.openEditorsView\\\",\\\"isHidden\\\":false,\\\"order\\\":0},{\\\"id\\\":\\\"workbench.explorer.emptyView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"npm\\\",\\\"isHidden\\\":false,\\\"order\\\":5},{\\\"id\\\":\\\"gitlens.views.repositories:explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.fileHistory:explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.lineHistory:explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.compare:explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.search:explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"mavenProjects\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"javaDependencyExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"xmlTreeView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dartPackages\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"arduinoExampleExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"spring-boot-dashboard\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"mysql\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.explorer.fileView\\\",\\\"isHidden\\\":false,\\\"order\\\":1},{\\\"id\\\":\\\"azurerm-vscode-tools.template-outline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"javaProjectExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.session.explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extension.vsKubernetesExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extension.vsKubernetesHelmRepoExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"kubernetes.cloudExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dartDependencyTree\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"pythonEnvironments\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"commitViewProvider\\\",\\\"isHidden\\\":false,\\\"order\\\":6},{\\\"id\\\":\\\"compareCommitViewProvider\\\",\\\"isHidden\\\":false,\\\"order\\\":7},{\\\"id\\\":\\\"dotnet-interactive-panel-values\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"jupyterViewVariables\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerContainers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerImages\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerRegistries\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerNetworks\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerVolumes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-docker.views.dockerContexts\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-docker.views.help\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"objectExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"queryHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqlite.explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"ionide.projectExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sfdx.force.tasks.view\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sshfs-configs\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sshfs-connections\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cell-tag\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"jsonOutline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-serial-monitor.monitor0\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-serial-monitor.monitor1\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-serial-monitor.monitor2\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"polyglot-notebook-panel-values\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"spring.apps\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"spring.beans\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"spring.mappings\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"spring.properties\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"spring.memoryView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dataworkspace.views.main\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.kubernetes.localDevExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.kubectlExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.cloudRunExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.apiExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.secretsExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.gceExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.apigee.explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.gcfExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.awsLambdaImporterExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.cloudStorageExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.sourceProtectExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.mcdcSources\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.helpAndFeedbackExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workspaceEnvironments\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.preview_ended\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.authenticate\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.not_part_of_a_team\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.loading\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"codeium.chatPanelView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"codeium.searchPanelView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dbclient.search.result\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github.cweijan.mysql\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github.dbclient.history\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github.cweijan.nosql\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-edge-devtools-view.targets\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-edge-devtools-view.help-links\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.session\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.help\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.devtools\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqltoolsViewConsoleMessages\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqltoolsViewConnectionExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqltoolsViewBookmarksExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqltoolsViewHistoryExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"codegpt-sidebar\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.current-branch\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.workflows\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.settings\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.empty-view\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cmake.projectStatus\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"makefile.outline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cmake.outline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cmake.pinnedCommands\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:login\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"pr:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"issues:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:conflictResolution\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:createPullRequestWebview\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChangesFiles\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChangesCommits\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"prStatus:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:activePullRequest\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:activePullRequest:welcome\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.login\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.dummyLoginNotifications\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.files\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.notifications\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.panel.chat.view.copilot\\\",\\\"isHidden\\\":false,\\\"order\\\":2},{\\\"id\\\":\\\"foundProjects\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"run-config\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.graph\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.home\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.graphDetails\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.drafts\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.workspaces\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.account\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.commitDetails\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.pullRequest\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.lineHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.fileHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.timeline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.searchAndCompare\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.gemini.chatView\\\",\\\"isHidden\\\":false}]\",\"workbench.scm.views.state.hidden\":\"[{\\\"id\\\":\\\"workbench.scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.repositories:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.fileHistory:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.lineHistory:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.compare:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.search:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"pr:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"prStatus:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.scm.repositories\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"scmTreeDataProvider\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.repositories\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"gitlens.views.commits\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.fileHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.lineHistory\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"gitlens.views.branches\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.remotes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.stashes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.tags\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.contributors\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"gitlens.views.searchAndCompare\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.worktrees\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.commitDetails\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.scm.sync\\\",\\\"isHidden\\\":false}]\",\"workbench.view.search.state.hidden\":\"[{\\\"id\\\":\\\"workbench.view.search\\\",\\\"isHidden\\\":false}]\",\"workbench.activityBar.location\":\"default\",\"workbench.activity.pinnedViewlets2\":\"[{\\\"id\\\":\\\"workbench.view.explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":0},{\\\"id\\\":\\\"workbench.view.search\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":1},{\\\"id\\\":\\\"workbench.view.scm\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":2},{\\\"id\\\":\\\"workbench.view.debug\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":3},{\\\"id\\\":\\\"workbench.view.remote\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":4},{\\\"id\\\":\\\"workbench.view.extensions\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":4},{\\\"id\\\":\\\"workbench.view.extension.test\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":6},{\\\"id\\\":\\\"workbench.view.extension.references-view\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":7},{\\\"id\\\":\\\"workbench.view.extension.figma\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":10},{\\\"id\\\":\\\"workbench.view.extension.cspell-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":20},{\\\"id\\\":\\\"workbench.view.extension.github-pull-requests\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":12},{\\\"id\\\":\\\"workbench.view.extension.aws-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":9},{\\\"id\\\":\\\"workbench.view.extension.blackbox\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.view.extension.github-pull-request\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.package-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.view.extension.github-actions\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":11},{\\\"id\\\":\\\"workbench.view.extension.mintdocs\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.dockerView\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.kubernetesView\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":16},{\\\"id\\\":\\\"workbench.view.extension.cmake-view\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":17},{\\\"id\\\":\\\"workbench.view.extension.flutter\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":16},{\\\"id\\\":\\\"workbench.view.extension.makefile__viewContainer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":18},{\\\"id\\\":\\\"workbench.view.extension.PowerShellCommandExplorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":17},{\\\"id\\\":\\\"workbench.view.extension.project-manager\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.view.extension.jupyter\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.chatActivityViewSlack\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":12},{\\\"id\\\":\\\"workbench.view.extension.chatActivityViewDiscord\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.msg-view\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":19},{\\\"id\\\":\\\"workbench.view.extension.tabnine-access\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":19},{\\\"id\\\":\\\"workbench.view.extension.gradleContainerView\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":19},{\\\"id\\\":\\\"workbench.view.extension.dataworkspace\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":15},{\\\"id\\\":\\\"workbench.view.extension.copilot-labs\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":10},{\\\"id\\\":\\\"workbench.view.extension.1-cloudCodeDuetAIChatViewContainer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":12},{\\\"id\\\":\\\"workbench.view.extension.json-views\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":20},{\\\"id\\\":\\\"workbench.view.extension.cmake__viewContainer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":15},{\\\"id\\\":\\\"workbench.view.extension.atlascode-drawer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":9},{\\\"id\\\":\\\"workbench.view.extension.postgres-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":11},{\\\"id\\\":\\\"workbench.view.extension.visualText\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":12},{\\\"id\\\":\\\"workbench.view.extension.objectExplorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":16},{\\\"id\\\":\\\"workbench.view.extension.vscode-spotify\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":21},{\\\"id\\\":\\\"workbench.view.extension.databaseExplorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":10},{\\\"id\\\":\\\"workbench.view.extension.azure\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":15},{\\\"id\\\":\\\"workbench.view.extension.bookmarks\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.view.extension.spring\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":19},{\\\"id\\\":\\\"workbench.view.extension.sshfs\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.view.extension.ionide-fsharp\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":12},{\\\"id\\\":\\\"workbench.view.extension.metadata\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":21},{\\\"id\\\":\\\"workbench.view.extension.conflicts\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":22},{\\\"id\\\":\\\"workbench.view.extension.mongoDB\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":10},{\\\"id\\\":\\\"workbench.view.sync\\\",\\\"pinned\\\":true,\\\"visible\\\":false},{\\\"id\\\":\\\"workbench.view.editSessions\\\",\\\"pinned\\\":true,\\\"visible\\\":false},{\\\"id\\\":\\\"userDataProfiles\\\",\\\"pinned\\\":true,\\\"visible\\\":false}]\",\"workbench.panel.pinnedPanels\":\"[{\\\"id\\\":\\\"workbench.panel.markers\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":0},{\\\"id\\\":\\\"workbench.panel.output\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":1},{\\\"id\\\":\\\"workbench.panel.repl\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":2},{\\\"id\\\":\\\"workbench.panel.testResults\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":3},{\\\"id\\\":\\\"terminal\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":3},{\\\"id\\\":\\\"~remote.forwardedPortsContainer\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":5},{\\\"id\\\":\\\"workbench.view.extension.aws-codewhisperer-reference-log\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":6},{\\\"id\\\":\\\"workbench.view.extension.polyglot-notebook-panel\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":6},{\\\"id\\\":\\\"workbench.view.extension.jupyter-variables\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":7},{\\\"id\\\":\\\"workbench.view.extension.dotnet-interactive-panel\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":7},{\\\"id\\\":\\\"workbench.view.extension.vscode-serial-monitor-tools\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.panel.comments\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":10},{\\\"id\\\":\\\"refactorPreview\\\",\\\"pinned\\\":true,\\\"visible\\\":false}]\",\"themeUpdatedNotificationShown\":\"true\",\"nps/lastSessionDate\":\"Mon Jul 22 2024\",\"nps/sessionCount\":\"8\",\"workbench.view.debug.state.hidden\":\"[{\\\"id\\\":\\\"workbench.debug.welcome\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.variablesView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.watchExpressionsView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.callStackView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.loadedScriptsView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.breakPointsView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"jsBrowserBreakpoints\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"jsExcludedCallers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extension.firefox.loadedScripts\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"CppSshTargetsView\\\",\\\"isHidden\\\":false}]\",\"workbench.telemetryOptOutShown\":\"true\",\"cpp.1.lastSessionDate\":\"Mon Jul 22 2024\",\"cpp.1.sessionCount\":\"634\",\"java.2.lastSessionDate\":\"Mon Jul 22 2024\",\"java.2.sessionCount\":\"634\",\"javascript.1.lastSessionDate\":\"Mon Jul 22 2024\",\"javascript.1.sessionCount\":\"634\",\"typescript.1.lastSessionDate\":\"Mon Jul 22 2024\",\"typescript.1.sessionCount\":\"634\",\"colorThemeData\":\"{\\\"id\\\":\\\"vs-dark vscode-theme-defaults-themes-dark_modern-json\\\",\\\"label\\\":\\\"Dark Modern\\\",\\\"settingsId\\\":\\\"Default Dark Modern\\\",\\\"themeTokenColors\\\":[{\\\"settings\\\":{\\\"foreground\\\":\\\"#D4D4D4\\\"},\\\"scope\\\":[\\\"meta.embedded\\\",\\\"source.groovy.embedded\\\",\\\"string meta.image.inline.markdown\\\",\\\"variable.legacy.builtin.python\\\"]},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"italic\\\"},\\\"scope\\\":\\\"emphasis\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"bold\\\"},\\\"scope\\\":\\\"strong\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#000080\\\"},\\\"scope\\\":\\\"header\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#6A9955\\\"},\\\"scope\\\":\\\"comment\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"constant.language\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":[\\\"constant.numeric\\\",\\\"variable.other.enummember\\\",\\\"keyword.operator.plus.exponent\\\",\\\"keyword.operator.minus.exponent\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#646695\\\"},\\\"scope\\\":\\\"constant.regexp\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"entity.name.tag\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d7ba7d\\\"},\\\"scope\\\":[\\\"entity.name.tag.css\\\",\\\"entity.name.tag.less\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9cdcfe\\\"},\\\"scope\\\":\\\"entity.other.attribute-name\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d7ba7d\\\"},\\\"scope\\\":[\\\"entity.other.attribute-name.class.css\\\",\\\"source.css entity.other.attribute-name.class\\\",\\\"entity.other.attribute-name.id.css\\\",\\\"entity.other.attribute-name.parent-selector.css\\\",\\\"entity.other.attribute-name.parent.less\\\",\\\"source.css entity.other.attribute-name.pseudo-class\\\",\\\"entity.other.attribute-name.pseudo-element.css\\\",\\\"source.css.less entity.other.attribute-name.id\\\",\\\"entity.other.attribute-name.scss\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#f44747\\\"},\\\"scope\\\":\\\"invalid\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"underline\\\"},\\\"scope\\\":\\\"markup.underline\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"bold\\\",\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"markup.bold\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"bold\\\",\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"markup.heading\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"italic\\\"},\\\"scope\\\":\\\"markup.italic\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"strikethrough\\\"},\\\"scope\\\":\\\"markup.strikethrough\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":\\\"markup.inserted\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"markup.deleted\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"markup.changed\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#6A9955\\\"},\\\"scope\\\":\\\"punctuation.definition.quote.begin.markdown\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#6796e6\\\"},\\\"scope\\\":\\\"punctuation.definition.list.begin.markdown\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"markup.inline.raw\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#808080\\\"},\\\"scope\\\":\\\"punctuation.definition.tag\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"meta.preprocessor\\\",\\\"entity.name.function.preprocessor\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"meta.preprocessor.string\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":\\\"meta.preprocessor.numeric\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9cdcfe\\\"},\\\"scope\\\":\\\"meta.structure.dictionary.key.python\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"meta.diff.header\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"storage\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"storage.type\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"storage.modifier\\\",\\\"keyword.operator.noexcept\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":[\\\"string\\\",\\\"meta.embedded.assembly\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"string.tag\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"string.value\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d16969\\\"},\\\"scope\\\":\\\"string.regexp\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"punctuation.definition.template-expression.begin\\\",\\\"punctuation.definition.template-expression.end\\\",\\\"punctuation.section.embedded\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d4d4d4\\\"},\\\"scope\\\":[\\\"meta.template.expression\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9cdcfe\\\"},\\\"scope\\\":[\\\"support.type.vendored.property-name\\\",\\\"support.type.property-name\\\",\\\"source.css variable\\\",\\\"source.coffee.embedded\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"keyword\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"keyword.control\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d4d4d4\\\"},\\\"scope\\\":\\\"keyword.operator\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"keyword.operator.new\\\",\\\"keyword.operator.expression\\\",\\\"keyword.operator.cast\\\",\\\"keyword.operator.sizeof\\\",\\\"keyword.operator.alignof\\\",\\\"keyword.operator.typeid\\\",\\\"keyword.operator.alignas\\\",\\\"keyword.operator.instanceof\\\",\\\"keyword.operator.logical.python\\\",\\\"keyword.operator.wordlike\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":\\\"keyword.other.unit\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"punctuation.section.embedded.begin.php\\\",\\\"punctuation.section.embedded.end.php\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9cdcfe\\\"},\\\"scope\\\":\\\"support.function.git-rebase\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":\\\"constant.sha.git-rebase\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d4d4d4\\\"},\\\"scope\\\":[\\\"storage.modifier.import.java\\\",\\\"variable.language.wildcard.java\\\",\\\"storage.modifier.package.java\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"variable.language\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#DCDCAA\\\"},\\\"scope\\\":[\\\"entity.name.function\\\",\\\"support.function\\\",\\\"support.constant.handlebars\\\",\\\"source.powershell variable.other.member\\\",\\\"entity.name.operator.custom-literal\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#4EC9B0\\\"},\\\"scope\\\":[\\\"support.class\\\",\\\"support.type\\\",\\\"entity.name.type\\\",\\\"entity.name.namespace\\\",\\\"entity.other.attribute\\\",\\\"entity.name.scope-resolution\\\",\\\"entity.name.class\\\",\\\"storage.type.numeric.go\\\",\\\"storage.type.byte.go\\\",\\\"storage.type.boolean.go\\\",\\\"storage.type.string.go\\\",\\\"storage.type.uintptr.go\\\",\\\"storage.type.error.go\\\",\\\"storage.type.rune.go\\\",\\\"storage.type.cs\\\",\\\"storage.type.generic.cs\\\",\\\"storage.type.modifier.cs\\\",\\\"storage.type.variable.cs\\\",\\\"storage.type.annotation.java\\\",\\\"storage.type.generic.java\\\",\\\"storage.type.java\\\",\\\"storage.type.object.array.java\\\",\\\"storage.type.primitive.array.java\\\",\\\"storage.type.primitive.java\\\",\\\"storage.type.token.java\\\",\\\"storage.type.groovy\\\",\\\"storage.type.annotation.groovy\\\",\\\"storage.type.parameters.groovy\\\",\\\"storage.type.generic.groovy\\\",\\\"storage.type.object.array.groovy\\\",\\\"storage.type.primitive.array.groovy\\\",\\\"storage.type.primitive.groovy\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#4EC9B0\\\"},\\\"scope\\\":[\\\"meta.type.cast.expr\\\",\\\"meta.type.new.expr\\\",\\\"support.constant.math\\\",\\\"support.constant.dom\\\",\\\"support.constant.json\\\",\\\"entity.other.inherited-class\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#C586C0\\\"},\\\"scope\\\":[\\\"keyword.control\\\",\\\"source.cpp keyword.operator.new\\\",\\\"keyword.operator.delete\\\",\\\"keyword.other.using\\\",\\\"keyword.other.directive.using\\\",\\\"keyword.other.operator\\\",\\\"entity.name.operator\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9CDCFE\\\"},\\\"scope\\\":[\\\"variable\\\",\\\"meta.definition.variable.name\\\",\\\"support.variable\\\",\\\"entity.name.variable\\\",\\\"constant.other.placeholder\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#4FC1FF\\\"},\\\"scope\\\":[\\\"variable.other.constant\\\",\\\"variable.other.enummember\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9CDCFE\\\"},\\\"scope\\\":[\\\"meta.object-literal.key\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#CE9178\\\"},\\\"scope\\\":[\\\"support.constant.property-value\\\",\\\"support.constant.font-name\\\",\\\"support.constant.media-type\\\",\\\"support.constant.media\\\",\\\"constant.other.color.rgb-value\\\",\\\"constant.other.rgb-value\\\",\\\"support.constant.color\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#CE9178\\\"},\\\"scope\\\":[\\\"punctuation.definition.group.regexp\\\",\\\"punctuation.definition.group.assertion.regexp\\\",\\\"punctuation.definition.character-class.regexp\\\",\\\"punctuation.character.set.begin.regexp\\\",\\\"punctuation.character.set.end.regexp\\\",\\\"keyword.operator.negation.regexp\\\",\\\"support.other.parenthesis.regexp\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d16969\\\"},\\\"scope\\\":[\\\"constant.character.character-class.regexp\\\",\\\"constant.other.character-class.set.regexp\\\",\\\"constant.other.character-class.regexp\\\",\\\"constant.character.set.regexp\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#DCDCAA\\\"},\\\"scope\\\":[\\\"keyword.operator.or.regexp\\\",\\\"keyword.control.anchor.regexp\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d7ba7d\\\"},\\\"scope\\\":\\\"keyword.operator.quantifier.regexp\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"constant.character\\\",\\\"constant.other.option\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d7ba7d\\\"},\\\"scope\\\":\\\"constant.character.escape\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#C8C8C8\\\"},\\\"scope\\\":\\\"entity.name.label\\\"}],\\\"semanticTokenRules\\\":[{\\\"_selector\\\":\\\"newOperator\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#d4d4d4\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"stringLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#ce9178\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"customLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#d4d4d4\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"numberLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#b5cea8\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"newOperator\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#c586c0\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"stringLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#ce9178\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"customLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#dcdcaa\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"numberLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#b5cea8\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}}],\\\"extensionData\\\":{\\\"_extensionId\\\":\\\"vscode.theme-defaults\\\",\\\"_extensionIsBuiltin\\\":true,\\\"_extensionName\\\":\\\"theme-defaults\\\",\\\"_extensionPublisher\\\":\\\"vscode\\\"},\\\"themeSemanticHighlighting\\\":true,\\\"colorMap\\\":{\\\"checkbox.border\\\":\\\"#3c3c3c\\\",\\\"editor.background\\\":\\\"#1f1f1f\\\",\\\"editor.foreground\\\":\\\"#cccccc\\\",\\\"editor.inactiveSelectionBackground\\\":\\\"#3a3d41\\\",\\\"editorIndentGuide.background1\\\":\\\"#404040\\\",\\\"editorIndentGuide.activeBackground1\\\":\\\"#707070\\\",\\\"editor.selectionHighlightBackground\\\":\\\"#add6ff26\\\",\\\"list.dropBackground\\\":\\\"#383b3d\\\",\\\"activityBarBadge.background\\\":\\\"#0078d4\\\",\\\"sideBarTitle.foreground\\\":\\\"#cccccc\\\",\\\"input.placeholderForeground\\\":\\\"#989898\\\",\\\"menu.background\\\":\\\"#1f1f1f\\\",\\\"menu.foreground\\\":\\\"#cccccc\\\",\\\"menu.separatorBackground\\\":\\\"#454545\\\",\\\"menu.border\\\":\\\"#454545\\\",\\\"statusBarItem.remoteForeground\\\":\\\"#ffffff\\\",\\\"statusBarItem.remoteBackground\\\":\\\"#0078d4\\\",\\\"ports.iconRunningProcessForeground\\\":\\\"#369432\\\",\\\"sideBarSectionHeader.background\\\":\\\"#181818\\\",\\\"sideBarSectionHeader.border\\\":\\\"#2b2b2b\\\",\\\"tab.selectedBackground\\\":\\\"#222222\\\",\\\"tab.selectedForeground\\\":\\\"#ffffffa0\\\",\\\"tab.lastPinnedBorder\\\":\\\"#cccccc33\\\",\\\"list.activeSelectionIconForeground\\\":\\\"#ffffff\\\",\\\"terminal.inactiveSelectionBackground\\\":\\\"#3a3d41\\\",\\\"widget.border\\\":\\\"#313131\\\",\\\"actionBar.toggledBackground\\\":\\\"#383a49\\\",\\\"activityBar.activeBorder\\\":\\\"#0078d4\\\",\\\"activityBar.background\\\":\\\"#181818\\\",\\\"activityBar.border\\\":\\\"#2b2b2b\\\",\\\"activityBar.foreground\\\":\\\"#d7d7d7\\\",\\\"activityBar.inactiveForeground\\\":\\\"#868686\\\",\\\"activityBarBadge.foreground\\\":\\\"#ffffff\\\",\\\"badge.background\\\":\\\"#616161\\\",\\\"badge.foreground\\\":\\\"#f8f8f8\\\",\\\"button.background\\\":\\\"#0078d4\\\",\\\"button.border\\\":\\\"#ffffff12\\\",\\\"button.foreground\\\":\\\"#ffffff\\\",\\\"button.hoverBackground\\\":\\\"#026ec1\\\",\\\"button.secondaryBackground\\\":\\\"#313131\\\",\\\"button.secondaryForeground\\\":\\\"#cccccc\\\",\\\"button.secondaryHoverBackground\\\":\\\"#3c3c3c\\\",\\\"chat.slashCommandBackground\\\":\\\"#34414b\\\",\\\"chat.slashCommandForeground\\\":\\\"#40a6ff\\\",\\\"checkbox.background\\\":\\\"#313131\\\",\\\"debugToolBar.background\\\":\\\"#181818\\\",\\\"descriptionForeground\\\":\\\"#9d9d9d\\\",\\\"dropdown.background\\\":\\\"#313131\\\",\\\"dropdown.border\\\":\\\"#3c3c3c\\\",\\\"dropdown.foreground\\\":\\\"#cccccc\\\",\\\"dropdown.listBackground\\\":\\\"#1f1f1f\\\",\\\"editor.findMatchBackground\\\":\\\"#9e6a03\\\",\\\"editorGroup.border\\\":\\\"#ffffff17\\\",\\\"editorGroupHeader.tabsBackground\\\":\\\"#181818\\\",\\\"editorGroupHeader.tabsBorder\\\":\\\"#2b2b2b\\\",\\\"editorGutter.addedBackground\\\":\\\"#2ea043\\\",\\\"editorGutter.deletedBackground\\\":\\\"#f85149\\\",\\\"editorGutter.modifiedBackground\\\":\\\"#0078d4\\\",\\\"editorLineNumber.activeForeground\\\":\\\"#cccccc\\\",\\\"editorLineNumber.foreground\\\":\\\"#6e7681\\\",\\\"editorOverviewRuler.border\\\":\\\"#010409\\\",\\\"editorWidget.background\\\":\\\"#202020\\\",\\\"errorForeground\\\":\\\"#f85149\\\",\\\"focusBorder\\\":\\\"#0078d4\\\",\\\"foreground\\\":\\\"#cccccc\\\",\\\"icon.foreground\\\":\\\"#cccccc\\\",\\\"input.background\\\":\\\"#313131\\\",\\\"input.border\\\":\\\"#3c3c3c\\\",\\\"input.foreground\\\":\\\"#cccccc\\\",\\\"inputOption.activeBackground\\\":\\\"#2489db82\\\",\\\"inputOption.activeBorder\\\":\\\"#2488db\\\",\\\"keybindingLabel.foreground\\\":\\\"#cccccc\\\",\\\"menu.selectionBackground\\\":\\\"#0078d4\\\",\\\"notificationCenterHeader.background\\\":\\\"#1f1f1f\\\",\\\"notificationCenterHeader.foreground\\\":\\\"#cccccc\\\",\\\"notifications.background\\\":\\\"#1f1f1f\\\",\\\"notifications.border\\\":\\\"#2b2b2b\\\",\\\"notifications.foreground\\\":\\\"#cccccc\\\",\\\"panel.background\\\":\\\"#181818\\\",\\\"panel.border\\\":\\\"#2b2b2b\\\",\\\"panelInput.border\\\":\\\"#2b2b2b\\\",\\\"panelTitle.activeBorder\\\":\\\"#0078d4\\\",\\\"panelTitle.activeForeground\\\":\\\"#cccccc\\\",\\\"panelTitle.inactiveForeground\\\":\\\"#9d9d9d\\\",\\\"peekViewEditor.background\\\":\\\"#1f1f1f\\\",\\\"peekViewEditor.matchHighlightBackground\\\":\\\"#bb800966\\\",\\\"peekViewResult.background\\\":\\\"#1f1f1f\\\",\\\"peekViewResult.matchHighlightBackground\\\":\\\"#bb800966\\\",\\\"pickerGroup.border\\\":\\\"#3c3c3c\\\",\\\"progressBar.background\\\":\\\"#0078d4\\\",\\\"quickInput.background\\\":\\\"#222222\\\",\\\"quickInput.foreground\\\":\\\"#cccccc\\\",\\\"settings.dropdownBackground\\\":\\\"#313131\\\",\\\"settings.dropdownBorder\\\":\\\"#3c3c3c\\\",\\\"settings.headerForeground\\\":\\\"#ffffff\\\",\\\"settings.modifiedItemIndicator\\\":\\\"#bb800966\\\",\\\"sideBar.background\\\":\\\"#181818\\\",\\\"sideBar.border\\\":\\\"#2b2b2b\\\",\\\"sideBar.foreground\\\":\\\"#cccccc\\\",\\\"sideBarSectionHeader.foreground\\\":\\\"#cccccc\\\",\\\"statusBar.background\\\":\\\"#181818\\\",\\\"statusBar.border\\\":\\\"#2b2b2b\\\",\\\"statusBar.debuggingBackground\\\":\\\"#0078d4\\\",\\\"statusBar.debuggingForeground\\\":\\\"#ffffff\\\",\\\"statusBar.focusBorder\\\":\\\"#0078d4\\\",\\\"statusBar.foreground\\\":\\\"#cccccc\\\",\\\"statusBar.noFolderBackground\\\":\\\"#1f1f1f\\\",\\\"statusBarItem.focusBorder\\\":\\\"#0078d4\\\",\\\"statusBarItem.prominentBackground\\\":\\\"#6e768166\\\",\\\"tab.activeBackground\\\":\\\"#1f1f1f\\\",\\\"tab.activeBorder\\\":\\\"#1f1f1f\\\",\\\"tab.activeBorderTop\\\":\\\"#0078d4\\\",\\\"tab.activeForeground\\\":\\\"#ffffff\\\",\\\"tab.selectedBorderTop\\\":\\\"#6caddf\\\",\\\"tab.border\\\":\\\"#2b2b2b\\\",\\\"tab.hoverBackground\\\":\\\"#1f1f1f\\\",\\\"tab.inactiveBackground\\\":\\\"#181818\\\",\\\"tab.inactiveForeground\\\":\\\"#9d9d9d\\\",\\\"tab.unfocusedActiveBorder\\\":\\\"#1f1f1f\\\",\\\"tab.unfocusedActiveBorderTop\\\":\\\"#2b2b2b\\\",\\\"tab.unfocusedHoverBackground\\\":\\\"#1f1f1f\\\",\\\"terminal.foreground\\\":\\\"#cccccc\\\",\\\"terminal.tab.activeBorder\\\":\\\"#0078d4\\\",\\\"textBlockQuote.background\\\":\\\"#2b2b2b\\\",\\\"textBlockQuote.border\\\":\\\"#616161\\\",\\\"textCodeBlock.background\\\":\\\"#2b2b2b\\\",\\\"textLink.activeForeground\\\":\\\"#4daafc\\\",\\\"textLink.foreground\\\":\\\"#4daafc\\\",\\\"textPreformat.foreground\\\":\\\"#d0d0d0\\\",\\\"textPreformat.background\\\":\\\"#3c3c3c\\\",\\\"textSeparator.foreground\\\":\\\"#21262d\\\",\\\"titleBar.activeBackground\\\":\\\"#181818\\\",\\\"titleBar.activeForeground\\\":\\\"#cccccc\\\",\\\"titleBar.border\\\":\\\"#2b2b2b\\\",\\\"titleBar.inactiveBackground\\\":\\\"#1f1f1f\\\",\\\"titleBar.inactiveForeground\\\":\\\"#9d9d9d\\\",\\\"welcomePage.tileBackground\\\":\\\"#2b2b2b\\\",\\\"welcomePage.progress.foreground\\\":\\\"#0078d4\\\"},\\\"watch\\\":false}\",\"workbench.panel.repl.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.repl.view\\\",\\\"isHidden\\\":false}]\",\"workbench.welcomePage.walkthroughMetadata\":\"[[\\\"eamodio.gitlens#welcome\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"get-started\\\",\\\"core-features\\\",\\\"pro-features\\\",\\\"pro-trial\\\",\\\"pro-upgrade\\\",\\\"pro-reactivate\\\",\\\"pro-paid\\\",\\\"visualize\\\",\\\"launchpad\\\",\\\"code-collab\\\",\\\"integrations\\\",\\\"more\\\"],\\\"manaullyOpened\\\":false}],[\\\"GitHub.copilot#copilotWelcome\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"copilot.signin\\\",\\\"copilot.firstsuggest\\\",\\\"copilot.chatWin\\\",\\\"copilot.chatNonWin\\\",\\\"copilot.realfiles.openrecent\\\",\\\"copilot.realfiles.quickopen\\\",\\\"copilot.iterate\\\",\\\"copilot.creativity\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-azuretools.vscode-docker#dockerStart\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"openFolder\\\",\\\"openFolderMac\\\",\\\"scaffold\\\",\\\"buildImage\\\",\\\"runContainer\\\",\\\"dockerExplorer\\\",\\\"pushImage\\\",\\\"azDeploy\\\",\\\"learn\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-python.python#pythonWelcome\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"python.createPythonFolder\\\",\\\"python.createPythonFile\\\",\\\"python.installPythonWin8\\\",\\\"python.installPythonMac\\\",\\\"python.installPythonLinux\\\",\\\"python.createEnvironment\\\",\\\"python.runAndDebug\\\",\\\"python.learnMoreWithDS\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-python.python#pythonDataScienceWelcome\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"python.installJupyterExt\\\",\\\"python.createNewNotebook\\\",\\\"python.openInteractiveWindow\\\",\\\"python.dataScienceLearnMore\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-vscode.cpptools#cppWelcome\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"awaiting.activation.mac\\\",\\\"awaiting.activation.linux\\\",\\\"awaiting.activation.windows\\\",\\\"awaiting.activation.windows10\\\",\\\"awaiting.activation.windows11\\\",\\\"no.compilers.found.mac\\\",\\\"no.compilers.found.linux\\\",\\\"no.compilers.found.windows\\\",\\\"no.compilers.found.windows10\\\",\\\"no.compilers.found.windows11\\\",\\\"verify.compiler.mac\\\",\\\"verify.compiler.linux\\\",\\\"verify.compiler.windows\\\",\\\"verify.compiler.windows10\\\",\\\"verify.compiler.windows11\\\",\\\"create.cpp.file\\\",\\\"relaunch.developer.command.prompt.windows\\\",\\\"run.project.mac\\\",\\\"run.project.linux\\\",\\\"run.project.windows\\\",\\\"customize.debugging.linux\\\",\\\"customize.debugging.windows\\\",\\\"customize.debugging.mac\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-vscode.remote-repositories#remoteRepositoriesWalkthrough\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"editCommitRepo\\\",\\\"createGitHubPullRequest\\\",\\\"continueOn\\\",\\\"openRepo\\\",\\\"remoteIndicator\\\"],\\\"manaullyOpened\\\":false}]]\",\"csharp.1.lastSessionDate\":\"Mon Jul 22 2024\",\"csharp.1.sessionCount\":\"219\",\"extensionTips/promptedExecutableTips\":\"{\\\"wsl\\\":[\\\"ms-vscode-remote.remote-wsl\\\"],\\\"docker\\\":[\\\"ms-vscode-remote.remote-containers\\\"]}\",\"workbench.panel.alignment\":\"center\",\"workbench.statusbar.hidden\":\"[\\\"ms-vscode.cmake-tools\\\",\\\"status.feedback\\\",\\\"mindaro.mindaro\\\",\\\"atlassian.atlascode\\\",\\\"status.workspaceTrust.1621579629793\\\",\\\"status.workspaceTrust.1629938235871\\\",\\\"status.workspaceTrust.1632537148791\\\",\\\"status.workspaceTrust.98d10f2f9493fc1801e2e9645a265f86\\\",\\\"status.workspaceTrust.1632885715911\\\",\\\"status.workspaceTrust.1632885779698\\\",\\\"status.workspaceTrust.1632972072346\\\",\\\"status.workspaceTrust.1642884826669\\\",\\\"status.workspaceTrust.1651969561853\\\",\\\"status.workspaceTrust.1653083347523\\\",\\\"status.workspaceTrust.1657157504982\\\",\\\"status.workspaceTrust.1657157570490\\\",\\\"status.workspaceTrust.1657157616527\\\",\\\"status.workspaceTrust.1658177688125\\\",\\\"status.workspaceTrust.1659132204306\\\",\\\"status.workspaceTrust.1660409095580\\\",\\\"status.workspaceTrust.1660420571411\\\",\\\"status.workspaceTrust.1660534311024\\\",\\\"status.workspaceTrust.1661908552539\\\",\\\"status.workspaceTrust.1661921193085\\\",\\\"status.workspaceTrust.1662399930586\\\",\\\"status.workspaceTrust.1662487352194\\\",\\\"status.workspaceTrust.1662488129833\\\",\\\"status.workspaceTrust.1662489133851\\\",\\\"status.workspaceTrust.1662489273360\\\",\\\"status.workspaceTrust.1662489740820\\\",\\\"status.workspaceTrust.1662495081482\\\",\\\"status.workspaceTrust.1662758801137\\\",\\\"status.workspaceTrust.ff7e0055879de07da01d4fe46d0c91f0\\\",\\\"status.workspaceTrust.1662759069488\\\",\\\"status.workspaceTrust.1662759155946\\\",\\\"status.workspaceTrust.812bc79c982c821e6883b3b54c67f371\\\",\\\"status.workspaceTrust.1662772901070\\\",\\\"status.workspaceTrust.3080b26e0647791886cef6ca70af761b\\\",\\\"status.workspaceTrust.1662774553425\\\",\\\"status.workspaceTrust.93f818e7089d9c38535846ef90270c28\\\",\\\"status.workspaceTrust.e683ea29db54c408313184ef1a948f2c\\\",\\\"status.workspaceTrust.1663120393789\\\",\\\"status.workspaceTrust.1663183840247\\\",\\\"status.workspaceTrust.1663186176073\\\",\\\"status.workspaceTrust.e7d945e3f9f454a1f858ae3476fc2626\\\",\\\"status.workspaceTrust.7c5bc2c7a33f23750990217b9792001c\\\",\\\"status.workspaceTrust.1664835031599\\\",\\\"status.workspaceTrust.1665096102153\\\",\\\"status.workspaceTrust.1665383384373\\\",\\\"status.workspaceTrust.1666422343842\\\",\\\"status.workspaceTrust.1667607210771\\\",\\\"status.workspaceTrust.639a1f30cc7ca463968e2a8a0f908bc5\\\",\\\"status.workspaceTrust.1668038634418\\\",\\\"status.workspaceTrust.1668041463221\\\",\\\"status.workspaceTrust.1668042254756\\\",\\\"status.workspaceTrust.1668042566525\\\",\\\"status.workspaceTrust.c2bf6ad7540d8581a49ad9529ee4bf73\\\",\\\"status.workspaceTrust.1669073911252\\\",\\\"status.workspaceTrust.1669940761038\\\",\\\"status.workspaceTrust.1670434203702\\\",\\\"status.workspaceTrust.49dd806ff78f0e24d60efbab896c767d\\\",\\\"status.workspaceTrust.2393b9ac107fee6b4bf69ed5d3384f27\\\",\\\"status.workspaceTrust.6f5cb1ee031ee55d761462fe5ec86ddd\\\",\\\"status.workspaceTrust.1673166014048\\\",\\\"status.workspaceTrust.1673165872090\\\",\\\"status.workspaceTrust.1675380551811\\\",\\\"status.workspaceTrust.71c571c7a4f01cc74f6237907dc68b65\\\",\\\"status.workspaceTrust.1675382899978\\\",\\\"status.workspaceTrust.1679028556013\\\",\\\"status.workspaceTrust.1679028722774\\\",\\\"status.workspaceTrust.1680041091605\\\",\\\"status.workspaceTrust.1680463219986\\\",\\\"status.workspaceTrust.bfa51580c1a9dc960d6e56bcc5a33ce7\\\",\\\"status.workspaceTrust.1681172243350\\\",\\\"status.workspaceTrust.1681172247710\\\",\\\"status.workspaceTrust.1681417920061\\\",\\\"status.workspaceTrust.1682233402109\\\",\\\"status.workspaceTrust.1682233639535\\\",\\\"status.workspaceTrust.e7e04b8360877ad40d53b80cc31f253e\\\",\\\"status.workspaceTrust.1687056491413\\\",\\\"status.workspaceTrust.1688932607442\\\",\\\"status.workspaceTrust.1688938795948\\\",\\\"status.workspaceTrust.1689734711304\\\",\\\"status.workspaceTrust.1689743549758\\\",\\\"status.workspaceTrust.1690179118118\\\",\\\"status.workspaceTrust.1690629574115\\\",\\\"status.workspaceTrust.1690629772910\\\",\\\"status.workspaceTrust.1690630591819\\\",\\\"status.workspaceTrust.1690631249856\\\",\\\"status.workspaceTrust.59a764e0b535bf8301b1d7f0106a509d\\\",\\\"status.workspaceTrust.1690631454021\\\",\\\"status.workspaceTrust.1690631471819\\\",\\\"status.workspaceTrust.1690631936567\\\",\\\"status.workspaceTrust.1690632053081\\\",\\\"status.workspaceTrust.1690632060605\\\",\\\"status.workspaceTrust.1690632094565\\\",\\\"status.workspaceTrust.1690881757362\\\",\\\"status.workspaceTrust.1690882132349\\\",\\\"status.workspaceTrust.1691062039560\\\",\\\"status.workspaceTrust.5106276a004d631a8a89fc1737d5bdc5\\\",\\\"status.workspaceTrust.1691144724264\\\",\\\"status.workspaceTrust.1691144891488\\\",\\\"status.workspaceTrust.1691145837755\\\",\\\"status.workspaceTrust.1691146206439\\\",\\\"status.workspaceTrust.1691146298537\\\",\\\"status.workspaceTrust.1691146339979\\\",\\\"status.workspaceTrust.1691531308640\\\",\\\"status.workspaceTrust.1691939601313\\\",\\\"status.workspaceTrust.1693184671752\\\",\\\"status.workspaceTrust.618a3f0bdb002acc520be7d258605126\\\",\\\"status.workspaceTrust.e61d85b721f377d4709ad1d2ee546337\\\",\\\"status.workspaceTrust.1693188561842\\\",\\\"status.workspaceTrust.1fa9573bc6bae80a06d3a109c628e8d4\\\",\\\"status.workspaceTrust.1693365880955\\\",\\\"status.workspaceTrust.1693381026116\\\",\\\"status.workspaceTrust.1693381044164\\\",\\\"status.workspaceTrust.aff81d9ff4da33ac0c53e9aa110d7645\\\",\\\"status.workspaceTrust.1693456179435\\\",\\\"status.workspaceTrust.1693459290692\\\",\\\"status.workspaceTrust.1693637542105\\\",\\\"status.workspaceTrust.fc58d27d80224a155d537b7864bd4c84\\\",\\\"status.workspaceTrust.1693645899627\\\",\\\"status.workspaceTrust.bbe2dba3c1c59639167386a3865ce670\\\",\\\"status.workspaceTrust.c9f98d01e6910ad2e30ee2dfc755d5c6\\\",\\\"status.workspaceTrust.c9b4f0b9e6a3c2f90783a60f313587f5\\\",\\\"status.workspaceTrust.1695435675547\\\",\\\"status.workspaceTrust.1696319828813\\\",\\\"status.workspaceTrust.553362f632f65cb2c023d6ac7c2e57f1\\\",\\\"status.workspaceTrust.1697504367108\\\",\\\"status.workspaceTrust.80cbe5bfe961e953a9465d3efda01f4f\\\",\\\"status.workspaceTrust.59ea7b5d7968c92ecdf5ceaceee71df9\\\",\\\"status.workspaceTrust.09d00a6357ea4fdf5313d8d2b9063fb9\\\",\\\"status.workspaceTrust.1698903319743\\\",\\\"status.workspaceTrust.1699074246717\\\",\\\"status.workspaceTrust.1699519926358\\\",\\\"status.workspaceTrust.1700647378448\\\",\\\"status.workspaceTrust.1700739389648\\\",\\\"status.workspaceTrust.1700742950383\\\",\\\"status.workspaceTrust.1701960495809\\\",\\\"status.workspaceTrust.1702013066482\\\",\\\"status.workspaceTrust.10a911dec1a5ff51f292d2c0ca22599a\\\",\\\"status.workspaceTrust.1702017791569\\\",\\\"status.workspaceTrust.1703545873467\\\",\\\"status.workspaceTrust.1704976411957\\\"]\",\"commandPalette.mru.cache\":\"{\\\"usesLRU\\\":true,\\\"entries\\\":[{\\\"key\\\":\\\"java.runtime\\\",\\\"value\\\":5},{\\\"key\\\":\\\"gitlens.enableDebugLogging\\\",\\\"value\\\":7},{\\\"key\\\":\\\"gitlens.plus.hide\\\",\\\"value\\\":8},{\\\"key\\\":\\\"workbench.action.toggleKeybindingsLog\\\",\\\"value\\\":9},{\\\"key\\\":\\\"search.action.clearHistory\\\",\\\"value\\\":10},{\\\"key\\\":\\\"workbench.profiles.actions.cleanupProfiles\\\",\\\"value\\\":11},{\\\"key\\\":\\\"resetGettingStartedProgress\\\",\\\"value\\\":13},{\\\"key\\\":\\\"workbench.profiles.actions.resetWorkspaces\\\",\\\"value\\\":14},{\\\"key\\\":\\\"workbench.extensions.action.refreshExtension\\\",\\\"value\\\":16},{\\\"key\\\":\\\"workbench.extensions.action.enableAll\\\",\\\"value\\\":17},{\\\"key\\\":\\\"pylance.indexing.clearPersistedIndices\\\",\\\"value\\\":19},{\\\"key\\\":\\\"workbench.action.reloadWindow\\\",\\\"value\\\":31},{\\\"key\\\":\\\"workbench.action.openSettingsJson\\\",\\\"value\\\":32},{\\\"key\\\":\\\"python.clearWorkspaceInterpreter\\\",\\\"value\\\":33},{\\\"key\\\":\\\"python.clearCacheAndReload\\\",\\\"value\\\":34}]}\",\"commandPalette.mru.counter\":\"35\",\"workbench.view.extension.tabnine.state.hidden\":\"[{\\\"id\\\":\\\"tabnine.chat\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.welcome\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.authenticate\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.loading\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.preview_ended\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.authenticate\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.not_part_of_a_team\\\",\\\"isHidden\\\":false}]\",\"Comments.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.comments\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.mintdocs.state.hidden\":\"[{\\\"id\\\":\\\"docs\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"formatOptions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"progress\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"languageOptions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"team\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"hotkeyOptions\\\",\\\"isHidden\\\":false}]\",\"extensionsAssistant/deprecated\":\"[\\\"dongli.python-preview\\\"]\",\"snippets.usageTimestamps\":\"[[\\\"snippets/modules.json/__init__() from the logging module\\\",1693645332771],[\\\"snippets/modules.json/main() from the py_compile module\\\",1712862626745],[\\\"snippets/modules.json/request() from the http.client module\\\",1712862629845],[\\\"snippets/modules.json/length() from the xml.dom module\\\",1713135565321],[\\\"snippets/modules.json/Class from the symtable module\\\",1714100265267],[\\\"snippets/modules.json/datetime A combination of a date and a time. Attributes: () from the datetime module\\\",1714592817409]]\",\"tabnine-Ferreyra Carlos Eduardo\":\"[{\\\"id\\\":\\\"tabnine.tabnine-vscode\\\",\\\"name\\\":\\\"Tabnine AI\\\",\\\"allowed\\\":true}]\",\"fileBasedRecommendations/promptedRecommendations\":\"{\\\"makefile\\\":[\\\"ms-vscode.makefile-tools\\\"],\\\"powershell\\\":[\\\"ms-vscode.powershell\\\"],\\\"yaml\\\":[\\\"github.vscode-github-actions\\\"],\\\"java\\\":[\\\"vscjava.vscode-java-pack\\\"]}\",\"tabs-list-width-horizontal\":\"137\",\"workbench.welcomePage.hiddenCategories\":\"[]\",\"workbench.view.extension.package-explorer.state.hidden\":\"[{\\\"id\\\":\\\"pythonEnvironments\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workspaceEnvironments\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.figma.state.hidden\":\"[{\\\"id\\\":\\\"figma.views.login\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.dummyLoginNotifications\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.files\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.notifications\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.github-pull-request.state.hidden\":\"[{\\\"id\\\":\\\"github:createPullRequest\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChanges\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"prStatus:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:activePullRequest\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:activePullRequest:welcome\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:createPullRequestWebview\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChangesFiles\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChangesCommits\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extensions.state.hidden\":\"[{\\\"id\\\":\\\"workbench.views.extensions.installed\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchOutdated\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.workspaceRecommendations\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.popular\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchRecentlyUpdated\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.otherRecommendations\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extensions.recommendedList\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.enabled\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"workbench.views.extensions.disabled\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"workbench.views.extensions.marketplace\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchInstalled\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchEnabled\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchDisabled\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchBuiltin\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchWorkspaceUnsupported\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.builtinFeatureExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.builtinThemeExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.builtinProgrammingLanguageExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.untrustedUnsupportedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.untrustedPartiallySupportedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.virtualUnsupportedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.virtualPartiallySupportedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.deprecatedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.local.installed\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.remote.installed\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.project-manager.state.hidden\":\"[{\\\"id\\\":\\\"projectsExplorerFavorites\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"projectsExplorerGit\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"projectsExplorerSVN\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"projectsExplorerAny\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"projectsExplorerMercurial\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"projectsExplorerVSCode\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"projectManagerHelpAndFeedback\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.gitlens.state.hidden\":\"[{\\\"id\\\":\\\"gitlens.views.home\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.workspaces\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.account\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.drafts\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.gitlensInspect.state.hidden\":\"[{\\\"id\\\":\\\"gitlens.views.commitDetails\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.lineHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.fileHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.timeline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.searchAndCompare\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.pullRequest\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.github-pull-requests.state.hidden\":\"[{\\\"id\\\":\\\"github:login\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"pr:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"issues:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:conflictResolution\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.dockerView.state.hidden\":\"[{\\\"id\\\":\\\"dockerContainers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerImages\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerRegistries\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerNetworks\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerVolumes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-docker.views.dockerContexts\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-docker.views.help\\\",\\\"isHidden\\\":false}]\",\"workbench.view.remote.state.hidden\":\"[{\\\"id\\\":\\\"targetsContainers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"detailsContainers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"devVolumes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"targetsWsl\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"remoteTargets\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"remoteHub.views.workspaceRepositories\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"~remote.helpPanel\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.makefile__viewContainer.state.hidden\":\"[{\\\"id\\\":\\\"makefile.outline\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.test.state.hidden\":\"[{\\\"id\\\":\\\"workbench.view.testing\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"test-explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.view.testCoverage\\\",\\\"isHidden\\\":false}]\",\"nps/isCandidate\":\"true\",\"~remote.forwardedPortsContainer.hidden\":\"[{\\\"id\\\":\\\"~remote.forwardedPorts\\\",\\\"isHidden\\\":false}]\",\"ces/skipSurvey\":\"1.85.1\",\"workbench.view.extension.codeium.state.hidden\":\"[{\\\"id\\\":\\\"codeium.chatPanelView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"codeium.searchPanelView\\\",\\\"isHidden\\\":false}]\",\"codeium_auth-Ferreyra Carlos Eduardo (Ferreyra, Carlos Eduardo)\":\"[{\\\"id\\\":\\\"codeium.codeium\\\",\\\"name\\\":\\\"Codeium: AI Coding Autocomplete and Chat for Python, Javascript, Typescript, Java, Go, and more\\\",\\\"allowed\\\":true}]\",\"userDataProfiles.state.hidden\":\"[{\\\"id\\\":\\\"workbench.views.profiles.export.preview\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.1-cloudCodeContainer.state.hidden\":\"[{\\\"id\\\":\\\"cloudcode.unified.kubernetes.localDevExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.kubectlExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.cloudRunExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.apiExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.secretsExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.gceExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.apigee.explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.gcfExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.awsLambdaImporterExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.cloudStorageExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.sourceProtectExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.mcdcSources\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.helpAndFeedbackExplorer\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.1-cloudCodeDuetAIChatViewContainer.state.hidden\":\"[{\\\"id\\\":\\\"cloudcode.duetAI.chatView\\\",\\\"isHidden\\\":false}]\",\"terminal.integrated.showTerminalConfigPrompt\":\"false\",\"workbench.view.extension.1-geminiAIChatViewContainer.state.hidden\":\"[{\\\"id\\\":\\\"cloudcode.gemini.chatView\\\",\\\"isHidden\\\":false}]\",\"javascript.1.editedCount\":\"7\",\"javascript.1.editedDate\":\"Tue Jun 25 2024\",\"memento/workbench.editor.keybindings\":\"{\\\"searchHistory\\\":[\\\"omm\\\",\\\"comm\\\",\\\"command+\\\",\\\"command+t\\\",\\\"terminal \\\",\\\"co\\\",\\\"command e c\\\",\\\"command e command t\\\",\\\"command e com\\\",\\\"command e\\\",\\\"com\\\",\\\"ter\\\",\\\"terminal create\\\",\\\"integrated\\\",\\\"terminal\\\",\\\"comment\\\",\\\"copilot\\\"]}\",\"http.linkProtectionTrustedDomains\":\"[\\\"https://accounts.google.com\\\"]\",\"workbench.panel.chatSidebar.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.chat.view.copilot\\\",\\\"isHidden\\\":false}]\",\"typescript.1.editedCount\":\"1\",\"typescript.1.editedDate\":\"Fri May 03 2024\",\"workbench.view.extension.vscode-edge-devtools-view.state.hidden\":\"[{\\\"id\\\":\\\"vscode-edge-devtools-view.targets\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-edge-devtools-view.help-links\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.github-actions.state.hidden\":\"[{\\\"id\\\":\\\"github-actions.current-branch\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.workflows\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.settings\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.empty-view\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.github-cweijan-mysql.state.hidden\":\"[{\\\"id\\\":\\\"github.cweijan.mysql\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.github-cweijan-nosql.state.hidden\":\"[{\\\"id\\\":\\\"github.cweijan.nosql\\\",\\\"isHidden\\\":false}]\",\"remoteTunnelServicePromptedPreview\":\"true\",\"remoteTunnelServiceUsed\":\"{\\\"hostName\\\":\\\"carloss-laptoplocal\\\",\\\"timeStamp\\\":1716488963137}\",\"workbench.view.extension.liveshare.state.hidden\":\"[{\\\"id\\\":\\\"liveshare.session\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.help\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.devtools\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.kubernetesView.state.hidden\":\"[{\\\"id\\\":\\\"extension.vsKubernetesExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extension.vsKubernetesHelmRepoExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"kubernetes.cloudExplorer\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.sqltoolsActivityBarContainer.state.hidden\":\"[{\\\"id\\\":\\\"sqltoolsViewConnectionExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqltoolsViewBookmarksExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqltoolsViewHistoryExplorer\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.sqltoolsPanelContainer.state.hidden\":\"[{\\\"id\\\":\\\"sqltoolsViewConsoleMessages\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.codegpt-sidebar-view.state.hidden\":\"[{\\\"id\\\":\\\"codegpt-sidebar\\\",\\\"isHidden\\\":false}]\",\"github-carlosferreyra\":\"[{\\\"id\\\":\\\"github.copilot\\\",\\\"name\\\":\\\"GitHub Copilot\\\",\\\"allowed\\\":true},{\\\"id\\\":\\\"github.copilot-chat\\\",\\\"name\\\":\\\"GitHub Copilot Chat\\\",\\\"allowed\\\":true},{\\\"id\\\":\\\"vscode.configuration-editing\\\",\\\"name\\\":\\\"Configuration Editing\\\",\\\"allowed\\\":true},{\\\"id\\\":\\\"github.vscode-github-actions\\\",\\\"name\\\":\\\"GitHub Actions\\\",\\\"allowed\\\":true}]\",\"extension.features.state\":\"{\\\"GitHub.copilot-chat\\\":{\\\"languageModels\\\":{\\\"disabled\\\":false,\\\"accessCount\\\":469}}}\",\"languageModelAccess.copilot-gpt-4\":\"[\\\"github.copilot-chat\\\"]\",\"languageModelStats.copilot-gpt-4\":\"{\\\"extensions\\\":[{\\\"extensionId\\\":\\\"GitHub.copilot-chat\\\",\\\"requestCount\\\":0,\\\"tokenCount\\\":0,\\\"participants\\\":[{\\\"id\\\":\\\"github.copilot.workspace\\\",\\\"requestCount\\\":22,\\\"tokenCount\\\":25134},{\\\"id\\\":\\\"github.copilot.default\\\",\\\"requestCount\\\":33,\\\"tokenCount\\\":39027},{\\\"id\\\":\\\"github.copilot.vscode\\\",\\\"requestCount\\\":3,\\\"tokenCount\\\":8163},{\\\"id\\\":\\\"github.copilot.terminal\\\",\\\"requestCount\\\":8,\\\"tokenCount\\\":4476}]}]}\",\"languageModelAccess.copilot-gpt-3.5-turbo\":\"[\\\"github.copilot-chat\\\"]\",\"languageModelStats.copilot-gpt-3.5-turbo\":\"{\\\"extensions\\\":[{\\\"extensionId\\\":\\\"GitHub.copilot-chat\\\",\\\"requestCount\\\":61,\\\"tokenCount\\\":94102,\\\"participants\\\":[{\\\"id\\\":\\\"github.copilot.editor\\\",\\\"requestCount\\\":133,\\\"tokenCount\\\":53458}]}]}\",\"workbench.auxiliarybar.pinnedPanels\":\"[{\\\"id\\\":\\\"workbench.panel.chatSidebar\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":100},{\\\"id\\\":\\\"workbench.views.service.auxiliarybar.9efd7744-aead-42ca-bbcd-ac5d75eb8f28\\\",\\\"pinned\\\":true,\\\"visible\\\":false}]\",\"views.customizations\":\"{\\\"viewContainerLocations\\\":{\\\"workbench.panel.chatSidebar\\\":2,\\\"workbench.views.service.auxiliarybar.9efd7744-aead-42ca-bbcd-ac5d75eb8f28\\\":2},\\\"viewLocations\\\":{\\\"workbench.panel.chat.view.copilot\\\":\\\"workbench.views.service.auxiliarybar.9efd7744-aead-42ca-bbcd-ac5d75eb8f28\\\"},\\\"viewContainerBadgeEnablementStates\\\":{}}\",\"remote.tunnels.toRestore.undefined.-219061745\":\"[{\\\"remoteHost\\\":\\\"localhost\\\",\\\"remotePort\\\":8000,\\\"localAddress\\\":\\\"https://lvsknjvk-8000.brs.devtunnels.ms/\\\",\\\"localUri\\\":{\\\"$mid\\\":1,\\\"path\\\":\\\"/\\\",\\\"scheme\\\":\\\"https\\\",\\\"authority\\\":\\\"lvsknjvk-8000.brs.devtunnels.ms\\\"},\\\"protocol\\\":\\\"http\\\",\\\"source\\\":{\\\"source\\\":0,\\\"description\\\":\\\"User Forwarded\\\"}}]\",\"remote.tunnels.toRestoreExpiration.undefined.-219061745\":\"1718366097271\",\"languageModelAccess.gpt-3.5-turbo\":\"[\\\"github.copilot-chat\\\"]\",\"languageModelStats.gpt-3.5-turbo\":\"{\\\"extensions\\\":[{\\\"extensionId\\\":\\\"GitHub.copilot-chat\\\",\\\"requestCount\\\":9,\\\"tokenCount\\\":15668,\\\"participants\\\":[{\\\"id\\\":\\\"github.copilot.editor\\\",\\\"requestCount\\\":147,\\\"tokenCount\\\":90412},{\\\"id\\\":\\\"git-commit\\\",\\\"requestCount\\\":35,\\\"tokenCount\\\":45588}]}]}\",\"languageModelAccess.gpt-4-0125-preview\":\"[\\\"github.copilot-chat\\\"]\",\"languageModelStats.gpt-4-0125-preview\":\"{\\\"extensions\\\":[{\\\"extensionId\\\":\\\"GitHub.copilot-chat\\\",\\\"requestCount\\\":0,\\\"tokenCount\\\":0,\\\"participants\\\":[{\\\"id\\\":\\\"github.copilot.workspace\\\",\\\"requestCount\\\":5,\\\"tokenCount\\\":8978},{\\\"id\\\":\\\"github.copilot.default\\\",\\\"requestCount\\\":5,\\\"tokenCount\\\":12523},{\\\"id\\\":\\\"github.copilot.terminal\\\",\\\"requestCount\\\":8,\\\"tokenCount\\\":4567}]}]}\",\"refactorPreview.hidden\":\"[{\\\"id\\\":\\\"refactorPreview\\\",\\\"isHidden\\\":false}]\",\"terminal-inline-chat-history\":\"[\\\"install yarn\\\",\\\"don't remember the rest of the cmd\\\",\\\"complete the command to generate the docs\\\"]\",\"workbench.views.service.auxiliarybar.9efd7744-aead-42ca-bbcd-ac5d75eb8f28.state.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.chat.view.copilot\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.msg-view.state.hidden\":\"[{\\\"id\\\":\\\"msg.openEditors\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"msg.connections\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"msg.oci\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"msg.shellTasks\\\",\\\"isHidden\\\":false}]\",\"scm.input.lastActionId\":\"github.copilot.git.generateCommitMessage\",\"java.2.editedCount\":\"1\",\"java.2.editedDate\":\"Mon Jul 15 2024\",\"workbench.view.extension.gitlensPanel.state.hidden\":\"[{\\\"id\\\":\\\"gitlens.views.graph\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.graphDetails\\\",\\\"isHidden\\\":false}]\",\"memento/gettingStartedService\":\"{\\\"commandPaletteTask\\\":{\\\"done\\\":true},\\\"commandPaletteTaskWeb\\\":{\\\"done\\\":true},\\\"pickColorTheme\\\":{\\\"done\\\":true},\\\"pickColorThemeWeb\\\":{\\\"done\\\":true}}\",\"microsoft-jadu_015@hotmail.com\":\"[{\\\"id\\\":\\\"ms-vscode.remote-server\\\",\\\"name\\\":\\\"Remote - Tunnels\\\",\\\"allowed\\\":true}]\",\"expandSuggestionDocs\":\"true\"}}"} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..937294f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,34 @@ +# Use the official Python image from the Docker Hub +FROM python:3.12-slim-bullseye + +# Set environment variables +ENV SECRET_KEY=${DJANGO_SECRET_KEY} +ENV DJANGO_SETTINGS_MODULE=server.settings.base +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +# Set the working directory +WORKDIR /app + +# Copy the requirements file and install dependencies +COPY requirements.txt . +RUN pip install --upgrade pip && pip install -r requirements.txt + +# Copy the entire backend directory +COPY backend/ . + +# Collect static files +RUN python manage.py collectstatic --noinput + +# Make migrations and migrate the database +RUN python manage.py makemigrations +RUN python manage.py migrate + +# Generate the OpenAPI schema +RUN python manage.py spectacular --color --file schema.yml --validate + +# Expose port 8000 for the Django app +EXPOSE 8000 + +# Run the application +CMD ["gunicorn", "server.wsgi:application", "--bind", "0.0.0.0:8000"] \ No newline at end of file diff --git a/FrontAdmin/.env.production b/FrontAdmin/.env.production new file mode 100644 index 0000000..30d03a3 --- /dev/null +++ b/FrontAdmin/.env.production @@ -0,0 +1 @@ +VITE_API_URL=http://djangobackend.us-east-1.elasticbeanstalk.com/api/swagger-ui/ \ No newline at end of file diff --git a/FrontAdmin/.eslintrc.cjs b/FrontAdmin/.eslintrc.cjs new file mode 100644 index 0000000..97e94fc --- /dev/null +++ b/FrontAdmin/.eslintrc.cjs @@ -0,0 +1,21 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react-hooks/recommended", + ], + ignorePatterns: ["dist", ".eslintrc.cjs"], + parser: "@typescript-eslint/parser", + plugins: ["react-refresh"], + rules: { + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + "@typescript-eslint/prefer-as-const": "warn", // Warning de la regla que requiere const en lugar de type assertion + "@typescript-eslint/no-unused-vars": "warn", // Warning de la regla que indica variables no usadas + "no-extra-semi": "warn", // Warning de la regla que prohíbe los puntos y comas innecesarios + }, +}; diff --git a/FrontAdmin/index.html b/FrontAdmin/index.html new file mode 100644 index 0000000..3459bec --- /dev/null +++ b/FrontAdmin/index.html @@ -0,0 +1,13 @@ + + + + + + + TUP + + +
+ + + diff --git a/FrontAdmin/package-lock.json b/FrontAdmin/package-lock.json new file mode 100644 index 0000000..f7d13e5 --- /dev/null +++ b/FrontAdmin/package-lock.json @@ -0,0 +1,4973 @@ +{ + "name": "frontadmin", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontadmin", + "version": "0.0.0", + "dependencies": { + "@chakra-ui/icons": "^2.1.1", + "@chakra-ui/react": "^2.8.2", + "@types/react-router-dom": "^5.3.3", + "chart.js": "^4.4.3", + "date-fns": "^3.6.0", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-datepicker": "^6.9.0", + "react-dom": "^18.2.0", + "react-icons": "^5.2.1", + "react-router-dom": "^6.23.1" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-datepicker": "^6.2.0", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "peer": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "peer": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@chakra-ui/accordion": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.3.1.tgz", + "integrity": "sha512-FSXRm8iClFyU+gVaXisOSEw0/4Q+qZbFRiuhIAkVU6Boj0FxAMrlo9a8AV5TuF77rgaHytCdHk0Ng+cyUijrag==", + "dependencies": { + "@chakra-ui/descendant": "3.1.0", + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/alert": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.2.2.tgz", + "integrity": "sha512-jHg4LYMRNOJH830ViLuicjb3F+v6iriE/2G5T+Sd0Hna04nukNJ1MxUmBPE+vI22me2dIflfelu2v9wdB6Pojw==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/spinner": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/anatomy": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.2.2.tgz", + "integrity": "sha512-MV6D4VLRIHr4PkW4zMyqfrNS1mPlCTiCXwvYGtDFQYr+xHFfonhAuf9WjsSc0nyp2m0OdkSLnzmVKkZFLo25Tg==" + }, + "node_modules/@chakra-ui/avatar": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.3.0.tgz", + "integrity": "sha512-8gKSyLfygnaotbJbDMHDiJoF38OHXUYVme4gGxZ1fLnQEdPVEaIWfH+NndIjOM0z8S+YEFnT9KyGMUtvPrBk3g==", + "dependencies": { + "@chakra-ui/image": "2.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/breadcrumb": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.2.0.tgz", + "integrity": "sha512-4cWCG24flYBxjruRi4RJREWTGF74L/KzI2CognAW/d/zWR0CjiScuJhf37Am3LFbCySP6WSoyBOtTIoTA4yLEA==", + "dependencies": { + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/breakpoint-utils": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz", + "integrity": "sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "node_modules/@chakra-ui/button": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/button/-/button-2.1.0.tgz", + "integrity": "sha512-95CplwlRKmmUXkdEp/21VkEWgnwcx2TOBG6NfYlsuLBDHSLlo5FKIiE2oSi4zXc4TLcopGcWPNcm/NDaSC5pvA==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/spinner": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/card": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/card/-/card-2.2.0.tgz", + "integrity": "sha512-xUB/k5MURj4CtPAhdSoXZidUbm8j3hci9vnc+eZJVDqhDOShNlD6QeniQNRPRys4lWAQLCbFcrwL29C8naDi6g==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/checkbox": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.3.2.tgz", + "integrity": "sha512-85g38JIXMEv6M+AcyIGLh7igNtfpAN6KGQFYxY9tBj0eWvWk4NKQxvqqyVta0bSAyIl1rixNIIezNpNWk2iO4g==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/visually-hidden": "2.2.0", + "@zag-js/focus-visible": "0.16.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/clickable": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.1.0.tgz", + "integrity": "sha512-flRA/ClPUGPYabu+/GLREZVZr9j2uyyazCAUHAdrTUEdDYCr31SVGhgh7dgKdtq23bOvAQJpIJjw/0Bs0WvbXw==", + "dependencies": { + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/close-button": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.1.1.tgz", + "integrity": "sha512-gnpENKOanKexswSVpVz7ojZEALl2x5qjLYNqSQGbxz+aP9sOXPfUS56ebyBrre7T7exuWGiFeRwnM0oVeGPaiw==", + "dependencies": { + "@chakra-ui/icon": "3.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/color-mode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.2.0.tgz", + "integrity": "sha512-niTEA8PALtMWRI9wJ4LL0CSBDo8NBfLNp4GD6/0hstcm3IlbBHTVKxN6HwSaoNYfphDQLxCjT4yG+0BJA5tFpg==", + "dependencies": { + "@chakra-ui/react-use-safe-layout-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/control-box": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.1.0.tgz", + "integrity": "sha512-gVrRDyXFdMd8E7rulL0SKeoljkLQiPITFnsyMO8EFHNZ+AHt5wK4LIguYVEq88APqAGZGfHFWXr79RYrNiE3Mg==", + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/counter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.1.0.tgz", + "integrity": "sha512-s6hZAEcWT5zzjNz2JIWUBzRubo9la/oof1W7EKZVVfPYHERnl5e16FmBC79Yfq8p09LQ+aqFKm/etYoJMMgghw==", + "dependencies": { + "@chakra-ui/number-utils": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/css-reset": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.3.0.tgz", + "integrity": "sha512-cQwwBy5O0jzvl0K7PLTLgp8ijqLPKyuEMiDXwYzl95seD3AoeuoCLyzZcJtVqaUZ573PiBdAbY/IlZcwDOItWg==", + "peerDependencies": { + "@emotion/react": ">=10.0.35", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/descendant": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.1.0.tgz", + "integrity": "sha512-VxCIAir08g5w27klLyi7PVo8BxhW4tgU/lxQyujkmi4zx7hT9ZdrcQLAted/dAa+aSIZ14S1oV0Q9lGjsAdxUQ==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/dom-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.1.0.tgz", + "integrity": "sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ==" + }, + "node_modules/@chakra-ui/editable": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/editable/-/editable-3.1.0.tgz", + "integrity": "sha512-j2JLrUL9wgg4YA6jLlbU88370eCRyor7DZQD9lzpY95tSOXpTljeg3uF9eOmDnCs6fxp3zDWIfkgMm/ExhcGTg==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-focus-on-pointer-down": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/event-utils": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz", + "integrity": "sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw==" + }, + "node_modules/@chakra-ui/focus-lock": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.1.0.tgz", + "integrity": "sha512-EmGx4PhWGjm4dpjRqM4Aa+rCWBxP+Rq8Uc/nAVnD4YVqkEhBkrPTpui2lnjsuxqNaZ24fIAZ10cF1hlpemte/w==", + "dependencies": { + "@chakra-ui/dom-utils": "2.1.0", + "react-focus-lock": "^2.9.4" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/form-control": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.2.0.tgz", + "integrity": "sha512-wehLC1t4fafCVJ2RvJQT2jyqsAwX7KymmiGqBu7nQoQz8ApTkGABWpo/QwDh3F/dBLrouHDoOvGmYTqft3Mirw==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/hooks": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.2.1.tgz", + "integrity": "sha512-RQbTnzl6b1tBjbDPf9zGRo9rf/pQMholsOudTxjy4i9GfTfz6kgp5ValGjQm2z7ng6Z31N1cnjZ1AlSzQ//ZfQ==", + "dependencies": { + "@chakra-ui/react-utils": "2.0.12", + "@chakra-ui/utils": "2.0.15", + "compute-scroll-into-view": "3.0.3", + "copy-to-clipboard": "3.3.3" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/icon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.2.0.tgz", + "integrity": "sha512-xxjGLvlX2Ys4H0iHrI16t74rG9EBcpFvJ3Y3B7KMQTrnW34Kf7Da/UC8J67Gtx85mTHW020ml85SVPKORWNNKQ==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/icons": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/icons/-/icons-2.1.1.tgz", + "integrity": "sha512-3p30hdo4LlRZTT5CwoAJq3G9fHI0wDc0pBaMHj4SUn0yomO+RcDRlzhdXqdr5cVnzax44sqXJVnf3oQG0eI+4g==", + "dependencies": { + "@chakra-ui/icon": "3.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/image": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-2.1.0.tgz", + "integrity": "sha512-bskumBYKLiLMySIWDGcz0+D9Th0jPvmX6xnRMs4o92tT3Od/bW26lahmV2a2Op2ItXeCmRMY+XxJH5Gy1i46VA==", + "dependencies": { + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/input": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/input/-/input-2.1.2.tgz", + "integrity": "sha512-GiBbb3EqAA8Ph43yGa6Mc+kUPjh4Spmxp1Pkelr8qtudpc3p2PJOOebLpd90mcqw8UePPa+l6YhhPtp6o0irhw==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/object-utils": "2.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/layout": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.3.1.tgz", + "integrity": "sha512-nXuZ6WRbq0WdgnRgLw+QuxWAHuhDtVX8ElWqcTK+cSMFg/52eVP47czYBE5F35YhnoW2XBwfNoNgZ7+e8Z01Rg==", + "dependencies": { + "@chakra-ui/breakpoint-utils": "2.0.8", + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/object-utils": "2.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/lazy-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz", + "integrity": "sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg==" + }, + "node_modules/@chakra-ui/live-region": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.1.0.tgz", + "integrity": "sha512-ZOxFXwtaLIsXjqnszYYrVuswBhnIHHP+XIgK1vC6DePKtyK590Wg+0J0slDwThUAd4MSSIUa/nNX84x1GMphWw==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/media-query": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.3.0.tgz", + "integrity": "sha512-IsTGgFLoICVoPRp9ykOgqmdMotJG0CnPsKvGQeSFOB/dZfIujdVb14TYxDU4+MURXry1MhJ7LzZhv+Ml7cr8/g==", + "dependencies": { + "@chakra-ui/breakpoint-utils": "2.0.8", + "@chakra-ui/react-env": "3.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/menu": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.2.1.tgz", + "integrity": "sha512-lJS7XEObzJxsOwWQh7yfG4H8FzFPRP5hVPN/CL+JzytEINCSBvsCDHrYPQGp7jzpCi8vnTqQQGQe0f8dwnXd2g==", + "dependencies": { + "@chakra-ui/clickable": "2.1.0", + "@chakra-ui/descendant": "3.1.0", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/popper": "3.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-animation-state": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-disclosure": "2.1.0", + "@chakra-ui/react-use-focus-effect": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-outside-click": "2.2.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/modal": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.3.1.tgz", + "integrity": "sha512-TQv1ZaiJMZN+rR9DK0snx/OPwmtaGH1HbZtlYt4W4s6CzyK541fxLRTjIXfEzIGpvNW+b6VFuFjbcR78p4DEoQ==", + "dependencies": { + "@chakra-ui/close-button": "2.1.1", + "@chakra-ui/focus-lock": "2.1.0", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.1.0", + "aria-hidden": "^1.2.3", + "react-remove-scroll": "^2.5.6" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/number-input": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.1.2.tgz", + "integrity": "sha512-pfOdX02sqUN0qC2ysuvgVDiws7xZ20XDIlcNhva55Jgm095xjm8eVdIBfNm3SFbSUNxyXvLTW/YQanX74tKmuA==", + "dependencies": { + "@chakra-ui/counter": "2.1.0", + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/react-use-event-listener": "2.1.0", + "@chakra-ui/react-use-interval": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/number-utils": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz", + "integrity": "sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg==" + }, + "node_modules/@chakra-ui/object-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.1.0.tgz", + "integrity": "sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ==" + }, + "node_modules/@chakra-ui/pin-input": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.1.0.tgz", + "integrity": "sha512-x4vBqLStDxJFMt+jdAHHS8jbh294O53CPQJoL4g228P513rHylV/uPscYUHrVJXRxsHfRztQO9k45jjTYaPRMw==", + "dependencies": { + "@chakra-ui/descendant": "3.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/popover": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.2.1.tgz", + "integrity": "sha512-K+2ai2dD0ljvJnlrzesCDT9mNzLifE3noGKZ3QwLqd/K34Ym1W/0aL1ERSynrcG78NKoXS54SdEzkhCZ4Gn/Zg==", + "dependencies": { + "@chakra-ui/close-button": "2.1.1", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/popper": "3.1.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-animation-state": "2.1.0", + "@chakra-ui/react-use-disclosure": "2.1.0", + "@chakra-ui/react-use-focus-effect": "2.1.0", + "@chakra-ui/react-use-focus-on-pointer-down": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/popper": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.1.0.tgz", + "integrity": "sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg==", + "dependencies": { + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@popperjs/core": "^2.9.3" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/portal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.1.0.tgz", + "integrity": "sha512-9q9KWf6SArEcIq1gGofNcFPSWEyl+MfJjEUg/un1SMlQjaROOh3zYr+6JAwvcORiX7tyHosnmWC3d3wI2aPSQg==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/progress": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.2.0.tgz", + "integrity": "sha512-qUXuKbuhN60EzDD9mHR7B67D7p/ZqNS2Aze4Pbl1qGGZfulPW0PY8Rof32qDtttDQBkzQIzFGE8d9QpAemToIQ==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/provider": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.4.2.tgz", + "integrity": "sha512-w0Tef5ZCJK1mlJorcSjItCSbyvVuqpvyWdxZiVQmE6fvSJR83wZof42ux0+sfWD+I7rHSfj+f9nzhNaEWClysw==", + "dependencies": { + "@chakra-ui/css-reset": "2.3.0", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/react-env": "3.1.0", + "@chakra-ui/system": "2.6.2", + "@chakra-ui/utils": "2.0.15" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/radio": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.1.2.tgz", + "integrity": "sha512-n10M46wJrMGbonaghvSRnZ9ToTv/q76Szz284gv4QUWvyljQACcGrXIONUnQ3BIwbOfkRqSk7Xl/JgZtVfll+w==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@zag-js/focus-visible": "0.16.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-2.8.2.tgz", + "integrity": "sha512-Hn0moyxxyCDKuR9ywYpqgX8dvjqwu9ArwpIb9wHNYjnODETjLwazgNIliCVBRcJvysGRiV51U2/JtJVrpeCjUQ==", + "dependencies": { + "@chakra-ui/accordion": "2.3.1", + "@chakra-ui/alert": "2.2.2", + "@chakra-ui/avatar": "2.3.0", + "@chakra-ui/breadcrumb": "2.2.0", + "@chakra-ui/button": "2.1.0", + "@chakra-ui/card": "2.2.0", + "@chakra-ui/checkbox": "2.3.2", + "@chakra-ui/close-button": "2.1.1", + "@chakra-ui/control-box": "2.1.0", + "@chakra-ui/counter": "2.1.0", + "@chakra-ui/css-reset": "2.3.0", + "@chakra-ui/editable": "3.1.0", + "@chakra-ui/focus-lock": "2.1.0", + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/hooks": "2.2.1", + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/image": "2.1.0", + "@chakra-ui/input": "2.1.2", + "@chakra-ui/layout": "2.3.1", + "@chakra-ui/live-region": "2.1.0", + "@chakra-ui/media-query": "3.3.0", + "@chakra-ui/menu": "2.2.1", + "@chakra-ui/modal": "2.3.1", + "@chakra-ui/number-input": "2.1.2", + "@chakra-ui/pin-input": "2.1.0", + "@chakra-ui/popover": "2.2.1", + "@chakra-ui/popper": "3.1.0", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/progress": "2.2.0", + "@chakra-ui/provider": "2.4.2", + "@chakra-ui/radio": "2.1.2", + "@chakra-ui/react-env": "3.1.0", + "@chakra-ui/select": "2.1.2", + "@chakra-ui/skeleton": "2.1.0", + "@chakra-ui/skip-nav": "2.1.0", + "@chakra-ui/slider": "2.1.0", + "@chakra-ui/spinner": "2.1.0", + "@chakra-ui/stat": "2.1.1", + "@chakra-ui/stepper": "2.3.1", + "@chakra-ui/styled-system": "2.9.2", + "@chakra-ui/switch": "2.1.2", + "@chakra-ui/system": "2.6.2", + "@chakra-ui/table": "2.1.0", + "@chakra-ui/tabs": "3.0.0", + "@chakra-ui/tag": "3.1.1", + "@chakra-ui/textarea": "2.1.2", + "@chakra-ui/theme": "3.3.1", + "@chakra-ui/theme-utils": "2.0.21", + "@chakra-ui/toast": "7.0.2", + "@chakra-ui/tooltip": "2.3.1", + "@chakra-ui/transition": "2.1.0", + "@chakra-ui/utils": "2.0.15", + "@chakra-ui/visually-hidden": "2.2.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/react-children-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz", + "integrity": "sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-context": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.1.0.tgz", + "integrity": "sha512-iahyStvzQ4AOwKwdPReLGfDesGG+vWJfEsn0X/NoGph/SkN+HXtv2sCfYFFR9k7bb+Kvc6YfpLlSuLvKMHi2+w==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-env": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-3.1.0.tgz", + "integrity": "sha512-Vr96GV2LNBth3+IKzr/rq1IcnkXv+MLmwjQH6C8BRtn3sNskgDFD5vLkVXcEhagzZMCh8FR3V/bzZPojBOyNhw==", + "dependencies": { + "@chakra-ui/react-use-safe-layout-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.7.tgz", + "integrity": "sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-animation-state": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.1.0.tgz", + "integrity": "sha512-CFZkQU3gmDBwhqy0vC1ryf90BVHxVN8cTLpSyCpdmExUEtSEInSCGMydj2fvn7QXsz/za8JNdO2xxgJwxpLMtg==", + "dependencies": { + "@chakra-ui/dom-utils": "2.1.0", + "@chakra-ui/react-use-event-listener": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-callback-ref": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.1.0.tgz", + "integrity": "sha512-efnJrBtGDa4YaxDzDE90EnKD3Vkh5a1t3w7PhnRQmsphLy3g2UieasoKTlT2Hn118TwDjIv5ZjHJW6HbzXA9wQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-controllable-state": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.1.0.tgz", + "integrity": "sha512-QR/8fKNokxZUs4PfxjXuwl0fj/d71WPrmLJvEpCTkHjnzu7LnYvzoe2wB867IdooQJL0G1zBxl0Dq+6W1P3jpg==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-disclosure": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.1.0.tgz", + "integrity": "sha512-Ax4pmxA9LBGMyEZJhhUZobg9C0t3qFE4jVF1tGBsrLDcdBeLR9fwOogIPY9Hf0/wqSlAryAimICbr5hkpa5GSw==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-event-listener": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.1.0.tgz", + "integrity": "sha512-U5greryDLS8ISP69DKDsYcsXRtAdnTQT+jjIlRYZ49K/XhUR/AqVZCK5BkR1spTDmO9H8SPhgeNKI70ODuDU/Q==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-focus-effect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.1.0.tgz", + "integrity": "sha512-xzVboNy7J64xveLcxTIJ3jv+lUJKDwRM7Szwn9tNzUIPD94O3qwjV7DDCUzN2490nSYDF4OBMt/wuDBtaR3kUQ==", + "dependencies": { + "@chakra-ui/dom-utils": "2.1.0", + "@chakra-ui/react-use-event-listener": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-focus-on-pointer-down": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.1.0.tgz", + "integrity": "sha512-2jzrUZ+aiCG/cfanrolsnSMDykCAbv9EK/4iUyZno6BYb3vziucmvgKuoXbMPAzWNtwUwtuMhkby8rc61Ue+Lg==", + "dependencies": { + "@chakra-ui/react-use-event-listener": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-interval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.1.0.tgz", + "integrity": "sha512-8iWj+I/+A0J08pgEXP1J1flcvhLBHkk0ln7ZvGIyXiEyM6XagOTJpwNhiu+Bmk59t3HoV/VyvyJTa+44sEApuw==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-latest-ref": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.1.0.tgz", + "integrity": "sha512-m0kxuIYqoYB0va9Z2aW4xP/5b7BzlDeWwyXCH6QpT2PpW3/281L3hLCm1G0eOUcdVlayqrQqOeD6Mglq+5/xoQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-merge-refs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.1.0.tgz", + "integrity": "sha512-lERa6AWF1cjEtWSGjxWTaSMvneccnAVH4V4ozh8SYiN9fSPZLlSG3kNxfNzdFvMEhM7dnP60vynF7WjGdTgQbQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-outside-click": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.2.0.tgz", + "integrity": "sha512-PNX+s/JEaMneijbgAM4iFL+f3m1ga9+6QK0E5Yh4s8KZJQ/bLwZzdhMz8J/+mL+XEXQ5J0N8ivZN28B82N1kNw==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-pan-event": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.1.0.tgz", + "integrity": "sha512-xmL2qOHiXqfcj0q7ZK5s9UjTh4Gz0/gL9jcWPA6GVf+A0Od5imEDa/Vz+533yQKWiNSm1QGrIj0eJAokc7O4fg==", + "dependencies": { + "@chakra-ui/event-utils": "2.0.8", + "@chakra-ui/react-use-latest-ref": "2.1.0", + "framesync": "6.1.2" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-previous": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.1.0.tgz", + "integrity": "sha512-pjxGwue1hX8AFcmjZ2XfrQtIJgqbTF3Qs1Dy3d1krC77dEsiCUbQ9GzOBfDc8pfd60DrB5N2tg5JyHbypqh0Sg==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-safe-layout-effect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.1.0.tgz", + "integrity": "sha512-Knbrrx/bcPwVS1TorFdzrK/zWA8yuU/eaXDkNj24IrKoRlQrSBFarcgAEzlCHtzuhufP3OULPkELTzz91b0tCw==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-size": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.1.0.tgz", + "integrity": "sha512-tbLqrQhbnqOjzTaMlYytp7wY8BW1JpL78iG7Ru1DlV4EWGiAmXFGvtnEt9HftU0NJ0aJyjgymkxfVGI55/1Z4A==", + "dependencies": { + "@zag-js/element-size": "0.10.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-timeout": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.1.0.tgz", + "integrity": "sha512-cFN0sobKMM9hXUhyCofx3/Mjlzah6ADaEl/AXl5Y+GawB5rgedgAcu2ErAgarEkwvsKdP6c68CKjQ9dmTQlJxQ==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-update-effect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.1.0.tgz", + "integrity": "sha512-ND4Q23tETaR2Qd3zwCKYOOS1dfssojPLJMLvUtUbW5M9uW1ejYWgGUobeAiOVfSplownG8QYMmHTP86p/v0lbA==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-utils": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz", + "integrity": "sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==", + "dependencies": { + "@chakra-ui/utils": "2.0.15" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/select": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/select/-/select-2.1.2.tgz", + "integrity": "sha512-ZwCb7LqKCVLJhru3DXvKXpZ7Pbu1TDZ7N0PdQ0Zj1oyVLJyrpef1u9HR5u0amOpqcH++Ugt0f5JSmirjNlctjA==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/shared-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz", + "integrity": "sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q==" + }, + "node_modules/@chakra-ui/skeleton": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.1.0.tgz", + "integrity": "sha512-JNRuMPpdZGd6zFVKjVQ0iusu3tXAdI29n4ZENYwAJEMf/fN0l12sVeirOxkJ7oEL0yOx2AgEYFSKdbcAgfUsAQ==", + "dependencies": { + "@chakra-ui/media-query": "3.3.0", + "@chakra-ui/react-use-previous": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/skip-nav": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/skip-nav/-/skip-nav-2.1.0.tgz", + "integrity": "sha512-Hk+FG+vadBSH0/7hwp9LJnLjkO0RPGnx7gBJWI4/SpoJf3e4tZlWYtwGj0toYY4aGKl93jVghuwGbDBEMoHDug==", + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/slider": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.1.0.tgz", + "integrity": "sha512-lUOBcLMCnFZiA/s2NONXhELJh6sY5WtbRykPtclGfynqqOo47lwWJx+VP7xaeuhDOPcWSSecWc9Y1BfPOCz9cQ==", + "dependencies": { + "@chakra-ui/number-utils": "2.0.7", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-latest-ref": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-pan-event": "2.1.0", + "@chakra-ui/react-use-size": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/spinner": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.1.0.tgz", + "integrity": "sha512-hczbnoXt+MMv/d3gE+hjQhmkzLiKuoTo42YhUG7Bs9OSv2lg1fZHW1fGNRFP3wTi6OIbD044U1P9HK+AOgFH3g==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/stat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.1.1.tgz", + "integrity": "sha512-LDn0d/LXQNbAn2KaR3F1zivsZCewY4Jsy1qShmfBMKwn6rI8yVlbvu6SiA3OpHS0FhxbsZxQI6HefEoIgtqY6Q==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/stepper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/stepper/-/stepper-2.3.1.tgz", + "integrity": "sha512-ky77lZbW60zYkSXhYz7kbItUpAQfEdycT0Q4bkHLxfqbuiGMf8OmgZOQkOB9uM4v0zPwy2HXhe0vq4Dd0xa55Q==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/styled-system": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.9.2.tgz", + "integrity": "sha512-To/Z92oHpIE+4nk11uVMWqo2GGRS86coeMmjxtpnErmWRdLcp1WVCVRAvn+ZwpLiNR+reWFr2FFqJRsREuZdAg==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5", + "csstype": "^3.1.2", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/switch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.1.2.tgz", + "integrity": "sha512-pgmi/CC+E1v31FcnQhsSGjJnOE2OcND4cKPyTE+0F+bmGm48Q/b5UmKD9Y+CmZsrt/7V3h8KNczowupfuBfIHA==", + "dependencies": { + "@chakra-ui/checkbox": "2.3.2", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/system": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/system/-/system-2.6.2.tgz", + "integrity": "sha512-EGtpoEjLrUu4W1fHD+a62XR+hzC5YfsWm+6lO0Kybcga3yYEij9beegO0jZgug27V+Rf7vns95VPVP6mFd/DEQ==", + "dependencies": { + "@chakra-ui/color-mode": "2.2.0", + "@chakra-ui/object-utils": "2.1.0", + "@chakra-ui/react-utils": "2.0.12", + "@chakra-ui/styled-system": "2.9.2", + "@chakra-ui/theme-utils": "2.0.21", + "@chakra-ui/utils": "2.0.15", + "react-fast-compare": "3.2.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/table": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/table/-/table-2.1.0.tgz", + "integrity": "sha512-o5OrjoHCh5uCLdiUb0Oc0vq9rIAeHSIRScc2ExTC9Qg/uVZl2ygLrjToCaKfaaKl1oQexIeAcZDKvPG8tVkHyQ==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/tabs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-3.0.0.tgz", + "integrity": "sha512-6Mlclp8L9lqXmsGWF5q5gmemZXOiOYuh0SGT/7PgJVNPz3LXREXlXg2an4MBUD8W5oTkduCX+3KTMCwRrVrDYw==", + "dependencies": { + "@chakra-ui/clickable": "2.1.0", + "@chakra-ui/descendant": "3.1.0", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/tag": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/tag/-/tag-3.1.1.tgz", + "integrity": "sha512-Bdel79Dv86Hnge2PKOU+t8H28nm/7Y3cKd4Kfk9k3lOpUh4+nkSGe58dhRzht59lEqa4N9waCgQiBdkydjvBXQ==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/textarea": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.1.2.tgz", + "integrity": "sha512-ip7tvklVCZUb2fOHDb23qPy/Fr2mzDOGdkrpbNi50hDCiV4hFX02jdQJdi3ydHZUyVgZVBKPOJ+lT9i7sKA2wA==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/theme": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme/-/theme-3.3.1.tgz", + "integrity": "sha512-Hft/VaT8GYnItGCBbgWd75ICrIrIFrR7lVOhV/dQnqtfGqsVDlrztbSErvMkoPKt0UgAkd9/o44jmZ6X4U2nZQ==", + "dependencies": { + "@chakra-ui/anatomy": "2.2.2", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/theme-tools": "2.1.2" + }, + "peerDependencies": { + "@chakra-ui/styled-system": ">=2.8.0" + } + }, + "node_modules/@chakra-ui/theme-tools": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.1.2.tgz", + "integrity": "sha512-Qdj8ajF9kxY4gLrq7gA+Azp8CtFHGO9tWMN2wfF9aQNgG9AuMhPrUzMq9AMQ0MXiYcgNq/FD3eegB43nHVmXVA==", + "dependencies": { + "@chakra-ui/anatomy": "2.2.2", + "@chakra-ui/shared-utils": "2.0.5", + "color2k": "^2.0.2" + }, + "peerDependencies": { + "@chakra-ui/styled-system": ">=2.0.0" + } + }, + "node_modules/@chakra-ui/theme-utils": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.21.tgz", + "integrity": "sha512-FjH5LJbT794r0+VSCXB3lT4aubI24bLLRWB+CuRKHijRvsOg717bRdUN/N1fEmEpFnRVrbewttWh/OQs0EWpWw==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/styled-system": "2.9.2", + "@chakra-ui/theme": "3.3.1", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/toast": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/toast/-/toast-7.0.2.tgz", + "integrity": "sha512-yvRP8jFKRs/YnkuE41BVTq9nB2v/KDRmje9u6dgDmE5+1bFt3bwjdf9gVbif4u5Ve7F7BGk5E093ARRVtvLvXA==", + "dependencies": { + "@chakra-ui/alert": "2.2.2", + "@chakra-ui/close-button": "2.1.1", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-timeout": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/styled-system": "2.9.2", + "@chakra-ui/theme": "3.3.1" + }, + "peerDependencies": { + "@chakra-ui/system": "2.6.2", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/tooltip": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.3.1.tgz", + "integrity": "sha512-Rh39GBn/bL4kZpuEMPPRwYNnccRCL+w9OqamWHIB3Qboxs6h8cOyXfIdGxjo72lvhu1QI/a4KFqkM3St+WfC0A==", + "dependencies": { + "@chakra-ui/dom-utils": "2.1.0", + "@chakra-ui/popper": "3.1.0", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-disclosure": "2.1.0", + "@chakra-ui/react-use-event-listener": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/transition": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.1.0.tgz", + "integrity": "sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/utils": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.15.tgz", + "integrity": "sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA==", + "dependencies": { + "@types/lodash.mergewith": "4.6.7", + "css-box-model": "1.2.1", + "framesync": "6.1.2", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/visually-hidden": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.2.0.tgz", + "integrity": "sha512-KmKDg01SrQ7VbTD3+cPWf/UfpF5MSwm3v7MWi0n5t8HnnadT13MF0MJCDSXbBWnzLv1ZKJ6zlyAOeARWX+DpjQ==", + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "peer": true, + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==", + "peer": true + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "peer": true, + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "peer": true + }, + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "peer": true, + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==", + "peer": true + }, + "node_modules/@emotion/styled": { + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "peer": true + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peer": true, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==", + "peer": true + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==", + "peer": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "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.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "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/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.26.16", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.16.tgz", + "integrity": "sha512-HEf43zxZNAI/E781QIVpYSF3K2VH4TTYZpqecjdsFkjsaU1EbaWcM++kw0HXFffj7gDUcBFevX8s0rQGQpxkow==", + "dependencies": { + "@floating-ui/react-dom": "^2.1.0", + "@floating-ui/utils": "^0.2.0", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", + "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@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": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remix-run/router": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", + "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", + "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", + "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", + "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", + "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", + "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", + "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", + "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", + "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", + "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", + "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", + "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", + "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.5.tgz", + "integrity": "sha512-M8O22EEgdSONLd+7KRrXj8pn+RdAZZ7ISnPjE9KCQQlI0kkFNEquWR+uFdlFxQfwlyCe/Zb6uGXGDvtcov4IMg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.5.5", + "@swc/core-darwin-x64": "1.5.5", + "@swc/core-linux-arm-gnueabihf": "1.5.5", + "@swc/core-linux-arm64-gnu": "1.5.5", + "@swc/core-linux-arm64-musl": "1.5.5", + "@swc/core-linux-x64-gnu": "1.5.5", + "@swc/core-linux-x64-musl": "1.5.5", + "@swc/core-win32-arm64-msvc": "1.5.5", + "@swc/core-win32-ia32-msvc": "1.5.5", + "@swc/core-win32-x64-msvc": "1.5.5" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.5.tgz", + "integrity": "sha512-Ol5ZwZYdTOZsv2NwjcT/qVVALKzVFeh+IJ4GNarr3P99+38Dkwi81OqCI1o/WaDXQYKAQC/V+CzMbkEuJJfq9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.5.tgz", + "integrity": "sha512-XHWpKBIPKYLgh5/lV2PYjO84lkzf5JR51kjiloyz2Pa9HIV8tHoAP8bYdJwm4nUp2I7KcEh3pPH0AVu5LpxMKw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.5.tgz", + "integrity": "sha512-vtoWNCWAe+CNSqtqIwFnIH48qgPPlUZKoQ4EVFeMM+7/kDi6SeNxoh5TierJs5bKAWxD49VkPvRoWFCk6V62mA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.5.tgz", + "integrity": "sha512-L4l7M78U6h/rCAxId+y5Vu+1KfDRF6dJZtitFcaT293guiUQFwJv8gLxI4Jh5wFtZ0fYd0QaCuvh2Ip79CzGMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.5.tgz", + "integrity": "sha512-DkzJc13ukXa7oJpyn24BjIgsiOybYrc+IxjsQyfNlDrrs1QXP4elStcpkD02SsIuSyHjZV8Hw2HFBMQB3OHPrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.5.tgz", + "integrity": "sha512-kj4ZwWJGeBEUzHrRQP2VudN+kkkYH7OI1dPVDc6kWQx5X4329JeKOas4qY0l7gDVjBbRwN9IbbPI6TIn2KfAug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.5.tgz", + "integrity": "sha512-6pTorCs4mYhPhYtC4jNOnhGgjNd3DZcRoZ9P0tzXXP69aCbYjvlgNH/NRvAROp9AaVFeZ7a7PmCWb6+Rbe7NKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.5.tgz", + "integrity": "sha512-o0/9pstmEjwZyrY/bA+mymF0zH7E+GT/XCVqdKeWW9Wn3gTTyWa5MZnrFgI2THQ+AXwdglMB/Zo76ARQPaz/+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.5.tgz", + "integrity": "sha512-B+nypUwsmCuaH6RtKWgiPCb+ENjxstJPPJeMJvBqlJqyCaIkZzN4M07Ozi3xVv1VG21SRkd6G3xIqRoalrNc0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.5.tgz", + "integrity": "sha512-ry83ki9ZX0Q+GWGnqc2J618Z+FvKE8Ajn42F8EYi8Wj0q6Jz3mj+pJzgzakk2INm2ldEZ+FaRPipn4ozsZDcBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.6.tgz", + "integrity": "sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "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==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", + "integrity": "sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==" + }, + "node_modules/@types/lodash.mergewith": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz", + "integrity": "sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "peer": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "node_modules/@types/react": { + "version": "18.3.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz", + "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-datepicker": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-6.2.0.tgz", + "integrity": "sha512-+JtO4Fm97WLkJTH8j8/v3Ldh7JCNRwjMYjRaKh4KHH0M3jJoXtwiD3JBCsdlg3tsFIw9eQSqyAPeVDN2H2oM9Q==", + "dev": true, + "dependencies": { + "@floating-ui/react": "^0.26.2", + "@types/react": "*", + "date-fns": "^3.3.1" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "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==", + "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==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", + "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/type-utils": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz", + "integrity": "sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==", + "dev": true, + "dependencies": { + "@swc/core": "^1.3.107" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/@zag-js/dom-query": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-0.16.0.tgz", + "integrity": "sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ==" + }, + "node_modules/@zag-js/element-size": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.10.5.tgz", + "integrity": "sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w==" + }, + "node_modules/@zag-js/focus-visible": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.16.0.tgz", + "integrity": "sha512-a7U/HSopvQbrDU4GLerpqiMcHKEkQkNPeDZJWz38cw/6Upunh41GjHetq5TB84hxyCaDzJ6q2nEdNoBQfC0FKA==", + "dependencies": { + "@zag-js/dom-query": "0.16.0" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": 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/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-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/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-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "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/chart.js": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", + "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "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/color2k": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz", + "integrity": "sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog==" + }, + "node_modules/compute-scroll-into-view": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz", + "integrity": "sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "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==", + "peer": true + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "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-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "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/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/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/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==", + "peer": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "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.3", + "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-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz", + "integrity": "sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/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/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/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.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "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==", + "dev": true, + "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.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "peer": true + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/focus-lock": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.5.tgz", + "integrity": "sha512-QFaHbhv9WPUeLYBDe/PAuLKJ4Dd9OPvKs9xZBr3yLXnUrDNaVXKu2baDBXe3naPY30hgHYSsf2JW4jzas2mDEQ==", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/framer-motion": { + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.1.9.tgz", + "integrity": "sha512-flECDIPV4QDNcOrDafVFiIazp8X01HFpzc01eDKJsdNH/wrATcYydJSH9JbPWMS8UD5lZlw+J1sK8LG2kICgqw==", + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/framesync": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz", + "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==", + "dependencies": { + "tslib": "2.4.0" + } + }, + "node_modules/framesync/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "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==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "peer": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "peer": true, + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "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==", + "peer": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "peer": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "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/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "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==", + "peer": 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/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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/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==", + "peer": true + }, + "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.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.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + }, + "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/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "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/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/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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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/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==", + "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==", + "peer": 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/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==", + "dev": true, + "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==", + "peer": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "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.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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/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/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "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/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-chartjs-2": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", + "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", + "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-datepicker": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-6.9.0.tgz", + "integrity": "sha512-QTxuzeem7BUfVFWv+g5WuvzT0c5BPo+XTCNbMTZKSZQLU+cMMwSUHwspaxuIcDlwNcOH0tiJ+bh1fJ2yxOGYWA==", + "dependencies": { + "@floating-ui/react": "^0.26.2", + "clsx": "^2.1.0", + "date-fns": "^3.3.1", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.13.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17 || ^18", + "react-dom": "^16.9.0 || ^17 || ^18" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + }, + "node_modules/react-focus-lock": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.12.1.tgz", + "integrity": "sha512-lfp8Dve4yJagkHiFrC1bGtib3mF2ktqwPJw4/WGcgPW+pJ/AVQA5X2vI7xgp13FcxFEpYBBHpXai/N2DBNC0Jw==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^1.3.5", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.2", + "use-sidecar": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-icons": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz", + "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==", + "peerDependencies": { + "react": "*" + } + }, + "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-onclickoutside": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.1.tgz", + "integrity": "sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w==", + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" + }, + "peerDependencies": { + "react": "^15.5.x || ^16.x || ^17.x || ^18.x", + "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.10", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.10.tgz", + "integrity": "sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.6", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", + "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", + "dependencies": { + "@remix-run/router": "1.16.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", + "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", + "dependencies": { + "@remix-run/router": "1.16.1", + "react-router": "6.23.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "peer": true, + "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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "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/rollup": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", + "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.17.2", + "@rollup/rollup-android-arm64": "4.17.2", + "@rollup/rollup-darwin-arm64": "4.17.2", + "@rollup/rollup-darwin-x64": "4.17.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", + "@rollup/rollup-linux-arm-musleabihf": "4.17.2", + "@rollup/rollup-linux-arm64-gnu": "4.17.2", + "@rollup/rollup-linux-arm64-musl": "4.17.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", + "@rollup/rollup-linux-riscv64-gnu": "4.17.2", + "@rollup/rollup-linux-s390x-gnu": "4.17.2", + "@rollup/rollup-linux-x64-gnu": "4.17.2", + "@rollup/rollup-linux-x64-musl": "4.17.2", + "@rollup/rollup-win32-arm64-msvc": "4.17.2", + "@rollup/rollup-win32-ia32-msvc": "4.17.2", + "@rollup/rollup-win32-x64-msvc": "4.17.2", + "fsevents": "~2.3.2" + } + }, + "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==", + "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": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/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/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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-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/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "peer": true + }, + "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==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "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/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, + "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==", + "peer": 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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "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-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/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "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/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "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/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/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "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/FrontAdmin/package.json b/FrontAdmin/package.json new file mode 100644 index 0000000..00bae09 --- /dev/null +++ b/FrontAdmin/package.json @@ -0,0 +1,38 @@ +{ + "name": "frontadmin", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 30", + "preview": "vite preview" + }, + "dependencies": { + "@chakra-ui/icons": "^2.1.1", + "@chakra-ui/react": "^2.8.2", + "@types/react-router-dom": "^5.3.3", + "chart.js": "^4.4.3", + "date-fns": "^3.6.0", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-datepicker": "^6.9.0", + "react-dom": "^18.2.0", + "react-icons": "^5.2.1", + "react-router-dom": "^6.23.1" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-datepicker": "^6.2.0", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } +} diff --git a/FrontAdmin/public/TUP.png b/FrontAdmin/public/TUP.png new file mode 100644 index 0000000000000000000000000000000000000000..860d25bd5cdea1b734c6a9a60a8fb705a8fdbd89 GIT binary patch literal 35595 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 blK$W!J`Lc_rkhu!`Hlx=YHd>)sqhfmi literal 0 HcmV?d00001 diff --git a/FrontAdmin/src/API/DatosEstadistica.ts b/FrontAdmin/src/API/DatosEstadistica.ts new file mode 100644 index 0000000..3bcb635 --- /dev/null +++ b/FrontAdmin/src/API/DatosEstadistica.ts @@ -0,0 +1,48 @@ +const API = [ + { + id: 1, + title: 'Cuotas completas abonadas', + value: '31', + total: '40', + tipoDato: 'M' + }, + { + id: 2, + title: 'Cuotas reducidas abonadas', + value: '28', + total: '36', + tipoDato: 'M' + }, + { + id: 3, + title: 'Habilitados', + value: '74', + total: '76', + tipoDato: 'C' + }, + { + id: 4, + title: 'Inhabilitados', + value: '2', + total: '76', + tipoDato: 'C' + }, + { + id: 5, + title: 'Compromiso de pago firmados', + value: '70', + total: '76', + tipoDato: 'C' + }, + { + id: 6, + title: 'Matriculas abonadas', + value: '75', + total: '76', + Tipo: 'C' + } + ] + +export default API; + + diff --git a/FrontAdmin/src/API/Login.ts b/FrontAdmin/src/API/Login.ts new file mode 100644 index 0000000..2f84810 --- /dev/null +++ b/FrontAdmin/src/API/Login.ts @@ -0,0 +1,21 @@ +export const FetchLogin = async (username : string, email : string, password: string) => { + try { + const response = await fetch('http://127.0.0.1:8000/accounts/login/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ username ,email, password }), + }); + + if (response.ok) { + const data = await response.json(); + console.log('Login successful', data); + return data; + } else { + console.error('Login failed'); + } + } catch (error) { + console.error('Network error', error); + } + } \ No newline at end of file diff --git a/FrontAdmin/src/App.tsx b/FrontAdmin/src/App.tsx new file mode 100644 index 0000000..ed10ea4 --- /dev/null +++ b/FrontAdmin/src/App.tsx @@ -0,0 +1,62 @@ +import { + createBrowserRouter, + Navigate, + RouteObject, + RouterProvider, +} from "react-router-dom"; +import NavBar from "./components/NavBar/NavBar"; +import { ChakraProvider } from "@chakra-ui/react"; +import { useEffect } from "react"; +import Estadisticas from "./components/Pages/Estadisticas/Estadisticas" +import ErrorPage from "./components/Pages/Error404"; +import LoginPage from "./components/Pages/Login/LoginPage"; + + +const routes: RouteObject[] = [ + { + path: "/", + element: , + children: [ + { + path: "Estadisticas", + element: , + }, + { + path: "/", + element: , + }, + // { + // path: "error404", + // element: , + // }, + { + path: '/login', + element: , + } + + ], + }, + { + path: "*", + element: , + }, +]; + +const router = createBrowserRouter(routes); + + +function App() { + useEffect(() => { + document.title = "TUP Admin"; + }, []); + + return ( + <> + + + + + ) +} + +export default App diff --git a/FrontAdmin/src/components/NavBar/LinksItems.tsx b/FrontAdmin/src/components/NavBar/LinksItems.tsx new file mode 100644 index 0000000..cbcd9a5 --- /dev/null +++ b/FrontAdmin/src/components/NavBar/LinksItems.tsx @@ -0,0 +1,12 @@ +import iconAlumno from '../icons/alumno 1.png'; +import iconChat from '../icons/burbuja-de-chat 1.png'; +import iconConfig from '../icons/configuracion 1.png'; +import iconEstadisticas from '../icons/grafico-de-barras 1.png'; + +export const LINK_ITEMS = [ + { icon: iconEstadisticas, url: "/Estadisticas" }, + { icon: iconAlumno, url: "/error404" }, + { icon: iconChat, url: "/error404" }, + { icon: iconConfig, url: "/error404" }, + +]; diff --git a/FrontAdmin/src/components/NavBar/MobileNav.tsx b/FrontAdmin/src/components/NavBar/MobileNav.tsx new file mode 100644 index 0000000..4327d91 --- /dev/null +++ b/FrontAdmin/src/components/NavBar/MobileNav.tsx @@ -0,0 +1,39 @@ +import { + StackProps, + HStack, + useColorModeValue, + IconButton, + Text, +} from "@chakra-ui/react"; +import { FiMenu } from "react-icons/fi"; + +interface MobileProps extends StackProps { + onOpen: () => void; +} + +export function MobileNav({ onOpen, ...rest }: MobileProps) { + return ( + + } + /> + + + TUP + + + ); +} diff --git a/FrontAdmin/src/components/NavBar/NavBar.tsx b/FrontAdmin/src/components/NavBar/NavBar.tsx new file mode 100644 index 0000000..3815bb7 --- /dev/null +++ b/FrontAdmin/src/components/NavBar/NavBar.tsx @@ -0,0 +1,26 @@ +import { Outlet } from "react-router-dom"; +import { Box, Drawer, DrawerContent, useDisclosure, Text } from "@chakra-ui/react"; +import {MobileNav} from "./MobileNav"; +import { SidebarContent } from "./SidebarContent"; + +export default function NavBar() { + const { isOpen, onOpen, onClose } = useDisclosure(); + + return ( + + + + + + + + + + + + + + ); +} + + diff --git a/FrontAdmin/src/components/NavBar/NavItem.tsx b/FrontAdmin/src/components/NavBar/NavItem.tsx new file mode 100644 index 0000000..15a824d --- /dev/null +++ b/FrontAdmin/src/components/NavBar/NavItem.tsx @@ -0,0 +1,22 @@ +import { Flex, Image, FlexProps } from "@chakra-ui/react"; + +interface NavItemProps extends FlexProps { + icon: string; + color: string; +} + +export default function NavItem({ icon, color, ...props }: NavItemProps) { + return ( + + + + ); +} diff --git a/FrontAdmin/src/components/NavBar/SidebarContent.tsx b/FrontAdmin/src/components/NavBar/SidebarContent.tsx new file mode 100644 index 0000000..a76b0c3 --- /dev/null +++ b/FrontAdmin/src/components/NavBar/SidebarContent.tsx @@ -0,0 +1,41 @@ +import { Box, Flex, HStack, CloseButton, useMediaQuery, Text, BoxProps } from "@chakra-ui/react"; +import { Link, useLocation } from "react-router-dom"; +import { LINK_ITEMS } from "./LinksItems"; +import NavItem from "./NavItem"; + +interface SidebarProps extends BoxProps { + onClose: () => void; +} + +export function SidebarContent({ onClose, ...rest }: SidebarProps) { + const [isLargerThanMd] = useMediaQuery("(min-width: 768px)"); + const location = useLocation(); + + return ( + <> + + + {!isLargerThanMd && } + + + + TUP + + {LINK_ITEMS.map((link) => ( + + + + ))} + + + + ); +} diff --git a/FrontAdmin/src/components/Pages/Error404.tsx b/FrontAdmin/src/components/Pages/Error404.tsx new file mode 100644 index 0000000..a7213bd --- /dev/null +++ b/FrontAdmin/src/components/Pages/Error404.tsx @@ -0,0 +1,29 @@ +import React, { useEffect } from "react"; +import { Box, Button, Text } from "@chakra-ui/react"; +import { Link, useLocation, useNavigate } from "react-router-dom"; + +const ErrorPage: React.FC = () => { + const url = useLocation(); + const navigate = useNavigate(); + + useEffect(() => { + if (url.pathname === "/") { + navigate("/home"); + } + }, [navigate, url.pathname]); + + return ( + + 404 + Página no encontrada + + + + + ); +}; + +export default ErrorPage; + diff --git a/FrontAdmin/src/components/Pages/Estadisticas/Chars/Donut.tsx b/FrontAdmin/src/components/Pages/Estadisticas/Chars/Donut.tsx new file mode 100644 index 0000000..9e5597b --- /dev/null +++ b/FrontAdmin/src/components/Pages/Estadisticas/Chars/Donut.tsx @@ -0,0 +1,53 @@ +import { Doughnut } from 'react-chartjs-2'; +import { Chart, ArcElement, Tooltip, Legend, ChartOptions } from 'chart.js'; +import { Box } from '@chakra-ui/react'; +Chart.register(ArcElement, Tooltip, Legend); + +interface DoughnutChartProps { + labelsPromp: string[]; + dataPromp: number[]; + } + + + +const DoughnutChart : React.FC = ({ labelsPromp, dataPromp }) => { + const data = { + labels: labelsPromp, + datasets: [ + { + label: 'Estado de Alumnos', + data: dataPromp, + backgroundColor: ['#4CAF50', '#FF6384'], + hoverBackgroundColor: ['#66BB6A', '#FF6384'], + }, + ], + }; + + const options: ChartOptions<'doughnut'> = { + plugins: { + tooltip: { + callbacks: { + label: (context) => `${context.label}: ${context.raw}` + }, + }, + legend: { + display: true, + position: 'bottom' as 'bottom', + labels: { + font: { + size: 14, + }, + }, + }, + }, + maintainAspectRatio: false, + }; + + return ( + + + + ); +}; + +export default DoughnutChart; diff --git a/FrontAdmin/src/components/Pages/Estadisticas/Estadisticas.tsx b/FrontAdmin/src/components/Pages/Estadisticas/Estadisticas.tsx new file mode 100644 index 0000000..21508ee --- /dev/null +++ b/FrontAdmin/src/components/Pages/Estadisticas/Estadisticas.tsx @@ -0,0 +1,36 @@ +import { Box, CardFooter, Flex, FormControl, FormLabel, Heading, HStack, Input, Spacer, Stack, StackDivider, Tab, TabIndicator, TabList, TabPanel, TabPanels, Tabs } from "@chakra-ui/react"; +import { Card, CardBody, Text } from '@chakra-ui/react' +import Mensual from "./SubPages/Mensual"; +import Cuatrimestral from "./SubPages/Cuatrimestral"; +import Calendario from "./SubPages/Calendario"; + +function Estadisticas() { + + + + return ( + + + + Mensual + Cuatrimestral + Calendario + + + + + + + + + + + + + + + + ); +} + +export default Estadisticas; \ No newline at end of file diff --git a/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Calendario.tsx b/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Calendario.tsx new file mode 100644 index 0000000..dfd74d3 --- /dev/null +++ b/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Calendario.tsx @@ -0,0 +1,77 @@ +import { Box, CardFooter, Flex, FormControl, FormLabel, Heading, HStack, Input, Stack} from "@chakra-ui/react"; +import { Card, CardBody, Text } from '@chakra-ui/react' +import API from '../../../../API/DatosEstadistica' +import DoughnutChart from "../Chars/Donut"; + + + +function Calendario() { + + const tarjetas = API.map((v) => { + return ( + + + {v.value} + / + {v.total} + + + + + {v.title} + + + ) + + }); + + return ( + + + + + + + + Desde + + + + Hasta + + + + + + + + {tarjetas} + + + + + + + + + + + ) +}; + +export default Calendario; \ No newline at end of file diff --git a/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Cuatrimestral.tsx b/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Cuatrimestral.tsx new file mode 100644 index 0000000..ccf17fa --- /dev/null +++ b/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Cuatrimestral.tsx @@ -0,0 +1,92 @@ +import { Box, CardFooter, Flex, FormControl, FormLabel, Heading, HStack, Icon, Input, Select, Spacer, Stack, StackDivider } from "@chakra-ui/react"; +import { Card, CardBody, Text } from '@chakra-ui/react' +import API from '../../../../API/DatosEstadistica' +import DoughnutChart from "../Chars/Donut"; +import { CalendarIcon } from '@chakra-ui/icons'; +import DatePicker from 'react-datepicker'; +import 'react-datepicker/dist/react-datepicker.css'; +import { registerLocale, setDefaultLocale } from 'react-datepicker'; +import { SetStateAction, useState } from "react"; +import { es } from 'date-fns/locale/es'; +registerLocale('es', es); + + +function Cuatrimestral() { + + const [selectedDate, setSelectedDate] = useState(null); + + const handleDateChange = (date: Date) => { + setSelectedDate(date); + }; + + const tarjetas = API.map((v) => { + return ( + + + {v.value} + / + {v.total} + + + + + {v.title} + + + ) + } + ); + + return ( + + + + + + + Catrimestre + + } + placeholderText="aaaa" + /> + + + + + + + + + + + {tarjetas} + + + + + + + + + + + ) +}; + +export default Cuatrimestral; \ No newline at end of file diff --git a/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Mensual.tsx b/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Mensual.tsx new file mode 100644 index 0000000..41756aa --- /dev/null +++ b/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Mensual.tsx @@ -0,0 +1,91 @@ +import { Box, CardFooter, Flex, FormControl, FormLabel, Heading, HStack, Icon, Input, Spacer, Stack, StackDivider } from "@chakra-ui/react"; +import { Card, CardBody, Text } from '@chakra-ui/react' +import API from '../../../../API/DatosEstadistica' + +import DatePicker from 'react-datepicker'; +import 'react-datepicker/dist/react-datepicker.css'; +import { registerLocale, setDefaultLocale } from 'react-datepicker'; +import { es } from 'date-fns/locale/es'; +import { SetStateAction, useState } from "react"; +import { CalendarIcon } from '@chakra-ui/icons'; +import DoughnutChart from '../Chars/Donut'; +registerLocale('es', es); + +function Mensual() { + const [selectedDate, setSelectedDate] = useState(null); + + const handleDateChange = (date: Date) => { + setSelectedDate(date); + }; + + const tarjetas = API.map((v) => { + + return ( + + + + {v.value} + / + {v.total} + + + + + {v.title} + + + + ); + + return null; + }); + + return ( + + + + + + + Mes - Año + + } + placeholderText="mm/aaaa" + /> + + + + + + + + + + {tarjetas} + + + + + + + + + + + ); +} + +export default Mensual; diff --git a/FrontAdmin/src/components/Pages/Login/LoginPage.tsx b/FrontAdmin/src/components/Pages/Login/LoginPage.tsx new file mode 100644 index 0000000..85f5812 --- /dev/null +++ b/FrontAdmin/src/components/Pages/Login/LoginPage.tsx @@ -0,0 +1,146 @@ +import { useState } from "react"; +import { + Box, + Flex, + Button, + FormControl, + FormLabel, + Heading, + Input, + useColorModeValue, + useColorMode, + useToast +} from "@chakra-ui/react"; +import { FetchLogin } from "../../../API/Login"; + + + +function LoginPage() { + + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [email, setEmail] = useState(''); + + const titleColor = useColorModeValue("red.500", "red.500"); + const textColor = useColorModeValue("white", "black"); + + + + + const handleSubmit = async (e: { preventDefault: () => void; }) => { + e.preventDefault(); + try { + await FetchLogin(username, email, password); + + } catch (error) { + console.error('Network error', error); + // Handle network errors here + } + }; + + return ( + + + +
+ + + Login TUP + + + + Usuario + + setUsername(e.target.value)} + /> + + Contraseña + + setPassword(e.target.value)} + /> + + + + +
+
+ + + + +
+
+ ); +} + +export default LoginPage; \ No newline at end of file diff --git a/FrontAdmin/src/components/icons/alumno 1.png b/FrontAdmin/src/components/icons/alumno 1.png new file mode 100644 index 0000000000000000000000000000000000000000..c80c018b404c83f965176d2558f369241e78f6b2 GIT binary patch literal 2455 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 literal 0 HcmV?d00001 diff --git a/FrontAdmin/src/components/icons/configuracion 1.png b/FrontAdmin/src/components/icons/configuracion 1.png new file mode 100644 index 0000000000000000000000000000000000000000..64d520e4e3b643e7bea4d04d96e7518e45b25892 GIT binary patch literal 1620 zcmV-a2CMmrP)TDTK5DKP~1=#q%DCKSWtt;D&3S&z7`j_kQhlC3}{>^zrd|V z>_THi<7HzPHUes4fizywRH*axoRhxi{buIOobQx;eUc|RU(Y+2w=?tJ<^U^$M-AUI zyl%MY;Z?&A4IjWNL5txR@GGTx!SF7u0_;GXVi})D#aM&tu~|I-V>s-P<4V0{*q;7= z((ofxh*;%140{c48GdYd#Uj%to~hjXj=nk#PheTOH34IOVmOBtzyZS>Sl&i_-j}{> zH5@QJZ}_*6`Q6iBXZk*qT`-(Be8F&CD${2f^8hNwLD{Y{KNX~$McNvM1=t1~-rd&6Y9dHSD zMP4%;w~Sd@L9G}&o)GWH#XD}VQNugX7}gse!m^Sab5guNs^;Xg#!hJCL5^DFwixa* zycgA?EA4lSg z#5(o+R!Ac*uRd?b5s!New;P@{{02#6aSe%2k90DC+g4JK14!C2)hE>JYzVEa!&at!{-9V7*_435Q(+vU|9!0 zqxe5dS7CGPj2{_uo4_Na&LUnv-;E1gf)hTFUq5$IKe9x9L@u}t(w!y&jM z6=nn6{@+{Lz6d`Kqrg)7FpYfl(dm)pR?;grhQy$RfO3pNZX&;eTRm-Pgf0vD^B&oy z#F3dWeHufo1<~-dryaM5+`gRPVU&Yjjam4Q!b#+<u?m4rDvx!3IJVG=Et~0}}F(+hsc0#wJ3p8XiqEEV$4$t_$bm?6R zT}9q!TuVudw8uSq9jdQvGiC$kLF|CS-G#7MP0XIvPYc&LY3(+fWVKkYABA z5p8Rt-C~q~PS2t`4^OgR*sR%`jqVjZ7+!DCs3WWWIgj~$2cze zY|ipBg%&escBP-A|M1lvwVxYAHPB^_Z64XZaQiv>?>YUeCd4}5g0(+YUo@n%M#d+>mNhwI*5E0kZ}ZlysYGV5dpf0UqxeP2t|&XwGUgx zixy1RQ22Y^BFi06RAS&!kgHb8kWHz9L#kiTBA=PZknOexjGLtzs2 zTffvrNEyX$2Y4YV=UM6^|A~ zLbx#q1us*0C$Q7mzO9p-+nR8 zV$8|a%-qos^63}H+>I3i&24`=fGZ-HKsn`V4!I2hV_FgWNg_k1a|JU0iDz!TnnSJ~ z`6867VtplG%-e>tU&`*lDgaY_-+iBrtl_j^m4L+=eswOd$6W4$)wfMp0sIfk;XTJO SVg7yq0000GZx^prwfgF}}M_)$E)e-c@NatAzJ978G?-_F|Y#q223)}OSn*JY1FlfYI% zS61DgZAqdm+S#JoTeoi9aM^srCG`y(HVb`Z{UW$0;UO!NlyvWkkMika(y`$8 zXi9SUR~$330E9eCcI>zoaHY1E|J&&Z!@{0BTskfvc+Ulj9x*I>yhQ$$>C30PidIZr zqjza_q^R)oOZSBKY`L=bAoD7r%IG53Lxm8eDw8MhOyky-jM)+b^A`3T^1H+sJG=aH z!Mrbd>9N6ize-umb>3e7&^ALsUu2z!1qw2`6X(eGF6!2Dou}Oe2ZF9=Yu<19K5ZAL z_fN5!jaO2=xDP!ndS;bb5@>Ke!O|wX`<1Vr_%ZGO)rk|0vskW7PXCFVdQ&MBb@0J;C`g#Z8m literal 0 HcmV?d00001 diff --git a/FrontAdmin/src/main.tsx b/FrontAdmin/src/main.tsx new file mode 100644 index 0000000..e039637 --- /dev/null +++ b/FrontAdmin/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' + + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/FrontAdmin/src/vite-env.d.ts b/FrontAdmin/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/FrontAdmin/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/FrontAdmin/tsconfig.json b/FrontAdmin/tsconfig.json new file mode 100644 index 0000000..a7fc6fb --- /dev/null +++ b/FrontAdmin/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/FrontAdmin/tsconfig.node.json b/FrontAdmin/tsconfig.node.json new file mode 100644 index 0000000..97ede7e --- /dev/null +++ b/FrontAdmin/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/FrontAdmin/vite.config.ts b/FrontAdmin/vite.config.ts new file mode 100644 index 0000000..861b04b --- /dev/null +++ b/FrontAdmin/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react-swc' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7d5b460 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2024 Universidad Tecnologica Nacional + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..fa0833d --- /dev/null +++ b/README.md @@ -0,0 +1,247 @@ + +# :computer: _Sistema de Gestion TUP_ :rocket::books: + +![GitHub followers](https://img.shields.io/github/followers/samuop) ![GitHub forks](https://img.shields.io/github/forks/samuop/GestionTUP) ![GitHub Repo stars](https://img.shields.io/github/stars/samuop/GestionTUP) ![GitHub watchers](https://img.shields.io/github/watchers/samuop/GestionTUP) [![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) + +[![Django](https://img.shields.io/badge/Django-5.0.7-green.svg)](https://www.djangoproject.com/) [![Python](https://img.shields.io/badge/Python-3.10.0-blue.svg)](https://www.python.org/) [![React](https://img.shields.io/badge/React-17.0.2-blue.svg)](https://reactjs.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-4.3.5-blue.svg)](https://www.typescriptlang.org/) [![Vite](https://img.shields.io/badge/Vite-2.4.4-blue.svg)](https://vitejs.dev/) [![Docker](https://img.shields.io/badge/Docker-20.10.7-blue.svg)](https://www.docker.com/) [![Docker Compose](https://img.shields.io/badge/Docker_Compose-1.29.2-blue.svg)](https://docs.docker.com/compose/) [![ESLint](https://img.shields.io/badge/ESLint-7.32.0-blue.svg)](https://eslint.org/) [![Prettier](https://img.shields.io/badge/Prettier-2.4.1-orange.svg)](https://prettier.io/) [![Google Cloud](https://img.shields.io/badge/Google_Cloud-Run-lightblue.svg)](https://cloud.google.com/run) + +[![Run on Google Cloud](https://deploy.cloud.run/button.svg)](https://deploy.cloud.run) + +## :notebook: Table of Contents :ledger: + +- [:computer: _Sistema de Gestion TUP_ :rocket::books:](#computer-sistema-de-gestion-tup-rocketbooks) + - [:notebook: Table of Contents :ledger:](#notebook-table-of-contents-ledger) + - [About the project :briefcase:](#about-the-project-briefcase) + - [Team :busts\_in\_silhouette: :star:](#team-busts_in_silhouette-star) + - [Documentation :notebook:](#documentation-notebook) + - [Frontend Documentation (React)](#frontend-documentation-react) + - [React + TypeScript + Vite](#react--typescript--vite) + - [Expanding the ESLint configuration](#expanding-the-eslint-configuration) + - [Backend :snake:🧑‍💻](#backend-snake) + - [Setting up the backend](#setting-up-the-backend) + - [Setting up the Docker container](#setting-up-the-docker-container) + +## About the project :briefcase: + +Team project for the Seminario Universitario course at the UTN - FRRe. The project consists of a web application for managing the TUP (Tecnicatura Universitaria en Programacion) of the students of the UTN - FRRe. The project is divided into two parts, the frontend and the backend. The frontend is developed using React/TS/Vite and the backend using Python with Django/DRF. + +## Team :busts_in_silhouette: :star: + +[carlosferreyra]: +[TobiasMaciel]: +[yoelmarain]: +[facundomelgarejo]: +[MirandaAriano]: +[samuop]: + +- [Ferreyra, Carlos Eduardo][carlosferreyra] +- [Maciel Meister, Tobias Alejandro][TobiasMaciel] +- [Marain, Yoel Mario][yoelmarain] +- [Melgarejo Roma, Facundo Gabriel][facundomelgarejo] +- [Miranda Falkievich, Ariano Gabriel][MirandaAriano] + +- [Pallares, Ulises Pablo] +- [Paredes, Samuel Octavio][samuop] +- [Robales Lopez, Lautaro Nicols] + +## Documentation :notebook: + +### Frontend Documentation (React) + +#### React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +#### Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +} +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list + +======================================= + +[DjangoDocs]: +[PythonDocs]: +[DRFDocs]: +[DRFSpectacularDocs]: +[APIUrl]: + +### Backend :snake:🧑‍💻 + +This section is used for setting up the backend [Django][DjangoDocs] server, using [Python][PythonDocs] and [Django REST framework][DRFDocs], along with 3th party libraries like [drf-spectacular][DRFSpectacularDocs] for API documentation. + +You can test the current backend (only Swagger API endpoint done so far) by visiting the following [URL][APIUrl] deployed in GCP (Google Cloud Platform): +This deployment is done using the `Dockerfile`. +This template provides a minimal setup to get Python working in a Django web server. + +#### Setting up the backend + +- Tools needed: + - Python 3.10 or higher + - pip (Python package manager) + - venv (Python virtual environment manager) + - Docker (optional) + - Docker Compose (optional) + - Git (optional) + - Visual Studio Code (optional - recommended) + +Steps to set up the backend environment: + +1. Install Python 3.10 or higher using the package manager from you OS: + 1. if macOS run using zsh: + + ```bash + brew install python + ``` + + 2. if Ubuntu/Debian run using bash: + + ```bash + sudo apt-get install python3 + ``` + + 3. if Windows run using PowerShell or PowerShell Core: + + ```bash + winget install python + ``` + + **Note:** _If you are using a different OS, or prefer a manual installation, please refer to the official Python [download page](https://www.python.org/downloads/)_ +2. Install pip (Python package manager): + + ```bash + python -m ensurepip + ``` + + to get the latest version of pip: + + ```bash + python -m pip install --upgrade pip + ``` + +3. At the root of the project, create a virtual environment + + ```bash + python -m venv venv + ``` + +4. Activate the virtual environment using: + 1. On macOS/Linux: + + ```bash + source venv/bin/activate + ``` + + 2. On Windows: + + ```bash + .\venv\Scripts\Activate + ``` + + **Note:** + +- _You can deactivate the virtual environment using the `deactivate` command, once you are done working on the project._ +- _A complete list of python dependencies can be found in the `requirements.txt` file at the root of the project._ + +##### Setting up the Docker container + +1. Install Docker using the official [Docker Desktop](https://www.docker.com/products/docker-desktop) application or using the package manager from your OS: + 1.On macOS run: + + ```bash + brew install docker + ``` + + 2.On Linux/Debian run: + + ```bash + sudo apt-get install docker + ``` + + 1.On Windows run: + + ```bash + winget install docker + ``` + + _**Note:**_ _You may also need to install Docker Compose using `brew install docker-compose` in macOS or `sudo apt-get install docker-compose` in Ubuntu/Debian_ +2. Build the Docker image using at the root of the project: + + ```bash + docker build -t [backend] . #replace `[backend]` with the desired image name + ``` + + Docker settings can be configured in the `Dockerfile` and `docker-compose.yml` files at the root of the project. +3. Run the Docker container using + + ```bash + docker run -p 8000:8000 [backend] #replace `[backend]` with the image name used in the previous step. + ``` + + You can also run the container in the background using the `-d` flag or specify a different port using `-p [host_port]:8000` +4. If defaults settings are used,the Django server should now be running on + + ```bash + http://localhost:8000/ + ``` + +5. You can access the Django admin panel (if the '_DEBUG_' flag is set to True): + + ```bash + http://localhost:8000/_/` #using superuser credentials + ``` + +6. You can access the API documentation with Swagger UI at `http://localhost:8000/api/swagger-ui/` or +7. You can access the API documentation with ReDoc at `http://localhost:8000/api/redoc-ui/` +8. to stop the container press `Ctrl + C` in the terminal where the container is running. + + *_If the container is running in the background use:_ + + ```bash + docker ps #get the container ID + ``` + + and then: + + ```bash + docker stop [container_id] #replace `[container_id]` with the container ID + ``` + +9. to restart the container use: + + ```bash + docker start [container_id] #replace `[container_id]` with the container ID + ``` + +10. to remove the image use: + + ```bash + docker rmi [backend] #replace `[backend]` with the image name + ``` + +11. to remove the container and image use: + + ```bash + docker rm -f [container_id] #replace `[container_id]` with the container ID + ``` diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..034e848 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 5.1.x | :white_check_mark: | +| 5.0.x | :x: | +| 4.0.x | :white_check_mark: | +| < 4.0 | :x: | + +## Reporting a Vulnerability + +Use this section to tell people how to report a vulnerability. + +Tell them where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc. diff --git a/backend/api/__init__.py b/backend/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/api/__pycache__/__init__.cpython-312.pyc b/backend/api/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7e17fc1e13098e58c56f955fdcc203094a9a807 GIT binary patch literal 169 zcmX@j%ge<81lyL+O9Ro5K?FMZ%mNgd&QQsq$>_I|p@<2{`wUX^%R@i3IJKx)KRK}| zC%-r?wWuhyvM5pCB|o_|H#M)MSU)JWAir4OJ+-(bGe0jRG(bNoF*!RmFGWAGAX7g+ qJ~J<~BtBlRpz;@oO>TZlX-=wL5i8JOMj$Q*F+MUgGBOr116crg1}mok literal 0 HcmV?d00001 diff --git a/backend/api/__pycache__/serializers.cpython-312.pyc b/backend/api/__pycache__/serializers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba451ef8aa54d450ca51241615e3e29630511c08 GIT binary patch literal 1224 zcmah|&1(}u6rb5m(lxeLk&2+=_=)k5ob*scEKQNBh@>gPUdHL}ix- z_25ywiC3xri5JC-E_f0VZ$c`F7k#svCVJ6Y0d%yX;H*a1~OjHT3JD;C-ep!Tk zGMn919)SKe1kZ?1d>W9Dx|AAh1y*Rgc8+cQUUEx0E(PVV;*L>bk*mZnZxO!&blWbt zTxVmf=6p4q8qJPeyWL&@B}E`NLEV-~cW%8Wl}Kb9q5B}LClL8udtC?x???!I{5-X& zK{X)}GSH)JbR3vlFwaPU7(2MU->d9`<&)%<1OWKZ)ikeMXX@>#=p8 zJi)%-A1c6;=;oIy8>|+rrc!~=l9-7gh}T%EWptN$xfHgzFxTSEx%SNbjRlT)e&)u! zJJ(_|8Z!JPx6Yc-k&$7L3G0G_ocLZWedbB!rGZdPhP_xNx;mto?g=GA7B4MNvvwB@ z0536_OTh4QiVOAYqXY#>s-hx#6fj5}#nr5=tkWK-%()8*PcanxT+$G9G8<3H_Hgb6 zLTk>o=^$edeqL{wdC(0{s36uIPzpAbXf$Il4IxT&qXoTKH?D#hap!$>T5Vcax{zIH&vQAhof~ z;XD!{aGq5;4`V+K3?AovH5EbOQ6&sj=Edb2vWY>V9s~jBHL51jrOi}cQTt7lvun)z z)yL5M*diawhu`lzwPRbAO26Wi&-BL-?HHsE?8e`$?a2=N%N(Ca!bO^N>wok>nXYD2 zzUpw@!#frE1k}?6-`Yqb2K<@7yjBpYib+1(Ty7!t3^M=gJ>~_xB!w)k7WA0Wl?LVI!@2LIXC;A;D65W8>UiNaR2}S literal 0 HcmV?d00001 diff --git a/backend/api/__pycache__/tests.cpython-312.pyc b/backend/api/__pycache__/tests.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee85a590aae8a0bafe69cb7e72cfcb90f1e7a20f GIT binary patch literal 213 zcmX@j%ge<81Zhv_rP%=K#~=<2FhLog1%Qm{3@HpLj5!Rsj8Tk?43$ip%r8OGnvAzN zLQ;!MoD+*v{WO_wai?S@=B4NBl>o(xn1KpbGJFQ9`{k-1TAW%`te>1%l#^eamReMl zT3M8+?~PO4oI2hdbTAT9fgc5VaG>UdKtll16PJ$}Lhrc-uw@At3}(5fl)u`i106py@Kchnww>`$n~#Ze-q_=-4iYgJICp4hb$rHWA5!+7S+yf-uJ{gzC|8FI{@Un)wJ zVSdnHaHPI-X|oLTiP0F1H5ijsSeE(`BVtCCsL3gu8B<~b7BzTNPy`bwz!VjcWg-k> zHI7(eH$9LYeh>Su7CYh(Nq2ezhCnR1l>tT=B4LQPGU6i)i7=wKG7=+ZHO!W1VOsSRrn)mFA$Rj;k8dI0+q0l0=L7&$wEz<7XcA*@%L z6ln1-X~l2(w|>5}fi5GF9mF zq0^F_aO?+l9g+^9j*U{#B|c2FL`*lPB`q*;-xU(Rr0uG;swESWgXy#Kr!`zDIm7Fd z_sLQY=1305sNreV9NFJ3RWRA6Vd1@!qnoyYb{lTLT%eVJ8j+R@s#BsmzC;?4f8-)u zbG|Z{B*$DY!A%EY2bNWASWX3DjG9=5OIEpVqMGZ#HDp^3d`UX$R&8T*6>h6#a>W`{ zZ5`6dWxII|o|u+aH_%f&LqzEdb54mlkFqTLC(f{Ut|A;8xnPL7iVwVtF(xJ+%y=o; zOXYhhxt)?bsd?|w>n``^I|n>**2@*W-2Gmz*v=I@xrZk!UG6Q(9NhJ?3!h;xyU@-q zbh5=0xyvn6eAY|LUOL}P%k8w>NzWgD=yK0U;tWimfxHLidLZ8h`D4%pkI#~`zXdMF nU&QGYIWM#5W$yJdi|x$f$*XSW#VHx%{rR*s9{DKY3|ZzcA~7)3 literal 0 HcmV?d00001 diff --git a/backend/api/admin.py b/backend/api/admin.py new file mode 100644 index 0000000..bdb6a6d --- /dev/null +++ b/backend/api/admin.py @@ -0,0 +1,3 @@ +# api/admin.py + +# Register your models into the admin. diff --git a/backend/api/apps.py b/backend/api/apps.py new file mode 100644 index 0000000..9b32d40 --- /dev/null +++ b/backend/api/apps.py @@ -0,0 +1,11 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + """ + This class is used to configure the api app. + :param AppConfig: This class is used to configure the api app. + """ + + default_auto_field = "django.db.models.BigAutoField" + name = "api" diff --git a/backend/api/migrations/__init__.py b/backend/api/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/api/migrations/__pycache__/__init__.cpython-312.pyc b/backend/api/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e51a278da012d8fcbc063deae5ed7218c1f4b286 GIT binary patch literal 180 zcmX@j%ge<81lyL+O9Ro5K?FMZ%mNgd&QQsq$>_I|p@<2{`wUX^D_B3YIJKx)KRK}| zC%-r?wWuhyvM5pCB|o_|H#M)MSU)JWAir4OJ+-(bGe0jRG(bNoF*!RmFGWAGAX7g# zGrcGgBvGs%AD@|*SrQ+wS5Wzj!zMRBr8Fniu80+A2O|&{gBTx~85tRin1L(+%EvGs literal 0 HcmV?d00001 diff --git a/backend/api/models.py b/backend/api/models.py new file mode 100644 index 0000000..aa0ea2d --- /dev/null +++ b/backend/api/models.py @@ -0,0 +1,3 @@ +# api/models.py + +# Create your models here. diff --git a/backend/api/schemas.py b/backend/api/schemas.py new file mode 100644 index 0000000..176f95d --- /dev/null +++ b/backend/api/schemas.py @@ -0,0 +1,6 @@ +# api/schema.py + +""" +This module contains the schema for the API using drf_spectacular. +:param module: This module contains the schema for the API. +:returns: The schema for the API.""" diff --git a/backend/api/serializers.py b/backend/api/serializers.py new file mode 100644 index 0000000..9620879 --- /dev/null +++ b/backend/api/serializers.py @@ -0,0 +1,22 @@ +# users/seralizers.py +from dj_rest_auth.serializers import JWTSerializerWithExpiration +from drf_spectacular.utils import extend_schema_field +from dj_rest_auth.serializers import UserDetailsSerializer +from dj_rest_auth.jwt_auth import ( + CookieTokenRefreshSerializer as DjRestAuthCookieTokenRefreshSerializer, +) + + +class CustomJWTSerializerWithExpiration(JWTSerializerWithExpiration): + @extend_schema_field( + field=UserDetailsSerializer, + ) + def get_user(self, obj): + """ + Required to allow using custom USER_DETAILS_SERIALIZER in + JWTSerializer. Defining it here to avoid circular imports + + :param obj: The object to be serialized. + :return: The serialized object. + """ + return super().get_user(obj) diff --git a/backend/api/signals.py b/backend/api/signals.py new file mode 100644 index 0000000..72237b5 --- /dev/null +++ b/backend/api/signals.py @@ -0,0 +1,25 @@ +# api/signals.py + +from django.db.models.signals import post_save +from drf_spectacular.utils import extend_schema +from django.dispatch import receiver +from django.http import HttpRequest +from drf_spectacular.utils import extend_schema + + +@receiver(post_save) +def generate_schema_on_request(sender, instance=None, created=False, **kwargs) -> None: + """ + :param sender: The sender of the signal. + :param instance: The instance of the sender. + :param created: A boolean indicating if the instance was created. + :param kwargs: Additional keyword arguments. + :return: None + :raises: No exceptions raised. + """ + if not isinstance(instance, HttpRequest): + return # Ignore non-request signals + + # Check if URL matches schema or swagger UI endpoints + if instance.path.startswith("/schema") or instance.path.startswith("/swagger"): + pass # Schema already generated diff --git a/backend/api/tests.py b/backend/api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/backend/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/api/urls.py b/backend/api/urls.py new file mode 100644 index 0000000..f8995a9 --- /dev/null +++ b/backend/api/urls.py @@ -0,0 +1,33 @@ +# api/urls.py + +# create a router and register our viewsets with it +from django.conf import settings +from django.urls import path +from drf_spectacular.views import ( + SpectacularAPIView, + SpectacularRedocView, + SpectacularSwaggerView, +) +from rest_framework_simplejwt.views import ( + TokenObtainPairView, + TokenRefreshView, + TokenVerifyView, +) + +urlpatterns = [ + path("token/", TokenObtainPairView.as_view(), name="token_obtain_pair"), + path("token/refresh/", TokenRefreshView.as_view(), name="token_refresh"), + path("token/verify/", TokenVerifyView.as_view(), name="token_verify"), + path("schema/", SpectacularAPIView.as_view(), name="schema"), + path( + "swagger-ui/", + SpectacularSwaggerView.as_view(url_name="schema"), + name="swagger-ui", + ), + path("redoc-ui/", SpectacularRedocView.as_view(url_name="schema"), name="redoc-ui"), +] +if settings.DEBUG: + # add admin to the urlpatterns if DEBUG is True + from django.contrib import admin + + urlpatterns += [path("admin/", admin.site.urls)] diff --git a/backend/api/views.py b/backend/api/views.py new file mode 100644 index 0000000..6ecbc62 --- /dev/null +++ b/backend/api/views.py @@ -0,0 +1,3 @@ +# api/models.py + +# Create your views here. diff --git a/backend/core/__init__.py b/backend/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/core/__pycache__/__init__.cpython-312.pyc b/backend/core/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..360c3e92c2780c505ea241344b4cac35f493a352 GIT binary patch literal 170 zcmX@j%ge<81lyL+O9Ro5K?FMZ%mNgd&QQsq$>_I|p@<2{`wUX^%TqtJIJKx)KRK}| zC%-r?wWuhyvM5pCB|o_|H#M)MSU)JWAir4OJ+-(bGe0jRG(bNoF*!RmFGW8&zbI8d rK0Y%qvm`!Vub}c5hfQvNN@-52T@fqLWJVw^1~EP|Gcqz3F#}lut+Ol_ literal 0 HcmV?d00001 diff --git a/backend/core/__pycache__/admin.cpython-312.pyc b/backend/core/__pycache__/admin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e85ad49ff78e34b8ad5f8bbb9a62f6460511b25 GIT binary patch literal 250 zcmX@j%ge<81SL=BrCnfVV0aATzyK4J@mU7Qn9h*GkiwY5kjogw$OvLH)p zR5EEYzXU1OWW2?in39{B=cmbXi!UWBF)uw|FF8N2q$o3~2xvINE$-y}qEx-y{FKz3 z;#+JGdL_eWkmg@*`k}?CMaBBbiA6d2#c8QUMX8lViTW=2$)&lec_qdAL8%4##rp24 z#U+{fc_Ej25eipEh=9Z^ghjuNmV;qx+VVpNGR-I|6 zaSP*{l!TSiq0A>~IK@Qyv0r|mwP&!@W35inNHQUjM?}b_&xBx^AgIs1G-B~oq6?OA zi3Utg10G+F&e527*DR(;kAX;%NGHjJzFUzj1!P;L8CY}=-mINPbL+k@^h==+Z8L9H w3u?2_mn`iqjf%z%g;w>$a;GD)si;1p)Cc@FA%yQ>?`O?`oyYDkP^EDF0hlU!1^@s6 literal 0 HcmV?d00001 diff --git a/backend/core/__pycache__/models.cpython-312.pyc b/backend/core/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79db7c51d9016bb66c4ad425b7e03f4ed3ca47e5 GIT binary patch literal 15324 zcmdU0U2GiJb)F%2m&@h;k`zrzTypp$hAUa59VN2sDydlhD2kxmza0*_%eXY$A@=fe=iJ{p=ljk*bNCOjScHS?S66?r{91^gG_ySkt7kM7*ZH2aC`(iuKwQ(0Xsr{#%6p-6*g{{WU?~mJAeKANSgCH4dA{nBR z9UvKQBH2MDJ3%tiL^4bzyFfD9M6#1g#y~ROL^47p6CjyvBH2YHQy|&hL^4VxdqA?c ziDZmQ9s$X|CX#U~`3gw(H<3(G$)g~7tchfjN*)KvfhLkEDwzh!!6uU38$%i4x2P@| z-U#b*sideYI@Ci&O_B?G-q9+KGu4WF`2l?UkdwJZUg8$pB!02IjgtensA9VtaGnY6DW;yQMxhzgmoJgfbmQ$7Qi36GaqnLjMr~u6N`$ zBI~kR(gjh_%S*T9d`ZxVkk`sYmnS1sXqv3(Z_yeyVXG7-N*il(<}G1iRTgG%iRy}G z-2s7e!EReB5oM`dl3hJ0Qm)7*B1}w|OWM357bLT*HKG(nvLU=DZwSjUkrH%o&YJZ< zX-`Deic3TmCT3Pe;_gBfi?X0C)28NrF-K|Pww{kSX^%sU;qoTTM*ITC;_j81#QjEJ+3MyI_A zMu_c;adgkc8BzBxJmp@ZmV9wx>bfoyeJU@Kf~Lb-h`d3>saY*wE~0`=fv#x!)CJfO zMN=29Uzu7G^Y6*3G?mwgJjK*va&3czpf_4{LPh@$6hGzuqpd3#{`?r%J@TM$J2hNM z4L^};sWY43--)HSZfwWWm00>oPc3$ObAG4i%!9MrJ!dLCXR1BlzI%zhV)fTxS-2Z` zz5Hh=TC*%UIZ5oO@p{(wF%Sw~ivYDC)64#Hm$r2Qa5j+uzyyh7?$)d>wKp9< zz7fa-jnH(VTvRo2(cg4SWeFbAAsK8L6a(z6te3PRDv4>UqONOs1uR(-sDwu0!?Cr3 zydvJxgb770nJsiS&2Q*}g40!&mAr`BB&g-$l1!YYlB)Q(Q>naIXx0H}sVKqN3(A@{ zN9(($kS~LZt0e*MmMpje6YbR09N@TIl8uPdI-5z5C_FL}!vX=BB(R`H8T)}MFKAFu z7$OMzMq>KDf6WfSYAR-Ed=s*j^d!uy7+X4+f>I zsBg;~Mu;th^x$u5=mDhLz^=@u|d2)Scwfjy7PSf(+^&J zP>apqoo8d?uwUK^LF0WG&1G?n&wRL1?rho?+#Qg??ebirI5x5k?jVRld18cDffCaaCO$MR$YtPU0fppR@g`g;nrk@&!P3VU1|( zfY7>71QAIriGsF4K?`BU|UT1(A=CzKq15ZX=-SCYez$DhxCnthS2C1*A- z?nH;S=C`9mmFQ44I=nfz6Cd7M-i{Af;=|SW=;npr2ZF(?{C{#-vPI&!{(2*T^Wf;s zmp_HrnA*Y#q(xlzVFr5?z-7R8q&&~na2kT+AxH@x5%^P1!S`dkzke38QNCxRBNH}~ zGg=W$ps48Dtb9dW(ZtVufL;{V#0_+f;j~mNDkZEQ9+<-zYq>R;OKWE)zo}VRv?i0~ zypk_KSF@nR3xK@t^Ap&+4D{7U1zxPJ4@Quxh!J%^UZcZ&97e3+=@5)# z7!hX^875PYSHN2#wkcl7{TAFKSX_mV{vi|yxha6$ajtg^kCda8p3&!lTFgXAe*j4)79wEZjjySop><6-8)g~ov8Mn+`PP#8nzFz*J`QP@gVCs z&g;+nJ{^29Sc{#v9A})DKP3P1D~IF;ux!;`_Bp!Rundtq0MAR#vni$gLu@5H<#eFqzJ|6 z(&DBCpdd<>d$nN*wj@GWaW@ZGn`A8*LY=@F+OjibtI&_c%!0YADzH-{Jp`KBW57gTd zES`#iF3)94?0FKfCDy8Pn zo_2ekH`w?7ZEV-ygZ&LB41`iTmUECW+c~hjE~|N^sK8mzJU+Skz>K~j5=*qr(9%om|E&0 zr9TD(CKsSEx?CG?M4X3eq;@?Qqu06Z?5h!V?-=99F4qdZ42IZ20pw>;u^Frfjz1^4 zq_DNVofxVlhMvsU60dK5Zznm5$Dh$ka<+!0re5e{928MH3#s4_u@ROGT ztEo}oyZ(tsq3!;OO8-Q)|Kw+ZBRj`WJvzI6{8Z)msp|35p9T7NdPc1yS+(Z`9LSs= zDdXLJn=u$JtAWAn_kRBlcUp^OK}7Tqe&ayj&-uipTyHB5_5GmDR_rZc{Gz%lE-3}2 zB%<>!PWc^1RH0Go@Mz;8KB^gt@C1&*#Hdm$4eM&|u6ogC0f3=#)$ULSN;7i;pA!yf zzHu*bcnRimFt6Sn0P_ykI9V^oK@bWZZiF~*XboOBe5nCk9&=0QHou9|Fptr_d&8Q? z#qAgjIR(aN^!YzLau#oPx%S)ogYFEOf!kyji^i}%xq;td@d7@&1_e6d34pK>E;ZsG z98XU^y0M*}tfVJ*!UIo2pTwWW>+NlWq0a)xJ`Zs{-#|xwywW{h?VbQ9x_jL7x7(4o zAO~mA06E~0(d%oG#6$iJ=JNh0)I;3;4B^eAE1?Hdbnr+kDLN*U*st671q6vE^Gr%h zlV(cCWlU=_y^|$TmziOiZ;CKS$9=(>u`wNpS;ubj?b@Gw$q!+fl=Vmt*7j5y+zz@Y z{|FTwk9epwAyAqmH%OJ^bR~WI*JHKxpMXyIq?U zsV?-6E2?l?DXmiH&@(MdgJ{}^&oN>)dl3ND%tX?JEF-^y08oCBCXz^^l(9O&-=_QL zGmIJKj_$2~7|5hK9ApS<0v5wqVEmGdVc`L;oA@0T27L54pg-tnLHWL30F;L5i3vY-6D+{NXquH$Gwq)NNLk+s$Td56x*si`3K00_U=TP;&_I=% zhtVvdR`LR!4xDxeC0B1B2gW!fZV@QkhgRSYH=khfZ}72`>%yRFyXm7=Hm426-~n&tHq`uu(&%h)0Zi+ zzpt_Ggs;d1-{b3|Y$2BQjp@g@JSJ2mc!3G>I!$&F*F~iuF72gd&C;T&v&0f=&`t7j zjTjyKYb%=wggKglW8PEHhxucNk>1DF zW+wLmDhmhB?8A51jI+G2=Rgt<0$;F$04$Lv^kF8Rfsso(7qSFW z1Ut<>?eMz1_%%6=#UvI}Sa>{Jn%kzpjVUxWOep-2+xh0(J_&Yaybc>=Gy8bgG{NpB z4kci53kwkoI#W8HXAUcP7mER$!yHu5yN&^E4RXn0jBE;(gzz~1>+#=A{>@}9aS`I1 zuD50SljTp;r)n+soz3~*2l(J6$d$vA`P$g;|68+n_)UCvAj44g9i?fnR0@ z)0%-(ixzM^YSxso=}i0#yohpGoY`&Q@M6OHcLcW~??61zN}_$!{5OTv{O0%3z_ZlA zv!;P#zu8O=WE-%!R$fz=*?(ws+L12yUmQUi=wivgG}1|vcxhVMd7R-i7B{eV<|UO&$tksdIbf?Z? zz5Z4j%B{2a&)qwRLh#LbUf|Dc&ELOt51K)>KF{~_Cm!5*`0hv0GgRwmyZ952`hGF+ z^MN`C)%rl37p!rhS|5pleBZ-?kKjI3>q3-2u{D1G)qAhjIjGhL6Y%%?{X6&W)H$fu a$9nloy!8dv>yy2FmS9@tr~d`yKR;yv literal 0 HcmV?d00001 diff --git a/backend/core/__pycache__/serializers.cpython-312.pyc b/backend/core/__pycache__/serializers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f758c5669592d0b2f58975d3d33c93d180e26f49 GIT binary patch literal 5601 zcmbuD&rcgy5XawoZDafcY~vpogMm;fbyeXIC~APB(2&w9fl`uGtt)lAv6t3m?WJ#R zRWz3#IJ7rz;Z)@sMg2>9^2unGTh&8vRZUchQ)ixkENft&(OP=r+41+ydOkb5`*!~b zh5Q6QKmYaHZrDf2pSaQac-l_$&_&2|QY1w|CBM6bmM645m+C5ud9fXJcYpVw=OP=V zC?1lcTM@qxb`qQ4uf&$0A7DxkD7_q|k0}R0>EkE|nQ{=6evZ=5lmSo%Im!T2hCn&Q zQ3jcE7?fd-GQ^Y-P)0e*A*LJwWsIX7X397y6C7ojDU+Za4w!(h(2}f{ep0AjFnfv+cYC8b1cOS25M2Zazyop(Q5G7&vA+Ma;X4Lf&)W%8F-+3n^wdm8xtE zNRq6olC+ie8a_#?$Yn*648J6mwPH<0KPX8*)MT~&%RoDi;Q@i78s6QKq89a+q=|px z>|yQ+6s_k9GF3HwSD{onpmJ_qE7ZzLrK;z4lzmOlZ76!Rq*We2+0H$c3wuhXm@8;h z$(;i>yMJJ~@h?(1?MVcNj_2ngISD6!@tj1)e)Up}(h)FQFWnTc6EuJZbu3K7=rL6k zJ#WWgyxB_kpUdS*|4YEMgs8F5z3#yZuc@_iMRRbh;=LKzp`wHE&)_ii6l!=|YC43) z4WsF)8UfK1m?VrY#Kc926#J)lHcp~w66nOyFrXN6#3|YCq~2mJN&9K-@hcM9QVUro zao}a3)(IHxmN^Me^a*bqaiL+32@f|dbzZm0#_nn5eX5m9y0)%t%ilU_x5=w>*&+=0 z&f`#g3yPkB(QU!0J}KUSNfZrpOp3Vah~kh#awFFHwzS-+g2u?>q%hC$iu`ONV8B=4n`MJyiZ8)A{#WA;T$9kIf69$N##5F zX-O?r8Fzd3`$ z=|d=S14gs8U_A+s_1R>1VG>325jrL_3^`&J+R;=8u%edfwv2uVe`5GOQ6Na|3aU+1Q0%qCk1>Fd<4ZZu~LpO#f zygZP0DZHupQKNelX&S*ANc7I6NNel-tl>?3U18#Dy$fIux9r)BJzB73G%g3(GKbxt z**%9{L@B#ou+xAYX;y~yQTxod(t2&OO22_D*tvQF>_4I)2&Y~mjJ+nAH}HKEH`1@k zY>F}+fsUNIv_Up3;l z>hW9WB72R*Ts<*oMvk8~CYS1yOJ?N7a${z-KC@~@F7E4ixshJ1rx#7l(St@TSC8e) W$Z@)nTBxTMY$NSFZ?ICo(xn1KpbGJFQ9`{kw|TAW%`te>1%l#^eamReMl zT3M8+?~TZlX-=wL5eLv%Mj$Q*F+MOeGBVy{P$*&pasb=_IPw4h literal 0 HcmV?d00001 diff --git a/backend/core/__pycache__/urls.cpython-312.pyc b/backend/core/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4bf4a56a6e7f8fe207e1bef0f33ca0c3184a3a1 GIT binary patch literal 1610 zcmaiz%TLr$6vl5m4`!w_Qyv58N0-D^G{s;So){xV_(Ze&+P3JCPnai`Rl{- zy9gmaeIc%RusPCYLUxHxbjc)^RFW*YBul=Q&4?8(MR6a|qh{=>AbTx_T{f#a zc+raHtPV(CW&)PAs_D$ossrr6Z%0?kdkITJ!_c_bqM238rhH2ctU_RTN|{;}MlFL= z?!_wF3f|)7Ds`}{)v#B!CBrlvt!z*m_*SQ5RA}L%?Wvk>8MeV4rsubNRRtLiBjjIb8!j#@+@Zd?^15;Y;K~V&2N}&WGAfD3^m1GoepAb8jUGuh&J2@ zkYJ*Il%9es9vV!==AXzB#zu}Oi*p;EmEK$q5q)#ZNw&;?AP}z^FONNCC8vn#e gEcv?q&C{Lv-G%oH` literal 0 HcmV?d00001 diff --git a/backend/core/__pycache__/views.cpython-312.pyc b/backend/core/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8673dc221a7c9bb718016049f157644d7b297c22 GIT binary patch literal 5828 zcmc&&%~Kmk7M~G92nh{H2u2_b0(~$-LJ}V)ENeS9A((h=ihMYg>Kv3Y8r#BZjngBN zBBwp+!Z$- zM#I>HJa`0+U@!9GQ8bEu$cO#NkH^p$4xj**kc7w4IG#WgIEaEcghG7&aAgvQQ5a95 zDLjp)v5aIKK@mKIX7DVU#ZeT+b7&6VKsWF_n#T)h0mo1bFQP?Ja0&N?lII^nX+#@3 z*=ue7`uo*TqmSYo>1D`K2V{aHeGKV$KqfhIj3EOK$P`CP3_0$AT;|9Lh739&6^;xs zK&5>b-oN_>}aO5;Y$_~g3M@ATO#sQh-$XSMrIv`g$a*iQyI3RNzInR&_4#+%5 z#u#$Z0a-X(O2>bLa7l}{e^)iMM`~4lrV%#u{!rF_G_;!Wn+SHv4%{o@aDqeS$P^9POdG#X!k_#3$IN8pk5y99ji(wR+8I&vd;0My)~Yol|AqEaH}dy21J?WM z@lpPXdi+AGmh#6s(enHa$-O)yakdy2Io2^?JO32w$?R3}vS=l@X>!|4?)?4WUoS3} zskCIecj~f2-C?rYnl^yv5NO1H^D%G=*%Kg1*is6_G6;C?L;;Zo(I%R#z;GHw21FJF zcLx|Cg_hW0ofaR7m8-+cLo2aG6I*6toAZ&P(xU0!uFK19K49(u_y~8svJSKaz`wq< z%!0KSE$d(avCY~WV3~zUX4}f#rJ1`{W{+m}%*;L~W|c~c>E5r)xi&E{aR9`~@25lu zZbsQQ`*S0MwHG%x!2semYX$@#<0f~<%I(wKzLk4Ga}UhiL*VB1>3F$xw)ZhK-h=8>h9e)7>i2JOy=!h#yGygXR(79e_s#49XC_Cb zwCO&m%lS4lFmV9P%zRjsIIuGbZuVto5v;wU29gN@@i}X)tWwyu3J+-EfmJx9g+sG& z)W|AXDy^FCqq@A&rUzyYfSzzy5$nK=2VCsSOc<=anE4nCAfVbKa85VQZ%_@u<=}Pk z>fmn(w%XU<7+8Dxdk+jCzGba-_A2X^vO|>}OSwapJEn4%zbEW?Nt*7vbve@x1eiDg zR^aaAK*t35)t8P1u=b(@{x={XzGKZ;VuBsFi;1h~W%O#{a=~0&=TyY0G;g}s>vEz^ z1xy+M72~aIkpmy&Y$xaq!C zm(y)dVB#P+Y29fZI2i%w`o_oFY`a2KS zUjF_K3?OvqK-tys7gUGoH9Jx|QLE4NT!*dKNB zg1Ff<+tWZ2o~8M7@WQ&hNamH0ABJ$JCHzvsi$xy8{Ke*;@QeospzXiD$Qp#FcK-1A zJ&ae@ynN!d0>6YrVO?Hf^1$bw^OO(+1Du-n*duVIMQ9xK{PqU74PKA)8kARFyv*RI zDL*)PHsv{lzc@TnIDPNk2LJTlYFy>-5IBWJ){G4%e;*P>@ts!?*WP&qG4Y3ITy*^* zbcRhox%QUnMniOc3&$q2fg-$A zW)n0Y{#N$FYeiORWEC)3z$DKjRxm|_DbOTAvvU62n$FPa3}{w*Yuf9)gLQa3{vVMj BMm+!k literal 0 HcmV?d00001 diff --git a/backend/core/admin.py b/backend/core/admin.py new file mode 100644 index 0000000..650fa6c --- /dev/null +++ b/backend/core/admin.py @@ -0,0 +1,25 @@ +# core/admin.py +from django.contrib import admin +import core.models as models + +# unregister the default OutstandingTokenAdmin +# from rest_framework_simplejwt.token_blacklist.models import OutstandingToken +# from rest_framework_simplejwt.token_blacklist.admin import OutstandingTokenAdmin +# admin.site.unregister(OutstandingToken) +# admin.site.unregister(OutstandingTokenAdmin) + +# Register your models here. +# admin.site.register(models.Materia) +# admin.site.register(models.Alumno) +# admin.site.register(models.MateriaAlumno) +# admin.site.register(models.CompromisoDePago) +# admin.site.register(models.Pago) +# admin.site.register(models.Cuota) +# admin.site.register(models.Inhabilitacion) +# admin.site.register(models.TipoInhabilitacion) +# admin.site.register(models.Administrador) +# admin.site.register(models.TipoEstado) +# admin.site.register(models.Rol) +# admin.site.register(models.Permisos) +# admin.site.register(models.AdminRol) +# admin.site.register(models.RolPermiso) diff --git a/backend/core/apps.py b/backend/core/apps.py new file mode 100644 index 0000000..c0ce093 --- /dev/null +++ b/backend/core/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CoreConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "core" diff --git a/backend/core/migrations/0001_initial.py b/backend/core/migrations/0001_initial.py new file mode 100644 index 0000000..99ffed6 --- /dev/null +++ b/backend/core/migrations/0001_initial.py @@ -0,0 +1,138 @@ +# Generated by Django 5.0.6 on 2024-07-08 21:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Administrador', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dni', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='AdminRol', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + migrations.CreateModel( + name='Alumno', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('legajo', models.IntegerField()), + ('dni', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='CompromisoDePago', + fields=[ + ('id_comp_pago', models.AutoField(primary_key=True, serialize=False)), + ('perfciclo', models.DateTimeField()), + ('monto', models.FloatField()), + ('firmado', models.BooleanField()), + ('fecha_firmado', models.DateTimeField()), + ('compromiso', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='Cuota', + fields=[ + ('id_cuota', models.AutoField(primary_key=True, serialize=False)), + ('nro_cuota', models.IntegerField()), + ('recargo', models.FloatField()), + ('monto', models.FloatField()), + ('firmado', models.BooleanField()), + ('vencimiento', models.DateField()), + ('fecha_pago', models.DateField()), + ('fecha_vencimiento', models.DateField()), + ('fecha_pago_devengado', models.DateField()), + ('fecha_pedido', models.DateField()), + ('tipo_puesto', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='Inhabilitacion', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('fecha_desde', models.DateTimeField()), + ('fecha_hasta', models.DateTimeField()), + ('descripcion', models.TextField()), + ], + ), + migrations.CreateModel( + name='Materia', + fields=[ + ('id_materia', models.AutoField(primary_key=True, serialize=False)), + ('nombre', models.CharField(max_length=255)), + ('cuatrimestre', models.PositiveSmallIntegerField()), + ], + ), + migrations.CreateModel( + name='MateriaAlumno', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('offrc', models.IntegerField()), + ('atendnc', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='Pago', + fields=[ + ('id_pago', models.AutoField(primary_key=True, serialize=False)), + ('descripcion', models.TextField()), + ('medio_pago', models.CharField(max_length=255)), + ('nro_recibo', models.IntegerField()), + ('monto', models.FloatField()), + ('estado', models.BooleanField()), + ('fecha', models.DateField()), + ('comprobante', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='Permisos', + fields=[ + ('id_permiso', models.AutoField(primary_key=True, serialize=False)), + ('nombre', models.CharField(max_length=255)), + ('descripcion', models.TextField()), + ], + ), + migrations.CreateModel( + name='Rol', + fields=[ + ('id_rol', models.AutoField(primary_key=True, serialize=False)), + ('nombre', models.CharField(max_length=255)), + ('descripcion', models.TextField()), + ], + ), + migrations.CreateModel( + name='RolPermiso', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + migrations.CreateModel( + name='TipoEstado', + fields=[ + ('id_tipo_estado', models.AutoField(primary_key=True, serialize=False)), + ('nombre', models.CharField(max_length=255)), + ('descripcion', models.TextField()), + ], + ), + migrations.CreateModel( + name='TipoInhabilitacion', + fields=[ + ('id_tipo_inhabilitacion', models.AutoField(primary_key=True, serialize=False)), + ('nombre', models.CharField(max_length=255)), + ('descripcion', models.TextField()), + ], + ), + ] diff --git a/backend/core/migrations/0002_initial.py b/backend/core/migrations/0002_initial.py new file mode 100644 index 0000000..22941af --- /dev/null +++ b/backend/core/migrations/0002_initial.py @@ -0,0 +1,100 @@ +# Generated by Django 5.0.6 on 2024-07-08 21:24 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('core', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='administrador', + name='user', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='adminrol', + name='id_admin', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.administrador'), + ), + migrations.AddField( + model_name='alumno', + name='user', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='compromisodepago', + name='alumno', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.alumno'), + ), + migrations.AddField( + model_name='inhabilitacion', + name='id_alumno', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.alumno'), + ), + migrations.AddField( + model_name='materiaalumno', + name='id_alumno', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.alumno'), + ), + migrations.AddField( + model_name='materiaalumno', + name='id_materia', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.materia'), + ), + migrations.AddField( + model_name='pago', + name='alumno', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.alumno'), + ), + migrations.AddField( + model_name='pago', + name='cuota', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.cuota'), + ), + migrations.AddField( + model_name='adminrol', + name='id_rol', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.rol'), + ), + migrations.AddField( + model_name='rolpermiso', + name='id_permiso', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.permisos'), + ), + migrations.AddField( + model_name='rolpermiso', + name='id_rol', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.rol'), + ), + migrations.AddField( + model_name='alumno', + name='estado', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.tipoestado'), + ), + migrations.AddField( + model_name='inhabilitacion', + name='id_tipo_inhabilitacion', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.tipoinhabilitacion'), + ), + migrations.AlterUniqueTogether( + name='materiaalumno', + unique_together={('id_materia', 'id_alumno')}, + ), + migrations.AlterUniqueTogether( + name='adminrol', + unique_together={('id_admin', 'id_rol')}, + ), + migrations.AlterUniqueTogether( + name='rolpermiso', + unique_together={('id_rol', 'id_permiso')}, + ), + ] diff --git a/backend/core/migrations/__init__.py b/backend/core/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/core/migrations/__pycache__/0001_initial.cpython-312.pyc b/backend/core/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf77d0a7eb31a8a06ff100080c78428587cd2517 GIT binary patch literal 5549 zcmd5=PfR1%8K3e0e~>X@fwhhQ0846&F$UsF6{(qndEa~A zpWpZUzV~Jx{~Q?baq#^8uYV~#ALh94sL*|!ox$_>VDL4EIK-E@GQZ82ZQC}UvvK!1 zWc!jscFga&x<(g&PweJ++kWUsI=`nv(q{O|a#59PvQp6uS6M;0q~$McIBujPJl_Oh zUvrq-<`K7TL;SYA$Zb1p9Cq#nE*qF*WJ7jXbMFbSS>q9p9LV|1b>c8r3pV6t+C#5u zpLC`QwxaEs=fq};SH|_;EN+pv;L~?ApU8iGE|&7OTfi1T11uUe%gYaC`PpEXG2r+O zrrE9NCG`uAk-&7uE-iM3mvn+mC)8JG$U>|)nNH+YKWO;btrOmyhq}8g@Gyc#nKvsu zj4{o=y@qZxo&G%hR9uBvtmvyeT;e=zK__BCXWW8L)Phco>0DnszlGYxZ@9k_EO!4s zp0J=Z$#mlVcrQ9E;GaTwm?tZ}H_bG!3GGzL~tS+2-hO_h+M z8a5f-Gi(pmlMW*w?bj4BuVSf&k>RhZa#>Oj#i#ht@M>6k6Z^6Tm>1IkY;#Th{sCFaIKd1%N50Nm2gqoQw(8EDOXjcENjX--jIrl5s;CX zhe@#tQqrdS;XqdD_pafsVzrQ$^CiV_mX%6PG28`NEdy#}pn&tclGqh})Pd>s`~QGx zl83Ku>2tA!E5+Kb;auBSYLelhk=V#vQ6Wz@bgMWoser?OfGc^qEMpqTXZoj*jG#Hb zygYodEFugmMG7j=nZ-y3$zPMJidfyp8u%N0P}!AsX6@;YEU8w0MbB5wZpelDHPPa;Rc%us^kp^ zB;$-*?zsc*4RHAwH;tiz+EBr;vnqpM z6{_t6p`&H^HX;8HO?QK^&gkg4AEIk7Q8Loik$b3mlzh|hh^*H{(eQ~P+@SVL7{&on z{QbUEqKyZV8(O*s9cly+u0qbVm{?Qkjm+?`v6g;F?_Mgs5E+3Fy>Da98N?mhm)0y4GpLf)6ZzvkzJHSuM zQmNDv&!+&F=Kb(n?m3|2e*7%61^Z3QKxdW|t$2XB$lnXe9-qci&G%&FsSifoIdqBce~BGg*J5i*uKay7?N z`dF$ymL|en+i4#j{K4t+`r3m%zQX-|we2=)=LEYzkKOJ5cCFxT5}rHCHN$gyc&;9v zCqnkMxZDov-wpnS9{-c)!5B$ok4Kt`te(i8qBGn`Y!YFs6^xMR!cn0aUC^To_2?22 z-fjiQNGNqQ-3+DlP^uoH8MlHV63HChYeq79BvX%MiLe0Fk%`>#baNu7Pvq(o?-F6T z6&xqA%+WzJmeFIG)5S*YS44QfJ>aIee1L1D2iMqnFighNN1rsu)B1S&bn5I*V|;@M zzhStt6jxS{X6w;KA}lcsX^J7ON7D63h6wZ4u|`RJ{@B%w&+GB|dVGNhi@jLuF*Bzr zGMzgvG^ca=bgn*a=JXaxE`Kx9OfKum<$7|32zOgOeAW{tzRNLA*BbHniLlxp4ba@* zfZXFfxhJlxIe1&5h?n&EQazp{!aJ?t6>~3T*7iDSOb^5y>WLXT@2$`J*@unTVudhFVL1YMP;U6s~D>3Ybl-m6`8rT@`$ z+Jm#S{h29`@mM=-D0DvVXas%$~iHosn~TM!cvXoMO&K_z@94zN)e} z@IBtYQ?ESLz%D^17mstz$whr~@gEMdvDKLTgb1Jh1fcGm2a_bV@=dOpTG3N0XAbh& zZyTxK5kdT)oIkbyksosX=_7Ts`}TMQUyEL}Csm5d9NJ-TS@vQz-!D(78q?i^(T|?H t<~#d6^-~b(KbKX(uJviaa3aV{{=D&;phMW literal 0 HcmV?d00001 diff --git a/backend/core/migrations/__pycache__/0002_initial.cpython-312.pyc b/backend/core/migrations/__pycache__/0002_initial.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbee7718eda012428661c46a7a2bdcb603b93f5d GIT binary patch literal 4634 zcmdT|zi-<{6ecN&qG-vs7{`udDY4_gjygzI(w{&PM2Hg?X%ZKX4HrUDmeQSNs{Eml z6k2OaffVSNty|Y7h=I0C`$u#!5djhoC|aOXHv>+WOnpa6u3giB1P6l4;dt-fyN};} z_jr2LuZe`n!1eR@-)($7%rJjaqkBaQ&Th9jb`RxHI)O~WR< zZX&GN<%2M1JI3CZG0F;ijEWp$iy_2u3=UVl6&;+yFqjWy!}?Jbt|)jjrNgtRg+eF{ zKCwD})Q98M^G8RkV*z8SfUyfl$AWooN1k(j>^9$3@L0Z4MAsr#rvuPmJ6{y*i<|gA z({c!j1Jp9!mzD`Md}_IkoN8{P1Jo_q*PcqJINv06W`Mel^`%=BogE;z@xHiCpmPJ{ zHrXe))2o|^&JR$xslIeepws}lrH|!y>F94f8bKE}+3kzniUD|rt3h#5G~H9&1e!S* zS4kG7txK6%61&%}(^jEs3ztm`lla2ILS9x4)ln6VBow4W-*zkonHCAxZEQhk%rs=E z>ac?e=a`ugRD86`lMO}3B=_M-J}7$_nOC&BZkS}WZ0a@3 z)Kwb*Yf8mz4EfQ%dssC#m6EEdj#7s5lEf&e?@H*3gDq9*m?C&OBaOHR(XmLF!jee2 zZaPXs^juz_@Gu3KHUw{sau%VfVT-aM6tL58B)o`@1vM_V9nhyS;te}$&GZMzILx6Y z=y{NKV`4w>up`4+=O7;}TBt&Q1a4%cZm19ISa!?`b~dT}7OiouDL;nZtTZ(DGiQh( zds`sOM3iONlDdYWAD88abw#7w0#>xMw^kS?kum!VrB+i)5D0o>17V}QWziC!j1<;Z zKakfR+**OXB+xDz=GGKwiK#WA@+y%&U)cYmj|*uB=#^ zX>VZ5!dsS-TQtjc9UG3FTfsHc&MkrV@T}Ffk8&lY{5dQsN7c^#`%RLA6u;U{@oa6& ziUPdX2+*<9Ak1Utk74Q2(k{=$X4=C1H)2becZK<WtZLT^3LjJQ&NKf zF1{WfnRarrCmu>uDh2VFZzoeH0suiz43O@LL8&Q~gO-p!sRjUWt|tbcH6cfSb}r5Ccf0Oiv=}P082?@Lt?GSAZ;&7)=uhe-z9SoSc(7Yj&-$rUStF^=^u1iRLc7Q zbY#1yo%IHUk)e*iY#JN>xf_I|p@<2{`wUX^D?~rEIJKx)KRK}| zC%-r?wWuhyvM5pCB|o_|H#M)MSU)JWAir4OJ+-(bGe0jRG(bNoF*!RmFGW8&zbI8d zH#5B`5hPQrA0MBYmst`YuUAm{i^C>2KczG$)vkyYXbB?_7lRldnHd=wi None: + """Run administrative tasks.""" + env.setdefault(key="DJANGO_SETTINGS_MODULE", value="server.settings.base") + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == "__main__": + main() diff --git a/backend/schema.yml b/backend/schema.yml new file mode 100644 index 0000000..be2b232 --- /dev/null +++ b/backend/schema.yml @@ -0,0 +1,3783 @@ +openapi: 3.0.3 +info: + title: Gestion TUP API + version: 0.1.0 + x-logo: + url: https://www.djangoproject.com /m/img/logos/django-logo-negative.png + backgroundColor: '#FFFFFF' + altText: Django Logo + description: API Endpoint Documentation for Gestion TUP + termsOfService: https://github.com/samuop/GestionTUP/blob/main/README.md + contact: + name: API Support + url: https://github.com/carlosferreyra/GestionTUP + email: eduferreyraok@gmail.com + license: + name: MIT License + url: https://opensource.org/licenses/MIT +paths: + /api/schema/: + get: + operationId: api_schema_retrieve + description: |- + OpenApi3 schema for this API. Format can be selected via content negotiation. + + - YAML: application/vnd.oai.openapi + - JSON: application/vnd.oai.openapi+json + parameters: + - in: query + name: format + schema: + type: string + enum: + - json + - yaml + - in: query + name: lang + schema: + type: string + enum: + - af + - ar + - ar-dz + - ast + - az + - be + - bg + - bn + - br + - bs + - ca + - ckb + - cs + - cy + - da + - de + - dsb + - el + - en + - en-au + - en-gb + - eo + - es + - es-ar + - es-co + - es-mx + - es-ni + - es-ve + - et + - eu + - fa + - fi + - fr + - fy + - ga + - gd + - gl + - he + - hi + - hr + - hsb + - hu + - hy + - ia + - id + - ig + - io + - is + - it + - ja + - ka + - kab + - kk + - km + - kn + - ko + - ky + - lb + - lt + - lv + - mk + - ml + - mn + - mr + - ms + - my + - nb + - ne + - nl + - nn + - os + - pa + - pl + - pt + - pt-br + - ro + - ru + - sk + - sl + - sq + - sr + - sr-latn + - sv + - sw + - ta + - te + - tg + - th + - tk + - tr + - tt + - udm + - ug + - uk + - ur + - uz + - vi + - zh-hans + - zh-hant + tags: + - api + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '200': + content: + application/vnd.oai.openapi: + schema: + type: object + additionalProperties: {} + application/yaml: + schema: + type: object + additionalProperties: {} + application/vnd.oai.openapi+json: + schema: + type: object + additionalProperties: {} + application/json: + schema: + type: object + additionalProperties: {} + description: '' + /api/token/: + post: + operationId: api_token_create + description: |- + Takes a set of user credentials and returns an access and refresh JSON web + token pair to prove the authentication of those credentials. + tags: + - api + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TokenObtainPairRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TokenObtainPairRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TokenObtainPairRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TokenObtainPair' + description: '' + /api/token/refresh/: + post: + operationId: api_token_refresh_create + description: |- + Takes a refresh type JSON web token and returns an access type JSON web + token if the refresh token is valid. + tags: + - api + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TokenRefreshRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TokenRefreshRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TokenRefreshRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TokenRefresh' + description: '' + /api/token/verify/: + post: + operationId: api_token_verify_create + description: |- + Takes a token and indicates if it is valid. This view provides no + information about a token's fitness for a particular use. + tags: + - api + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TokenVerifyRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TokenVerifyRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TokenVerifyRequest' + required: true + responses: + '200': + description: No response body + /core/admin-roles/: + get: + operationId: core_admin_roles_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/AdminRol' + description: '' + post: + operationId: core_admin_roles_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdminRolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AdminRolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AdminRolRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/AdminRol' + description: '' + /core/admin-roles/{id}/: + get: + operationId: core_admin_roles_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this admin rol. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AdminRol' + description: '' + put: + operationId: core_admin_roles_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this admin rol. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdminRolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AdminRolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AdminRolRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AdminRol' + description: '' + patch: + operationId: core_admin_roles_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this admin rol. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedAdminRolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedAdminRolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedAdminRolRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AdminRol' + description: '' + delete: + operationId: core_admin_roles_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this admin rol. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/administradores/: + get: + operationId: core_administradores_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Administrador' + description: '' + post: + operationId: core_administradores_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdministradorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AdministradorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AdministradorRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Administrador' + description: '' + /core/administradores/{id}/: + get: + operationId: core_administradores_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this administrador. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Administrador' + description: '' + put: + operationId: core_administradores_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this administrador. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdministradorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AdministradorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AdministradorRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Administrador' + description: '' + patch: + operationId: core_administradores_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this administrador. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedAdministradorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedAdministradorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedAdministradorRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Administrador' + description: '' + delete: + operationId: core_administradores_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this administrador. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/alumnos/: + get: + operationId: core_alumnos_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Alumno' + description: '' + post: + operationId: core_alumnos_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AlumnoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AlumnoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AlumnoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Alumno' + description: '' + /core/alumnos/{id}/: + get: + operationId: core_alumnos_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this alumno. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Alumno' + description: '' + put: + operationId: core_alumnos_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this alumno. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AlumnoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AlumnoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AlumnoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Alumno' + description: '' + patch: + operationId: core_alumnos_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this alumno. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedAlumnoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedAlumnoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedAlumnoRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Alumno' + description: '' + delete: + operationId: core_alumnos_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this alumno. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/compromisos/: + get: + operationId: core_compromisos_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/CompromisoDePago' + description: '' + post: + operationId: core_compromisos_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CompromisoDePagoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CompromisoDePagoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CompromisoDePagoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/CompromisoDePago' + description: '' + /core/compromisos/{id_comp_pago}/: + get: + operationId: core_compromisos_retrieve + parameters: + - in: path + name: id_comp_pago + schema: + type: integer + description: A unique integer value identifying this compromiso de pago. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CompromisoDePago' + description: '' + put: + operationId: core_compromisos_update + parameters: + - in: path + name: id_comp_pago + schema: + type: integer + description: A unique integer value identifying this compromiso de pago. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CompromisoDePagoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CompromisoDePagoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CompromisoDePagoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CompromisoDePago' + description: '' + patch: + operationId: core_compromisos_partial_update + parameters: + - in: path + name: id_comp_pago + schema: + type: integer + description: A unique integer value identifying this compromiso de pago. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedCompromisoDePagoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedCompromisoDePagoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedCompromisoDePagoRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CompromisoDePago' + description: '' + delete: + operationId: core_compromisos_destroy + parameters: + - in: path + name: id_comp_pago + schema: + type: integer + description: A unique integer value identifying this compromiso de pago. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/cuotas/: + get: + operationId: core_cuotas_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Cuota' + description: '' + post: + operationId: core_cuotas_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CuotaRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CuotaRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CuotaRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Cuota' + description: '' + /core/cuotas/{id_cuota}/: + get: + operationId: core_cuotas_retrieve + parameters: + - in: path + name: id_cuota + schema: + type: integer + description: A unique integer value identifying this cuota. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Cuota' + description: '' + put: + operationId: core_cuotas_update + parameters: + - in: path + name: id_cuota + schema: + type: integer + description: A unique integer value identifying this cuota. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CuotaRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CuotaRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CuotaRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Cuota' + description: '' + patch: + operationId: core_cuotas_partial_update + parameters: + - in: path + name: id_cuota + schema: + type: integer + description: A unique integer value identifying this cuota. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedCuotaRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedCuotaRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedCuotaRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Cuota' + description: '' + delete: + operationId: core_cuotas_destroy + parameters: + - in: path + name: id_cuota + schema: + type: integer + description: A unique integer value identifying this cuota. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/inhabilitaciones/: + get: + operationId: core_inhabilitaciones_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Inhabilitacion' + description: '' + post: + operationId: core_inhabilitaciones_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InhabilitacionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/InhabilitacionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/InhabilitacionRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Inhabilitacion' + description: '' + /core/inhabilitaciones/{id}/: + get: + operationId: core_inhabilitaciones_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this inhabilitacion. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Inhabilitacion' + description: '' + put: + operationId: core_inhabilitaciones_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this inhabilitacion. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InhabilitacionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/InhabilitacionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/InhabilitacionRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Inhabilitacion' + description: '' + patch: + operationId: core_inhabilitaciones_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this inhabilitacion. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedInhabilitacionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedInhabilitacionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedInhabilitacionRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Inhabilitacion' + description: '' + delete: + operationId: core_inhabilitaciones_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this inhabilitacion. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/materia-alumnos/: + get: + operationId: core_materia_alumnos_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/MateriaAlumno' + description: '' + post: + operationId: core_materia_alumnos_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaAlumnoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MateriaAlumnoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MateriaAlumnoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaAlumno' + description: '' + /core/materia-alumnos/{id}/: + get: + operationId: core_materia_alumnos_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this materia alumno. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaAlumno' + description: '' + put: + operationId: core_materia_alumnos_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this materia alumno. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaAlumnoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MateriaAlumnoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MateriaAlumnoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaAlumno' + description: '' + patch: + operationId: core_materia_alumnos_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this materia alumno. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedMateriaAlumnoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedMateriaAlumnoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedMateriaAlumnoRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaAlumno' + description: '' + delete: + operationId: core_materia_alumnos_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this materia alumno. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/materias/: + get: + operationId: core_materias_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Materia' + description: '' + post: + operationId: core_materias_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MateriaRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MateriaRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Materia' + description: '' + /core/materias/{id_materia}/: + get: + operationId: core_materias_retrieve + parameters: + - in: path + name: id_materia + schema: + type: integer + description: A unique integer value identifying this materia. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Materia' + description: '' + put: + operationId: core_materias_update + parameters: + - in: path + name: id_materia + schema: + type: integer + description: A unique integer value identifying this materia. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MateriaRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MateriaRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Materia' + description: '' + patch: + operationId: core_materias_partial_update + parameters: + - in: path + name: id_materia + schema: + type: integer + description: A unique integer value identifying this materia. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedMateriaRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedMateriaRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedMateriaRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Materia' + description: '' + delete: + operationId: core_materias_destroy + parameters: + - in: path + name: id_materia + schema: + type: integer + description: A unique integer value identifying this materia. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/pagos/: + get: + operationId: core_pagos_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Pago' + description: '' + post: + operationId: core_pagos_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PagoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PagoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PagoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Pago' + description: '' + /core/pagos/{id_pago}/: + get: + operationId: core_pagos_retrieve + parameters: + - in: path + name: id_pago + schema: + type: integer + description: A unique integer value identifying this pago. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Pago' + description: '' + put: + operationId: core_pagos_update + parameters: + - in: path + name: id_pago + schema: + type: integer + description: A unique integer value identifying this pago. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PagoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PagoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PagoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Pago' + description: '' + patch: + operationId: core_pagos_partial_update + parameters: + - in: path + name: id_pago + schema: + type: integer + description: A unique integer value identifying this pago. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedPagoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedPagoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedPagoRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Pago' + description: '' + delete: + operationId: core_pagos_destroy + parameters: + - in: path + name: id_pago + schema: + type: integer + description: A unique integer value identifying this pago. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/permisos/: + get: + operationId: core_permisos_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Permisos' + description: '' + post: + operationId: core_permisos_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PermisosRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PermisosRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PermisosRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Permisos' + description: '' + /core/permisos/{id_permiso}/: + get: + operationId: core_permisos_retrieve + parameters: + - in: path + name: id_permiso + schema: + type: integer + description: A unique integer value identifying this permisos. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Permisos' + description: '' + put: + operationId: core_permisos_update + parameters: + - in: path + name: id_permiso + schema: + type: integer + description: A unique integer value identifying this permisos. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PermisosRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PermisosRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PermisosRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Permisos' + description: '' + patch: + operationId: core_permisos_partial_update + parameters: + - in: path + name: id_permiso + schema: + type: integer + description: A unique integer value identifying this permisos. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedPermisosRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedPermisosRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedPermisosRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Permisos' + description: '' + delete: + operationId: core_permisos_destroy + parameters: + - in: path + name: id_permiso + schema: + type: integer + description: A unique integer value identifying this permisos. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/rol-permisos/: + get: + operationId: core_rol_permisos_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/RolPermiso' + description: '' + post: + operationId: core_rol_permisos_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RolPermisoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RolPermisoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RolPermisoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/RolPermiso' + description: '' + /core/rol-permisos/{id}/: + get: + operationId: core_rol_permisos_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this rol permiso. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RolPermiso' + description: '' + put: + operationId: core_rol_permisos_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this rol permiso. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RolPermisoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RolPermisoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RolPermisoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RolPermiso' + description: '' + patch: + operationId: core_rol_permisos_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this rol permiso. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedRolPermisoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedRolPermisoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedRolPermisoRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RolPermiso' + description: '' + delete: + operationId: core_rol_permisos_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this rol permiso. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/roles/: + get: + operationId: core_roles_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Rol' + description: '' + post: + operationId: core_roles_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RolRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Rol' + description: '' + /core/roles/{id_rol}/: + get: + operationId: core_roles_retrieve + parameters: + - in: path + name: id_rol + schema: + type: integer + description: A unique integer value identifying this rol. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Rol' + description: '' + put: + operationId: core_roles_update + parameters: + - in: path + name: id_rol + schema: + type: integer + description: A unique integer value identifying this rol. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RolRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Rol' + description: '' + patch: + operationId: core_roles_partial_update + parameters: + - in: path + name: id_rol + schema: + type: integer + description: A unique integer value identifying this rol. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedRolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedRolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedRolRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Rol' + description: '' + delete: + operationId: core_roles_destroy + parameters: + - in: path + name: id_rol + schema: + type: integer + description: A unique integer value identifying this rol. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/tipo-estados/: + get: + operationId: core_tipo_estados_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TipoEstado' + description: '' + post: + operationId: core_tipo_estados_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TipoEstadoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TipoEstadoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TipoEstadoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoEstado' + description: '' + /core/tipo-estados/{id_tipo_estado}/: + get: + operationId: core_tipo_estados_retrieve + parameters: + - in: path + name: id_tipo_estado + schema: + type: integer + description: A unique integer value identifying this tipo estado. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoEstado' + description: '' + put: + operationId: core_tipo_estados_update + parameters: + - in: path + name: id_tipo_estado + schema: + type: integer + description: A unique integer value identifying this tipo estado. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TipoEstadoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TipoEstadoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TipoEstadoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoEstado' + description: '' + patch: + operationId: core_tipo_estados_partial_update + parameters: + - in: path + name: id_tipo_estado + schema: + type: integer + description: A unique integer value identifying this tipo estado. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedTipoEstadoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedTipoEstadoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedTipoEstadoRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoEstado' + description: '' + delete: + operationId: core_tipo_estados_destroy + parameters: + - in: path + name: id_tipo_estado + schema: + type: integer + description: A unique integer value identifying this tipo estado. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/tipo-inhabilitaciones/: + get: + operationId: core_tipo_inhabilitaciones_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TipoInhabilitacion' + description: '' + post: + operationId: core_tipo_inhabilitaciones_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TipoInhabilitacionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TipoInhabilitacionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TipoInhabilitacionRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoInhabilitacion' + description: '' + /core/tipo-inhabilitaciones/{id_tipo_inhabilitacion}/: + get: + operationId: core_tipo_inhabilitaciones_retrieve + parameters: + - in: path + name: id_tipo_inhabilitacion + schema: + type: integer + description: A unique integer value identifying this tipo inhabilitacion. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoInhabilitacion' + description: '' + put: + operationId: core_tipo_inhabilitaciones_update + parameters: + - in: path + name: id_tipo_inhabilitacion + schema: + type: integer + description: A unique integer value identifying this tipo inhabilitacion. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TipoInhabilitacionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TipoInhabilitacionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TipoInhabilitacionRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoInhabilitacion' + description: '' + patch: + operationId: core_tipo_inhabilitaciones_partial_update + parameters: + - in: path + name: id_tipo_inhabilitacion + schema: + type: integer + description: A unique integer value identifying this tipo inhabilitacion. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedTipoInhabilitacionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedTipoInhabilitacionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedTipoInhabilitacionRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoInhabilitacion' + description: '' + delete: + operationId: core_tipo_inhabilitaciones_destroy + parameters: + - in: path + name: id_tipo_inhabilitacion + schema: + type: integer + description: A unique integer value identifying this tipo inhabilitacion. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /users/login/: + post: + operationId: users_login_create + description: |- + Check the credentials and return the REST Token + if the credentials are valid and authenticated. + Calls Django Auth login method to register User ID + in Django session framework + + Accept the following POST parameters: username, password + Return the REST Framework Token Object's key. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CustomLoginRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CustomLoginRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CustomLoginRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CustomJWTSerializerWithExpiration' + description: '' + /users/logout/: + post: + operationId: users_logout_create + description: |- + Calls Django logout method and delete the Token object + assigned to the current User object. + + Accepts/Returns nothing. + tags: + - users + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RestAuthDetail' + description: '' + /users/password/change/: + post: + operationId: users_password_change_create + description: |- + Calls Django Auth SetPasswordForm save method. + + Accepts the following POST parameters: new_password1, new_password2 + Returns the success/fail message. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordChangeRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PasswordChangeRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PasswordChangeRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RestAuthDetail' + description: '' + /users/password/reset/: + post: + operationId: users_password_reset_create + description: |- + Calls Django Auth PasswordResetForm save method. + + Accepts the following POST parameters: email + Returns the success/fail message. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordResetRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PasswordResetRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PasswordResetRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RestAuthDetail' + description: '' + /users/password/reset/confirm/: + post: + operationId: users_password_reset_confirm_create + description: |- + Password reset e-mail link is confirmed, therefore + this resets the user's password. + + Accepts the following POST parameters: token, uid, + new_password1, new_password2 + Returns the success/fail message. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordResetConfirmRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PasswordResetConfirmRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PasswordResetConfirmRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RestAuthDetail' + description: '' + /users/signup/: + post: + operationId: users_signup_create + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RegisterRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RegisterRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RegisterRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/CustomJWTSerializerWithExpiration' + description: '' + /users/signup/resend-email/: + post: + operationId: users_signup_resend_email_create + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ResendEmailVerificationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ResendEmailVerificationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ResendEmailVerificationRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/RestAuthDetail' + description: '' + /users/signup/verify-email/: + post: + operationId: users_signup_verify_email_create + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VerifyEmailRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VerifyEmailRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VerifyEmailRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RestAuthDetail' + description: '' + /users/token/refresh/: + post: + operationId: users_token_refresh_create + description: |- + Takes a refresh type JSON web token and returns an access type JSON web + token if the refresh token is valid. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TokenRefreshRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TokenRefreshRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TokenRefreshRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TokenRefresh' + description: '' + /users/token/verify/: + post: + operationId: users_token_verify_create + description: |- + Takes a token and indicates if it is valid. This view provides no + information about a token's fitness for a particular use. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TokenVerifyRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TokenVerifyRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TokenVerifyRequest' + required: true + responses: + '200': + description: No response body + /users/user/: + get: + operationId: users_user_retrieve + description: |- + Reads and updates UserModel fields + Accepts GET, PUT, PATCH methods. + + Default accepted fields: username, first_name, last_name + Default display fields: pk, username, email, first_name, last_name + Read-only fields: pk, email + + Returns UserModel fields. + tags: + - users + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserDetails' + description: '' + put: + operationId: users_user_update + description: |- + Reads and updates UserModel fields + Accepts GET, PUT, PATCH methods. + + Default accepted fields: username, first_name, last_name + Default display fields: pk, username, email, first_name, last_name + Read-only fields: pk, email + + Returns UserModel fields. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserDetailsRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/UserDetailsRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/UserDetailsRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserDetails' + description: '' + patch: + operationId: users_user_partial_update + description: |- + Reads and updates UserModel fields + Accepts GET, PUT, PATCH methods. + + Default accepted fields: username, first_name, last_name + Default display fields: pk, username, email, first_name, last_name + Read-only fields: pk, email + + Returns UserModel fields. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedUserDetailsRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedUserDetailsRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedUserDetailsRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserDetails' + description: '' +components: + schemas: + AdminRol: + type: object + properties: + id: + type: integer + readOnly: true + id_admin: + type: integer + id_rol: + type: integer + required: + - id_admin + - id_rol + AdminRolRequest: + type: object + properties: + id_admin: + type: integer + id_rol: + type: integer + required: + - id_admin + - id_rol + Administrador: + type: object + properties: + id: + type: integer + readOnly: true + dni: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + user: + type: integer + required: + - dni + - user + AdministradorRequest: + type: object + properties: + dni: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + user: + type: integer + required: + - dni + - user + Alumno: + type: object + properties: + id: + type: integer + readOnly: true + legajo: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + dni: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + user: + type: integer + estado: + type: integer + required: + - dni + - estado + - legajo + - user + AlumnoRequest: + type: object + properties: + legajo: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + dni: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + user: + type: integer + estado: + type: integer + required: + - dni + - estado + - legajo + - user + CompromisoDePago: + type: object + properties: + id_comp_pago: + type: integer + readOnly: true + perfciclo: + type: string + format: date-time + monto: + type: number + format: double + firmado: + type: boolean + fecha_firmado: + type: string + format: date-time + compromiso: + type: string + maxLength: 255 + alumno: + type: integer + required: + - alumno + - compromiso + - fecha_firmado + - firmado + - monto + - perfciclo + CompromisoDePagoRequest: + type: object + properties: + perfciclo: + type: string + format: date-time + monto: + type: number + format: double + firmado: + type: boolean + fecha_firmado: + type: string + format: date-time + compromiso: + type: string + minLength: 1 + maxLength: 255 + alumno: + type: integer + required: + - alumno + - compromiso + - fecha_firmado + - firmado + - monto + - perfciclo + Cuota: + type: object + properties: + id_cuota: + type: integer + readOnly: true + nro_cuota: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + recargo: + type: number + format: double + monto: + type: number + format: double + firmado: + type: boolean + vencimiento: + type: string + format: date + fecha_pago: + type: string + format: date + fecha_vencimiento: + type: string + format: date + fecha_pago_devengado: + type: string + format: date + fecha_pedido: + type: string + format: date + tipo_puesto: + type: string + maxLength: 255 + required: + - fecha_pago + - fecha_pago_devengado + - fecha_pedido + - fecha_vencimiento + - firmado + - monto + - nro_cuota + - recargo + - tipo_puesto + - vencimiento + CuotaRequest: + type: object + properties: + nro_cuota: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + recargo: + type: number + format: double + monto: + type: number + format: double + firmado: + type: boolean + vencimiento: + type: string + format: date + fecha_pago: + type: string + format: date + fecha_vencimiento: + type: string + format: date + fecha_pago_devengado: + type: string + format: date + fecha_pedido: + type: string + format: date + tipo_puesto: + type: string + minLength: 1 + maxLength: 255 + required: + - fecha_pago + - fecha_pago_devengado + - fecha_pedido + - fecha_vencimiento + - firmado + - monto + - nro_cuota + - recargo + - tipo_puesto + - vencimiento + CustomJWTSerializerWithExpiration: + type: object + description: Serializer for JWT authentication with expiration times. + properties: + access: + type: string + refresh: + type: string + user: + allOf: + - $ref: '#/components/schemas/UserDetails' + readOnly: true + access_expiration: + type: string + format: date-time + refresh_expiration: + type: string + format: date-time + required: + - access + - access_expiration + - refresh + - refresh_expiration + CustomLoginRequest: + type: object + description: |- + Custom login serializer that accepts either an email or a username. + :email_or_username: The email or username of the user. + :password: The password of the user. + :user: The user object. + :return: The validated data from the user serializer. + properties: + email_or_username: + type: string + minLength: 1 + password: + type: string + minLength: 1 + required: + - email_or_username + - password + Inhabilitacion: + type: object + properties: + id: + type: integer + readOnly: true + fecha_desde: + type: string + format: date-time + fecha_hasta: + type: string + format: date-time + descripcion: + type: string + id_alumno: + type: integer + id_tipo_inhabilitacion: + type: integer + required: + - descripcion + - fecha_desde + - fecha_hasta + - id_alumno + - id_tipo_inhabilitacion + InhabilitacionRequest: + type: object + properties: + fecha_desde: + type: string + format: date-time + fecha_hasta: + type: string + format: date-time + descripcion: + type: string + minLength: 1 + id_alumno: + type: integer + id_tipo_inhabilitacion: + type: integer + required: + - descripcion + - fecha_desde + - fecha_hasta + - id_alumno + - id_tipo_inhabilitacion + Materia: + type: object + properties: + id_materia: + type: integer + readOnly: true + nombre: + type: string + maxLength: 255 + cuatrimestre: + type: integer + maximum: 9223372036854775807 + minimum: 0 + format: int64 + required: + - cuatrimestre + - nombre + MateriaAlumno: + type: object + properties: + id: + type: integer + readOnly: true + offrc: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + atendnc: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + id_materia: + type: integer + id_alumno: + type: integer + required: + - atendnc + - id_alumno + - id_materia + - offrc + MateriaAlumnoRequest: + type: object + properties: + offrc: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + atendnc: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + id_materia: + type: integer + id_alumno: + type: integer + required: + - atendnc + - id_alumno + - id_materia + - offrc + MateriaRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + cuatrimestre: + type: integer + maximum: 9223372036854775807 + minimum: 0 + format: int64 + required: + - cuatrimestre + - nombre + Pago: + type: object + properties: + id_pago: + type: integer + readOnly: true + descripcion: + type: string + medio_pago: + type: string + maxLength: 255 + nro_recibo: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + monto: + type: number + format: double + estado: + type: boolean + fecha: + type: string + format: date + comprobante: + type: string + maxLength: 255 + alumno: + type: integer + cuota: + type: integer + required: + - alumno + - comprobante + - cuota + - descripcion + - estado + - fecha + - medio_pago + - monto + - nro_recibo + PagoRequest: + type: object + properties: + descripcion: + type: string + minLength: 1 + medio_pago: + type: string + minLength: 1 + maxLength: 255 + nro_recibo: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + monto: + type: number + format: double + estado: + type: boolean + fecha: + type: string + format: date + comprobante: + type: string + minLength: 1 + maxLength: 255 + alumno: + type: integer + cuota: + type: integer + required: + - alumno + - comprobante + - cuota + - descripcion + - estado + - fecha + - medio_pago + - monto + - nro_recibo + PasswordChangeRequest: + type: object + properties: + new_password1: + type: string + minLength: 1 + maxLength: 128 + new_password2: + type: string + minLength: 1 + maxLength: 128 + required: + - new_password1 + - new_password2 + PasswordResetConfirmRequest: + type: object + description: Serializer for confirming a password reset attempt. + properties: + new_password1: + type: string + minLength: 1 + maxLength: 128 + new_password2: + type: string + minLength: 1 + maxLength: 128 + uid: + type: string + minLength: 1 + token: + type: string + minLength: 1 + required: + - new_password1 + - new_password2 + - token + - uid + PasswordResetRequest: + type: object + description: Serializer for requesting a password reset e-mail. + properties: + email: + type: string + format: email + minLength: 1 + required: + - email + PatchedAdminRolRequest: + type: object + properties: + id_admin: + type: integer + id_rol: + type: integer + PatchedAdministradorRequest: + type: object + properties: + dni: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + user: + type: integer + PatchedAlumnoRequest: + type: object + properties: + legajo: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + dni: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + user: + type: integer + estado: + type: integer + PatchedCompromisoDePagoRequest: + type: object + properties: + perfciclo: + type: string + format: date-time + monto: + type: number + format: double + firmado: + type: boolean + fecha_firmado: + type: string + format: date-time + compromiso: + type: string + minLength: 1 + maxLength: 255 + alumno: + type: integer + PatchedCuotaRequest: + type: object + properties: + nro_cuota: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + recargo: + type: number + format: double + monto: + type: number + format: double + firmado: + type: boolean + vencimiento: + type: string + format: date + fecha_pago: + type: string + format: date + fecha_vencimiento: + type: string + format: date + fecha_pago_devengado: + type: string + format: date + fecha_pedido: + type: string + format: date + tipo_puesto: + type: string + minLength: 1 + maxLength: 255 + PatchedInhabilitacionRequest: + type: object + properties: + fecha_desde: + type: string + format: date-time + fecha_hasta: + type: string + format: date-time + descripcion: + type: string + minLength: 1 + id_alumno: + type: integer + id_tipo_inhabilitacion: + type: integer + PatchedMateriaAlumnoRequest: + type: object + properties: + offrc: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + atendnc: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + id_materia: + type: integer + id_alumno: + type: integer + PatchedMateriaRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + cuatrimestre: + type: integer + maximum: 9223372036854775807 + minimum: 0 + format: int64 + PatchedPagoRequest: + type: object + properties: + descripcion: + type: string + minLength: 1 + medio_pago: + type: string + minLength: 1 + maxLength: 255 + nro_recibo: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + monto: + type: number + format: double + estado: + type: boolean + fecha: + type: string + format: date + comprobante: + type: string + minLength: 1 + maxLength: 255 + alumno: + type: integer + cuota: + type: integer + PatchedPermisosRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + PatchedRolPermisoRequest: + type: object + properties: + id_rol: + type: integer + id_permiso: + type: integer + PatchedRolRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + PatchedTipoEstadoRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + PatchedTipoInhabilitacionRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + PatchedUserDetailsRequest: + type: object + description: User model w/o password + properties: + username: + type: string + minLength: 1 + description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ + only. + pattern: ^[\w.@+-]+$ + maxLength: 150 + first_name: + type: string + maxLength: 150 + last_name: + type: string + maxLength: 150 + Permisos: + type: object + properties: + id_permiso: + type: integer + readOnly: true + nombre: + type: string + maxLength: 255 + descripcion: + type: string + required: + - descripcion + - nombre + PermisosRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + required: + - descripcion + - nombre + RegisterRequest: + type: object + properties: + username: + type: string + minLength: 1 + maxLength: 150 + email: + type: string + format: email + minLength: 1 + password1: + type: string + writeOnly: true + minLength: 1 + password2: + type: string + writeOnly: true + minLength: 1 + required: + - email + - password1 + - password2 + - username + ResendEmailVerificationRequest: + type: object + properties: + email: + type: string + format: email + minLength: 1 + required: + - email + RestAuthDetail: + type: object + properties: + detail: + type: string + readOnly: true + Rol: + type: object + properties: + id_rol: + type: integer + readOnly: true + nombre: + type: string + maxLength: 255 + descripcion: + type: string + required: + - descripcion + - nombre + RolPermiso: + type: object + properties: + id: + type: integer + readOnly: true + id_rol: + type: integer + id_permiso: + type: integer + required: + - id_permiso + - id_rol + RolPermisoRequest: + type: object + properties: + id_rol: + type: integer + id_permiso: + type: integer + required: + - id_permiso + - id_rol + RolRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + required: + - descripcion + - nombre + TipoEstado: + type: object + properties: + id_tipo_estado: + type: integer + readOnly: true + nombre: + type: string + maxLength: 255 + descripcion: + type: string + required: + - descripcion + - nombre + TipoEstadoRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + required: + - descripcion + - nombre + TipoInhabilitacion: + type: object + properties: + id_tipo_inhabilitacion: + type: integer + readOnly: true + nombre: + type: string + maxLength: 255 + descripcion: + type: string + required: + - descripcion + - nombre + TipoInhabilitacionRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + required: + - descripcion + - nombre + TokenObtainPair: + type: object + properties: + access: + type: string + readOnly: true + refresh: + type: string + readOnly: true + TokenObtainPairRequest: + type: object + properties: + username: + type: string + writeOnly: true + minLength: 1 + password: + type: string + writeOnly: true + minLength: 1 + required: + - password + - username + TokenRefresh: + type: object + properties: + access: + type: string + readOnly: true + refresh: + type: string + required: + - refresh + TokenRefreshRequest: + type: object + properties: + refresh: + type: string + minLength: 1 + required: + - refresh + TokenVerifyRequest: + type: object + properties: + token: + type: string + writeOnly: true + minLength: 1 + required: + - token + UserDetails: + type: object + description: User model w/o password + properties: + pk: + type: integer + readOnly: true + title: ID + username: + type: string + description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ + only. + pattern: ^[\w.@+-]+$ + maxLength: 150 + email: + type: string + format: email + readOnly: true + title: Email address + first_name: + type: string + maxLength: 150 + last_name: + type: string + maxLength: 150 + required: + - username + UserDetailsRequest: + type: object + description: User model w/o password + properties: + username: + type: string + minLength: 1 + description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ + only. + pattern: ^[\w.@+-]+$ + maxLength: 150 + first_name: + type: string + maxLength: 150 + last_name: + type: string + maxLength: 150 + required: + - username + VerifyEmailRequest: + type: object + properties: + key: + type: string + writeOnly: true + minLength: 1 + required: + - key + securitySchemes: + jwtCookieAuth: + type: apiKey + in: cookie + name: access_token + jwtHeaderAuth: + type: http + scheme: bearer + bearerFormat: JWT +x-logo: x-logo +servers: +- url: '{protocol}://{host}{port}/' + description: Development server + variables: + protocol: + description: Protocol (http only for now) + default: https + enum: + - http + - https + host: + description: Hostname (FQDN) + default: gestiontup-42tx6kvt3q-uc.a.run.app + enum: + - gestiontup-42tx6kvt3q-uc.a.run.app + - 127.0.0.1 + port: + description: server port + default: '' + enum: + - '' + - :8000 +tags: +- name: api + description: API endpoint access, operations and schema. + externalDocs: + description: API Schema Formatting - OpenAPI 3.0.3 + url: https://spec.openapis.org/oas/v3.0.3#schema +- name: users + description: User operations, including login, logout, signup, and + password reset. + externalDocs: + description: 'Included auth Library: dj-rest-auth' + url: https://dj-rest-auth.readthedocs.io/en/latest/ +- name: core + description: Core operations, including CRUD operations for the main + models. +externalDocs: + description: Click here for Swagger UI Specification Docs + url: https://swagger.io/specification/ diff --git a/backend/server/__init__.py b/backend/server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/server/__pycache__/__init__.cpython-312.pyc b/backend/server/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39cb5fa5b6c8d8015ba8d4db5aae5284b3e6e4fb GIT binary patch literal 172 zcmX@j%ge<81lyL+O9Ro5K?FMZ%mNgd&QQsq$>_I|p@<2{`wUX^%UeIRIJKx)KRK}| zC%-r?wWuhyvM5pCB|o_|H#M)MSU)JWAir4OJ+-(bGe0jRG(bNoF*!RmFGU}ytt_=j sKR!M)FS8^*Uaz3?7l%!5eoARhs$CH)&}>E^E(S3^GBYwV7BK@^03C%b2LJ#7 literal 0 HcmV?d00001 diff --git a/backend/server/__pycache__/urls.cpython-312.pyc b/backend/server/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01f2f99705ddec03cf44c57c8bd41a396837cd7b GIT binary patch literal 1858 zcmb7F&2Jk;6rZ)%Uhn!VPSXTR1xuUMF-g3DR6tfp1x=GwpbCWqAz!xZ-LbP_znIx= z8%sz5A(10FB?lz9R>_6`fIAnEduUdQK;pzLA#mx5H{*4%3P>=LXJ+5L_nY7Q8h>9b zDhS30AAa4Q%^>s(`xuN|vN>B65ZXiQ$U;qI30BGx+*C6quzlJ|yJA!1d(p|b*=E+2 zniBucI5}5t$^uFuELmBYvzBxKSZo}m`YS)n@iX}!&lG-^fBLMGZYnsBFvP^8cU8xxp-TKH#8d?ks)oLL&&Ky@U0nhM*C$xD zJpgn2uz`aOiUAon6cxrs7zVVVX_jx&y0vL|9e;40>AM>CwCnYkwa^c2lWI&^gX^iL z+kBIwWi#33`*x(;FvXp`fn`!a03%Yq|O-+=&S(N z|6#-Q>ju>s$aL)~Mz=lFi7eaeKoIzS%r%zaL40oWz^Fh4(!+G|bWLq1p=|WS)lWyA z1$;m<(VgW%`Oj=yj^EKBfP}DgVQmSj;GxiJ}rU#ApKB|d#x@AU$-ZwfO zOy(k6TLM%$z|agH_Cmt2Kq3+RafE3|8J7BFSzG5WnFeuu+Qx+7En;Ykz8Se-MYUBN z_*7d43ux4}_4l-vVSa=?OY8S5?~r=1^&~g%7;eil7DxqvufmU(VA@7st^6?c+ILfr zF0X8(GmxOT07UikmbslLwK&5=11z%v!EO7&o!VF|={oeQuE+VLL|A1J7L|A; zkEY~MHzYLncdg-=X)2Xdt&WK%WL&?Np0tM*1nwivH1KM5{1->g2ciX3!g0%} zp>$MOd0ctncS)3$Qw7OIu(`h1*lq0H*uBxqT|FsEW7*RZlArsg`Y89(X;~VZIYm-t O=F@jhWF(Gqm;MAsj1FJ` literal 0 HcmV?d00001 diff --git a/backend/server/__pycache__/wsgi.cpython-312.pyc b/backend/server/__pycache__/wsgi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a52c3fde63c34361f7e32b8ccf219efa031104f5 GIT binary patch literal 663 zcmYjPL2DC16rS0QP1)EW()K)vmw@iXgBKA&NV`Nd6_X(3vYG6>O*Wm~S!On=>8&Th zKj5u*=}+-eQ55#1NDtnW+B%1&!-!mcDNC07)FcM2X6Yx;L z90Zv&6|G7Mi-D8jkfo`J0+vNG84k_7eFG9p1tdxgUc4$0nV8{`CSfGtf#CqoB+F9$ zgie8cq1EXocl#n_ErC^~LZOLF(DA4o` zm~B%Jbg{Bt|1}-4;1Ci{OLi-XZo0VKd|EF4nW~$)<}V@LG{;{XWBkvm;>z+a!p;SH k^b=X{ofGE=+WCTZ&UfAO=KeS2{i@&lTEBl%Q@2gif3aG{5dZ)H literal 0 HcmV?d00001 diff --git a/backend/server/asgi.py b/backend/server/asgi.py new file mode 100644 index 0000000..78e9f62 --- /dev/null +++ b/backend/server/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for server project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings.base") + +application = get_asgi_application() diff --git a/backend/server/db.sqlite3 b/backend/server/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..85d6c7e7c8971e021d8cc8d66e6fcb5dbdd29cce GIT binary patch literal 356352 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 literal 0 HcmV?d00001 diff --git a/backend/server/settings/__pycache__/dev.cpython-312.pyc b/backend/server/settings/__pycache__/dev.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7c24599cb097c2f49ba75e4028ac594ba9e4f91 GIT binary patch literal 1863 zcma)7&1)M+6rWw~YFE-qvMtMz;*U6AP2Co$NoxvC8c?j2Eh0-sT9I@qENjhJmb0rh zyK6U=2{=$_a!XEWiXlF>r2k1T0aFk|4~Ei1ZZbXua_Spd3Q6gqBlPCYo8SAr_vUMV zk4D1?+J*04tnm^;f3d-^MFz^r&m2O}P#s}}ISc8m=Pl0Wb)G{wfCVdH3%X#7x@ZUW zpe^Z=E$gx!(nEGw58DwvVk^30NA;*3(_?mAk8_Aegnu~*04$AQ#8Q*j$4G*V zr(u>Pv3!H|5)L)FP81%z*m6ZsY2EgMms!ti0q;2YQ-} zL%b+sfb7u5m;ZrJWAV4x(4${{9FO2pJhso{#GoGsJ&7mq8JyY=;50r9T>m$pG@cx? z<0(9iXYjfGAf5%r^Y{Y3*yMpv#FzF1Ee>Da7xl>Y%V zO+#}Ejpypxl2NazRb#o5S4&jBm8+>nzF4JWd9{$Mmox()6{Ap8OL-bAmTOwBR8sRs zZe^uL!^_2dzNFsCRaF|Qs`$x?Yrlh2b9uq+MWX?2+V;7@rK!MI_?!l^f7}3s60%l zPftUzl$&PL^vRsqUkR_}v}p>rJag3|Mt_eWX@iwRT#ts|73#U4u+*f%%-j^^9S=hG zZ-*OTbHb|W5w~Abkfi`GAaZ3ULQJry(Pgiot1tnt4{~En#F-cYK^3?pYB_JzO1avS zJHzZ_%r01Pc4)x!T^ctGv)%45E);JV?sy-tY5MC_*l=2HcY+yY+q_5M{CQL=RTdZF zmi&rNU;@3ZWb2Tnmu;A?<#=nb#bn1dvw5enWs|n=WvgV<@v@7=^I>hY`bw6qJZa-B zxWU5uzOb1`Wjt(~f5l zr~D8-iYNAzBU#xKkEX8tGWlw9elPmSf3om+=Mc^Jf{2SB35lL4B=}<_aQt4ZrywrU z73O;ZJ`Oe>Y+8bQgd8+($_h9>QB(oBUsc*WeE8WSdZu-J;R2l{6*l4gfi$bGd hIVikJecDY_I|p@<2{`wUX^%S%7BIJKx)KRK}| zC%-r?wWuhyvM5pCB|o_|H#M)MSU)JWAir4OJ+-(bGe0jRG(bNoF*!RmFGar;tS>%3 pGcU6wK3=b&@)w6qZhlH>PO4oIE6`|0AT9tvZwB1d)P8CtjhdiFOCNG9)+x2P0?lFd%G%cls_<5LAp zThTR=Vdf;X)___etgJ)4R^X*mX3hMmWcNGpR-b@$p-DDOnOHxlxmjDrg~kFXFBfV0 z&@-i5>pc9wwQ^R+lMd-%5&15?Fbr<()Lr1#|!O{Fx_9zlYsqwBL#3n50)uX@4ymEUYVVJjZcEkFvdfuPB5qi=y8b zaRrOg8t>G~g;(sSS4VS6C?&ykKN(!VA?HE%;xG?Og}mghu~13p6oBbk3Dx7`$P{{qJV#*F{~ literal 0 HcmV?d00001 diff --git a/backend/users/__pycache__/apps.cpython-312.pyc b/backend/users/__pycache__/apps.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eca9c691a671a30fd82a9ad1d1e2d4bce27e0a27 GIT binary patch literal 729 zcmY*Xzi$&U6t?f2G+bJ>w1NQyIw6)Il$+SvN`he ztxQOah(Cn|i3M&#Vqyb@E}eMxr3gGczxVupeBbl?xV9D`I1i5Ar9+I+cWYdp)>2vA z1LX{H6eEtgm*c4ydl-4>0CE2%;zW2K{3bT`XRTg){x&$CWG0*{UgaW8lq^{$O;}Ex zk!IscvocdMOqF)tp%L1ItSI_H@VE@QNHZy#gcJAnNJ&UL36q=|b3c4B$&yJ3EwnI& zk|rBLA6pE1x$>DD|6e%FWH@-r%EMLB?P|8(8scr+R+Bc=H*C}OE zs?tr`KnAg~@6p1tyx5N%$S7etS0)u&iV#zZh zdE{_K@K>f^%(Pt+C+r@XYam{sujIzJ+dH4g^*8=!vh$_8c{^ literal 0 HcmV?d00001 diff --git a/backend/users/__pycache__/backends.cpython-312.pyc b/backend/users/__pycache__/backends.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..674a1a29d76c2d6497ee52a7c0edf07643aebfe1 GIT binary patch literal 2396 zcmb_d%}?A$6d&9B2@AW4k=V3|P7_dB3GL>PL=;t(sE9~EvPqM0$o60vdmskydYSQd z7eu8f;*dX}5KtL*RK{|9XBVMaZwnL{Bm#x}O2DK}=#wHmOTBNkUq-<+@T+d|I&+^<*t65t%S) zD?C<9$z+C@iFINonX;t>;#ztoRZ9PcOiA+k7nrNH1mjxWF_{gL+;t>A(v2n7FoBmo zH^Te;j~p`H5g;}QBQ?n+HQAJEikUK%b*Yvx6D&C|o5}S=Ewv(-(%#!w>$+v%;Im+- zq1Rd5!s_om6rRbZ&hlyzKi2pL9AHm|pAmrgJ0jRoh#sd8`~ zXKsr({3}|*b?Q`a!NG=W8MV`O z4t2PH0t1SS>Xu+)l2#q?)?iJvBq&Fz8K_i^L@b$5Z_*2I_l2L!EOC!E7o$8MNeEet z@DP)^>4;gAA4ywMz@3oFk#rSwBl@f4T5_>3I(z(GQz8v6uO)Aj73D(QtIV-xM2!#* z7`zLbG4Fj$M;gKRSg%bw%3acyN(uc7aJUESk57mJ&X!wDxRdk_R61m+Gq=bLH%MYk z7fXf(2$UlZOB2>;-p31Wym7V(&}uu}49-Rzbxt|5)Yka|6nM%sEiA5X(zq-;;T*yprw*d74fp{}HA0yA;rpOE6>6vk z?OTYFqG=ZE=!OfjK0i5;pb8zDodx&&=JV1)s)eV(Xy6DrFE{NlQFYv_9ZR_0;B{y{ zt7)?veoe$Jztx!O^&9t?v7|+jlu}+oFniuhheh-56|-#EEiq#mmLIpRJCa zGLFh|P3#ZBVYyEZ&Ze`)J#}bT9obe#cGaNUpHkJG|XH{7q-4ckG!u`0&$bdG+OCo)pgQ=0~^lqc4b*Ek0KV_wvQv{Kf73 z#Yk|Vz{V>v2xcE#naYvJId$ra^7!4exL%fE_0kxjW|>BONZ??>5#Rk1mJRY>hRK?A zJVI`h6OE6BdF?rBX!)q2mDO)w@8;0epvgX-{)hJZ7o7ql70@UCkDid5OVv_>k=6w~|2`~$oSgCoa=xE=qK-XPFFna! zdg%ioj))Kd=-7jI&Xe!d3FSv=LMh2r?9_~=;mpu9uSdgwcFRUOr)kSA-41usnr1qN zrtu=Wu2>D14*~T9>B36 vf(Sq4?*WTHH-Q?EAxYXN<$ZE_pA7$!d+TX#=zjJvF)9@|$Nwbo@$dKx7Jqf# literal 0 HcmV?d00001 diff --git a/backend/users/__pycache__/models.cpython-312.pyc b/backend/users/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14a05a6821261e47f537900abd1fb2a8dbf21d72 GIT binary patch literal 2800 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 literal 0 HcmV?d00001 diff --git a/backend/users/__pycache__/tests.cpython-312.pyc b/backend/users/__pycache__/tests.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81b6007f54654a5b5aedbe7eaa7c8afd05f5ffe9 GIT binary patch literal 5245 zcmcIoOKcm*8J^`!D~hBW*^>3J<+0t$rXEyfG&!j0!%b`>Kq>^O+`_t0tKFfw%5s;T zSxTni072mb?WyQVc3U7pP7dT_4n`lq5M1f*kGC3IAn*&8v`)z`d>`K)XwB{HMi&5RNUCp!wb(wIf zt_db+#o^SgGWteCxK8c5U>s*NtCR)NgWZ&~I%k5}uAmy#r4VhPlxa&nTD@+Wy5^dW zUCO@YLbq-;3@{Y4={j_iakJ8t5;|vcI&~_bQtH|=-Krd8x9UuHnL#zz<>q<=l+0x{ zLARJ?QMezXRC5DOuz1^nwW1ABvsGm_)ok!;Q?pEiLfc>zCe^vKX&TIcWnT_WEoCWO zD-f(VAXfCE+pM$V62-WzV@GJ6>Xs%VC3L+>-`vpbn+~Y^IdiLyA$(nex!3DU^cT#f zjk;W+)WPgclRI_|!iutfMC_Zr5iUt@aDEwsRPL?`{0ZJBJu0yKRX}KtQWJ#|V}aL; zhxAL_mPN%=(NhfNmx|w!jdq>xZ(YBIjVrIci*VZ}jI1hvfrO!~CXI}dybC)Y?kTvZ z;hu(jrkN-Xc*Bvtz?AkGq5%Dl!sNd#x%0sx69Rn*0;CuM$PGj6%R(2t0|NsthfqG; z$C_=>byn3jO~4jx>i)`6_qT%&)ch@D1WoM63HAk1e@U#MiXOaR$2Z3eYQfj^4RO<} z=B2QMDqb8vD7CC3W`b(~ek9?4?`>$di5v8jjQ~1f4bD`pS%4(Wvb^CvcgC*Um#V6F^eAsfh(VY`K#-~(F z4qNmP18}|^GUlbw-m^Tmp=mFNkAam>(w>S(2I}_G(pOIn2EA-#*c%M(EEkg;_k}m$ ztZ%>>EW9BO@PO zXsgpLb-FV$*%?0D89CoMdAc)t>hTa6yzrD{2D5uGpY*^77bfA80=T>!d>$rtx`2FN zxkEM(ko&GX%7(hH3m%Q+P8XsIIaE$&hP|?e@*HxxUKxDaCwJ`N4Dj=ngS|#7SYL3L z{vJO#6XZ`E?0pWY(Ice#`#N@nRG&BDP6je}l)$feTqNy%9;dw(*pMuunZ!^Yk@nyXAv z2Cl7CmgrT@5-beCJdk`@H0q2au=|c`x@&F%hpzAji?|swAyCw<3rs8*s*rgiD+@^c zfs(_zBdis05Ut?3;uEr;-r}p^gYd?S3eUrhBbxXSG|R<;GtG&YjVClx!9Uq{OfC9OfEi} z{MqkP9W~ch$6D&xy%Qf!+@JWUysN$%?>lq<%!BD&bur#Ib${x?=&t&G==;O5-yge| zYLCsf#%3QZKN|btuKId>>goHZchw8Ap7!`mYkX!`oehOQEZi@|=ltdPy_G+Ye{}U< z>MTDA?)Q*0lBOi*kKxBQl4O@?;W512E{PKIFog80gG6rLD}1{31n`mbeS&Lfsl&`z02`S2%b08fCY1R>#8{(Zw|rik%XD3rl=t zF(~2Ypa!QhRpU)rK{;J=qkat^Dwef;tmFfeKT1$h zbsClt>Xwdy!5-K52O=k~o$^8@l$-(~y$$W{hfrpn=`kihlcZx@i?24awt4F}&#%As}1gtrSw z9hbuNP_iM%Y+<>W_Hyy%df8|jL}bbF+zGRYtcjM(+@TfyIBR z@5~!uK&(LX0eL(@3d8OER4YIA>C6}TsYm%AJtpd4;qNE^lN)X4rdqkFc5bGXo9T?7 z>5NWy#xHax&vqs#WPJJACnS?Ee4U2rU!%-d*gO-+{@dTXoKF5DoxWTcC?>oNXKsVr z%kb4eEz7LCT=uf%vj3?Je&@<%JQVQsg{OgX*>Lo7nPbwz&trqR=qE(-mt=8{nTKqU z(gaStOTJ1RORIb5PNcJYb7SebCqEcT7km+%y%g3YtPizeOG_XFTns(q@d6|PAZB5R+ZG#b3{4&Uo!P1^D9Lu+#7pJ@Gdp{4?wM^ A?*IS* literal 0 HcmV?d00001 diff --git a/backend/users/__pycache__/urls.cpython-312.pyc b/backend/users/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90c4e8d17919c207bd298be96771af8a7957330f GIT binary patch literal 472 zcmYk2zfZzI6vywbS6Y4)#Kc4wM?)8?JJH4HW{i<&SV-+1rPv?jt{q@=)4#yY-QeKl zKjA`xgLE|xZWv5Vn7kGh-th9?ect!|xMxkv0bx(?cdc~@z+001nerP<&qZ(x2q4e} z9&A7lH4p>{P)LyQh)4sWO^o0Nc_7W>lxI?|{Bw1|ZPbu@Sv~iWlJuYMb;&W+Zf~a6ynsY5-DO45Hu*$e6K*0w2){D` zZhfji&R(zHoDJ71BTauSzTmwvR$tZfSS<}#wnysDt5*3^u$-C5N(o)%SwS@T0W5rn Ad;kCd literal 0 HcmV?d00001 diff --git a/backend/users/__pycache__/views.cpython-312.pyc b/backend/users/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31d12a34ff21d4172576710e30df514670e53f11 GIT binary patch literal 263 zcmX@j%ge<81geQWX$e63F^B^LOi;#W86aaiLkdF*V-73Mzkb*yQG?l;)(`6@k3T2*kzQ VK;i>4BO~Ko2IYGU3Pl`1J^&x`M}GhS literal 0 HcmV?d00001 diff --git a/backend/users/admin.py b/backend/users/admin.py new file mode 100644 index 0000000..e6c5b4e --- /dev/null +++ b/backend/users/admin.py @@ -0,0 +1,16 @@ +# users/admin.py +""" +This module is responsible for registering the CustomUser model in the Django admin site. + +It imports the CustomUser model from the users.models module \ + and registers it using the admin.site.register() function. + +Example usage: + admin.site.register(CustomUser) +""" +from django.contrib import admin +from users.models import CustomUser + +# Register your models here. + +admin.site.register(model_or_iterable=CustomUser) diff --git a/backend/users/apps.py b/backend/users/apps.py new file mode 100644 index 0000000..7e529ba --- /dev/null +++ b/backend/users/apps.py @@ -0,0 +1,14 @@ +""" +This module contains the configuration for the Users app. + +It defines the `UsersConfig` class, which is responsible for configuring the Users app in Django. +""" + +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + """Users app config""" + + default_auto_field: str = "django.db.models.BigAutoField" + name = "users" diff --git a/backend/users/backends.py b/backend/users/backends.py new file mode 100644 index 0000000..2fa030a --- /dev/null +++ b/backend/users/backends.py @@ -0,0 +1,63 @@ +# users/backends.py + +""" +This module contains a custom authentication backend that allows users to\ + authenticate using either their email or username. +""" + +from django.contrib.auth import get_user_model +from django.contrib.auth.backends import ModelBackend +from django.contrib.auth.models import AbstractUser +from django.db.models import Q + +UserModel: type[AbstractUser] = get_user_model() + + +class EmailOrUsernameModelBackend(ModelBackend): + """ + A custom authentication backend that allows users to authenticate using either\ + their email or username. + + :param ModelBackend: A class that extends the default Django ModelBackend. + :return: A custom authentication backend. + :raises: No exceptions raised. + """ + + def authenticate( + self, request, username=None, password=None, **kwargs + ) -> None | AbstractUser: + """ + Authenticates a user based on their email or username. + + :param request: The request object. + :param username: The username or email of the user. + :param password: The password of the user. + :param kwargs: Additional keyword arguments. + :return: The user object if the username and password are correct, otherwise None. + :raises: No exceptions raised. + """ + try: + user: AbstractUser = UserModel.objects.get( + Q(username__iexact=username) | Q(email__iexact=username) + ) + except UserModel.DoesNotExist: + return None + except UserModel.MultipleObjectsReturned: + return None + + if password is not None and user.check_password(raw_password=password): + return user + return None + + def get_user(self, user_id: int) -> AbstractUser | None: + """ + Retrieves a user object based on the user ID. + + :param user_id: The ID of the user. + :return: The user object if the user exists, otherwise None. + :raises: No exceptions raised. + """ + try: + return UserModel.objects.get(pk=user_id) + except UserModel.DoesNotExist: + return None diff --git a/backend/users/migrations/0001_initial.py b/backend/users/migrations/0001_initial.py new file mode 100644 index 0000000..0f848d5 --- /dev/null +++ b/backend/users/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 5.0.6 on 2024-07-08 21:24 + +import django.contrib.auth.models +import django.contrib.auth.validators +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='CustomUser', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/backend/users/migrations/0002_alter_customuser_email.py b/backend/users/migrations/0002_alter_customuser_email.py new file mode 100644 index 0000000..c663140 --- /dev/null +++ b/backend/users/migrations/0002_alter_customuser_email.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.7 on 2024-07-10 02:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='customuser', + name='email', + field=models.EmailField(max_length=254, unique=True, verbose_name='email address'), + ), + ] diff --git a/backend/users/migrations/0003_alter_customuser_options.py b/backend/users/migrations/0003_alter_customuser_options.py new file mode 100644 index 0000000..7f733b4 --- /dev/null +++ b/backend/users/migrations/0003_alter_customuser_options.py @@ -0,0 +1,17 @@ +# Generated by Django 5.0.7 on 2024-07-23 07:11 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0002_alter_customuser_email'), + ] + + operations = [ + migrations.AlterModelOptions( + name='customuser', + options={'ordering': ['-date_joined']}, + ), + ] diff --git a/backend/users/migrations/__init__.py b/backend/users/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/users/migrations/__pycache__/0001_initial.cpython-312.pyc b/backend/users/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..720c9013c98a1bbed5fd16968f397dcdcb493696 GIT binary patch literal 3631 zcmb7HO>7&-72Y3`A}LBHy zm!4T#7K;KdkVB6?H7Zavz6FJK@TpLHsgD7AS)u|cOb!julWz*_qCgHs-^`MdT+sn4 zz&rD1zIpG>_kKA3TUS?7g1|Pyt=$59tPM7b4x#i$W*@fatsWdk zM{F4#MaPhgQ!9N3wXI~^tmWFQ4INy2)?6ydsAr@1Su7O6_v3H%M+Q$$Z1nB(z5jc$ z**CBQ0(c@zt+EM74wUG)fh`50~>+RCmSatM}K(lNmW$1B-xP0Teh&#NrD z~HE6Yh33tABcM4OxY(M}Fu` zoLl15u~^l$A5?KIeYvb>YY1XnyObfz7 zHIHaTyo!mgeT03!@{We=lI_EVT%>(i&nW${L8nu0_*HS`5 zGX^XHDuEpPA+F)JI$Kev5MKvrOIY*6B!vKL;YnSacPVzT)yxvxr9K2i^NJe$vSFX+ zfN5D?)rIJ=Sa^ta0%zD*@oX2Pnh>;5$Sb6m6D2r`m55iZ(3&|1w+rXtl|(8oVaIbz zkfENg?dAuhW(oTTQWSo0U8pUb$ClF5FHAACK47^(Z&v5 zLUI#&Cx4v9jj(GOENK|##i6 zC-xHQ;At_y6&{~=Z430zH`~NQs|H!}8ZVzvLA2`I4wQ`#25O#*nd*A0?9gq~U7Pdx zH-vR^Eg*6NSkeRD!>8FFrB`4}`tDwV18BiAiQ~~Cv;(|G%)*psRm&K1x-g3?9xY5` z%E_FYzgt)`t@}VqK?JF=_t-0p!HHLwt*e+~zO!3*mT8-o|>gBLc3U(5xcpshh1q>I~`!C+|O z>9NMpM15#tbACsXekz*^3>9TkeJx2Ruc{zqrqusYz8u`3!DS!zt|&7cvY_7M!;)I$ zgRj=qfAe87@@+T>X*!gqBSM-DrP)xrA4>NlK)tV)BcO$25$?jzkhnlyA~`;5Mw9s0H- zatt@Q;qbXGfJ~`BhAkPkt?pd@W`FA)S34J0-`SBpd1BdV2U@ J5(q-ge*uK9>dOEC literal 0 HcmV?d00001 diff --git a/backend/users/migrations/__pycache__/0002_alter_customuser_email.cpython-312.pyc b/backend/users/migrations/__pycache__/0002_alter_customuser_email.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f94bdc913a5beeee8df27d50bd9ce375052ce2b4 GIT binary patch literal 805 zcmY*X&ubGw6n?Y2*=CnSY7qQc5mSV{bgOujLP0Hv7LoRngTp5Cnr^y3(wVFnPYOMF z?5#I%qGHeDpCEV&2n}=f)LS4Gp$Bnhnh>4Co9}z`-kbNnneWxA4{Ck+@NVlp0r;uO zbd@GxyrRGXFkmEslr%_cH7o)atO2w3fZ0eo?lft(f40wX!|ppl=~$D%l71SudDM&Z zOh`A)8787N%K`8vWXu#e0E7l%(6AV3lZI^pIvvySzbT;FVEWAMocrIe8FN^PxrcMp zb`Hx^q$-yCUf@gb$+RccV5tzug{&+uFW;td7Wd*Pk$$TXy*$-NvV>_AC&zzO?TuGe zLvBQjaTFr3)qK%Qnqb!MZA-Vv;@tvea@MU?1R%@}quW0wKG#3P7!Aa#GJ7y`!Mi!Ktqbn!$0HxS>u>#|^1`6JFuYhFp1(A# z)%R~5)#`&<{iFDL_gns>_WWed@%)kP*4#Ib_?2nR^}vxH>qJ>QUt&!og&F_s*2_A~ u#9meCw0!SO&lSF)sQT?7t|>FJ2_e5-Ai;@SA@06^G`~2QU;G7%nC!n0^whTi literal 0 HcmV?d00001 diff --git a/backend/users/migrations/__pycache__/0003_alter_customuser_options.cpython-312.pyc b/backend/users/migrations/__pycache__/0003_alter_customuser_options.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ee4c782eee8fc668856ab9215c80e0d6f76257e GIT binary patch literal 699 zcmZWnF>ljA6nN}n9j@{0J^0#M99ZNYQ zi9)Jdy_!FcfK#yl>uT(Gcl?rv)H zt$pKv?NcG$axBb0sEn(D+|=d(CNB7E6WeOJAD&MF@b7&JPQCVt*FIamb9UqI*Y5G^ z+Hq_B!m<5eVmmAD$7kaDtj|uzRz4d_I|p@<2{`wUX^D^x$UIJKx)KRK}| zC%-r?wWuhyvM5pCB|o_|H#M)MSU)JWAir4OJ+-(bGe0jRG(bNoF*!RmFGar;tS>h+ yy(keRRjeN$pP83g5+AQuQ2C3)CO1E&G$+-rh!toHBM=vZ7$2D#85xV1fh+( str: + """ + Returns the username of the user. + + Returns: + str: The username of the user. + """ + return str(object=self.username) + + class Meta: + """ + Meta class for the CustomUser model. + + Attributes: + ordering (list[str]): The ordering of the CustomUser model. + """ + + ordering: list[str] = ["-date_joined"] diff --git a/backend/users/permissions.py b/backend/users/permissions.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/users/serializers.py b/backend/users/serializers.py new file mode 100644 index 0000000..e7bc62c --- /dev/null +++ b/backend/users/serializers.py @@ -0,0 +1,84 @@ +""" +Serializer for user login. + +This module contains the `CustomLoginSerializer` class, which is used to \ + validate and authenticate user login credentials. + +Raises: + serializers.ValidationError: If the provided credentials are invalid. + +Returns: + dict: A dictionary containing the validated user login data. +""" + +from typing import Any + +from django.contrib.auth import authenticate +from django.contrib.auth.models import AbstractUser +from django.utils.translation import gettext_lazy as _ +from rest_framework import serializers + + +class CustomLoginSerializer(serializers.Serializer): + """ + Serializer for user login. + + This serializer is used to validate and authenticate user login credentials. + + Args: + serializers.Serializer: The base serializer class. + def update(self, instance, validated_data) -> None: + pass + + Raises: + serializers.ValidationError: If the provided credentials are invalid. + + Returns: + dict: A dictionary containing the validated user login data. + """ + + email_or_username = serializers.CharField(required=True) + password = serializers.CharField(style={"input_type": "password"}) + user: AbstractUser | None = None + + def validate(self, attrs) -> Any: + """ + Validate the user login credentials. + + This method checks if the provided email/username and password are valid. + If the credentials are valid, it returns a dictionary containing the validated data. + Otherwise, it raises a `serializers.ValidationError` with an appropriate error message. + + Args: + attrs (dict): A dictionary containing the user login data. + + Raises: + serializers.ValidationError: If the provided credentials are invalid. + + Returns: + dict: A dictionary containing the validated user login data. + """ + email_or_username: str = attrs.get("email_or_username") + password: str = attrs.get("password") + + if email_or_username and password: + user: AbstractUser | None = authenticate( + request=self.context["request"], + username=email_or_username, + password=password, + ) + if not user: + msg = _("Unable to log in with provided credentials.") + raise serializers.ValidationError(detail=msg, code="authorization") + else: + msg: str = _('Must include "email_or_username" and "password".') + raise serializers.ValidationError(detail=msg, code="authorization") + + attrs["user"] = user + return attrs + + def create(self, validated_data) -> Any: + return super().create(validated_data=validated_data) + + +# """ diff --git a/backend/users/tests.py b/backend/users/tests.py new file mode 100644 index 0000000..a1a1cda --- /dev/null +++ b/backend/users/tests.py @@ -0,0 +1,110 @@ +""" +This module contains test cases for the CustomUser model. + +The CustomUser model represents a custom user in the application. +It includes test cases to verify the creation of a user with the expected attributes, +as well as test cases to verify that a user is not created when an invalid value is provided. + +Attributes: + TestCase (type): The base test case class provided by Django. + +Methods: + setUp: Set up the test environment by creating a custom user. + test_user_created: Test case to verify the creation of a user. + test_user_not_created: Test case to verify that a user \ + is not created when an invalid value is provided. +""" + +from django.test import TestCase + +from .models import CustomUser + + +class CustomUserTestCase(TestCase): + """ + Test case class for testing the CustomUser model. + + This test case class is used to test the creation and behavior of the CustomUser model. + It includes test cases to verify the creation of a user with the expected attributes, + as well as test cases to verify that a user is not created when an invalid value is provided. + + Attributes: + TestCase (type): The base test case class provided by Django. + + Methods: + setUp: Set up the test environment by creating a custom user. + test_user_created: Test case to verify the creation of a user. + test_user_not_created: Test case to verify that a user \ + is not created when an invalid value is provided. + """ + + def setUp(self) -> None: + """ + Set up the test environment by creating a custom user. + + This method is called before each test case to prepare the necessary resources + and set up the initial state for the tests. + + The custom user created has the following attributes: + - username: "test" + - email: "test@test.com" + - password: "testpassword" + - first_name: "test" + - last_name: "test" + """ + CustomUser.objects.create_user( + username="test", + email="test@test.com", + password="testpassword", + first_name="test", + last_name="test", + ) + + def test_user_created(self) -> None: + """ + Test case to verify the creation of a user. + + This test case checks if a user is created with the expected attributes: + - Username: "test" + - Email: "test@test.com" + - First Name: "test" + - Last Name: "test" + - Password: "testpassword" + - is_staff: False + - is_superuser: False + - is_active: True + + It also verifies that the string representation of the user is "test". + """ + user: CustomUser = CustomUser.objects.get(username="test") + self.assertEqual(user.email, "test@test.com") + self.assertEqual(user.first_name, "test") + self.assertEqual(user.last_name, "test") + self.assertTrue(user.check_password("testpassword")) + self.assertFalse(user.is_staff) + self.assertFalse(user.is_superuser) + self.assertTrue(user.is_active) + self.assertEqual(str(user), "test") + + def test_user_not_created(self) -> None: + """ + Test case to verify that a user is not created when an invalid value is provided. + + This test case verifies that when an invalid value is provided for creating a user, + a `ValueError` exception is raised. In this case, we are trying to create a user + with an invalid password. The `create_user` method of the `CustomUser` model should + raise a `ValueError` when an invalid password is provided. + + This test uses the `assertRaises` context manager to assert that a `ValueError` + exception is raised when the `create_user` method\ + is called with the provided invalid values. + """ + with self.assertRaises(expected_exception=ValueError) as context: + + CustomUser.objects.create_user( + username="test", + email="test2@test.com", + password="testpassword", + first_name="test", + last_name="test", + ) diff --git a/backend/users/urls.py b/backend/users/urls.py new file mode 100644 index 0000000..25a7ae9 --- /dev/null +++ b/backend/users/urls.py @@ -0,0 +1,23 @@ +# users/urls.py +""" +This module defines the URL patterns for the users app. + +The urlpatterns list contains the URL patterns for the users app. It includes the base URLs for authentication and registration using the dj_rest_auth library. + +URL Patterns: +- "" (empty string): Includes the URLs for authentication using dj_rest_auth. +- "signup/": Includes the URLs for registration using dj_rest_auth.registration. + +Note: This module is imported and used in the project's main URL configuration file. +""" +from django.urls import URLResolver, include, path + +# base urls +urlpatterns: list[URLResolver] = [ + path("", include("dj_rest_auth.urls"), name="dj_rest_auth"), + path( + "signup/", + include("dj_rest_auth.registration.urls"), + name="dj_rest_auth_registration", + ), +] diff --git a/backend/users/views.py b/backend/users/views.py new file mode 100644 index 0000000..60f00ef --- /dev/null +++ b/backend/users/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/docs/.obsidian/app.json b/docs/.obsidian/app.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/docs/.obsidian/app.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/docs/.obsidian/appearance.json b/docs/.obsidian/appearance.json new file mode 100644 index 0000000..c8c365d --- /dev/null +++ b/docs/.obsidian/appearance.json @@ -0,0 +1,3 @@ +{ + "accentColor": "" +} \ No newline at end of file diff --git a/docs/.obsidian/core-plugins-migration.json b/docs/.obsidian/core-plugins-migration.json new file mode 100644 index 0000000..436f43c --- /dev/null +++ b/docs/.obsidian/core-plugins-migration.json @@ -0,0 +1,30 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "properties": false, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false +} \ No newline at end of file diff --git a/docs/.obsidian/core-plugins.json b/docs/.obsidian/core-plugins.json new file mode 100644 index 0000000..9405bfd --- /dev/null +++ b/docs/.obsidian/core-plugins.json @@ -0,0 +1,20 @@ +[ + "file-explorer", + "global-search", + "switcher", + "graph", + "backlink", + "canvas", + "outgoing-link", + "tag-pane", + "page-preview", + "daily-notes", + "templates", + "note-composer", + "command-palette", + "editor-status", + "bookmarks", + "outline", + "word-count", + "file-recovery" +] \ No newline at end of file diff --git a/docs/.obsidian/workspace.json b/docs/.obsidian/workspace.json new file mode 100644 index 0000000..56db47c --- /dev/null +++ b/docs/.obsidian/workspace.json @@ -0,0 +1,156 @@ +{ + "main": { + "id": "cfc817c7621d9047", + "type": "split", + "children": [ + { + "id": "6b5e76cf78e87084", + "type": "tabs", + "children": [ + { + "id": "357f742c6017d7c8", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "Notas de Clase/2024-06-26.md", + "mode": "source", + "source": false + } + } + } + ] + } + ], + "direction": "vertical" + }, + "left": { + "id": "c6b56d59718c2d43", + "type": "split", + "children": [ + { + "id": "6e0867b6a0304fa2", + "type": "tabs", + "children": [ + { + "id": "ee39f44e1e12fa62", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical" + } + } + }, + { + "id": "ec0775a8ac47dadf", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + }, + { + "id": "9bebc34f800618d3", + "type": "leaf", + "state": { + "type": "bookmarks", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 300 + }, + "right": { + "id": "e13c3cc95bdfc273", + "type": "split", + "children": [ + { + "id": "40a17265e57f0791", + "type": "tabs", + "children": [ + { + "id": "273941cf3bab30f9", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "Notas de Clase/2024-06-26.md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "2041cd56565be4c9", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "file": "Notas de Clase/2024-06-26.md", + "linksCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "0b2f80a73eeb40e0", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": true + } + } + }, + { + "id": "2b0f2f75b620fd97", + "type": "leaf", + "state": { + "type": "outline", + "state": { + "file": "Notas de Clase/2024-06-26.md" + } + } + } + ] + } + ], + "direction": "horizontal", + "width": 300, + "collapsed": true + }, + "left-ribbon": { + "hiddenItems": { + "switcher:Abrir selector rápido": false, + "graph:Abrir vista gráfica": false, + "canvas:Crear nuevo lienzo": false, + "daily-notes:Abrir la nota de hoy": false, + "templates:Insertar plantilla": false, + "command-palette:Abrir paleta de comandos": false + } + }, + "active": "357f742c6017d7c8", + "lastOpenFiles": [ + "Notas de Clase/2024-06-12.md", + "Notas de Clase/2024-06-26.md", + "Notas de Clase/2024-05-22.md", + "notas/Resumen de Informes.md" + ] +} \ No newline at end of file diff --git a/docs/Notas de Clase/2024-05-22.md b/docs/Notas de Clase/2024-05-22.md new file mode 100644 index 0000000..7f1c5fa --- /dev/null +++ b/docs/Notas de Clase/2024-05-22.md @@ -0,0 +1,42 @@ +| +# Devolucion + +### Vista de Coordinadora / Administradora + +- Mes de marzo seria conveniente mostrar lo de **matricula** +- Revisar **opción** de procesar los datos de sysadmin. +- Revisar **opción** procesar datos de SYSACAD. + +### Inscripciones Y Nuevos Alumnos +- Ver el tema de las inscripciones, si la lista incluye a los alumnos viejos o nuevos, o todos. +- ¿Como manejan a los alumnos que hacen el seminario? ¿De donde vienen? + + +##### Tema de los correos/envios de mensaje +- La profe lo ve mas como bandeja de entrada que sistema de mensajería. +- La profe quiere que esa parte sea mas como un "mini outlook" xD. que también se pueda adjuntar cosas +- Quiere que esa vista de mensajes sirva exclusivamente para **seleccionar** **usuarios** y enviar mensajes en cantidades +- También poder tener una visualización **general** de quienes lo leyeron y demás. +- **Ver** si tambien se puede enviar mensajes a los profesores, o entre profesores. + + + + +### Diagrama DER + +- Ver lo de `idpago`, hay que ver como relacionarlo con el alumno que paga. +- Hacer el modelo de tablas + +--- + +### Propuestas + +- Al momento de seleccionar los destinatarios de enviar sea un **filtro de usuarios de acuerdo a su estado**, si "Cursa una sola materia" +- Que la administradora pueda seleccionar a los alumnos que cursen tal materia, los que tienen o no tienen deuda... etc. + +## Para la Clase que viene + +- Terminar modelo dinámico de prototipo para la semana que viene, no necesariamente hay que tener todo terminado. +- Hacer la vista de alumnos. +- Definir como será la mensajería +- Tener Listo el modelo de tablas (un mockup al menos) diff --git a/docs/Notas de Clase/2024-06-12.md b/docs/Notas de Clase/2024-06-12.md new file mode 100644 index 0000000..eee37e0 --- /dev/null +++ b/docs/Notas de Clase/2024-06-12.md @@ -0,0 +1,89 @@ + +# Segunda entrevista con la Ing Laclau + +--- + + +## ¿Qué es prórroga? + +la prorroga es un pedido que el alumno puede hacer una vez que regularice la materia para que pueda rendir. segun el certificado analitico que tenga y la fecha de cuando regularizo la materia se le otorgara o no la prorroga que dura un año + +## La mora va a ser por día sobre la adeudado o del 10 al 15 un precio después otro? + + +## Existiendo la mora, en qué momento se inhabilita? + + + +## ¿Qué es la baja?, explicar bien como va a ser  + + + +## ¿Que se considera que un alumno no está vinculado? + + + +## Aclarar el tema del excel de los alumnos del seminario + + + +--- + +# Revision de nuestra presentacion + +## Vista de Administradora - Dashboard +- Revisar el tema de titulos de cada pantalla +- Compromiso de pago podria hacerlo por cuatrimestre... +- +### Cuando seleccione por alumno +- Agregar un cuarto estado -> "*pagado parcialmente*" +- colocar fechas de pago e importe + +- ufff prefiere mensajes (**tipo correo**) + +## Vista Alumno + +- agregar una funcionalidad para que el alumno pueda informar la "**suspencion**" + +--- +# Otras Notas + + +> **Importante:** cliente desea que se vea el listado de alumnos en la pantalla de inicio. segun ella es con lo que trabaja diariamente. + +##### Cuestiones del otro grupo +## Vista de Administradora - Dashboard + +cuando la coordina busque por alumno que se le pueda mostrar la vista que ve el alumno +(*ojo no es la misma, debe ser similar*) + +#### Tema de la mora +- Los alumnos estan inhabilitados indefinidamente hasta que paguen. +- no es baja fisica, es una baja logica / queda suspendido. +- no se les cobra mora es y se los inhabilita +#### Total de alumnos inhabilitados +- Cliente quiere que esos totales se muestren por ciclo lectivo +- Ese total se debe mostrar de todo el ciclo lectivo +- Tener en cuenta que se toma el listado de alumnos inscripto desde el SYSACAD + - En consecuencia con ese modelo de totales, el SYSACAD probablemente tendria mas alumnos que los que se muestran por el sistema poruqe la cliente se maneja con la lista de alumnos del SYSACAD + + +### Pantalla de Reportes + +- **Extra**: cliente desea que el alumno le informe su legajo y asi poder ver la situacion actual del alumno + + +### Pantalla de Configuracion + - Cliente desea que la planilla de pagos se puedan cargar cada semana + - Dicha planilla al momento de subirla se omitiran los movimientos desactualizados + - Y solamente se mostrarar los movimientos de la semana actual + +- Desea tener un registro cuatrimestral del valor historico de valores de **cuotas** y **moras** de cada cuatrimestre + +## Vista desde el Alumno + +- desea que pueda ver ordenado por fechas de ultimos vencimientos. +- Desea una funcionalidad que pueda pagar todo el cuatrimestre. **Aclarar que esto no es necesario** (*descuento como incentivo*) +- Destacar el nombre del alumno y lo que debe en funcion a la fecha actual +- Quiere que se pueda visualizar la fecha actual. + diff --git a/docs/Notas de Clase/2024-06-26.md b/docs/Notas de Clase/2024-06-26.md new file mode 100644 index 0000000..0203fc8 --- /dev/null +++ b/docs/Notas de Clase/2024-06-26.md @@ -0,0 +1,20 @@ + +Anoté lo que pude pq llegue tarde. + +### Modelo Conceptual + +- En lo posible armar un *diccionario de datos*, para una mejor corrección de la carpeta +- Para cada atributo **Anteponer** a que corresponde la entidad. +- En definitiva quiere que demos nombres significativos que permitan agrupar en cosas en comun para dar significado par que sea mas entendible. + +> Profesoras analizaban la posibilidad de implementar una funcionalidad de poder inscribir a los aspirantes y convertirlos a alumnos. Pero para un futuro... + + +---- +#### Parte Grupo 2 +- Tener en cuenta que la tabla `comunica` entre **coord/auxi** y **alumno** se debe *descomponer* en al menos dos tablas mas por tema de relaciones de claves + +--- +#### Semana que Viene +- **Entregar la carpeta** +- En lo posible las profes quieren que se entregue antes \ No newline at end of file diff --git a/docs/notas/Resumen de Informes.md b/docs/notas/Resumen de Informes.md new file mode 100644 index 0000000..2c14543 --- /dev/null +++ b/docs/notas/Resumen de Informes.md @@ -0,0 +1,22 @@ + + +**Reportes:** +- Necesitamos informes sobre quiénes están **inhabilitados**, quiénes **pidieron una baja temporal**, **prórroga** o **equivalencia**. +- Debemos **guardar la documentación relacionada con prórrogas y equivalencias**. +- Queremos ver resúmenes mensuales y de matrícula, así como listas de alumnos morosos y quiénes pagan cuotas completa o reducida. +- Para cada alumno, queremos saber cuándo ingresó, qué tipo de cuota paga, si firmó su compromiso de pago, si está habilitado o no, su historial de pagos y cuánto debe. + +**Pagos:** +- Las cuotas mensuales son de $25,000 con diferentes períodos de pago. +- Se propone que podamos cambiar el valor de la cuota para cada período. +- Los alumnos que no paguen serán inhabilitados después del mes actual, con un aviso 24 horas antes. +- Las deudas de años anteriores se pagarán con la cuota actualizada. +- Ofrecemos un descuento para quienes paguen el cuatrimestre completo, con la opción de cambiar el monto. + +**Detalles adicionales:** +- Hablamos sobre cómo gestionar las bajas temporales, las prórrogas y equivalencias, y cómo guardar los compromisos de pago firmados. +- No podemos inhabilitar automáticamente en otros sistemas, pero tenemos una solución alternativa. +- Proponemos recordatorios automáticos para los pagos y un botón de pago cuatrimestral bonificado. +- Podemos buscar alumnos por número de legajo o DNI, y ajustar el procedimiento para cuotas reducidas. + +Esta versión destaca los puntos principales de manera más sencilla y clara. \ No newline at end of file diff --git a/mysql_schema.pdf b/mysql_schema.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7ea3b91461e84671b2615d0b33e22a91682940c4 GIT binary patch literal 39536 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