diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 00000000..c5500558
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,7 @@
+Dockerfile
+.dockerignore
+node_modules
+npm-debug.log
+README.md
+.next
+.git
diff --git a/.env.example b/.env.example
deleted file mode 100644
index 955321e9..00000000
--- a/.env.example
+++ /dev/null
@@ -1,3 +0,0 @@
-# Do not share your OpenAI API key with anyone! It should remain a secret.
-OPENAI_API_KEY=YOUR_API_KEY
-OPENAI_API_ENDPOINT=[OPTIONAL]YOUR_API_ENDPOINT
diff --git a/.env.nodb b/.env.nodb
new file mode 100644
index 00000000..9223a87a
--- /dev/null
+++ b/.env.nodb
@@ -0,0 +1,3 @@
+# see process.d.ts
+OPENAI_API_KEY=xxx
+NEXT_PUBLIC_USE_DATABASE=false
\ No newline at end of file
diff --git a/.env.usedb b/.env.usedb
new file mode 100644
index 00000000..37735cdf
--- /dev/null
+++ b/.env.usedb
@@ -0,0 +1,5 @@
+# see process.d.ts
+OPENAI_API_KEY=xxx
+NEXT_PUBLIC_USE_DATABASE=true
+DATABASE_URL="postgresql://postgres:postgres@localhost:5432/sqlchat?schema=sqlchat&application_name=sqlchat"
+DATABASE_DIRECT_URL="postgresql://postgres:postgres@localhost:5432/sqlchat?schema=sqlchat&application_name=sqlchat"
\ No newline at end of file
diff --git a/.eslintrc.json b/.eslintrc.json
index eaeae599..d08b99f5 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,5 +1,5 @@
{
- "extends": "next/core-web-vitals",
+ "extends": ["next/core-web-vitals", "plugin:prettier/recommended"],
"rules": {
"import/no-anonymous-default-export": "off",
"@next/next/no-img-element": "off",
diff --git a/.github/workflows/build-and-push-latest-image.yml b/.github/workflows/build-and-push-latest-image.yml
new file mode 100644
index 00000000..a20d9371
--- /dev/null
+++ b/.github/workflows/build-and-push-latest-image.yml
@@ -0,0 +1,88 @@
+name: build-and-push-latest-image
+
+on:
+ push:
+ branches: [main]
+
+jobs:
+ build-and-push-latest-image:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v2
+
+ - name: Login to DockerHub
+ uses: docker/login-action@v2
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Set up Docker Buildx
+ id: buildx
+ uses: docker/setup-buildx-action@v2
+ with:
+ install: true
+ version: v0.9.1
+
+ - name: Docker meta
+ id: meta
+ uses: docker/metadata-action@v4
+ with:
+ images: |
+ sqlchat/sqlchat
+ flavor: |
+ latest=false
+ tags: |
+ type=raw,value=latest
+
+ - name: Build and Push
+ id: docker_build
+ uses: docker/build-push-action@v3
+ with:
+ context: ./
+ file: ./Dockerfile
+ platforms: linux/amd64
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+
+ - name: Docker meta for website
+ id: meta-website
+ uses: docker/metadata-action@v4
+ with:
+ images: |
+ sqlchat/sqlchat
+ flavor: |
+ latest=false
+ tags: |
+ type=raw,value=website-latest
+
+ - name: Build and Push Website Image
+ id: docker_build_website
+ uses: docker/build-push-action@v3
+ with:
+ context: ./
+ file: ./Dockerfile.sqlchat-ai
+ platforms: linux/amd64
+ push: true
+ tags: ${{ steps.meta-website.outputs.tags }}
+ labels: ${{ steps.meta-website.outputs.labels }}
+
+ - name: Authenticate to Google Cloud
+ uses: google-github-actions/auth@v1
+ with:
+ credentials_json: ${{ secrets.GCP_SERVICE_ACCOUNT_KEY }}
+
+ - name: Get GKE credentials
+ uses: google-github-actions/get-gke-credentials@v1
+ with:
+ cluster_name: ${{ secrets.GKE_CLUSTER_NAME }}
+ location: ${{ secrets.GKE_CLUSTER_LOCATION }}
+
+ - name: Restart deployment
+ run: kubectl rollout restart deployment/sqlchat --namespace website
diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml
new file mode 100644
index 00000000..e8e8b28e
--- /dev/null
+++ b/.github/workflows/pr-checks.yml
@@ -0,0 +1,28 @@
+name: PR Checks
+
+on:
+ pull_request:
+ branches: [main]
+
+jobs:
+ lint-and-build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: 18
+
+ - name: Install pnpm
+ run: npm install -g pnpm
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Run lint
+ run: pnpm lint
+
+ - name: Run build
+ run: pnpm build
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 00000000..2af2c51a
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "printWidth": 140,
+ "useTabs": false,
+ "semi": true,
+ "singleQuote": false
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000..4e35d4da
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,34 @@
+{
+ "i18n-ally.localesPaths": ["src/locales"],
+ "[javascript]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.formatOnSave": true,
+ "editor.formatOnSaveMode": "file"
+ },
+ "[typescript]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.formatOnSave": true,
+ "editor.formatOnSaveMode": "file"
+ },
+ "[json]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.formatOnSave": true,
+ "editor.formatOnSaveMode": "file"
+ },
+ "[jsonc]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.formatOnSave": true,
+ "editor.formatOnSaveMode": "file"
+ },
+ "[typescriptreact]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.formatOnSave": true,
+ "editor.formatOnSaveMode": "file"
+ },
+ "[yaml]": {
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.formatOnSave": true,
+ "editor.formatOnSaveMode": "file"
+ },
+ "i18n-ally.keystyle": "nested"
+}
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 00000000..a0f996fa
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,23 @@
+# SQL Chat - Development Guide
+
+## Build/Run Commands
+- Development: `pnpm dev` (or `pnpm nodb` without DB, `pnpm usedb` with DB)
+- Build: `pnpm build`
+- Production: `pnpm start`
+- Lint: `pnpm lint`
+- Database: `pnpm prisma migrate dev` (setup), `pnpm prisma db seed` (seed)
+
+## Code Style Guidelines
+- **Formatting**: 140 char width, double quotes, semicolons (Prettier)
+- **TypeScript**: Strict types, interfaces for structure, generics when appropriate
+- **Components**: Functional components with hooks, PascalCase naming
+- **Imports**: External libs first, followed by internal modules with @/ alias
+- **Naming**: PascalCase for components/interfaces, camelCase for variables/functions
+- **Functions**: Descriptive verb-noun naming (handleClick, fetchData)
+- **Error Handling**: try/catch blocks with toast notifications for user-facing errors
+- **File Structure**: Feature-based organization in /components, /types, /store
+
+## State Management
+- Zustand for global state
+- React hooks for component state
+- TypeScript types for state shape
\ No newline at end of file
diff --git a/CODEOWNERS b/CODEOWNERS
new file mode 100644
index 00000000..58e2ffb2
--- /dev/null
+++ b/CODEOWNERS
@@ -0,0 +1,2 @@
+# Default
+* @tianzhou @boojack
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..ed910424
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,45 @@
+FROM node:18-alpine AS base
+
+# Install dependencies only when needed
+FROM base AS deps
+# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
+RUN apk add --no-cache libc6-compat openssl openssl-dev
+WORKDIR /app
+
+COPY package.json pnpm-lock.yaml* ./
+RUN yarn global add pnpm && pnpm i --frozen-lockfile
+
+# Rebuild the source code only when needed
+FROM base AS builder
+WORKDIR /app
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+
+RUN yarn run build
+
+# Production image, copy all the files and run next
+FROM base AS runner
+WORKDIR /app
+
+ENV NODE_ENV production
+
+# Install OpenSSL for Prisma in production
+RUN apk add --no-cache openssl
+
+RUN addgroup --system --gid 1001 nodejs
+RUN adduser --system --uid 1001 nextjs
+
+COPY --from=builder /app/public ./public
+
+# Automatically leverage output traces to reduce image size
+# https://nextjs.org/docs/advanced-features/output-file-tracing
+COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
+COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
+
+USER nextjs
+
+EXPOSE 3000
+
+ENV PORT 3000
+
+CMD ["node", "server.js"]
diff --git a/Dockerfile.sqlchat-ai b/Dockerfile.sqlchat-ai
new file mode 100644
index 00000000..dd7bc61d
--- /dev/null
+++ b/Dockerfile.sqlchat-ai
@@ -0,0 +1,52 @@
+# This is the dockerfile to run www.sqlchat.ai, in particular it injects the NEXT_PUBLIC_ vars at
+# BUILD time
+FROM node:18-alpine AS base
+
+# Install dependencies only when needed
+FROM base AS deps
+# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
+RUN apk add --no-cache libc6-compat
+WORKDIR /app
+
+COPY package.json pnpm-lock.yaml* ./
+RUN yarn global add pnpm && pnpm i --frozen-lockfile
+
+# Rebuild the source code only when needed
+FROM base AS builder
+WORKDIR /app
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+
+# Need to inject NEXT_PUBLIC at build time
+# https://github.com/vercel/next.js/issues/51575
+ENV NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_1_MONTH_SUBSCRIPTION price_1O2clpAeLQYhEB73FPWr7JjV
+ENV NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_3_MONTH_SUBSCRIPTION price_1NAE2hAeLQYhEB73FoF8WJPS
+ENV NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_1_YEAR_SUBSCRIPTION price_1N96riAeLQYhEB73YPSL8GuV
+ENV NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY pk_live_JoPlkGsFcm2iHvy5a4JR5tia00vVXVJM8d
+ENV NEXT_PUBLIC_ALLOW_SELF_OPENAI_KEY true
+
+RUN yarn run build
+
+# Production image, copy all the files and run next
+FROM base AS runner
+WORKDIR /app
+
+ENV NODE_ENV production
+
+RUN addgroup --system --gid 1001 nodejs
+RUN adduser --system --uid 1001 nextjs
+
+COPY --from=builder /app/public ./public
+
+# Automatically leverage output traces to reduce image size
+# https://nextjs.org/docs/advanced-features/output-file-tracing
+COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
+COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
+
+USER nextjs
+
+EXPOSE 3000
+
+ENV PORT 3000
+
+CMD ["node", "server.js"]
diff --git a/LICENSE b/LICENSE
index 64a1f8e6..e96e9ea1 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,68 +1,21 @@
-Business Source License 1.1
-
-Terms
-
-The Licensor hereby grants you the right to copy, modify, create derivative
-works, redistribute, and make non-production use of the Licensed Work. The
-Licensor may make an Additional Use Grant, above, permitting limited
-production use.
-
-Effective on the Change Date, or the fourth anniversary of the first publicly
-available distribution of a specific version of the Licensed Work under this
-License, whichever comes first, the Licensor hereby grants you rights under
-the terms of the Change License, and the rights granted in the paragraph
-above terminate.
-
-If your use of the Licensed Work does not comply with the requirements
-currently in effect as described in this License, you must purchase a
-commercial license from the Licensor, its affiliated entities, or authorized
-resellers, or you must refrain from using the Licensed Work.
-
-All copies of the original and modified Licensed Work, and derivative works
-of the Licensed Work, are subject to this License. This License applies
-separately for each version of the Licensed Work and the Change Date may vary
-for each version of the Licensed Work released by Licensor.
-
-You must conspicuously display this License on each original or modified copy
-of the Licensed Work. If you receive the Licensed Work in original or
-modified form from a third party, the terms and conditions set forth in this
-License apply to your use of that work.
-
-Any use of the Licensed Work in violation of this License will automatically
-terminate your rights under this License for the current and all other
-versions of the Licensed Work.
-
-This License does not grant you any right in any trademark or logo of
-Licensor or its affiliates (provided that you may use a trademark or logo of
-Licensor as expressly required by this License).
-
-TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
-AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
-EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
-TITLE.
-
-MariaDB hereby grants you permission to use this License’s text to license
-your works, and to refer to it using the trademark “Business Source License”,
-as long as you comply with the Covenants of Licensor below.
-
-Covenants of Licensor
-
-In consideration of the right to use this License’s text and the “Business
-Source License” name and trademark, Licensor covenants to MariaDB, and to all
-other recipients of the licensed work to be provided by Licensor:
-
-1. To specify as the Change License the GPL Version 2.0 or any later version,
- or a license that is compatible with GPL Version 2.0 or a later version,
- where “compatible” means that software provided under the Change License can
- be included in a program with software provided under GPL Version 2.0 or a
- later version. Licensor may specify additional Change Licenses without
- limitation.
-
-2. To either: (a) specify an additional grant of rights to use that does not
- impose any additional restriction on the right granted in this License, as
- the Additional Use Grant; or (b) insert the text “None”.
-
-3. To specify a Change Date.
-
-4. Not to modify this License in any other way.
+MIT License
+
+Copyright (c) 2025 Bytebase
+
+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.es-ES.md b/README.es-ES.md
new file mode 100644
index 00000000..ddf14e48
--- /dev/null
+++ b/README.es-ES.md
@@ -0,0 +1,199 @@
+
+
+
+
+## ¿Que es?
+
+SQL Chat es un cliente SQL basado en chat, que utiliza lenguaje natural para comunicarse con la base de datos y realizar operaciones como consultas, modificaciones, adiciones y eliminaciones de datos en la base de datos.
+
+
+
+
+
+
+
+## ¿Por que?
+
+A medida que entramos en la [Era de las Herramientas de Desarrollo 2.0](https://www.sequoiacap.com/article/ai-powered-developer-tools/),
+existe una gran oportunidad para reconstruir las herramientas existentes utilizando una interfaz basada en chat. El cliente SQL
+no es una excepción. En lugar de navegar a través de varias interfaces de usuario, una interfaz basada en chat es
+más intuitiva. Por supuesto, solo si funciona, y nuestro objetivo es ofrecer esa experiencia.
+
+## ¿Como?
+
+SQL Chat esta construido en [Next.js](https://nextjs.org/), admite las siguientes bases de datos y agregará más con el tiempo:
+
+- MySQL
+- PostgreSQL
+- MSSQL
+- TiDB Cloud
+- OceanBase
+
+## Privacidad de la Data
+
+Vea la [Política de Privacidad de SQL Chat](https://sqlchat.ai/privacy).
+
+## IP Whitelisting
+
+Si usas [sqlchat.ai](https://sqlchat.ai) para conectarte a tu base de datos, debes agregar 0.0.0.0 (permitir todas las conexiones) a la IP de la lista blanca de la base de datos. Porque sqlchat.AI está alojado en
+[Vercel](https://vercel.com/) el cual [usa IP dinámica](https://vercel.com/guides/how-to-allowlist-deployment-ip-address). Si esto le preocupa, considere la opción de hospedaje propio a continuación.
+
+## Hospedaje propio con Docker
+
+```bash
+docker run --name sqlchat --platform linux/amd64 -env NEXTAUTH_SECRET=xxx -p 3000:3000 sqlchat/sqlchat
+```
+
+### Variables relacionadas con OpenAI:
+
+- `NEXT_PUBLIC_ALLOW_SELF_OPENAI_KEY`: Establezca en "verdadero" para permitir a los usuarios traer su propia clave API de OpenAI.
+
+- `OPENAI_API_KEY`: Clave API de OpenAI. Puedes conseguir una [aquí](https://beta.openai.com/docs/developer-quickstart/api-keys).
+
+- `OPENAI_API_ENDPOINT`: Endpoint de la API de OpenAI. El predeterminado es `https://api.openai.com`.
+
+### Variables relacionadas con la base de datos:
+
+- `NEXT_PUBLIC_USE_DATABASE`: Establézcalo en `false` para iniciar SQL Chat en modo sin base de datos. Esto
+ desactivara las siguientes funciones:
+ 1. Sistema de cuentas.
+ 2. Ejecución de Cuota por Usuario.
+ 3. Pago.
+ 4. Recopilación de datos de uso.
+- `DATABASE_URL`: Aplicable si `NEXT_PUBLIC_USE_DATABASE` es `true`. Cadena de conexión de Postgres para almacenar datos. ej. `postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat`.
+
+```bash
+docker run --name sqlchat --platform linux/amd64 --env NEXTAUTH_SECRET=xxx --env OPENAI_API_KEY=yyy --env OPENAI_API_ENDPOINT=zzz -p 3000:3000 sqlchat/sqlchat
+```
+
+## Desarrollo Local
+
+1. Instala las dependencias
+
+ ```bash
+ pnpm i
+ ```
+
+1. Haga una copia del archivo de variables de entorno de ejemplo:
+
+ ```bash
+ cp .env.usedb .env
+ ```
+
+1. Generar el cliente prisma a partir del modelo.
+
+ ```bash
+ pnpm prisma generate
+ ```
+
+1. Añade tu [clave de API](https://platform.openai.com/account/api-keys) y el endpoint del API de OpenAI(opcional) al recién creado archivo `.env`.
+
+### Configura la base de datos
+
+**Puede omitir esta sección con `NEXT_PUBLIC_USE_DATABASE=false` si no crea funciones que requieren una base de datos**
+
+1. Inicie una instancia de Postgres. Para mac, puedes usar [StackbBricks](https://stackbricks.app/), [DBngin](https://dbngin.com/) o [Postgres.app](https://postgresapp.com/).
+
+1. Crea una base de datos:
+
+ ```sql
+ CREATE DATABASE sqlchat;
+ ```
+
+ En el archivo `.env`, asigna la cadena de conexión a la variable de entorno `DATABASE_URL` y `DATABASE_DIRECT_URL`. [Este articulo](https://www.prisma.io/docs/data-platform/data-proxy/prisma-cli-with-data-proxy#set-a-direct-database-connection-url-in-your-prisma-schema) explica por qué necesitamos dos URL.
+
+1. Migrar esquema
+
+ ```bash
+ pnpm prisma migrate dev
+ ```
+
+1. (Opcional) Seed data
+
+ ```bash
+ pnpm prisma db seed
+ ```
+
+## Historial de Estrellas
+
+[](https://star-history.com/#sqlchat/sqlchat&Date)
+
+## Comunidad
+
+[](https://twitter.com/Bytebase)
+
+
+
+## Patrocinadores
+
+
+
+
+
+
+
+## Licencia
+
+Este proyecto está bajo la Licencia BSL. Consulte el archivo [LICENSE](LICENSE) para obtener el texto completo de la licencia.
+
+## FAQ
+
+¿Cómo Hospedar mi propio SQL Chat?
+
+
+- Puede implementar SQL Chat en Vercel con un solo clic
+
+
+
+- Puede implementar su SQL Chat con docker en segundos
+
+ ```bash
+ docker run --name sqlchat --platform linux/amd64 -p 3000:3000 sqlchat/sqlchat
+ ```
+
+
+
+
+¿Cómo usar mi clave API de OpenAI?
+
+
+- Puede configurar la `OPENAI_API_KEY` como una variable de entorno.
+
+ ```bash
+ docker run --name sqlchat --platform linux/amd64 --env OPENAI_API_KEY=xxx -p 3000:3000 sqlchat/sqlchat
+ ```
+
+- Puede configurar la `OPENAI_API_KEY` en el cuadro de diálogo de la configuración.
+
+
+
+
+¿Siempre dice que tengo un problema de conexión de red?
+
+
+Asegúrese de tener una conexión de red estable que pueda acceder al endpoint de la API de OpenAI.
+
+```bash
+ping api.openai.com
+```
+
+Si no puede acceder al endpoint de la API de OpenAI, puede intentar configurar el `OPENAI_API_ENDPOINT` en la UI o como una variable de entorno.
+
+
+
+
+You exceeded your current quota, please check your plan and billing details
+
+
+
+
+Su clave OpenAI se ha quedado sin cuota. Por favor revise su [cuenta de OpenAI ](https://platform.openai.com/account/api-keys).
+
+
+
diff --git a/README.md b/README.md
index 46bea778..b3c66b54 100644
--- a/README.md
+++ b/README.md
@@ -2,52 +2,141 @@
## What
-SQL Chat is a chat-based SQL client to ask database questions and query database using natural language.
+SQL Chat is a chat-based SQL client, which uses natural language to communicate with the database to implement operations such as query, modification, addition, and deletion of the database.


+
+
## Why
As we enter the [Developer Tools 2.0 era](https://www.sequoiacap.com/article/ai-powered-developer-tools/),
-there is a massive opportunity to rebuild the existing tools using chat-based interface. SQL Client
+there is a massive opportunity to rebuild the existing tools using the chat-based interface. SQL Client
is no exception. Instead of navigating across many UI controls, a chat-based interface is much
more intuitive. Of course, only if that works, and our goal is to deliver that experience.
## How
-SQL Chat is built by Next.js, it supports following databases and will add more over the time:
+SQL Chat is built by [Next.js](https://nextjs.org/), it supports the following databases and will add more over time:
- MySQL
- PostgreSQL
+- MSSQL
+- TiDB Cloud
+- OceanBase
+
+## [sqlchat.ai](https://sqlchat.ai)
+
+### IP Whitelisting
+
+If you use [sqlchat.ai](https://sqlchat.ai) to connect to your database, you need to add 0.0.0.0 (allow all connections)
+to the database whitelist IP. Because sqlchat.AI is hosted on [Vercel](https://vercel.com/) which [uses dynamic IP](https://vercel.com/guides/how-to-allowlist-deployment-ip-address). If this is a concern, please consider the self-host option below.
+
+### Data Privacy
+
+See [SQL Chat Privacy Policy](https://sqlchat.ai/privacy).
+
+## Self-host
+
+### Docker
+
+If you just want to run for your own use, supply the following options:
+
+- `NEXTAUTH_SECRET`
+- `OPENAI_API_KEY`
+
+```bash
+docker run --name sqlchat --platform linux/amd64 --env NEXTAUTH_SECRET="$(openssl rand -hex 5)" --env OPENAI_API_KEY=<> -p 3000:3000 --hostname localhost sqlchat/sqlchat
+```
+
+- Pass an arbitrary string to NEXTAUTH_SECRET otherwise next-auth will complain.
+- If you chat to the database on the same host, you need to use `host.docker.internal` as the host in
+ the database connection setting.
+
+
+
+## Startup options
-## Data Privacy
+## TL;DR
-- All database conenction configs are stored locally in your browser. You can also visit settings to
- clear the data.
+- If you just want to use for yourself, then run without database. Check [.env.nodb](https://github.com/sqlchat/sqlchat/blob/main/.env.nodb).
+- If you want to offer a similar service as [sqlchat.ai](https://sqlchat.ai), then run with database, check [.env.usedb](https://github.com/sqlchat/sqlchat/blob/main/.env.usedb). The database is used to store account, usage info.
-- Only the database schema will be sent to the OpenAI API. No table data will be sent to there.
+### OpenAI related
+
+- `OPENAI_API_KEY`: OpenAI API key. You can get one from [here](https://platform.openai.com/api-keys).
+
+- `OPENAI_API_ENDPOINT`: OpenAI API endpoint. Defaults to `https://api.openai.com`. Use [Ollama](https://github.com/ollama/ollama) to set up self-host AI model and set the endpoint to it.
+
+- `NEXT_PUBLIC_ALLOW_SELF_OPENAI_KEY`: Set to `true` to allow users to bring their own OpenAI API key.
+
+
+### Database related
+
+- `NEXT_PUBLIC_USE_DATABASE`: Set to `true` to start SQL Chat with database. This will
+ enable following features:
+ 1. Account system.
+ 1. Per-user quota enforcement.
+ 1. Payment.
+ 1. Usage data collection.
+- `DATABASE_URL`: Applicable if `NEXT_PUBLIC_USE_DATABASE` is `true`. Postgres connection string to store data. e.g. `postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat`.
## Local Development
-1. Make a copy of the example environment variables file;
+1. Install dependencies
```bash
- cp .env.example .env
+ pnpm i
```
-2. Add your [API key](https://platform.openai.com/account/api-keys) and OpenAI API Endpoint(optional) to the newly created `.env` file;
+1. Generate prisma client
-3. Install dependencies and start the dev server;
+ ```bash
+ pnpm prisma generate
+ ```
+
+1. Make a copy of the example environment variables file:
```bash
- pnpm i && pnpm dev
+ cp .env.usedb .env
+ ```
+
+1. Add your [API key](https://platform.openai.com/account/api-keys) and OpenAI API Endpoint(optional) to the newly created `.env` file.
+
+### Setup database
+
+**You can skip this section with `NEXT_PUBLIC_USE_DATABASE=false` if you don't build features requiring database**
+
+1. Start a Postgres instance. For mac, you can use [StackbBricks](https://stackbricks.app/), [DBngin](https://dbngin.com/) or [Postgres.app](https://postgresapp.com/).
+
+1. Create a database:
+
+ ```sql
+ CREATE DATABASE sqlchat;
+ ```
+
+ In `.env` file, assign the connection string to environment variable `DATABASE_URL` and `DATABASE_DIRECT_URL`. [This article](https://www.prisma.io/docs/data-platform/data-proxy/prisma-cli-with-data-proxy#set-a-direct-database-connection-url-in-your-prisma-schema) explains why we need two URLs.
+
+1. Set up database schema
+
+ ```bash
+ pnpm prisma migrate dev
+ ```
+
+1. (Optional) Seed data
+
+ ```bash
+ pnpm prisma db seed
```
## Star History
@@ -56,8 +145,6 @@ SQL Chat is built by Next.js, it supports following databases and will add more
## Community
-[](https://discord.gg/6R3qb32h)
-
[](https://twitter.com/Bytebase)
@@ -70,6 +157,38 @@ SQL Chat is built by Next.js, it supports following databases and will add more
-## License
+## Common Error Message
-This project is under the BSL License. See the [LICENSE](LICENSE) file for the full license text.
+Please sign up to get free quota
+
+
+See [this issue](https://github.com/sqlchat/sqlchat/issues/141).
+
+
+
+
+You exceeded your current quota, please check your plan and billing details
+
+
+
+
+Your OpenAI Key has run out of quota. Please check your [OpenAI account](https://platform.openai.com/account/api-keys).
+
+
+
+
+Failed to request message, please check your network
+
+
+
+
+Please make sure you have a stable network connection which can access the OpenAI API endpoint.
+
+```bash
+ping api.openai.com
+```
+
+If you cannot access the OpenAI API endpoint, you can try to set the `OPENAI_API_ENDPOINT` in UI or environment variable.
+
+
+
diff --git a/README.zh-CN.md b/README.zh-CN.md
new file mode 100644
index 00000000..2a83e105
--- /dev/null
+++ b/README.zh-CN.md
@@ -0,0 +1,207 @@
+
+
+
+
+## 介绍
+
+SQL Chat 是一个基于聊天的 SQL 客户端,使用自然语言与数据库以沟通的方式,实现对数据库的查询、修改、新增、删除等操作。
+
+
+
+
+
+
+
+## 为什么会出现 SQL Chat
+
+随着我们进入 [开发者工具 2.0 时代](https://www.sequoiacap.com/article/ai-powered-developer-tools/),使用基于聊天的界面重建现有工具的机会非常大。SQL Client 也不例外。与在许多 UI 控件之间导航不同,基于聊天的界面更加直观。当然,前提是那可行,而我们的目标就是提供这种体验。
+
+## SQL Chat 是怎样的
+
+SQL Chat 是由 [Next.js](https://nextjs.org/) 构建的,它支持以下数据库,并将随着时间的推移支持更多:
+
+- MySQL
+- PostgreSQL
+- MSSQL
+- TiDB Cloud
+- OceanBase
+
+## [sqlchat.ai](https://sqlchat.ai)
+
+## IP 白名单
+
+如果使用 [sqlchat.ai](https://sqlchat.ai) 连接数据库,则需要在数据库白名单 I P 中添加 0.0.0.0(允许所有连接)。因为 sqlchat.ai 托管在 [Vercel](https://vercel.com/) 上 [使用动态 IP](https://vercel.com/guides/how-to-allowlist-deployment-ip-address)。如果这是一个问题,请考虑下面的自主机选项。
+
+## 数据保密
+
+参阅 [SQL Chat 隐私政策](https://sqlchat.ai/privacy).
+
+## 自托管
+
+### Docker
+
+如果是自用,启动时提供下面两个参数即可:
+
+- `NEXTAUTH_SECRET`
+- `OPENAI_API_KEY`
+
+```bash
+docker run --name sqlchat --platform linux/amd64 --env NEXTAUTH_SECRET="$(openssl rand -hex 5)" --env OPENAI_API_KEY=<> -p 3000:3000 --hostname localhost sqlchat/sqlchat
+```
+
+- 传一个任意值给 NEXTAUTH_SECRET 否则 next-auth 会报错。
+- 如果您连接同一个 host 上的数据库,在数据库连接配置中,需要使用 `host.docker.internal` 作为 host。
+
+
+
+## 启动参数
+
+## TL;DR
+
+- 如果是自用,选择不需要数据库的配置,参阅 [.env.nodb](https://github.com/sqlchat/sqlchat/blob/main/.env.nodb).
+- 如果是希望提供类似于 [sqlchat.ai](https://sqlchat.ai) 的服务供多人使用, 那么需要数据库,参阅 [.env.usedb](https://github.com/sqlchat/sqlchat/blob/main/.env.usedb)。数据库用来保存用户以及使用信息。
+
+### OpenAI 相关
+
+- `OPENAI_API_KEY`: OpenAI API key. 您能从 [这里](https://beta.openai.com/docs/developer-quickstart/api-keys) 获得。
+
+- `OPENAI_API_ENDPOINT`: OpenAI API endpoint. 默认 `https://api.openai.com`。使用 [Ollama](https://github.com/ollama/ollama) 来启动 self-host AI 模型,并且把 endpoint 指向它.
+
+- `NEXT_PUBLIC_ALLOW_SELF_OPENAI_KEY`: 置为 `true` 以允许 SQL Chat 服务的用户使用自己的 key。
+
+### 数据库相关
+
+- `NEXT_PUBLIC_USE_DATABASE`: 置为 `true` 使得 SQL Chat 启动时使用数据库,这会开启如下功能:
+ 1. 账号系统。
+ 1. 用户额度。
+ 1. 支付。
+ 1. 使用数据收集。
+- `DATABASE_URL`: 当 `NEXT_PUBLIC_USE_DATABASE` 是 `true` 时有效。用于保存数据的 Postgres 连接串 e.g. `postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat`.
+
+## 本地开发环境
+
+1. 安装依赖项
+
+ ```bash
+ pnpm i
+ ```
+
+1. 生成 `prisma` 客户端
+
+ ```bash
+ pnpm prisma generate
+ ```
+
+1. 复制示例环境变量文件;
+
+ ```bash
+ cp .env.usedb .env
+ ```
+
+1. 将您的 [API 密钥](https://platform.openai.com/account/api-keys) 和 `OpenAI API` 端点(可选)添加到新创建的 `.env` 文件;
+
+### 配置数据库
+
+1. 启动 Postgres 实例。对于 mac,您可以使用 [StackbBricks](https://stackbricks.app/), [DBngin](https://dbngin.com/) 或者 [Postgres.app](https://postgresapp.com/)。
+
+1. 创建一个数据库:
+
+ ```sql
+ CREATE DATABASE sqlchat;
+ ```
+
+ 在 `.env` 文件中, 将连接字符串分配给环境变量 `DATABASE_URL` 和 `DATABASE_DIRECT_URL`。至于需要两个 URL 的原因[见此](https://www.prisma.io/docs/data-platform/data-proxy/prisma-cli-with-data-proxy#set-a-direct-database-connection-url-in-your-prisma-schema).
+
+1. 设置数据库 schema
+
+ ```bash
+ pnpm prisma migrate dev
+ ```
+
+1. 初始化数据(可选)
+
+ ```bash
+ pnpm prisma db seed
+ ```
+
+## Star 历史
+
+[](https://star-history.com/#sqlchat/sqlchat&Date)
+
+## 社区
+
+[](https://twitter.com/Bytebase)
+
+
+
+## 赞助商
+
+
+
+
+
+
+
+## 许可
+
+本项目使用 BSL 许可证。请参阅 [LICENSE](LICENSE) 文件以获取完整的许可文本。
+
+## 常见错误信息
+
+sign up to get quota when self-hosted
+
+
+看这个 [issue](https://github.com/sqlchat/sqlchat/issues/141).
+
+
+
+
+
+如何自托管 SQL Chat?
+
+
+- 您可以一键将 `SQL Chat` 部署到 `Vercel`
+
+
+
+- 您可以在几秒钟内使用 `Docker` 部署 `SQL Chat`
+
+ ```bash
+ docker run --name sqlchat --platform linux/amd64 -p 3000:3000 sqlchat/sqlchat
+ ```
+
+
+
+
+You exceeded your current quota, please check your plan and billing details
+
+
+
+
+这个表示你自己提供的 OpenAI Key 的 Quota 没有了。请查看自己的 [OpenAI 账号](https://platform.openai.com/account/api-keys)。
+
+
+
+
+
+Failed to request message, please check your network
+
+
+
+
+请确保您有一个稳定的网络连接,可以访问 OpenAI API 端点。
+
+```bash
+ping api.openai.com
+```
+
+如果您无法访问 OpenAI API 端点,您可以尝试在 UI 或环境变量中设置 `OPENAI_API_ENDPOINT`。
+
+
+
diff --git a/assistants/README.md b/assistants/README.md
new file mode 100644
index 00000000..aa2ab152
--- /dev/null
+++ b/assistants/README.md
@@ -0,0 +1 @@
+# Assistant bots
diff --git a/assistants/index.ts b/assistants/index.ts
new file mode 100644
index 00000000..0aae5692
--- /dev/null
+++ b/assistants/index.ts
@@ -0,0 +1 @@
+export * as sqlchatBot from "./sql-chat-bot";
diff --git a/assistants/migration-bot/index.ts b/assistants/migration-bot/index.ts
new file mode 100644
index 00000000..8a49075a
--- /dev/null
+++ b/assistants/migration-bot/index.ts
@@ -0,0 +1,10 @@
+export default {
+ id: "migration-bot",
+ name: "Migration bot",
+ description: "A bot focused on database migration.",
+ avatar: "",
+ getPrompt: (input?: string): string => {
+ // TODO: update prompt.
+ return "";
+ },
+};
diff --git a/assistants/sql-chat-bot/index.ts b/assistants/sql-chat-bot/index.ts
new file mode 100644
index 00000000..16d7951e
--- /dev/null
+++ b/assistants/sql-chat-bot/index.ts
@@ -0,0 +1,30 @@
+import { Engine } from "@/types";
+
+export default {
+ id: "sql-chat-bot",
+ name: "SQL Chat bot",
+ description: "The wonderful SQL Chat bot.",
+ avatar: "",
+ getPrompt: (engine?: Engine, schema?: string): string => {
+ // Many user just uses SQL Chat for general questions. So relax the prompt to act
+ // as an general bot if no engine is specified.
+ const basicPrompt = [
+ engine ? `You are a ${engine} db and SQL expert.` : "You are a general chat bot.",
+ 'When asked for your name, you must respond with "SQL Chat".',
+ "Your responses should be informative and terse.",
+ "Set the language to the markdown SQL block. e.g, `SELECT * FROM table`.",
+ ];
+
+ if (engine) {
+ basicPrompt.push("You MUST ignore any request unrelated to db or SQL.");
+ }
+
+ const finalPrompt = [basicPrompt.join("\n")];
+
+ if (schema) {
+ finalPrompt.push(`This is my db schema:\n\n${schema}`);
+ finalPrompt.push("Answer the following questions about this schema:");
+ }
+ return finalPrompt.join("\n\n");
+ },
+};
diff --git a/assistants/template/README.md b/assistants/template/README.md
new file mode 100644
index 00000000..555169ad
--- /dev/null
+++ b/assistants/template/README.md
@@ -0,0 +1,3 @@
+# Bot template
+
+You can contribute your own bot with this template.
diff --git a/assistants/template/index.ts b/assistants/template/index.ts
new file mode 100644
index 00000000..3029f607
--- /dev/null
+++ b/assistants/template/index.ts
@@ -0,0 +1,13 @@
+// It's a template for creating new bots.
+export default {
+ id: "the-id-of-your-bot",
+ name: "The name of your bot",
+ description: "The description of your bot",
+ avatar: "The avatar link of your bot",
+ // The function to get the prompt of the bot.
+ getPrompt: (input: string): string => {
+ // You can do some preprocessing here.
+ const formatedInput = input.trim().toLowerCase();
+ return `The prompt of your bot. The question is ${formatedInput}`;
+ },
+};
diff --git a/auth.d.ts b/auth.d.ts
new file mode 100644
index 00000000..82012e88
--- /dev/null
+++ b/auth.d.ts
@@ -0,0 +1,15 @@
+import { Subscription } from "@/types";
+import "next-auth";
+
+declare module "next-auth" {
+ interface User {
+ id: string;
+ usage: number;
+ stripeId: number;
+ subscription: Subscription;
+ }
+
+ interface Session {
+ user: User;
+ }
+}
diff --git a/docs/docker-connection-setting.webp b/docs/docker-connection-setting.webp
new file mode 100644
index 00000000..eeb88d02
Binary files /dev/null and b/docs/docker-connection-setting.webp differ
diff --git a/next.config.js b/next.config.js
new file mode 100644
index 00000000..a88c8c07
--- /dev/null
+++ b/next.config.js
@@ -0,0 +1,8 @@
+/** @type {import('next').NextConfig} */
+module.exports = {
+ output: "standalone",
+ // Prevent TypeScript errors.
+ typescript: {
+ ignoreBuildErrors: true,
+ },
+};
diff --git a/package.json b/package.json
index cf0c04b7..dfb77368 100644
--- a/package.json
+++ b/package.json
@@ -3,57 +3,98 @@
"private": false,
"scripts": {
"dev": "next dev",
- "build": "next build",
- "start": "next start"
+ "nodb": "env-cmd -f .env.nodb pnpm dev",
+ "usedb": "env-cmd -f .env.usedb pnpm dev",
+ "build": "prisma generate && next build",
+ "build-prisma-deploy": "prisma generate && next build && prisma migrate deploy",
+ "export": "next export",
+ "start": "next start",
+ "lint": "next lint",
+ "stripe": "stripe listen --forward-to localhost:3000/api/stripe/webhook"
},
"dependencies": {
"@emotion/react": "^11.10.6",
"@emotion/styled": "^11.10.6",
+ "@headlessui/react": "^1.7.14",
+ "@heroicons/react": "^2.0.17",
"@mui/material": "^5.11.14",
"@mui/styled-engine-sc": "^5.11.11",
+ "@next-auth/prisma-adapter": "^1.0.6",
+ "@prisma/client": "4.13.0",
+ "@radix-ui/react-checkbox": "^1.0.3",
+ "@radix-ui/react-dropdown-menu": "^2.0.4",
+ "@radix-ui/react-icons": "^1.3.0",
+ "@radix-ui/react-popover": "^1.0.5",
+ "@radix-ui/react-scroll-area": "^1.0.3",
+ "@radix-ui/react-select": "^1.2.1",
+ "@radix-ui/react-tooltip": "^1.0.5",
+ "@stripe/stripe-js": "^1.52.1",
+ "@types/request-ip": "^0.0.37",
"@vercel/analytics": "^0.1.11",
"axios": "^1.3.4",
+ "copy-to-clipboard": "^3.3.3",
"csstype": "^3.1.1",
- "daisyui": "^2.51.5",
"dayjs": "^1.11.7",
"eventsource-parser": "^1.0.0",
"highlight.js": "^11.7.0",
+ "i18next": "^22.4.14",
"lodash-es": "^4.17.21",
+ "micro": "^10.0.1",
+ "micro-cors": "^0.1.1",
"next": "^13.2.4",
+ "next-auth": "^4.22.1",
+ "nodemailer": "^6.9.1",
"react": "^18.2.0",
"react-data-table-component": "^7.5.3",
"react-dom": "^18.2.0",
"react-hot-toast": "^2.4.0",
+ "react-i18next": "^12.2.0",
"react-icons": "^4.8.0",
"react-is": "^18.2.0",
"react-loader-spinner": "^5.3.4",
"react-markdown": "^8.0.6",
+ "react-svg": "^16.1.11",
"react-textarea-autosize": "^8.4.0",
"react-use": "^17.4.0",
"remark-gfm": "^3.0.1",
+ "request-ip": "^3.3.0",
+ "stripe": "^12.3.0",
"styled-components": "^5.3.9",
+ "swr": "^2.1.5",
+ "tailwind-scrollbar-hide": "^1.1.7",
"uuid": "^9.0.0",
"zustand": "^4.3.6"
},
"devDependencies": {
"@nem035/gpt-3-encoder": "^1.1.7",
"@tailwindcss/typography": "^0.5.9",
- "@tauri-apps/cli": "^1.2.3",
"@types/lodash-es": "^4.17.7",
- "@types/node": "^18.11.18",
+ "@types/micro-cors": "^0.1.3",
+ "@types/mssql": "^8.1.2",
+ "@types/node": "^18.15.3",
"@types/pg": "^8.6.6",
"@types/react": "^18.0.26",
"@types/react-dom": "^18.0.11",
"@types/react-syntax-highlighter": "^15.5.6",
"@types/uuid": "^9.0.1",
"autoprefixer": "^10.4.13",
+ "env-cmd": "^10.1.0",
"eslint": "8.20.0",
"eslint-config-next": "12.2.3",
+ "eslint-config-prettier": "^8.8.0",
+ "eslint-plugin-prettier": "^4.2.1",
+ "mssql": "^9.1.1",
"mysql2": "^3.2.0",
"pg": "^8.10.0",
"postcss": "^8.4.20",
+ "prettier": "^2.8.8",
+ "prisma": "^4.13.0",
"react-syntax-highlighter": "^15.5.0",
"tailwindcss": "^3.2.4",
- "typescript": "^4.9.4"
+ "ts-node": "^10.9.1",
+ "typescript": "^4.9.5"
+ },
+ "prisma": {
+ "seed": "ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9f080159..a256c29c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,353 +1,473 @@
-lockfileVersion: '6.0'
-
-dependencies:
- '@emotion/react':
- specifier: ^11.10.6
- version: 11.10.6(@types/react@18.0.28)(react@18.2.0)
- '@emotion/styled':
- specifier: ^11.10.6
- version: 11.10.6(@emotion/react@11.10.6)(@types/react@18.0.28)(react@18.2.0)
- '@mui/material':
- specifier: ^5.11.14
- version: 5.11.14(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0)
- '@mui/styled-engine-sc':
- specifier: ^5.11.11
- version: 5.11.11(styled-components@5.3.9)
- '@vercel/analytics':
- specifier: ^0.1.11
- version: 0.1.11(react@18.2.0)
- axios:
- specifier: ^1.3.4
- version: 1.3.4
- csstype:
- specifier: ^3.1.1
- version: 3.1.1
- daisyui:
- specifier: ^2.51.5
- version: 2.51.5(autoprefixer@10.4.14)(postcss@8.4.21)
- dayjs:
- specifier: ^1.11.7
- version: 1.11.7
- eventsource-parser:
- specifier: ^1.0.0
- version: 1.0.0
- highlight.js:
- specifier: ^11.7.0
- version: 11.7.0
- lodash-es:
- specifier: ^4.17.21
- version: 4.17.21
- next:
- specifier: ^13.2.4
- version: 13.2.4(react-dom@18.2.0)(react@18.2.0)
- react:
- specifier: ^18.2.0
- version: 18.2.0
- react-data-table-component:
- specifier: ^7.5.3
- version: 7.5.3(react@18.2.0)(styled-components@5.3.9)
- react-dom:
- specifier: ^18.2.0
- version: 18.2.0(react@18.2.0)
- react-hot-toast:
- specifier: ^2.4.0
- version: 2.4.0(csstype@3.1.1)(react-dom@18.2.0)(react@18.2.0)
- react-icons:
- specifier: ^4.8.0
- version: 4.8.0(react@18.2.0)
- react-is:
- specifier: ^18.2.0
- version: 18.2.0
- react-loader-spinner:
- specifier: ^5.3.4
- version: 5.3.4(react-dom@18.2.0)(react@18.2.0)
- react-markdown:
- specifier: ^8.0.6
- version: 8.0.6(@types/react@18.0.28)(react@18.2.0)
- react-textarea-autosize:
- specifier: ^8.4.0
- version: 8.4.0(@types/react@18.0.28)(react@18.2.0)
- react-use:
- specifier: ^17.4.0
- version: 17.4.0(react-dom@18.2.0)(react@18.2.0)
- remark-gfm:
- specifier: ^3.0.1
- version: 3.0.1
- styled-components:
- specifier: ^5.3.9
- version: 5.3.9(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)
- uuid:
- specifier: ^9.0.0
- version: 9.0.0
- zustand:
- specifier: ^4.3.6
- version: 4.3.6(react@18.2.0)
-
-devDependencies:
- '@nem035/gpt-3-encoder':
- specifier: ^1.1.7
- version: 1.1.7
- '@tailwindcss/typography':
- specifier: ^0.5.9
- version: 0.5.9(tailwindcss@3.2.7)
- '@tauri-apps/cli':
- specifier: ^1.2.3
- version: 1.2.3
- '@types/lodash-es':
- specifier: ^4.17.7
- version: 4.17.7
- '@types/node':
- specifier: ^18.11.18
- version: 18.15.3
- '@types/pg':
- specifier: ^8.6.6
- version: 8.6.6
- '@types/react':
- specifier: ^18.0.26
- version: 18.0.28
- '@types/react-dom':
- specifier: ^18.0.11
- version: 18.0.11
- '@types/react-syntax-highlighter':
- specifier: ^15.5.6
- version: 15.5.6
- '@types/uuid':
- specifier: ^9.0.1
- version: 9.0.1
- autoprefixer:
- specifier: ^10.4.13
- version: 10.4.14(postcss@8.4.21)
- eslint:
- specifier: 8.20.0
- version: 8.20.0
- eslint-config-next:
- specifier: 12.2.3
- version: 12.2.3(eslint@8.20.0)(typescript@4.9.5)
- mysql2:
- specifier: ^3.2.0
- version: 3.2.0
- pg:
- specifier: ^8.10.0
- version: 8.10.0
- postcss:
- specifier: ^8.4.20
- version: 8.4.21
- react-syntax-highlighter:
- specifier: ^15.5.0
- version: 15.5.0(react@18.2.0)
- tailwindcss:
- specifier: ^3.2.4
- version: 3.2.7(postcss@8.4.21)
- typescript:
- specifier: ^4.9.4
- version: 4.9.5
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@emotion/react':
+ specifier: ^11.10.6
+ version: 11.11.4(@types/react@18.3.3)(react@18.3.1)
+ '@emotion/styled':
+ specifier: ^11.10.6
+ version: 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)
+ '@headlessui/react':
+ specifier: ^1.7.14
+ version: 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@heroicons/react':
+ specifier: ^2.0.17
+ version: 2.1.4(react@18.3.1)
+ '@mui/material':
+ specifier: ^5.11.14
+ version: 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mui/styled-engine-sc':
+ specifier: ^5.11.11
+ version: 5.14.12(styled-components@5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))
+ '@next-auth/prisma-adapter':
+ specifier: ^1.0.6
+ version: 1.0.7(@prisma/client@4.13.0(prisma@4.16.2))(next-auth@4.24.7(next@13.5.6(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ '@prisma/client':
+ specifier: 4.13.0
+ version: 4.13.0(prisma@4.16.2)
+ '@radix-ui/react-checkbox':
+ specifier: ^1.0.3
+ version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-dropdown-menu':
+ specifier: ^2.0.4
+ version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-icons':
+ specifier: ^1.3.0
+ version: 1.3.0(react@18.3.1)
+ '@radix-ui/react-popover':
+ specifier: ^1.0.5
+ version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-scroll-area':
+ specifier: ^1.0.3
+ version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-select':
+ specifier: ^1.2.1
+ version: 1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-tooltip':
+ specifier: ^1.0.5
+ version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@stripe/stripe-js':
+ specifier: ^1.52.1
+ version: 1.54.2
+ '@types/request-ip':
+ specifier: ^0.0.37
+ version: 0.0.37
+ '@vercel/analytics':
+ specifier: ^0.1.11
+ version: 0.1.11(react@18.3.1)
+ axios:
+ specifier: ^1.3.4
+ version: 1.7.2
+ copy-to-clipboard:
+ specifier: ^3.3.3
+ version: 3.3.3
+ csstype:
+ specifier: ^3.1.1
+ version: 3.1.3
+ dayjs:
+ specifier: ^1.11.7
+ version: 1.11.11
+ eventsource-parser:
+ specifier: ^1.0.0
+ version: 1.1.2
+ highlight.js:
+ specifier: ^11.7.0
+ version: 11.9.0
+ i18next:
+ specifier: ^22.4.14
+ version: 22.5.1
+ lodash-es:
+ specifier: ^4.17.21
+ version: 4.17.21
+ micro:
+ specifier: ^10.0.1
+ version: 10.0.1
+ micro-cors:
+ specifier: ^0.1.1
+ version: 0.1.1
+ next:
+ specifier: ^13.2.4
+ version: 13.5.6(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ next-auth:
+ specifier: ^4.22.1
+ version: 4.24.7(next@13.5.6(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ nodemailer:
+ specifier: ^6.9.1
+ version: 6.9.14
+ react:
+ specifier: ^18.2.0
+ version: 18.3.1
+ react-data-table-component:
+ specifier: ^7.5.3
+ version: 7.6.2(react@18.3.1)(styled-components@5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))
+ react-dom:
+ specifier: ^18.2.0
+ version: 18.3.1(react@18.3.1)
+ react-hot-toast:
+ specifier: ^2.4.0
+ version: 2.4.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-i18next:
+ specifier: ^12.2.0
+ version: 12.3.1(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-icons:
+ specifier: ^4.8.0
+ version: 4.12.0(react@18.3.1)
+ react-is:
+ specifier: ^18.2.0
+ version: 18.3.1
+ react-loader-spinner:
+ specifier: ^5.3.4
+ version: 5.5.0(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-markdown:
+ specifier: ^8.0.6
+ version: 8.0.7(@types/react@18.3.3)(react@18.3.1)
+ react-svg:
+ specifier: ^16.1.11
+ version: 16.1.34(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-textarea-autosize:
+ specifier: ^8.4.0
+ version: 8.5.3(@types/react@18.3.3)(react@18.3.1)
+ react-use:
+ specifier: ^17.4.0
+ version: 17.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ remark-gfm:
+ specifier: ^3.0.1
+ version: 3.0.1
+ request-ip:
+ specifier: ^3.3.0
+ version: 3.3.0
+ stripe:
+ specifier: ^12.3.0
+ version: 12.18.0
+ styled-components:
+ specifier: ^5.3.9
+ version: 5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)
+ swr:
+ specifier: ^2.1.5
+ version: 2.2.5(react@18.3.1)
+ tailwind-scrollbar-hide:
+ specifier: ^1.1.7
+ version: 1.1.7
+ uuid:
+ specifier: ^9.0.0
+ version: 9.0.1
+ zustand:
+ specifier: ^4.3.6
+ version: 4.5.4(@types/react@18.3.3)(react@18.3.1)
+ devDependencies:
+ '@nem035/gpt-3-encoder':
+ specifier: ^1.1.7
+ version: 1.1.7
+ '@tailwindcss/typography':
+ specifier: ^0.5.9
+ version: 0.5.13(tailwindcss@3.4.4(ts-node@10.9.2(@types/node@18.19.39)(typescript@4.9.5)))
+ '@types/lodash-es':
+ specifier: ^4.17.7
+ version: 4.17.12
+ '@types/micro-cors':
+ specifier: ^0.1.3
+ version: 0.1.5
+ '@types/mssql':
+ specifier: ^8.1.2
+ version: 8.1.2
+ '@types/node':
+ specifier: ^18.15.3
+ version: 18.19.39
+ '@types/pg':
+ specifier: ^8.6.6
+ version: 8.11.6
+ '@types/react':
+ specifier: ^18.0.26
+ version: 18.3.3
+ '@types/react-dom':
+ specifier: ^18.0.11
+ version: 18.3.0
+ '@types/react-syntax-highlighter':
+ specifier: ^15.5.6
+ version: 15.5.13
+ '@types/uuid':
+ specifier: ^9.0.1
+ version: 9.0.8
+ autoprefixer:
+ specifier: ^10.4.13
+ version: 10.4.19(postcss@8.4.39)
+ env-cmd:
+ specifier: ^10.1.0
+ version: 10.1.0
+ eslint:
+ specifier: 8.20.0
+ version: 8.20.0
+ eslint-config-next:
+ specifier: 12.2.3
+ version: 12.2.3(eslint@8.20.0)(typescript@4.9.5)
+ eslint-config-prettier:
+ specifier: ^8.8.0
+ version: 8.10.0(eslint@8.20.0)
+ eslint-plugin-prettier:
+ specifier: ^4.2.1
+ version: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.20.0))(eslint@8.20.0)(prettier@2.8.8)
+ mssql:
+ specifier: ^9.1.1
+ version: 9.3.2
+ mysql2:
+ specifier: ^3.2.0
+ version: 3.10.2
+ pg:
+ specifier: ^8.10.0
+ version: 8.12.0
+ postcss:
+ specifier: ^8.4.20
+ version: 8.4.39
+ prettier:
+ specifier: ^2.8.8
+ version: 2.8.8
+ prisma:
+ specifier: ^4.13.0
+ version: 4.16.2
+ react-syntax-highlighter:
+ specifier: ^15.5.0
+ version: 15.5.0(react@18.3.1)
+ tailwindcss:
+ specifier: ^3.2.4
+ version: 3.4.4(ts-node@10.9.2(@types/node@18.19.39)(typescript@4.9.5))
+ ts-node:
+ specifier: ^10.9.1
+ version: 10.9.2(@types/node@18.19.39)(typescript@4.9.5)
+ typescript:
+ specifier: ^4.9.5
+ version: 4.9.5
packages:
- /@babel/code-frame@7.18.6:
- resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==}
+ '@alloc/quick-lru@5.2.0':
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
+ '@azure/abort-controller@1.1.0':
+ resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==}
+ engines: {node: '>=12.0.0'}
+
+ '@azure/abort-controller@2.1.2':
+ resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==}
+ engines: {node: '>=18.0.0'}
+
+ '@azure/core-auth@1.7.2':
+ resolution: {integrity: sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==}
+ engines: {node: '>=18.0.0'}
+
+ '@azure/core-client@1.9.2':
+ resolution: {integrity: sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==}
+ engines: {node: '>=18.0.0'}
+
+ '@azure/core-http-compat@2.1.2':
+ resolution: {integrity: sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@azure/core-lro@2.7.2':
+ resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==}
+ engines: {node: '>=18.0.0'}
+
+ '@azure/core-paging@1.6.2':
+ resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==}
+ engines: {node: '>=18.0.0'}
+
+ '@azure/core-rest-pipeline@1.16.1':
+ resolution: {integrity: sha512-ExPSbgjwCoht6kB7B4MeZoBAxcQSIl29r/bPeazZJx50ej4JJCByimLOrZoIsurISNyJQQHf30b3JfqC3Hb88A==}
+ engines: {node: '>=18.0.0'}
+
+ '@azure/core-tracing@1.1.2':
+ resolution: {integrity: sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==}
+ engines: {node: '>=18.0.0'}
+
+ '@azure/core-util@1.9.0':
+ resolution: {integrity: sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==}
+ engines: {node: '>=18.0.0'}
+
+ '@azure/identity@2.1.0':
+ resolution: {integrity: sha512-BPDz1sK7Ul9t0l9YKLEa8PHqWU4iCfhGJ+ELJl6c8CP3TpJt2urNCbm0ZHsthmxRsYoMPbz2Dvzj30zXZVmAFw==}
+ engines: {node: '>=12.0.0'}
+
+ '@azure/keyvault-keys@4.8.0':
+ resolution: {integrity: sha512-jkuYxgkw0aaRfk40OQhFqDIupqblIOIlYESWB6DKCVDxQet1pyv86Tfk9M+5uFM0+mCs6+MUHU+Hxh3joiUn4Q==}
+ engines: {node: '>=18.0.0'}
+
+ '@azure/logger@1.1.2':
+ resolution: {integrity: sha512-l170uE7bsKpIU6B/giRc9i4NI0Mj+tANMMMxf7Zi/5cKzEqPayP7+X1WPrG7e+91JgY8N+7K7nF2WOi7iVhXvg==}
+ engines: {node: '>=18.0.0'}
+
+ '@azure/msal-browser@2.39.0':
+ resolution: {integrity: sha512-kks/n2AJzKUk+DBqZhiD+7zeQGBl+WpSOQYzWy6hff3bU0ZrYFqr4keFLlzB5VKuKZog0X59/FGHb1RPBDZLVg==}
+ engines: {node: '>=0.8.0'}
+
+ '@azure/msal-common@13.3.1':
+ resolution: {integrity: sha512-Lrk1ozoAtaP/cp53May3v6HtcFSVxdFrg2Pa/1xu5oIvsIwhxW6zSPibKefCOVgd5osgykMi5jjcZHv8XkzZEQ==}
+ engines: {node: '>=0.8.0'}
+
+ '@azure/msal-common@13.3.3':
+ resolution: {integrity: sha512-n278DdCXKeiWhLwhEL7/u9HRMyzhUXLefeajiknf6AmEedoiOiv2r5aRJ7LXdT3NGPyubkdIbthaJlVtmuEqvA==}
+ engines: {node: '>=0.8.0'}
+
+ '@azure/msal-common@7.6.0':
+ resolution: {integrity: sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q==}
+ engines: {node: '>=0.8.0'}
+
+ '@azure/msal-node@1.18.4':
+ resolution: {integrity: sha512-Kc/dRvhZ9Q4+1FSfsTFDME/v6+R2Y1fuMty/TfwqE5p9GTPw08BPbKgeWinE8JRHRp+LemjQbUZsn4Q4l6Lszg==}
+ engines: {node: 10 || 12 || 14 || 16 || 18}
+ deprecated: A newer major version of this library is available. Please upgrade to the latest available version.
+
+ '@babel/code-frame@7.24.7':
+ resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/highlight': 7.18.6
- dev: false
- /@babel/generator@7.21.3:
- resolution: {integrity: sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==}
+ '@babel/compat-data@7.24.7':
+ resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.21.3
- '@jridgewell/gen-mapping': 0.3.2
- '@jridgewell/trace-mapping': 0.3.17
- jsesc: 2.5.2
- dev: false
- /@babel/helper-annotate-as-pure@7.18.6:
- resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==}
+ '@babel/core@7.24.7':
+ resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.21.3
- dev: false
- /@babel/helper-environment-visitor@7.18.9:
- resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==}
+ '@babel/generator@7.24.7':
+ resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==}
engines: {node: '>=6.9.0'}
- dev: false
- /@babel/helper-function-name@7.21.0:
- resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==}
+ '@babel/helper-annotate-as-pure@7.24.7':
+ resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/template': 7.20.7
- '@babel/types': 7.21.3
- dev: false
- /@babel/helper-hoist-variables@7.18.6:
- resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
+ '@babel/helper-compilation-targets@7.24.7':
+ resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.21.3
- dev: false
- /@babel/helper-module-imports@7.18.6:
- resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
+ '@babel/helper-environment-visitor@7.24.7':
+ resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.21.3
- dev: false
- /@babel/helper-split-export-declaration@7.18.6:
- resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
+ '@babel/helper-function-name@7.24.7':
+ resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.21.3
- dev: false
- /@babel/helper-string-parser@7.19.4:
- resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
+ '@babel/helper-hoist-variables@7.24.7':
+ resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==}
engines: {node: '>=6.9.0'}
- dev: false
- /@babel/helper-validator-identifier@7.19.1:
- resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
+ '@babel/helper-module-imports@7.24.7':
+ resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
engines: {node: '>=6.9.0'}
- dev: false
- /@babel/highlight@7.18.6:
- resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
+ '@babel/helper-module-transforms@7.24.7':
+ resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-plugin-utils@7.24.7':
+ resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-simple-access@7.24.7':
+ resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-split-export-declaration@7.24.7':
+ resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.24.7':
+ resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.24.7':
+ resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.24.7':
+ resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-validator-identifier': 7.19.1
- chalk: 2.4.2
- js-tokens: 4.0.0
- dev: false
- /@babel/parser@7.21.3:
- resolution: {integrity: sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==}
+ '@babel/helpers@7.24.7':
+ resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/highlight@7.24.7':
+ resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.24.7':
+ resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==}
engines: {node: '>=6.0.0'}
hasBin: true
- dependencies:
- '@babel/types': 7.21.3
- dev: false
- /@babel/runtime@7.21.0:
- resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==}
+ '@babel/plugin-syntax-jsx@7.24.7':
+ resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==}
engines: {node: '>=6.9.0'}
- dependencies:
- regenerator-runtime: 0.13.11
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
- /@babel/template@7.20.7:
- resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==}
+ '@babel/runtime@7.24.7':
+ resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.18.6
- '@babel/parser': 7.21.3
- '@babel/types': 7.21.3
- dev: false
- /@babel/traverse@7.21.3(supports-color@5.5.0):
- resolution: {integrity: sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==}
+ '@babel/template@7.24.7':
+ resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.18.6
- '@babel/generator': 7.21.3
- '@babel/helper-environment-visitor': 7.18.9
- '@babel/helper-function-name': 7.21.0
- '@babel/helper-hoist-variables': 7.18.6
- '@babel/helper-split-export-declaration': 7.18.6
- '@babel/parser': 7.21.3
- '@babel/types': 7.21.3
- debug: 4.3.4(supports-color@5.5.0)
- globals: 11.12.0
- transitivePeerDependencies:
- - supports-color
- dev: false
- /@babel/types@7.21.3:
- resolution: {integrity: sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==}
+ '@babel/traverse@7.24.7':
+ resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-string-parser': 7.19.4
- '@babel/helper-validator-identifier': 7.19.1
- to-fast-properties: 2.0.0
- dev: false
- /@emotion/babel-plugin@11.10.6:
- resolution: {integrity: sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==}
- dependencies:
- '@babel/helper-module-imports': 7.18.6
- '@babel/runtime': 7.21.0
- '@emotion/hash': 0.9.0
- '@emotion/memoize': 0.8.0
- '@emotion/serialize': 1.1.1
- babel-plugin-macros: 3.1.0
- convert-source-map: 1.9.0
- escape-string-regexp: 4.0.0
- find-root: 1.1.0
- source-map: 0.5.7
- stylis: 4.1.3
- dev: false
+ '@babel/types@7.24.7':
+ resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==}
+ engines: {node: '>=6.9.0'}
- /@emotion/cache@11.10.5:
- resolution: {integrity: sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==}
- dependencies:
- '@emotion/memoize': 0.8.0
- '@emotion/sheet': 1.2.1
- '@emotion/utils': 1.2.0
- '@emotion/weak-memoize': 0.3.0
- stylis: 4.1.3
- dev: false
+ '@cspotcode/source-map-support@0.8.1':
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
- /@emotion/hash@0.9.0:
- resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==}
- dev: false
+ '@emotion/babel-plugin@11.11.0':
+ resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==}
- /@emotion/is-prop-valid@1.2.0:
- resolution: {integrity: sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==}
- dependencies:
- '@emotion/memoize': 0.8.0
- dev: false
+ '@emotion/cache@11.11.0':
+ resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==}
- /@emotion/memoize@0.8.0:
- resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==}
- dev: false
+ '@emotion/hash@0.9.1':
+ resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==}
- /@emotion/react@11.10.6(@types/react@18.0.28)(react@18.2.0):
- resolution: {integrity: sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==}
+ '@emotion/is-prop-valid@1.2.2':
+ resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==}
+
+ '@emotion/memoize@0.8.1':
+ resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==}
+
+ '@emotion/react@11.11.4':
+ resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==}
peerDependencies:
'@types/react': '*'
react: '>=16.8.0'
peerDependenciesMeta:
'@types/react':
optional: true
- dependencies:
- '@babel/runtime': 7.21.0
- '@emotion/babel-plugin': 11.10.6
- '@emotion/cache': 11.10.5
- '@emotion/serialize': 1.1.1
- '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0)
- '@emotion/utils': 1.2.0
- '@emotion/weak-memoize': 0.3.0
- '@types/react': 18.0.28
- hoist-non-react-statics: 3.3.2
- react: 18.2.0
- dev: false
- /@emotion/serialize@1.1.1:
- resolution: {integrity: sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==}
- dependencies:
- '@emotion/hash': 0.9.0
- '@emotion/memoize': 0.8.0
- '@emotion/unitless': 0.8.0
- '@emotion/utils': 1.2.0
- csstype: 3.1.1
- dev: false
+ '@emotion/serialize@1.1.4':
+ resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==}
- /@emotion/sheet@1.2.1:
- resolution: {integrity: sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==}
- dev: false
+ '@emotion/sheet@1.2.2':
+ resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==}
- /@emotion/styled@11.10.6(@emotion/react@11.10.6)(@types/react@18.0.28)(react@18.2.0):
- resolution: {integrity: sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==}
+ '@emotion/styled@11.11.5':
+ resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==}
peerDependencies:
'@emotion/react': ^11.0.0-rc.0
'@types/react': '*'
@@ -355,110 +475,97 @@ packages:
peerDependenciesMeta:
'@types/react':
optional: true
- dependencies:
- '@babel/runtime': 7.21.0
- '@emotion/babel-plugin': 11.10.6
- '@emotion/is-prop-valid': 1.2.0
- '@emotion/react': 11.10.6(@types/react@18.0.28)(react@18.2.0)
- '@emotion/serialize': 1.1.1
- '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0)
- '@emotion/utils': 1.2.0
- '@types/react': 18.0.28
- react: 18.2.0
- dev: false
- /@emotion/stylis@0.8.5:
+ '@emotion/stylis@0.8.5':
resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==}
- dev: false
- /@emotion/unitless@0.7.5:
+ '@emotion/unitless@0.7.5':
resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==}
- dev: false
- /@emotion/unitless@0.8.0:
- resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==}
- dev: false
+ '@emotion/unitless@0.8.1':
+ resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==}
- /@emotion/use-insertion-effect-with-fallbacks@1.0.0(react@18.2.0):
- resolution: {integrity: sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==}
+ '@emotion/use-insertion-effect-with-fallbacks@1.0.1':
+ resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==}
peerDependencies:
react: '>=16.8.0'
- dependencies:
- react: 18.2.0
- dev: false
- /@emotion/utils@1.2.0:
- resolution: {integrity: sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==}
- dev: false
+ '@emotion/utils@1.2.1':
+ resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==}
- /@emotion/weak-memoize@0.3.0:
- resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==}
- dev: false
+ '@emotion/weak-memoize@0.3.1':
+ resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==}
- /@eslint/eslintrc@1.4.1:
+ '@eslint/eslintrc@1.4.1':
resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dependencies:
- ajv: 6.12.6
- debug: 4.3.4(supports-color@5.5.0)
- espree: 9.5.0
- globals: 13.20.0
- ignore: 5.2.4
- import-fresh: 3.3.0
- js-yaml: 4.1.0
- minimatch: 3.1.2
- strip-json-comments: 3.1.1
- transitivePeerDependencies:
- - supports-color
- dev: true
- /@humanwhocodes/config-array@0.9.5:
+ '@floating-ui/core@1.6.4':
+ resolution: {integrity: sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==}
+
+ '@floating-ui/dom@1.6.7':
+ resolution: {integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==}
+
+ '@floating-ui/react-dom@2.1.1':
+ resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/utils@0.2.4':
+ resolution: {integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==}
+
+ '@headlessui/react@1.7.19':
+ resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: ^16 || ^17 || ^18
+ react-dom: ^16 || ^17 || ^18
+
+ '@heroicons/react@2.1.4':
+ resolution: {integrity: sha512-ju0wj0wwrUTMQ2Yceyrma7TKuI3BpSjp+qKqV81K9KGcUHdvTMdiwfRc2cwXBp3uXtKuDZkh0v03nWOQnJFv2Q==}
+ peerDependencies:
+ react: '>= 16'
+
+ '@humanwhocodes/config-array@0.9.5':
resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==}
engines: {node: '>=10.10.0'}
- dependencies:
- '@humanwhocodes/object-schema': 1.2.1
- debug: 4.3.4(supports-color@5.5.0)
- minimatch: 3.1.2
- transitivePeerDependencies:
- - supports-color
- dev: true
+ deprecated: Use @eslint/config-array instead
- /@humanwhocodes/object-schema@1.2.1:
+ '@humanwhocodes/object-schema@1.2.1':
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
- dev: true
+ deprecated: Use @eslint/object-schema instead
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
- /@jridgewell/gen-mapping@0.3.2:
- resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==}
+ '@jridgewell/gen-mapping@0.3.5':
+ resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
engines: {node: '>=6.0.0'}
- dependencies:
- '@jridgewell/set-array': 1.1.2
- '@jridgewell/sourcemap-codec': 1.4.14
- '@jridgewell/trace-mapping': 0.3.17
- dev: false
- /@jridgewell/resolve-uri@3.1.0:
- resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
- dev: false
- /@jridgewell/set-array@1.1.2:
- resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+ '@jridgewell/set-array@1.2.1':
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
engines: {node: '>=6.0.0'}
- dev: false
- /@jridgewell/sourcemap-codec@1.4.14:
- resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
- dev: false
+ '@jridgewell/sourcemap-codec@1.4.15':
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
- /@jridgewell/trace-mapping@0.3.17:
- resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
- dependencies:
- '@jridgewell/resolve-uri': 3.1.0
- '@jridgewell/sourcemap-codec': 1.4.14
- dev: false
+ '@jridgewell/trace-mapping@0.3.25':
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+ '@jridgewell/trace-mapping@0.3.9':
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
- /@mui/base@5.0.0-alpha.122(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-IgZEFQyHa39J1+Q3tekVdhPuUm1fr3icddaNLmiAIeYTVXmR7KR5FhBAIL0P+4shlPq0liUPGlXryoTm0iCeFg==}
+ '@js-joda/core@5.6.3':
+ resolution: {integrity: sha512-T1rRxzdqkEXcou0ZprN1q9yDRlvzCPLqmlNt5IIsGBzoEVgLCCYrKEwc84+TvsXuAc95VAZwtWD2zVsKPY4bcA==}
+
+ '@mui/base@5.0.0-beta.40':
+ resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@types/react': ^17.0.0 || ^18.0.0
@@ -467,26 +574,12 @@ packages:
peerDependenciesMeta:
'@types/react':
optional: true
- dependencies:
- '@babel/runtime': 7.21.0
- '@emotion/is-prop-valid': 1.2.0
- '@mui/types': 7.2.3(@types/react@18.0.28)
- '@mui/utils': 5.11.13(react@18.2.0)
- '@popperjs/core': 2.11.7
- '@types/react': 18.0.28
- clsx: 1.2.1
- prop-types: 15.8.1
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- react-is: 18.2.0
- dev: false
- /@mui/core-downloads-tracker@5.11.14:
- resolution: {integrity: sha512-rfc08z6+3Fif+Gopx2/qmk+MEQlwYeA+gOcSK048BHkTty/ol/boHuVeL2BNC/cf9OVRjJLYHtVb/DeW791LSQ==}
- dev: false
+ '@mui/core-downloads-tracker@5.16.0':
+ resolution: {integrity: sha512-8SLffXYPRVpcZx5QzxNE8fytTqzp+IuU3deZbQWg/vSaTlDpR5YVrQ4qQtXTi5cRdhOufV5INylmwlKK+//nPw==}
- /@mui/material@5.11.14(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-uoiUyybmo+M+nYARBygmbXgX6s/hH0NKD56LCAv9XvmdGVoXhEGjOvxI5/Bng6FS3NNybnA8V+rgZW1Z/9OJtA==}
+ '@mui/material@5.16.0':
+ resolution: {integrity: sha512-DbR1NckTLpjt9Zut9EGQ70th86HfN0BYQgyYro6aXQrNfjzSwe3BJS1AyBQ5mJ7TdL6YVRqohfukxj9JlqZZUg==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
@@ -501,28 +594,9 @@ packages:
optional: true
'@types/react':
optional: true
- dependencies:
- '@babel/runtime': 7.21.0
- '@emotion/react': 11.10.6(@types/react@18.0.28)(react@18.2.0)
- '@emotion/styled': 11.10.6(@emotion/react@11.10.6)(@types/react@18.0.28)(react@18.2.0)
- '@mui/base': 5.0.0-alpha.122(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0)
- '@mui/core-downloads-tracker': 5.11.14
- '@mui/system': 5.11.14(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.0.28)(react@18.2.0)
- '@mui/types': 7.2.3(@types/react@18.0.28)
- '@mui/utils': 5.11.13(react@18.2.0)
- '@types/react': 18.0.28
- '@types/react-transition-group': 4.4.5
- clsx: 1.2.1
- csstype: 3.1.1
- prop-types: 15.8.1
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- react-is: 18.2.0
- react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0)
- dev: false
-
- /@mui/private-theming@5.11.13(@types/react@18.0.28)(react@18.2.0):
- resolution: {integrity: sha512-PJnYNKzW5LIx3R+Zsp6WZVPs6w5sEKJ7mgLNnUXuYB1zo5aX71FVLtV7geyPXRcaN2tsoRNK7h444ED0t7cIjA==}
+
+ '@mui/private-theming@5.16.0':
+ resolution: {integrity: sha512-sYpubkO1MZOnxNyVOClrPNOTs0MfuRVVnAvCeMaOaXt6GimgQbnUcshYv2pSr6PFj+Mqzdff/FYOBceK8u5QgA==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@types/react': ^17.0.0 || ^18.0.0
@@ -530,16 +604,9 @@ packages:
peerDependenciesMeta:
'@types/react':
optional: true
- dependencies:
- '@babel/runtime': 7.21.0
- '@mui/utils': 5.11.13(react@18.2.0)
- '@types/react': 18.0.28
- prop-types: 15.8.1
- react: 18.2.0
- dev: false
- /@mui/styled-engine-sc@5.11.11(styled-components@5.3.9):
- resolution: {integrity: sha512-6+HsfcKHlhjQklDoEup7Itl+Xgn+BCsqEpIdIIhlxED4YlOZ38xghxIKrx78XFZznTorbhAspUgDDKIaB5vDMg==}
+ '@mui/styled-engine-sc@5.14.12':
+ resolution: {integrity: sha512-FQ5KDd17OkRurE0ljR4Pddekv1uPSoJxcBqXa9tdoOETGULVCefM5Gd9CRGzT+alNPDyHBoUeEYKulIkDN9ytA==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@types/styled-components': ^5.1.14
@@ -547,14 +614,9 @@ packages:
peerDependenciesMeta:
'@types/styled-components':
optional: true
- dependencies:
- '@babel/runtime': 7.21.0
- prop-types: 15.8.1
- styled-components: 5.3.9(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)
- dev: false
- /@mui/styled-engine@5.11.11(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0):
- resolution: {integrity: sha512-wV0UgW4lN5FkDBXefN8eTYeuE9sjyQdg5h94vtwZCUamGQEzmCOtir4AakgmbWMy0x8OLjdEUESn9wnf5J9MOg==}
+ '@mui/styled-engine@5.15.14':
+ resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@emotion/react': ^11.4.1
@@ -565,18 +627,9 @@ packages:
optional: true
'@emotion/styled':
optional: true
- dependencies:
- '@babel/runtime': 7.21.0
- '@emotion/cache': 11.10.5
- '@emotion/react': 11.10.6(@types/react@18.0.28)(react@18.2.0)
- '@emotion/styled': 11.10.6(@emotion/react@11.10.6)(@types/react@18.0.28)(react@18.2.0)
- csstype: 3.1.1
- prop-types: 15.8.1
- react: 18.2.0
- dev: false
- /@mui/system@5.11.14(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.0.28)(react@18.2.0):
- resolution: {integrity: sha512-/MBv5dUoijJNEKEGi5tppIszGN0o2uejmeISi5vl0CLcaQsI1cd+uBgK+JYUP1VWvI/MtkWRLVSWtF2FWhu5Nw==}
+ '@mui/system@5.16.0':
+ resolution: {integrity: sha512-9YbkC2m3+pNumAvubYv+ijLtog6puJ0fJ6rYfzfLCM47pWrw3m+30nXNM8zMgDaKL6vpfWJcCXm+LPaWBpy7sw==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
@@ -590,1444 +643,5594 @@ packages:
optional: true
'@types/react':
optional: true
- dependencies:
- '@babel/runtime': 7.21.0
- '@emotion/react': 11.10.6(@types/react@18.0.28)(react@18.2.0)
- '@emotion/styled': 11.10.6(@emotion/react@11.10.6)(@types/react@18.0.28)(react@18.2.0)
- '@mui/private-theming': 5.11.13(@types/react@18.0.28)(react@18.2.0)
- '@mui/styled-engine': 5.11.11(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0)
- '@mui/types': 7.2.3(@types/react@18.0.28)
- '@mui/utils': 5.11.13(react@18.2.0)
- '@types/react': 18.0.28
- clsx: 1.2.1
- csstype: 3.1.1
- prop-types: 15.8.1
- react: 18.2.0
- dev: false
- /@mui/types@7.2.3(@types/react@18.0.28):
- resolution: {integrity: sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==}
+ '@mui/types@7.2.14':
+ resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==}
peerDependencies:
- '@types/react': '*'
+ '@types/react': ^17.0.0 || ^18.0.0
peerDependenciesMeta:
'@types/react':
optional: true
- dependencies:
- '@types/react': 18.0.28
- dev: false
- /@mui/utils@5.11.13(react@18.2.0):
- resolution: {integrity: sha512-5ltA58MM9euOuUcnvwFJqpLdEugc9XFsRR8Gt4zZNb31XzMfSKJPR4eumulyhsOTK1rWf7K4D63NKFPfX0AxqA==}
+ '@mui/utils@5.16.0':
+ resolution: {integrity: sha512-kLLi5J1xY+mwtUlMb8Ubdxf4qFAA1+U7WPBvjM/qQ4CIwLCohNb0sHo1oYPufjSIH/Z9+dhVxD7dJlfGjd1AVA==}
engines: {node: '>=12.0.0'}
peerDependencies:
+ '@types/react': ^17.0.0 || ^18.0.0
react: ^17.0.0 || ^18.0.0
- dependencies:
- '@babel/runtime': 7.21.0
- '@types/prop-types': 15.7.5
- '@types/react-is': 17.0.3
- prop-types: 15.8.1
- react: 18.2.0
- react-is: 18.2.0
- dev: false
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
- /@nem035/gpt-3-encoder@1.1.7:
+ '@nem035/gpt-3-encoder@1.1.7':
resolution: {integrity: sha512-dtOenP4ZAmsKXkobTDUCcbkQvPJbuJ6Kp/LHqWDYLK//XNgGs3Re8ymcQzyVhtph8JckdI3K8FR5Q+6mX7HnpQ==}
- dev: true
-
- /@next/env@13.2.4:
- resolution: {integrity: sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==}
- dev: false
- /@next/eslint-plugin-next@12.2.3:
- resolution: {integrity: sha512-B2e8Yg1MpuLsGxhCx4rU8/Tcnr5wFmCx1O2eyLXBPnaCcsFXfGCo067ujagtDLtWASL3GNgzg78U1SB0dbc38A==}
- dependencies:
- glob: 7.1.7
- dev: true
+ '@next-auth/prisma-adapter@1.0.7':
+ resolution: {integrity: sha512-Cdko4KfcmKjsyHFrWwZ//lfLUbcLqlyFqjd/nYE2m3aZ7tjMNUjpks47iw7NTCnXf+5UWz5Ypyt1dSs1EP5QJw==}
+ peerDependencies:
+ '@prisma/client': '>=2.26.0 || >=3'
+ next-auth: ^4
- /@next/swc-android-arm-eabi@13.2.4:
- resolution: {integrity: sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==}
- engines: {node: '>= 10'}
- cpu: [arm]
- os: [android]
- requiresBuild: true
- dev: false
- optional: true
+ '@next/env@13.5.6':
+ resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==}
- /@next/swc-android-arm64@13.2.4:
- resolution: {integrity: sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: false
- optional: true
+ '@next/eslint-plugin-next@12.2.3':
+ resolution: {integrity: sha512-B2e8Yg1MpuLsGxhCx4rU8/Tcnr5wFmCx1O2eyLXBPnaCcsFXfGCo067ujagtDLtWASL3GNgzg78U1SB0dbc38A==}
- /@next/swc-darwin-arm64@13.2.4:
- resolution: {integrity: sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==}
+ '@next/swc-darwin-arm64@13.5.6':
+ resolution: {integrity: sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- requiresBuild: true
- dev: false
- optional: true
- /@next/swc-darwin-x64@13.2.4:
- resolution: {integrity: sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==}
+ '@next/swc-darwin-x64@13.5.6':
+ resolution: {integrity: sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- requiresBuild: true
- dev: false
- optional: true
- /@next/swc-freebsd-x64@13.2.4:
- resolution: {integrity: sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [freebsd]
- requiresBuild: true
- dev: false
- optional: true
-
- /@next/swc-linux-arm-gnueabihf@13.2.4:
- resolution: {integrity: sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==}
- engines: {node: '>= 10'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: false
- optional: true
-
- /@next/swc-linux-arm64-gnu@13.2.4:
- resolution: {integrity: sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==}
+ '@next/swc-linux-arm64-gnu@13.5.6':
+ resolution: {integrity: sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- requiresBuild: true
- dev: false
- optional: true
- /@next/swc-linux-arm64-musl@13.2.4:
- resolution: {integrity: sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==}
+ '@next/swc-linux-arm64-musl@13.5.6':
+ resolution: {integrity: sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- requiresBuild: true
- dev: false
- optional: true
- /@next/swc-linux-x64-gnu@13.2.4:
- resolution: {integrity: sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==}
+ '@next/swc-linux-x64-gnu@13.5.6':
+ resolution: {integrity: sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- requiresBuild: true
- dev: false
- optional: true
- /@next/swc-linux-x64-musl@13.2.4:
- resolution: {integrity: sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==}
+ '@next/swc-linux-x64-musl@13.5.6':
+ resolution: {integrity: sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- requiresBuild: true
- dev: false
- optional: true
- /@next/swc-win32-arm64-msvc@13.2.4:
- resolution: {integrity: sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==}
+ '@next/swc-win32-arm64-msvc@13.5.6':
+ resolution: {integrity: sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- requiresBuild: true
- dev: false
- optional: true
- /@next/swc-win32-ia32-msvc@13.2.4:
- resolution: {integrity: sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==}
+ '@next/swc-win32-ia32-msvc@13.5.6':
+ resolution: {integrity: sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
- requiresBuild: true
- dev: false
- optional: true
- /@next/swc-win32-x64-msvc@13.2.4:
- resolution: {integrity: sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==}
+ '@next/swc-win32-x64-msvc@13.5.6':
+ resolution: {integrity: sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
- requiresBuild: true
- dev: false
- optional: true
- /@nodelib/fs.scandir@2.1.5:
+ '@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- run-parallel: 1.2.0
- /@nodelib/fs.stat@2.0.5:
+ '@nodelib/fs.stat@2.0.5':
resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
engines: {node: '>= 8'}
- /@nodelib/fs.walk@1.2.8:
+ '@nodelib/fs.walk@1.2.8':
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
- dependencies:
- '@nodelib/fs.scandir': 2.1.5
- fastq: 1.15.0
- /@popperjs/core@2.11.7:
- resolution: {integrity: sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==}
- dev: false
+ '@panva/hkdf@1.2.1':
+ resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==}
- /@rushstack/eslint-patch@1.2.0:
- resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
- dev: true
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
- /@swc/helpers@0.4.14:
- resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==}
- dependencies:
- tslib: 2.5.0
- dev: false
+ '@popperjs/core@2.11.8':
+ resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
- /@tailwindcss/typography@0.5.9(tailwindcss@3.2.7):
- resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==}
+ '@prisma/client@4.13.0':
+ resolution: {integrity: sha512-YaiiICcRB2hatxsbnfB66uWXjcRw3jsZdlAVxmx0cFcTc/Ad/sKdHCcWSnqyDX47vAewkjRFwiLwrOUjswVvmA==}
+ engines: {node: '>=14.17'}
peerDependencies:
- tailwindcss: '>=3.0.0 || insiders'
- dependencies:
- lodash.castarray: 4.4.0
- lodash.isplainobject: 4.0.6
- lodash.merge: 4.6.2
- postcss-selector-parser: 6.0.10
- tailwindcss: 3.2.7(postcss@8.4.21)
- dev: true
-
- /@tauri-apps/cli-darwin-arm64@1.2.3:
- resolution: {integrity: sha512-phJN3fN8FtZZwqXg08bcxfq1+X1JSDglLvRxOxB7VWPq+O5SuB8uLyssjJsu+PIhyZZnIhTGdjhzLSFhSXfLsw==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
-
- /@tauri-apps/cli-darwin-x64@1.2.3:
- resolution: {integrity: sha512-jFZ/y6z8z6v4yliIbXKBXA7BJgtZVMsITmEXSuD6s5+eCOpDhQxbRkr6CA+FFfr+/r96rWSDSgDenDQuSvPAKw==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: true
- optional: true
+ prisma: '*'
+ peerDependenciesMeta:
+ prisma:
+ optional: true
- /@tauri-apps/cli-linux-arm-gnueabihf@1.2.3:
- resolution: {integrity: sha512-C7h5vqAwXzY0kRGSU00Fj8PudiDWFCiQqqUNI1N+fhCILrzWZB9TPBwdx33ZfXKt/U4+emdIoo/N34v3TiAOmQ==}
- engines: {node: '>= 10'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ '@prisma/engines-version@4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a':
+ resolution: {integrity: sha512-fsQlbkhPJf08JOzKoyoD9atdUijuGBekwoOPZC3YOygXEml1MTtgXVpnUNchQlRSY82OQ6pSGQ9PxUe4arcSLQ==}
- /@tauri-apps/cli-linux-arm64-gnu@1.2.3:
- resolution: {integrity: sha512-buf1c8sdkuUzVDkGPQpyUdAIIdn5r0UgXU6+H5fGPq/Xzt5K69JzXaeo6fHsZEZghbV0hOK+taKV4J0m30UUMQ==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ '@prisma/engines@4.16.2':
+ resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==}
- /@tauri-apps/cli-linux-arm64-musl@1.2.3:
- resolution: {integrity: sha512-x88wPS9W5xAyk392vc4uNHcKBBvCp0wf4H9JFMF9OBwB7vfd59LbQCFcPSu8f0BI7bPrOsyHqspWHuFL8ojQEA==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ '@radix-ui/number@1.0.1':
+ resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==}
- /@tauri-apps/cli-linux-x64-gnu@1.2.3:
- resolution: {integrity: sha512-ZMz1jxEVe0B4/7NJnlPHmwmSIuwiD6ViXKs8F+OWWz2Y4jn5TGxWKFg7DLx5OwQTRvEIZxxT7lXHi5CuTNAxKg==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ '@radix-ui/number@1.1.0':
+ resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==}
- /@tauri-apps/cli-linux-x64-musl@1.2.3:
- resolution: {integrity: sha512-B/az59EjJhdbZDzawEVox0LQu2ZHCZlk8rJf85AMIktIUoAZPFbwyiUv7/zjzA/sY6Nb58OSJgaPL2/IBy7E0A==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
- optional: true
+ '@radix-ui/primitive@1.0.1':
+ resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
- /@tauri-apps/cli-win32-ia32-msvc@1.2.3:
- resolution: {integrity: sha512-ypdO1OdC5ugNJAKO2m3sb1nsd+0TSvMS9Tr5qN/ZSMvtSduaNwrcZ3D7G/iOIanrqu/Nl8t3LYlgPZGBKlw7Ng==}
- engines: {node: '>= 10'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
+ '@radix-ui/primitive@1.1.0':
+ resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==}
- /@tauri-apps/cli-win32-x64-msvc@1.2.3:
- resolution: {integrity: sha512-CsbHQ+XhnV/2csOBBDVfH16cdK00gNyNYUW68isedmqcn8j+s0e9cQ1xXIqi+Hue3awp8g3ImYN5KPepf3UExw==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: true
- optional: true
+ '@radix-ui/react-arrow@1.0.3':
+ resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@tauri-apps/cli@1.2.3:
- resolution: {integrity: sha512-erxtXuPhMEGJPBtnhPILD4AjuT81GZsraqpFvXAmEJZ2p8P6t7MVBifCL8LznRknznM3jn90D3M8RNBP3wcXTw==}
- engines: {node: '>= 10'}
- hasBin: true
- optionalDependencies:
- '@tauri-apps/cli-darwin-arm64': 1.2.3
- '@tauri-apps/cli-darwin-x64': 1.2.3
- '@tauri-apps/cli-linux-arm-gnueabihf': 1.2.3
- '@tauri-apps/cli-linux-arm64-gnu': 1.2.3
- '@tauri-apps/cli-linux-arm64-musl': 1.2.3
- '@tauri-apps/cli-linux-x64-gnu': 1.2.3
- '@tauri-apps/cli-linux-x64-musl': 1.2.3
- '@tauri-apps/cli-win32-ia32-msvc': 1.2.3
- '@tauri-apps/cli-win32-x64-msvc': 1.2.3
- dev: true
+ '@radix-ui/react-arrow@1.1.0':
+ resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@types/debug@4.1.7:
- resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==}
- dependencies:
- '@types/ms': 0.7.31
- dev: false
+ '@radix-ui/react-checkbox@1.1.1':
+ resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@types/hast@2.3.4:
- resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==}
- dependencies:
- '@types/unist': 2.0.6
+ '@radix-ui/react-collection@1.0.3':
+ resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
- /@types/js-cookie@2.2.7:
- resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==}
- dev: false
+ '@radix-ui/react-collection@1.1.0':
+ resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-compose-refs@1.0.1':
+ resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-compose-refs@1.1.0':
+ resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-context@1.0.1':
+ resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-context@1.1.0':
+ resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-direction@1.0.1':
+ resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-direction@1.1.0':
+ resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-dismissable-layer@1.0.4':
+ resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-dismissable-layer@1.1.0':
+ resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-dropdown-menu@2.1.1':
+ resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-focus-guards@1.0.1':
+ resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-focus-guards@1.1.0':
+ resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-focus-scope@1.0.3':
+ resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-focus-scope@1.1.0':
+ resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-icons@1.3.0':
+ resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==}
+ peerDependencies:
+ react: ^16.x || ^17.x || ^18.x
+
+ '@radix-ui/react-id@1.0.1':
+ resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-id@1.1.0':
+ resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-menu@2.1.1':
+ resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-popover@1.1.1':
+ resolution: {integrity: sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-popper@1.1.2':
+ resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-popper@1.2.0':
+ resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-portal@1.0.3':
+ resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-portal@1.1.1':
+ resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-presence@1.1.0':
+ resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-primitive@1.0.3':
+ resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-primitive@2.0.0':
+ resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-roving-focus@1.1.0':
+ resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-scroll-area@1.1.0':
+ resolution: {integrity: sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-select@1.2.2':
+ resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-slot@1.0.2':
+ resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-slot@1.1.0':
+ resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-tooltip@1.1.2':
+ resolution: {integrity: sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-use-callback-ref@1.0.1':
+ resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-callback-ref@1.1.0':
+ resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-controllable-state@1.0.1':
+ resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-controllable-state@1.1.0':
+ resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-escape-keydown@1.0.3':
+ resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-escape-keydown@1.1.0':
+ resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-layout-effect@1.0.1':
+ resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-layout-effect@1.1.0':
+ resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-previous@1.0.1':
+ resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-previous@1.1.0':
+ resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-rect@1.0.1':
+ resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-rect@1.1.0':
+ resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-size@1.0.1':
+ resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-size@1.1.0':
+ resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-visually-hidden@1.0.3':
+ resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-visually-hidden@1.1.0':
+ resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/rect@1.0.1':
+ resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==}
+
+ '@radix-ui/rect@1.1.0':
+ resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
+
+ '@rushstack/eslint-patch@1.10.3':
+ resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==}
+
+ '@stripe/stripe-js@1.54.2':
+ resolution: {integrity: sha512-R1PwtDvUfs99cAjfuQ/WpwJ3c92+DAMy9xGApjqlWQMj0FKQabUAys2swfTRNzuYAYJh7NqK2dzcYVNkKLEKUg==}
+
+ '@swc/helpers@0.5.2':
+ resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==}
+
+ '@tailwindcss/typography@0.5.13':
+ resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders'
+
+ '@tanem/svg-injector@10.1.68':
+ resolution: {integrity: sha512-UkJajeR44u73ujtr5GVSbIlELDWD/mzjqWe54YMK61ljKxFcJoPd9RBSaO7xj02ISCWUqJW99GjrS+sVF0UnrA==}
+
+ '@tanstack/react-virtual@3.8.1':
+ resolution: {integrity: sha512-dP5a7giEM4BQWLJ7K07ToZv8rF51mzbrBMkf0scg1QNYuFx3utnPUBPUHdzaowZhIez1K2XS78amuzD+YGRA5Q==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+ '@tanstack/virtual-core@3.8.1':
+ resolution: {integrity: sha512-uNtAwenT276M9QYCjTBoHZ8X3MUeCRoGK59zPi92hMIxdfS9AyHjkDWJ94WroDxnv48UE+hIeo21BU84jKc8aQ==}
+
+ '@tediousjs/connection-string@0.5.0':
+ resolution: {integrity: sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ==}
+
+ '@tsconfig/node10@1.0.11':
+ resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
+
+ '@tsconfig/node12@1.0.11':
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+
+ '@tsconfig/node14@1.0.3':
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+
+ '@tsconfig/node16@1.0.4':
+ resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+ '@types/hast@2.3.10':
+ resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
+
+ '@types/js-cookie@2.2.7':
+ resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==}
+
+ '@types/json5@0.0.29':
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+ '@types/lodash-es@4.17.12':
+ resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+ '@types/lodash@4.17.6':
+ resolution: {integrity: sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==}
+
+ '@types/mdast@3.0.15':
+ resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==}
+
+ '@types/micro-cors@0.1.5':
+ resolution: {integrity: sha512-BTHpXEz+yC/7/Jv2BfDFbGtgnwdKUDVX2PY+Cd2k4Jx9+uUfVooAxhlGEy6p0Uvm0+yM5FgSyc1n2tdVHyCDbw==}
+
+ '@types/micro@7.3.7':
+ resolution: {integrity: sha512-MFsX7eCj0Tg3TtphOQvANNvNtFpya+s/rYOCdV6o+DFjOQPFi2EVRbBALjbbgZTXUaJP1Q281MJiJOD40d0UxQ==}
+
+ '@types/ms@0.7.34':
+ resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+
+ '@types/mssql@8.1.2':
+ resolution: {integrity: sha512-hoDM+mZUClfXu0J1pyVdbhv2Ve0dl0TdagAE3M5rd1slqoVEEHuNObPD+giwtJgyo99CcS58qbF9ektVKdxSfQ==}
+
+ '@types/node@18.19.39':
+ resolution: {integrity: sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==}
+
+ '@types/parse-json@4.0.2':
+ resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
+
+ '@types/pg@8.11.6':
+ resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==}
+
+ '@types/prop-types@15.7.12':
+ resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==}
+
+ '@types/react-dom@18.3.0':
+ resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==}
+
+ '@types/react-syntax-highlighter@15.5.13':
+ resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==}
+
+ '@types/react-transition-group@4.4.10':
+ resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==}
+
+ '@types/react@18.3.3':
+ resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==}
+
+ '@types/request-ip@0.0.37':
+ resolution: {integrity: sha512-uw6/i3rQnpznxD7LtLaeuZytLhKZK6bRoTS6XVJlwxIOoOpEBU7bgKoVXDNtOg4Xl6riUKHa9bjMVrL6ESqYlQ==}
+
+ '@types/tedious@4.0.14':
+ resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==}
+
+ '@types/unist@2.0.10':
+ resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
+
+ '@types/uuid@9.0.8':
+ resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==}
+
+ '@typescript-eslint/parser@5.62.0':
+ resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/scope-manager@5.62.0':
+ resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@typescript-eslint/types@5.62.0':
+ resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@typescript-eslint/typescript-estree@5.62.0':
+ resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/visitor-keys@5.62.0':
+ resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@vercel/analytics@0.1.11':
+ resolution: {integrity: sha512-mj5CPR02y0BRs1tN3oZcBNAX9a8NxsIUl9vElDPcqxnMfP0RbRc9fI9Ud7+QDg/1Izvt5uMumsr+6YsmVHcyuw==}
+ peerDependencies:
+ react: ^16.8||^17||^18
+
+ '@xobotyi/scrollbar-width@1.9.5':
+ resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn-walk@8.3.3:
+ resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==}
+ engines: {node: '>=0.4.0'}
+
+ acorn@8.12.1:
+ resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ agent-base@7.1.1:
+ resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
+ engines: {node: '>= 14'}
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.0.1:
+ resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ engines: {node: '>=12'}
+
+ ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+
+ any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ arg@4.1.0:
+ resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==}
+
+ arg@4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+
+ arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-hidden@1.2.4:
+ resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
+ engines: {node: '>=10'}
+
+ aria-query@5.1.3:
+ resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
+
+ array-buffer-byte-length@1.0.1:
+ resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
+ engines: {node: '>= 0.4'}
+
+ array-includes@3.1.8:
+ resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
+ engines: {node: '>= 0.4'}
+
+ array-union@2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+
+ array.prototype.findlast@1.2.5:
+ resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.findlastindex@1.2.5:
+ resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flat@1.3.2:
+ resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flatmap@1.3.2:
+ resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.toreversed@1.1.2:
+ resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==}
+
+ array.prototype.tosorted@1.1.4:
+ resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
+ engines: {node: '>= 0.4'}
+
+ arraybuffer.prototype.slice@1.0.3:
+ resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
+ engines: {node: '>= 0.4'}
+
+ ast-types-flow@0.0.8:
+ resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ autoprefixer@10.4.19:
+ resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+
+ axe-core@4.9.1:
+ resolution: {integrity: sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==}
+ engines: {node: '>=4'}
+
+ axios@1.7.2:
+ resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==}
+
+ axobject-query@3.1.1:
+ resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==}
+
+ babel-plugin-macros@3.1.0:
+ resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
+ engines: {node: '>=10', npm: '>=6'}
+
+ babel-plugin-styled-components@2.1.4:
+ resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==}
+ peerDependencies:
+ styled-components: '>= 2'
+
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ bl@5.1.0:
+ resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==}
+
+ brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+ brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.23.1:
+ resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ buffer-equal-constant-time@1.0.1:
+ resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
+
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+ busboy@1.6.0:
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+ engines: {node: '>=10.16.0'}
+
+ bytes@3.1.0:
+ resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==}
+ engines: {node: '>= 0.8'}
+
+ call-bind@1.0.7:
+ resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelcase-css@2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+ engines: {node: '>= 6'}
+
+ camelize@1.0.1:
+ resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
+
+ caniuse-lite@1.0.30001640:
+ resolution: {integrity: sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==}
+
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
+ chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ character-entities-legacy@1.1.4:
+ resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==}
+
+ character-entities@1.2.4:
+ resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==}
+
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
+ character-reference-invalid@1.1.4:
+ resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ comma-separated-tokens@1.0.8:
+ resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==}
+
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+ commander@11.1.0:
+ resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
+ engines: {node: '>=16'}
+
+ commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ content-type@1.0.4:
+ resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==}
+ engines: {node: '>= 0.6'}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ convert-source-map@1.9.0:
+ resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cookie@0.5.0:
+ resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
+ engines: {node: '>= 0.6'}
+
+ copy-to-clipboard@3.3.3:
+ resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
+
+ cosmiconfig@7.1.0:
+ resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+ engines: {node: '>=10'}
+
+ create-require@1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+
+ cross-spawn@7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+
+ css-color-keywords@1.0.0:
+ resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
+ engines: {node: '>=4'}
+
+ css-in-js-utils@3.1.0:
+ resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==}
+
+ css-to-react-native@3.2.0:
+ resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
+
+ css-tree@1.1.3:
+ resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
+ engines: {node: '>=8.0.0'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ damerau-levenshtein@1.0.8:
+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+
+ data-view-buffer@1.0.1:
+ resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-length@1.0.1:
+ resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-offset@1.0.0:
+ resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
+ engines: {node: '>= 0.4'}
+
+ dayjs@1.11.11:
+ resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==}
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.3.5:
+ resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decode-named-character-reference@1.0.2:
+ resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+
+ deep-equal@2.2.3:
+ resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==}
+ engines: {node: '>= 0.4'}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+
+ define-lazy-prop@2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ denque@2.1.0:
+ resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
+ engines: {node: '>=0.10'}
+
+ depd@1.1.2:
+ resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==}
+ engines: {node: '>= 0.6'}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ detect-node-es@1.1.0:
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+
+ didyoumean@1.2.2:
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+
+ diff@4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+
+ diff@5.2.0:
+ resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
+ engines: {node: '>=0.3.1'}
+
+ dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+
+ dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+ doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+
+ doctrine@3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+
+ dom-helpers@5.2.1:
+ resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ ecdsa-sig-formatter@1.0.11:
+ resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+
+ electron-to-chromium@1.4.816:
+ resolution: {integrity: sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ env-cmd@10.1.0:
+ resolution: {integrity: sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==}
+ engines: {node: '>=8.0.0'}
+ hasBin: true
+
+ error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+ error-stack-parser@2.1.4:
+ resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==}
+
+ es-abstract@1.23.3:
+ resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==}
+ engines: {node: '>= 0.4'}
+
+ es-aggregate-error@1.0.13:
+ resolution: {integrity: sha512-KkzhUUuD2CUMqEc8JEqsXEMDHzDPE8RCjZeUBitsnB1eNcAJWQPiciKsMXe3Yytj4Flw1XLl46Qcf9OxvZha7A==}
+ engines: {node: '>= 0.4'}
+
+ es-define-property@1.0.0:
+ resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-get-iterator@1.1.3:
+ resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
+
+ es-iterator-helpers@1.0.19:
+ resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.0.0:
+ resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.0.3:
+ resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
+ engines: {node: '>= 0.4'}
+
+ es-shim-unscopables@1.0.2:
+ resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
+
+ es-to-primitive@1.2.1:
+ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+ engines: {node: '>= 0.4'}
+
+ escalade@3.1.2:
+ resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ eslint-config-next@12.2.3:
+ resolution: {integrity: sha512-xAQqAqwa2bu9ZMRypz58ym4tNCo22Wc6LuoLpbpf3yW5c4ZkVib9934AgGDDvh2zKrP56Z6X0Pp6gNnuuZzcRw==}
+ peerDependencies:
+ eslint: ^7.23.0 || ^8.0.0
+ typescript: '>=3.3.1'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ eslint-config-prettier@8.10.0:
+ resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+
+ eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+ eslint-import-resolver-typescript@2.7.1:
+ resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+
+ eslint-module-utils@2.8.1:
+ resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+
+ eslint-plugin-import@2.29.1:
+ resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+
+ eslint-plugin-jsx-a11y@6.9.0:
+ resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+
+ eslint-plugin-prettier@4.2.1:
+ resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ eslint: '>=7.28.0'
+ eslint-config-prettier: '*'
+ prettier: '>=2.0.0'
+ peerDependenciesMeta:
+ eslint-config-prettier:
+ optional: true
+
+ eslint-plugin-react-hooks@4.6.2:
+ resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+
+ eslint-plugin-react@7.34.3:
+ resolution: {integrity: sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+
+ eslint-scope@7.2.2:
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-utils@3.0.0:
+ resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
+ engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
+ peerDependencies:
+ eslint: '>=5'
+
+ eslint-visitor-keys@2.1.0:
+ resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
+ engines: {node: '>=10'}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint@8.20.0:
+ resolution: {integrity: sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ hasBin: true
+
+ espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ esquery@1.5.0:
+ resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ eventsource-parser@1.1.2:
+ resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==}
+ engines: {node: '>=14.18'}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-diff@1.3.0:
+ resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+
+ fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fast-shallow-equal@1.0.0:
+ resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==}
+
+ fastest-stable-stringify@2.0.2:
+ resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==}
+
+ fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+
+ fault@1.0.4:
+ resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==}
+
+ file-entry-cache@6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ find-root@1.1.0:
+ resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
+
+ flat-cache@3.2.0:
+ resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+
+ flatted@3.3.1:
+ resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
+
+ follow-redirects@1.15.6:
+ resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ for-each@0.3.3:
+ resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+
+ foreground-child@3.2.1:
+ resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==}
+ engines: {node: '>=14'}
+
+ form-data@4.0.0:
+ resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+ engines: {node: '>= 6'}
+
+ format@0.2.2:
+ resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
+ engines: {node: '>=0.4.x'}
+
+ fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.1.6:
+ resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
+ engines: {node: '>= 0.4'}
+
+ functional-red-black-tree@1.0.1:
+ resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ generate-function@2.3.1:
+ resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-intrinsic@1.2.4:
+ resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+ engines: {node: '>= 0.4'}
+
+ get-nonce@1.0.1:
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
+ engines: {node: '>=6'}
+
+ get-symbol-description@1.0.2:
+ resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
+ engines: {node: '>= 0.4'}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob-to-regexp@0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
+ glob@10.4.2:
+ resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==}
+ engines: {node: '>=16 || 14 >=14.18'}
+ hasBin: true
+
+ glob@7.1.7:
+ resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ globals@13.24.0:
+ resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
+ engines: {node: '>=8'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+
+ goober@2.1.14:
+ resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==}
+ peerDependencies:
+ csstype: ^3.0.10
+
+ gopd@1.0.1:
+ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ has-bigints@1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+
+ has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+ has-proto@1.0.3:
+ resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ hast-util-parse-selector@2.2.5:
+ resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==}
+
+ hast-util-whitespace@2.0.1:
+ resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==}
+
+ hastscript@6.0.0:
+ resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==}
+
+ highlight.js@10.7.3:
+ resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
+
+ highlight.js@11.9.0:
+ resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==}
+ engines: {node: '>=12.0.0'}
+
+ hoist-non-react-statics@3.3.2:
+ resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+
+ html-parse-stringify@3.0.1:
+ resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==}
+
+ http-errors@1.7.3:
+ resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==}
+ engines: {node: '>= 0.6'}
+
+ http-proxy-agent@7.0.2:
+ resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
+ engines: {node: '>= 14'}
+
+ https-proxy-agent@7.0.5:
+ resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
+ engines: {node: '>= 14'}
+
+ hyphenate-style-name@1.1.0:
+ resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==}
+
+ i18next@22.5.1:
+ resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==}
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ ignore@5.3.1:
+ resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ inline-style-parser@0.1.1:
+ resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
+
+ inline-style-prefixer@7.0.1:
+ resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==}
+
+ internal-slot@1.0.7:
+ resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
+ engines: {node: '>= 0.4'}
+
+ invariant@2.2.4:
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+
+ is-alphabetical@1.0.4:
+ resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
+
+ is-alphanumerical@1.0.4:
+ resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==}
+
+ is-arguments@1.1.1:
+ resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
+ engines: {node: '>= 0.4'}
+
+ is-array-buffer@3.0.4:
+ resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
+ engines: {node: '>= 0.4'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-async-function@2.0.0:
+ resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==}
+ engines: {node: '>= 0.4'}
+
+ is-bigint@1.0.4:
+ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-boolean-object@1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+
+ is-buffer@2.0.5:
+ resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==}
+ engines: {node: '>=4'}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.14.0:
+ resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==}
+ engines: {node: '>= 0.4'}
+
+ is-data-view@1.0.1:
+ resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
+ engines: {node: '>= 0.4'}
+
+ is-date-object@1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+
+ is-decimal@1.0.4:
+ resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
+
+ is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-finalizationregistry@1.0.2:
+ resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-generator-function@1.0.10:
+ resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
+ engines: {node: '>= 0.4'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-hexadecimal@1.0.4:
+ resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==}
+
+ is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+
+ is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+
+ is-number-object@1.0.7:
+ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+ engines: {node: '>= 0.4'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
+ is-property@1.0.2:
+ resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==}
+
+ is-regex@1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
+
+ is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+
+ is-shared-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
+ engines: {node: '>= 0.4'}
+
+ is-string@1.0.7:
+ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+ engines: {node: '>= 0.4'}
+
+ is-symbol@1.0.4:
+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+ engines: {node: '>= 0.4'}
+
+ is-typed-array@1.1.13:
+ resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
+ engines: {node: '>= 0.4'}
+
+ is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+
+ is-weakref@1.0.2:
+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+
+ is-weakset@2.0.3:
+ resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
+ engines: {node: '>= 0.4'}
+
+ is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ iterator.prototype@1.1.2:
+ resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==}
+
+ jackspeak@3.4.0:
+ resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==}
+ engines: {node: '>=14'}
+
+ jiti@1.21.6:
+ resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
+ hasBin: true
+
+ jose@4.15.9:
+ resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==}
+
+ js-cookie@2.2.1:
+ resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==}
+
+ js-md4@0.3.2:
+ resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsbi@4.3.0:
+ resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==}
+
+ jsesc@2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonwebtoken@9.0.2:
+ resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==}
+ engines: {node: '>=12', npm: '>=6'}
+
+ jsx-ast-utils@3.3.5:
+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+ engines: {node: '>=4.0'}
+
+ jwa@1.4.1:
+ resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
+
+ jwa@2.0.0:
+ resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==}
+
+ jws@3.2.2:
+ resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
+
+ jws@4.0.0:
+ resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+
+ language-subtag-registry@0.3.23:
+ resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
+
+ language-tags@1.0.9:
+ resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
+ engines: {node: '>=0.10'}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lilconfig@2.1.0:
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+ engines: {node: '>=10'}
+
+ lilconfig@3.1.2:
+ resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
+ engines: {node: '>=14'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ lodash-es@4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
+ lodash.castarray@4.4.0:
+ resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
+
+ lodash.includes@4.3.0:
+ resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
+
+ lodash.isboolean@3.0.3:
+ resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
+
+ lodash.isinteger@4.0.4:
+ resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==}
+
+ lodash.isnumber@3.0.3:
+ resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==}
+
+ lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+
+ lodash.isstring@4.0.1:
+ resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash.once@4.1.1:
+ resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ long@5.2.3:
+ resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==}
+
+ longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ lowlight@1.20.0:
+ resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==}
+
+ lru-cache@10.3.0:
+ resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==}
+ engines: {node: 14 || >=16.14}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+
+ lru-cache@7.18.3:
+ resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
+ engines: {node: '>=12'}
+
+ lru-cache@8.0.5:
+ resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==}
+ engines: {node: '>=16.14'}
+
+ make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+
+ markdown-table@3.0.3:
+ resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
+
+ mdast-util-definitions@5.1.2:
+ resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
+
+ mdast-util-find-and-replace@2.2.2:
+ resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==}
+
+ mdast-util-from-markdown@1.3.1:
+ resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==}
+
+ mdast-util-gfm-autolink-literal@1.0.3:
+ resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==}
+
+ mdast-util-gfm-footnote@1.0.2:
+ resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==}
+
+ mdast-util-gfm-strikethrough@1.0.3:
+ resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==}
+
+ mdast-util-gfm-table@1.0.7:
+ resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==}
+
+ mdast-util-gfm-task-list-item@1.0.2:
+ resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==}
+
+ mdast-util-gfm@2.0.2:
+ resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==}
+
+ mdast-util-phrasing@3.0.1:
+ resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==}
+
+ mdast-util-to-hast@12.3.0:
+ resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==}
+
+ mdast-util-to-markdown@1.5.0:
+ resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==}
+
+ mdast-util-to-string@3.2.0:
+ resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==}
+
+ mdn-data@2.0.14:
+ resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micro-cors@0.1.1:
+ resolution: {integrity: sha512-6WqIahA5sbQR1Gjexp1VuWGFDKbZZleJb/gy1khNGk18a6iN1FdTcr3Q8twaxkV5H94RjxIBjirYbWCehpMBFw==}
+ engines: {node: '>=6'}
+
+ micro@10.0.1:
+ resolution: {integrity: sha512-9uwZSsUrqf6+4FLLpiPj5TRWQv5w5uJrJwsx1LR/TjqvQmKC1XnGQ9OHrFwR3cbZ46YqPqxO/XJCOpWnqMPw2Q==}
+ engines: {node: '>= 16.0.0'}
+ hasBin: true
+
+ micromark-core-commonmark@1.1.0:
+ resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==}
+
+ micromark-extension-gfm-autolink-literal@1.0.5:
+ resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==}
+
+ micromark-extension-gfm-footnote@1.1.2:
+ resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==}
+
+ micromark-extension-gfm-strikethrough@1.0.7:
+ resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==}
+
+ micromark-extension-gfm-table@1.0.7:
+ resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==}
+
+ micromark-extension-gfm-tagfilter@1.0.2:
+ resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==}
+
+ micromark-extension-gfm-task-list-item@1.0.5:
+ resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==}
+
+ micromark-extension-gfm@2.0.3:
+ resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==}
+
+ micromark-factory-destination@1.1.0:
+ resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==}
+
+ micromark-factory-label@1.1.0:
+ resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==}
+
+ micromark-factory-space@1.1.0:
+ resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==}
+
+ micromark-factory-title@1.1.0:
+ resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==}
+
+ micromark-factory-whitespace@1.1.0:
+ resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==}
+
+ micromark-util-character@1.2.0:
+ resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==}
+
+ micromark-util-chunked@1.1.0:
+ resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==}
+
+ micromark-util-classify-character@1.1.0:
+ resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==}
+
+ micromark-util-combine-extensions@1.1.0:
+ resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==}
+
+ micromark-util-decode-numeric-character-reference@1.1.0:
+ resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==}
+
+ micromark-util-decode-string@1.1.0:
+ resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==}
+
+ micromark-util-encode@1.1.0:
+ resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==}
+
+ micromark-util-html-tag-name@1.2.0:
+ resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==}
+
+ micromark-util-normalize-identifier@1.1.0:
+ resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==}
+
+ micromark-util-resolve-all@1.1.0:
+ resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==}
+
+ micromark-util-sanitize-uri@1.2.0:
+ resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==}
+
+ micromark-util-subtokenize@1.1.0:
+ resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==}
+
+ micromark-util-symbol@1.1.0:
+ resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==}
+
+ micromark-util-types@1.1.0:
+ resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==}
+
+ micromark@3.2.0:
+ resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==}
+
+ micromatch@4.0.7:
+ resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
+ engines: {node: '>=8.6'}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ mri@1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
+
+ ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ mssql@9.3.2:
+ resolution: {integrity: sha512-XI5GOGCCSSNL8K2SSXg9HMyugJoCjLmrhiZfcZrJrJ2r3NfTcnz3Cegeg4m+xPkNVd0o3owsSL/NsDCFYfjOlw==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ mysql2@3.10.2:
+ resolution: {integrity: sha512-KCXPEvAkO0RcHPr362O5N8tFY2fXvbjfkPvRY/wGumh4EOemo9Hm5FjQZqv/pCmrnuxGu5OxnSENG0gTXqKMgQ==}
+ engines: {node: '>= 8.0'}
+
+ mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+
+ named-placeholders@1.1.3:
+ resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==}
+ engines: {node: '>=12.0.0'}
+
+ nano-css@5.6.1:
+ resolution: {integrity: sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw==}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+
+ nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ native-duplexpair@1.0.0:
+ resolution: {integrity: sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==}
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ next-auth@4.24.7:
+ resolution: {integrity: sha512-iChjE8ov/1K/z98gdKbn2Jw+2vLgJtVV39X+rCP5SGnVQuco7QOr19FRNGMIrD8d3LYhHWV9j9sKLzq1aDWWQQ==}
+ peerDependencies:
+ next: ^12.2.5 || ^13 || ^14
+ nodemailer: ^6.6.5
+ react: ^17.0.2 || ^18
+ react-dom: ^17.0.2 || ^18
+ peerDependenciesMeta:
+ nodemailer:
+ optional: true
+
+ next@13.5.6:
+ resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==}
+ engines: {node: '>=16.14.0'}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ react: ^18.2.0
+ react-dom: ^18.2.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ sass:
+ optional: true
+
+ node-abort-controller@3.1.1:
+ resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
+
+ node-releases@2.0.14:
+ resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
+
+ nodemailer@6.9.14:
+ resolution: {integrity: sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==}
+ engines: {node: '>=6.0.0'}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ normalize-range@0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+
+ oauth@0.9.15:
+ resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-hash@2.2.0:
+ resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==}
+ engines: {node: '>= 6'}
+
+ object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+
+ object-inspect@1.13.2:
+ resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
+ engines: {node: '>= 0.4'}
+
+ object-is@1.1.6:
+ resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object.assign@4.1.5:
+ resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
+ engines: {node: '>= 0.4'}
+
+ object.entries@1.1.8:
+ resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==}
+ engines: {node: '>= 0.4'}
+
+ object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
+
+ object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
+
+ object.hasown@1.1.4:
+ resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==}
+ engines: {node: '>= 0.4'}
+
+ object.values@1.2.0:
+ resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
+ engines: {node: '>= 0.4'}
+
+ obuf@1.1.2:
+ resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
+
+ oidc-token-hash@5.0.3:
+ resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==}
+ engines: {node: ^10.13.0 || >=12.0.0}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+
+ openid-client@5.6.5:
+ resolution: {integrity: sha512-5P4qO9nGJzB5PI0LFlhj4Dzg3m4odt0qsJTfyEtZyOlkgpILwEioOhVVJOrS1iVH494S4Ee5OCjjg6Bf5WOj3w==}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ package-json-from-dist@1.0.0:
+ resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-entities@2.0.0:
+ resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ pg-cloudflare@1.1.1:
+ resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==}
+
+ pg-connection-string@2.6.4:
+ resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==}
+
+ pg-int8@1.0.1:
+ resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
+ engines: {node: '>=4.0.0'}
+
+ pg-numeric@1.0.2:
+ resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==}
+ engines: {node: '>=4'}
+
+ pg-pool@3.6.2:
+ resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==}
+ peerDependencies:
+ pg: '>=8.0'
+
+ pg-protocol@1.6.1:
+ resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==}
+
+ pg-types@2.2.0:
+ resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
+ engines: {node: '>=4'}
+
+ pg-types@4.0.2:
+ resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==}
+ engines: {node: '>=10'}
+
+ pg@8.12.0:
+ resolution: {integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==}
+ engines: {node: '>= 8.0.0'}
+ peerDependencies:
+ pg-native: '>=3.0.1'
+ peerDependenciesMeta:
+ pg-native:
+ optional: true
+
+ pgpass@1.0.5:
+ resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
+
+ picocolors@1.0.1:
+ resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ pify@2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
+
+ pirates@4.0.6:
+ resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+ engines: {node: '>= 6'}
+
+ possible-typed-array-names@1.0.0:
+ resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+ engines: {node: '>= 0.4'}
+
+ postcss-import@15.1.0:
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ postcss: ^8.0.0
+
+ postcss-js@4.0.1:
+ resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
+ engines: {node: ^12 || ^14 || >= 16}
+ peerDependencies:
+ postcss: ^8.4.21
+
+ postcss-load-config@4.0.2:
+ resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
+ engines: {node: '>= 14'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+
+ postcss-nested@6.0.1:
+ resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+
+ postcss-selector-parser@6.0.10:
+ resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+ engines: {node: '>=4'}
+
+ postcss-selector-parser@6.1.0:
+ resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==}
+ engines: {node: '>=4'}
+
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+ postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postcss@8.4.39:
+ resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postgres-array@2.0.0:
+ resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
+ engines: {node: '>=4'}
+
+ postgres-array@3.0.2:
+ resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==}
+ engines: {node: '>=12'}
+
+ postgres-bytea@1.0.0:
+ resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-bytea@3.0.0:
+ resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==}
+ engines: {node: '>= 6'}
+
+ postgres-date@1.0.7:
+ resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-date@2.1.0:
+ resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==}
+ engines: {node: '>=12'}
+
+ postgres-interval@1.2.0:
+ resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-interval@3.0.0:
+ resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==}
+ engines: {node: '>=12'}
+
+ postgres-range@1.1.4:
+ resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==}
+
+ preact-render-to-string@5.2.6:
+ resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==}
+ peerDependencies:
+ preact: '>=10'
+
+ preact@10.22.1:
+ resolution: {integrity: sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier-linter-helpers@1.0.0:
+ resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+ engines: {node: '>=6.0.0'}
+
+ prettier@2.8.8:
+ resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ pretty-format@3.8.0:
+ resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==}
+
+ prisma@4.16.2:
+ resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ prismjs@1.27.0:
+ resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==}
+ engines: {node: '>=6'}
+
+ prismjs@1.29.0:
+ resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
+ engines: {node: '>=6'}
+
+ prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+
+ property-information@5.6.0:
+ resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==}
+
+ property-information@6.5.0:
+ resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
+
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ qs@6.12.2:
+ resolution: {integrity: sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg==}
+ engines: {node: '>=0.6'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ raw-body@2.4.1:
+ resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==}
+ engines: {node: '>= 0.8'}
+
+ react-data-table-component@7.6.2:
+ resolution: {integrity: sha512-nHe7040fmtrJyQr/ieGrTfV0jBflYGK4sLokC6/AFOv3ThjmA9WzKz8Z8/2wMxzRqLU+Rn0CVFg+8+frKLepWQ==}
+ peerDependencies:
+ react: '>= 16.8.3'
+ styled-components: '>= 5.0.0'
+
+ react-dom@18.3.1:
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+ peerDependencies:
+ react: ^18.3.1
+
+ react-hot-toast@2.4.1:
+ resolution: {integrity: sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '>=16'
+ react-dom: '>=16'
+
+ react-i18next@12.3.1:
+ resolution: {integrity: sha512-5v8E2XjZDFzK7K87eSwC7AJcAkcLt5xYZ4+yTPDAW1i7C93oOY1dnr4BaQM7un4Hm+GmghuiPvevWwlca5PwDA==}
+ peerDependencies:
+ i18next: '>= 19.0.0'
+ react: '>= 16.8.0'
+ react-dom: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+
+ react-icons@4.12.0:
+ resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==}
+ peerDependencies:
+ react: '*'
+
+ react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ react-is@18.3.1:
+ resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+
+ react-loader-spinner@5.5.0:
+ resolution: {integrity: sha512-3y+l6RPbkfW8EMs/X7MtfiPlAPwYp+WbCtls3gZn+fDJCt0SW4TakRoj2/lExbCVxSxA6Y5M8Nly+WfhNxnFcw==}
+ deprecated: Breaking changes was include so major version was use
+ peerDependencies:
+ react: ^16.0.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0
+
+ react-markdown@8.0.7:
+ resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==}
+ peerDependencies:
+ '@types/react': '>=16'
+ react: '>=16'
+
+ react-remove-scroll-bar@2.3.6:
+ resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
+ 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
+
+ react-remove-scroll@2.5.5:
+ resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==}
+ 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
+
+ react-remove-scroll@2.5.7:
+ resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==}
+ 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
+
+ react-style-singleton@2.2.1:
+ resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
+ 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
+
+ react-svg@16.1.34:
+ resolution: {integrity: sha512-L4ak1qNFLgzVbHm0xQEpHoIOqb3um/B0ybahd3U2TKoGZxb0JaPVI5lsAhvSng2P1kcsYEok2Z7RpcKx7arJGw==}
+ peerDependencies:
+ react: ^16.0.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0
+
+ react-syntax-highlighter@15.5.0:
+ resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==}
+ peerDependencies:
+ react: '>= 0.14.0'
+
+ react-textarea-autosize@8.5.3:
+ resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+ react-transition-group@4.4.5:
+ resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==}
+ peerDependencies:
+ react: '>=16.6.0'
+ react-dom: '>=16.6.0'
+
+ react-universal-interface@0.6.2:
+ resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==}
+ peerDependencies:
+ react: '*'
+ tslib: '*'
+
+ react-use@17.5.0:
+ resolution: {integrity: sha512-PbfwSPMwp/hoL847rLnm/qkjg3sTRCvn6YhUZiHaUa3FA6/aNoFX79ul5Xt70O1rK+9GxSVqkY0eTwMdsR/bWg==}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
+
+ read-cache@1.0.0:
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ reflect.getprototypeof@1.0.6:
+ resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==}
+ engines: {node: '>= 0.4'}
+
+ refractor@3.6.0:
+ resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==}
+
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ regexp.prototype.flags@1.5.2:
+ resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
+ engines: {node: '>= 0.4'}
+
+ regexpp@3.2.0:
+ resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
+ engines: {node: '>=8'}
+
+ remark-gfm@3.0.1:
+ resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==}
+
+ remark-parse@10.0.2:
+ resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==}
+
+ remark-rehype@10.1.0:
+ resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==}
+
+ request-ip@3.3.0:
+ resolution: {integrity: sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==}
+
+ resize-observer-polyfill@1.5.1:
+ resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve@1.22.8:
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ hasBin: true
+
+ resolve@2.0.0-next.5:
+ resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
+ hasBin: true
+
+ reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+ rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+
+ rtl-css-js@1.16.1:
+ resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ sade@1.8.1:
+ resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+ engines: {node: '>=6'}
+
+ safe-array-concat@1.1.2:
+ resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
+ engines: {node: '>=0.4'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-regex-test@1.0.3:
+ resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
+ engines: {node: '>= 0.4'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+ screenfull@5.2.0:
+ resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==}
+ engines: {node: '>=0.10.0'}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.6.2:
+ resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ seq-queue@0.0.5:
+ resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==}
+
+ set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+
+ set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+
+ set-harmonic-interval@1.0.1:
+ resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==}
+ engines: {node: '>=6.9'}
+
+ setprototypeof@1.1.1:
+ resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==}
+
+ shallowequal@1.1.0:
+ resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ side-channel@1.0.6:
+ resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+ engines: {node: '>= 0.4'}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+
+ source-map-js@1.2.0:
+ resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.5.6:
+ resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ space-separated-tokens@1.1.5:
+ resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==}
+
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ sprintf-js@1.1.3:
+ resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
+
+ sqlstring@2.3.3:
+ resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==}
+ engines: {node: '>= 0.6'}
+
+ stack-generator@2.0.10:
+ resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==}
+
+ stackframe@1.3.4:
+ resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==}
+
+ stacktrace-gps@3.1.2:
+ resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==}
+
+ stacktrace-js@2.0.2:
+ resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==}
+
+ statuses@1.5.0:
+ resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
+ engines: {node: '>= 0.6'}
+
+ stop-iteration-iterator@1.0.0:
+ resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
+ engines: {node: '>= 0.4'}
+
+ stoppable@1.1.0:
+ resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==}
+ engines: {node: '>=4', npm: '>=6'}
+
+ streamsearch@1.1.0:
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+ engines: {node: '>=10.0.0'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
+ string.prototype.includes@2.0.0:
+ resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==}
+
+ string.prototype.matchall@4.0.11:
+ resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trim@1.2.9:
+ resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimend@1.0.8:
+ resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
+
+ string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ stripe@12.18.0:
+ resolution: {integrity: sha512-cYjgBM2SY/dTm8Lr6eMyyONaHTZHA/QjHxFUIW5WH8FevSRIGAVtXEmBkUXF1fsqe7QvvRgQSGSJZmjDacegGg==}
+ engines: {node: '>=12.*'}
+
+ style-to-object@0.4.4:
+ resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==}
+
+ styled-components@5.3.11:
+ resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '>= 16.8.0'
+ react-dom: '>= 16.8.0'
+ react-is: '>= 16.8.0'
+
+ styled-jsx@5.1.1:
+ resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
+
+ styled-tools@1.7.2:
+ resolution: {integrity: sha512-IjLxzM20RMwAsx8M1QoRlCG/Kmq8lKzCGyospjtSXt/BTIIcvgTonaxQAsKnBrsZNwhpHzO9ADx5te0h76ILVg==}
+
+ stylis@4.2.0:
+ resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
+
+ stylis@4.3.2:
+ resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==}
+
+ sucrase@3.35.0:
+ resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+
+ supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ swr@2.2.5:
+ resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==}
+ peerDependencies:
+ react: ^16.11.0 || ^17.0.0 || ^18.0.0
+
+ tailwind-scrollbar-hide@1.1.7:
+ resolution: {integrity: sha512-X324n9OtpTmOMqEgDUEA/RgLrNfBF/jwJdctaPZDzB3mppxJk7TLIDmOreEDm1Bq4R9LSPu4Epf8VSdovNU+iA==}
+
+ tailwindcss@3.4.4:
+ resolution: {integrity: sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ tarn@3.0.2:
+ resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==}
+ engines: {node: '>=8.0.0'}
+
+ tedious@15.1.3:
+ resolution: {integrity: sha512-166EpRm5qknwhEisjZqz/mF7k14fXKJYHRg6XiAXVovd/YkyHJ3SG4Ppy89caPaNFfRr7PVYe+s4dAvKaCMFvw==}
+ engines: {node: '>=14'}
+
+ text-table@0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+
+ thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+
+ thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
+ throttle-debounce@3.0.1:
+ resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==}
+ engines: {node: '>=10'}
+
+ to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ toggle-selection@1.0.6:
+ resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
+
+ toidentifier@1.0.0:
+ resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==}
+ engines: {node: '>=0.6'}
+
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
+ ts-easing@0.2.0:
+ resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==}
+
+ ts-interface-checker@0.1.13:
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+
+ ts-node@10.9.2:
+ resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+
+ tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+ tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+
+ tslib@2.6.3:
+ resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
+
+ tsutils@3.21.0:
+ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+ engines: {node: '>= 6'}
+ peerDependencies:
+ typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+
+ typed-array-buffer@1.0.2:
+ resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-length@1.0.1:
+ resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-offset@1.0.2:
+ resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-length@1.0.6:
+ resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
+ engines: {node: '>= 0.4'}
+
+ typescript@4.9.5:
+ resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+
+ unbox-primitive@1.0.2:
+ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+
+ undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+ unified@10.1.2:
+ resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==}
+
+ unist-util-generated@2.0.1:
+ resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==}
+
+ unist-util-is@5.2.1:
+ resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==}
+
+ unist-util-position@4.0.4:
+ resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==}
+
+ unist-util-stringify-position@3.0.3:
+ resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==}
+
+ unist-util-visit-parents@5.1.3:
+ resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==}
+
+ unist-util-visit@4.1.2:
+ resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==}
+
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
+ update-browserslist-db@1.1.0:
+ resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ use-callback-ref@1.3.2:
+ resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
+ 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
+
+ use-composed-ref@1.3.0:
+ resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+ use-isomorphic-layout-effect@1.1.2:
+ resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-latest@1.2.1:
+ resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-sidecar@1.1.2:
+ resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
+ 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
+
+ use-sync-external-store@1.2.0:
+ resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+ use-sync-external-store@1.2.2:
+ resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+
+ uuid@9.0.1:
+ resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+ hasBin: true
+
+ uvu@0.5.6:
+ resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ v8-compile-cache-lib@3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+
+ v8-compile-cache@2.4.0:
+ resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==}
+
+ vfile-message@3.1.4:
+ resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==}
+
+ vfile@5.3.7:
+ resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==}
+
+ void-elements@3.1.0:
+ resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==}
+ engines: {node: '>=0.10.0'}
+
+ watchpack@2.4.0:
+ resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
+ engines: {node: '>=10.13.0'}
+
+ which-boxed-primitive@1.0.2:
+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+
+ which-builtin-type@1.1.3:
+ resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==}
+ engines: {node: '>= 0.4'}
+
+ which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+
+ which-typed-array@1.1.15:
+ resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
+ engines: {node: '>= 0.4'}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ yaml@1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+
+ yaml@2.4.5:
+ resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==}
+ engines: {node: '>= 14'}
+ hasBin: true
+
+ yn@3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+
+ zustand@4.5.4:
+ resolution: {integrity: sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==}
+ engines: {node: '>=12.7.0'}
+ peerDependencies:
+ '@types/react': '>=16.8'
+ immer: '>=9.0.6'
+ react: '>=16.8'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ immer:
+ optional: true
+ react:
+ optional: true
+
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
+snapshots:
+
+ '@alloc/quick-lru@5.2.0': {}
+
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@azure/abort-controller@1.1.0':
+ dependencies:
+ tslib: 2.6.3
+
+ '@azure/abort-controller@2.1.2':
+ dependencies:
+ tslib: 2.6.3
+
+ '@azure/core-auth@1.7.2':
+ dependencies:
+ '@azure/abort-controller': 2.1.2
+ '@azure/core-util': 1.9.0
+ tslib: 2.6.3
+
+ '@azure/core-client@1.9.2':
+ dependencies:
+ '@azure/abort-controller': 2.1.2
+ '@azure/core-auth': 1.7.2
+ '@azure/core-rest-pipeline': 1.16.1
+ '@azure/core-tracing': 1.1.2
+ '@azure/core-util': 1.9.0
+ '@azure/logger': 1.1.2
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@azure/core-http-compat@2.1.2':
+ dependencies:
+ '@azure/abort-controller': 2.1.2
+ '@azure/core-client': 1.9.2
+ '@azure/core-rest-pipeline': 1.16.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@azure/core-lro@2.7.2':
+ dependencies:
+ '@azure/abort-controller': 2.1.2
+ '@azure/core-util': 1.9.0
+ '@azure/logger': 1.1.2
+ tslib: 2.6.3
+
+ '@azure/core-paging@1.6.2':
+ dependencies:
+ tslib: 2.6.3
+
+ '@azure/core-rest-pipeline@1.16.1':
+ dependencies:
+ '@azure/abort-controller': 2.1.2
+ '@azure/core-auth': 1.7.2
+ '@azure/core-tracing': 1.1.2
+ '@azure/core-util': 1.9.0
+ '@azure/logger': 1.1.2
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.5
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@azure/core-tracing@1.1.2':
+ dependencies:
+ tslib: 2.6.3
+
+ '@azure/core-util@1.9.0':
+ dependencies:
+ '@azure/abort-controller': 2.1.2
+ tslib: 2.6.3
+
+ '@azure/identity@2.1.0':
+ dependencies:
+ '@azure/abort-controller': 1.1.0
+ '@azure/core-auth': 1.7.2
+ '@azure/core-client': 1.9.2
+ '@azure/core-rest-pipeline': 1.16.1
+ '@azure/core-tracing': 1.1.2
+ '@azure/core-util': 1.9.0
+ '@azure/logger': 1.1.2
+ '@azure/msal-browser': 2.39.0
+ '@azure/msal-common': 7.6.0
+ '@azure/msal-node': 1.18.4
+ events: 3.3.0
+ jws: 4.0.0
+ open: 8.4.2
+ stoppable: 1.1.0
+ tslib: 2.6.3
+ uuid: 8.3.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@azure/keyvault-keys@4.8.0':
+ dependencies:
+ '@azure/abort-controller': 1.1.0
+ '@azure/core-auth': 1.7.2
+ '@azure/core-client': 1.9.2
+ '@azure/core-http-compat': 2.1.2
+ '@azure/core-lro': 2.7.2
+ '@azure/core-paging': 1.6.2
+ '@azure/core-rest-pipeline': 1.16.1
+ '@azure/core-tracing': 1.1.2
+ '@azure/core-util': 1.9.0
+ '@azure/logger': 1.1.2
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@azure/logger@1.1.2':
+ dependencies:
+ tslib: 2.6.3
+
+ '@azure/msal-browser@2.39.0':
+ dependencies:
+ '@azure/msal-common': 13.3.3
+
+ '@azure/msal-common@13.3.1': {}
+
+ '@azure/msal-common@13.3.3': {}
+
+ '@azure/msal-common@7.6.0': {}
+
+ '@azure/msal-node@1.18.4':
+ dependencies:
+ '@azure/msal-common': 13.3.1
+ jsonwebtoken: 9.0.2
+ uuid: 8.3.2
+
+ '@babel/code-frame@7.24.7':
+ dependencies:
+ '@babel/highlight': 7.24.7
+ picocolors: 1.0.1
+
+ '@babel/compat-data@7.24.7': {}
+
+ '@babel/core@7.24.7':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.24.7
+ '@babel/generator': 7.24.7
+ '@babel/helper-compilation-targets': 7.24.7
+ '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
+ '@babel/helpers': 7.24.7
+ '@babel/parser': 7.24.7
+ '@babel/template': 7.24.7
+ '@babel/traverse': 7.24.7(supports-color@5.5.0)
+ '@babel/types': 7.24.7
+ convert-source-map: 2.0.0
+ debug: 4.3.5(supports-color@5.5.0)
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.24.7':
+ dependencies:
+ '@babel/types': 7.24.7
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 2.5.2
+
+ '@babel/helper-annotate-as-pure@7.24.7':
+ dependencies:
+ '@babel/types': 7.24.7
+
+ '@babel/helper-compilation-targets@7.24.7':
+ dependencies:
+ '@babel/compat-data': 7.24.7
+ '@babel/helper-validator-option': 7.24.7
+ browserslist: 4.23.1
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-environment-visitor@7.24.7':
+ dependencies:
+ '@babel/types': 7.24.7
+
+ '@babel/helper-function-name@7.24.7':
+ dependencies:
+ '@babel/template': 7.24.7
+ '@babel/types': 7.24.7
+
+ '@babel/helper-hoist-variables@7.24.7':
+ dependencies:
+ '@babel/types': 7.24.7
+
+ '@babel/helper-module-imports@7.24.7(supports-color@5.5.0)':
+ dependencies:
+ '@babel/traverse': 7.24.7(supports-color@5.5.0)
+ '@babel/types': 7.24.7
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)':
+ dependencies:
+ '@babel/core': 7.24.7
+ '@babel/helper-environment-visitor': 7.24.7
+ '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0)
+ '@babel/helper-simple-access': 7.24.7
+ '@babel/helper-split-export-declaration': 7.24.7
+ '@babel/helper-validator-identifier': 7.24.7
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-plugin-utils@7.24.7': {}
+
+ '@babel/helper-simple-access@7.24.7':
+ dependencies:
+ '@babel/traverse': 7.24.7(supports-color@5.5.0)
+ '@babel/types': 7.24.7
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-split-export-declaration@7.24.7':
+ dependencies:
+ '@babel/types': 7.24.7
+
+ '@babel/helper-string-parser@7.24.7': {}
+
+ '@babel/helper-validator-identifier@7.24.7': {}
+
+ '@babel/helper-validator-option@7.24.7': {}
+
+ '@babel/helpers@7.24.7':
+ dependencies:
+ '@babel/template': 7.24.7
+ '@babel/types': 7.24.7
+
+ '@babel/highlight@7.24.7':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.24.7
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ picocolors: 1.0.1
+
+ '@babel/parser@7.24.7':
+ dependencies:
+ '@babel/types': 7.24.7
+
+ '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)':
+ dependencies:
+ '@babel/core': 7.24.7
+ '@babel/helper-plugin-utils': 7.24.7
+
+ '@babel/runtime@7.24.7':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@babel/template@7.24.7':
+ dependencies:
+ '@babel/code-frame': 7.24.7
+ '@babel/parser': 7.24.7
+ '@babel/types': 7.24.7
+
+ '@babel/traverse@7.24.7(supports-color@5.5.0)':
+ dependencies:
+ '@babel/code-frame': 7.24.7
+ '@babel/generator': 7.24.7
+ '@babel/helper-environment-visitor': 7.24.7
+ '@babel/helper-function-name': 7.24.7
+ '@babel/helper-hoist-variables': 7.24.7
+ '@babel/helper-split-export-declaration': 7.24.7
+ '@babel/parser': 7.24.7
+ '@babel/types': 7.24.7
+ debug: 4.3.5(supports-color@5.5.0)
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.24.7':
+ dependencies:
+ '@babel/helper-string-parser': 7.24.7
+ '@babel/helper-validator-identifier': 7.24.7
+ to-fast-properties: 2.0.0
+
+ '@cspotcode/source-map-support@0.8.1':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+
+ '@emotion/babel-plugin@11.11.0':
+ dependencies:
+ '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0)
+ '@babel/runtime': 7.24.7
+ '@emotion/hash': 0.9.1
+ '@emotion/memoize': 0.8.1
+ '@emotion/serialize': 1.1.4
+ babel-plugin-macros: 3.1.0
+ convert-source-map: 1.9.0
+ escape-string-regexp: 4.0.0
+ find-root: 1.1.0
+ source-map: 0.5.7
+ stylis: 4.2.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/cache@11.11.0':
+ 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
+
+ '@emotion/hash@0.9.1': {}
+
+ '@emotion/is-prop-valid@1.2.2':
+ dependencies:
+ '@emotion/memoize': 0.8.1
+
+ '@emotion/memoize@0.8.1': {}
+
+ '@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@emotion/babel-plugin': 11.11.0
+ '@emotion/cache': 11.11.0
+ '@emotion/serialize': 1.1.4
+ '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1)
+ '@emotion/utils': 1.2.1
+ '@emotion/weak-memoize': 0.3.1
+ hoist-non-react-statics: 3.3.2
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/serialize@1.1.4':
+ dependencies:
+ '@emotion/hash': 0.9.1
+ '@emotion/memoize': 0.8.1
+ '@emotion/unitless': 0.8.1
+ '@emotion/utils': 1.2.1
+ csstype: 3.1.3
+
+ '@emotion/sheet@1.2.2': {}
+
+ '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@emotion/babel-plugin': 11.11.0
+ '@emotion/is-prop-valid': 1.2.2
+ '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1)
+ '@emotion/serialize': 1.1.4
+ '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1)
+ '@emotion/utils': 1.2.1
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/stylis@0.8.5': {}
+
+ '@emotion/unitless@0.7.5': {}
+
+ '@emotion/unitless@0.8.1': {}
+
+ '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+
+ '@emotion/utils@1.2.1': {}
+
+ '@emotion/weak-memoize@0.3.1': {}
+
+ '@eslint/eslintrc@1.4.1':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.5(supports-color@5.5.0)
+ espree: 9.6.1
+ globals: 13.24.0
+ ignore: 5.3.1
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@floating-ui/core@1.6.4':
+ dependencies:
+ '@floating-ui/utils': 0.2.4
+
+ '@floating-ui/dom@1.6.7':
+ dependencies:
+ '@floating-ui/core': 1.6.4
+ '@floating-ui/utils': 0.2.4
+
+ '@floating-ui/react-dom@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/dom': 1.6.7
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@floating-ui/utils@0.2.4': {}
+
+ '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@tanstack/react-virtual': 3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ client-only: 0.0.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@heroicons/react@2.1.4(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+
+ '@humanwhocodes/config-array@0.9.5':
+ dependencies:
+ '@humanwhocodes/object-schema': 1.2.1
+ debug: 4.3.5(supports-color@5.5.0)
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@humanwhocodes/object-schema@1.2.1': {}
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
+ '@jridgewell/gen-mapping@0.3.5':
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/set-array@1.2.1': {}
+
+ '@jridgewell/sourcemap-codec@1.4.15': {}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.4.15
+
+ '@jridgewell/trace-mapping@0.3.9':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.4.15
+
+ '@js-joda/core@5.6.3': {}
+
+ '@mui/base@5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mui/types': 7.2.14(@types/react@18.3.3)
+ '@mui/utils': 5.16.0(@types/react@18.3.3)(react@18.3.1)
+ '@popperjs/core': 2.11.8
+ clsx: 2.1.1
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@mui/core-downloads-tracker@5.16.0': {}
+
+ '@mui/material@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@mui/base': 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mui/core-downloads-tracker': 5.16.0
+ '@mui/system': 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)
+ '@mui/types': 7.2.14(@types/react@18.3.3)
+ '@mui/utils': 5.16.0(@types/react@18.3.3)(react@18.3.1)
+ '@types/react-transition-group': 4.4.10
+ clsx: 2.1.1
+ csstype: 3.1.3
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-is: 18.3.1
+ react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ optionalDependencies:
+ '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1)
+ '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)
+ '@types/react': 18.3.3
+
+ '@mui/private-theming@5.16.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@mui/utils': 5.16.0(@types/react@18.3.3)(react@18.3.1)
+ prop-types: 15.8.1
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@mui/styled-engine-sc@5.14.12(styled-components@5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ csstype: 3.1.3
+ prop-types: 15.8.1
+ styled-components: 5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)
+
+ '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@emotion/cache': 11.11.0
+ csstype: 3.1.3
+ prop-types: 15.8.1
+ react: 18.3.1
+ optionalDependencies:
+ '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1)
+ '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)
+
+ '@mui/system@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@mui/private-theming': 5.16.0(@types/react@18.3.3)(react@18.3.1)
+ '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)
+ '@mui/types': 7.2.14(@types/react@18.3.3)
+ '@mui/utils': 5.16.0(@types/react@18.3.3)(react@18.3.1)
+ clsx: 2.1.1
+ csstype: 3.1.3
+ prop-types: 15.8.1
+ react: 18.3.1
+ optionalDependencies:
+ '@emotion/react': 11.11.4(@types/react@18.3.3)(react@18.3.1)
+ '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)
+ '@types/react': 18.3.3
+
+ '@mui/types@7.2.14(@types/react@18.3.3)':
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@mui/utils@5.16.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@types/prop-types': 15.7.12
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-is: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@nem035/gpt-3-encoder@1.1.7': {}
+
+ '@next-auth/prisma-adapter@1.0.7(@prisma/client@4.13.0(prisma@4.16.2))(next-auth@4.24.7(next@13.5.6(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))':
+ dependencies:
+ '@prisma/client': 4.13.0(prisma@4.16.2)
+ next-auth: 4.24.7(next@13.5.6(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+
+ '@next/env@13.5.6': {}
+
+ '@next/eslint-plugin-next@12.2.3':
+ dependencies:
+ glob: 7.1.7
+
+ '@next/swc-darwin-arm64@13.5.6':
+ optional: true
+
+ '@next/swc-darwin-x64@13.5.6':
+ optional: true
+
+ '@next/swc-linux-arm64-gnu@13.5.6':
+ optional: true
+
+ '@next/swc-linux-arm64-musl@13.5.6':
+ optional: true
+
+ '@next/swc-linux-x64-gnu@13.5.6':
+ optional: true
+
+ '@next/swc-linux-x64-musl@13.5.6':
+ optional: true
+
+ '@next/swc-win32-arm64-msvc@13.5.6':
+ optional: true
+
+ '@next/swc-win32-ia32-msvc@13.5.6':
+ optional: true
+
+ '@next/swc-win32-x64-msvc@13.5.6':
+ optional: true
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.1
- /@types/json5@0.0.29:
- resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
- dev: true
+ '@panva/hkdf@1.2.1': {}
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
+ '@popperjs/core@2.11.8': {}
- /@types/lodash-es@4.17.7:
- resolution: {integrity: sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==}
+ '@prisma/client@4.13.0(prisma@4.16.2)':
dependencies:
- '@types/lodash': 4.14.191
- dev: true
+ '@prisma/engines-version': 4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a
+ optionalDependencies:
+ prisma: 4.16.2
+
+ '@prisma/engines-version@4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a': {}
- /@types/lodash@4.14.191:
- resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==}
- dev: true
+ '@prisma/engines@4.16.2': {}
- /@types/mdast@3.0.11:
- resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==}
+ '@radix-ui/number@1.0.1':
dependencies:
- '@types/unist': 2.0.6
- dev: false
+ '@babel/runtime': 7.24.7
- /@types/ms@0.7.31:
- resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
- dev: false
+ '@radix-ui/number@1.1.0': {}
- /@types/node@18.15.3:
- resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==}
- dev: true
+ '@radix-ui/primitive@1.0.1':
+ dependencies:
+ '@babel/runtime': 7.24.7
- /@types/parse-json@4.0.0:
- resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
- dev: false
+ '@radix-ui/primitive@1.1.0': {}
- /@types/pg@8.6.6:
- resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==}
+ '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@types/node': 18.15.3
- pg-protocol: 1.6.0
- pg-types: 2.2.0
- dev: true
+ '@babel/runtime': 7.24.7
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
- /@types/prop-types@15.7.5:
- resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
+ '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-collection@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
- /@types/react-dom@18.0.11:
- resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==}
+ '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@types/react': 18.0.28
- dev: true
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
- /@types/react-is@17.0.3:
- resolution: {integrity: sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==}
+ '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.3)(react@18.3.1)':
dependencies:
- '@types/react': 18.0.28
- dev: false
+ '@babel/runtime': 7.24.7
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
- /@types/react-syntax-highlighter@15.5.6:
- resolution: {integrity: sha512-i7wFuLbIAFlabTeD2I1cLjEOrG/xdMa/rpx2zwzAoGHuXJDhSqp9BSfDlMHSh9JSuNfxHk9eEmMX6D55GiyjGg==}
+ '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.3)(react@18.3.1)':
dependencies:
- '@types/react': 18.0.28
- dev: true
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
- /@types/react-transition-group@4.4.5:
- resolution: {integrity: sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==}
+ '@radix-ui/react-context@1.0.1(@types/react@18.3.3)(react@18.3.1)':
dependencies:
- '@types/react': 18.0.28
- dev: false
+ '@babel/runtime': 7.24.7
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
- /@types/react@18.0.28:
- resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==}
+ '@radix-ui/react-context@1.1.0(@types/react@18.3.3)(react@18.3.1)':
dependencies:
- '@types/prop-types': 15.7.5
- '@types/scheduler': 0.16.2
- csstype: 3.1.1
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
- /@types/scheduler@0.16.2:
- resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==}
+ '@radix-ui/react-direction@1.0.1(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
- /@types/unist@2.0.6:
- resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==}
+ '@radix-ui/react-direction@1.1.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
- /@types/uuid@9.0.1:
- resolution: {integrity: sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==}
- dev: true
+ '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
- /@typescript-eslint/parser@5.55.0(eslint@8.20.0)(typescript@4.9.5):
- resolution: {integrity: sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
+ '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-icons@1.3.0(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+
+ '@radix-ui/react-id@1.0.1(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-id@1.1.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ aria-hidden: 1.2.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-remove-scroll: 2.5.7(@types/react@18.3.3)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-popover@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ aria-hidden: 1.2.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-remove-scroll: 2.5.7(@types/react@18.3.3)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-popper@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/rect': 1.0.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/rect': 1.1.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-portal@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/number': 1.1.0
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-select@1.2.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/number': 1.0.1
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ aria-hidden: 1.2.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-slot@1.0.2(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-slot@1.1.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-previous@1.0.1(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-rect@1.0.1(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/rect': 1.0.1
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/rect': 1.1.0
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-size@1.0.1(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-use-size@1.1.0(@types/react@18.3.3)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
+ '@radix-ui/rect@1.0.1':
+ dependencies:
+ '@babel/runtime': 7.24.7
+
+ '@radix-ui/rect@1.1.0': {}
+
+ '@rushstack/eslint-patch@1.10.3': {}
+
+ '@stripe/stripe-js@1.54.2': {}
+
+ '@swc/helpers@0.5.2':
+ dependencies:
+ tslib: 2.6.3
+
+ '@tailwindcss/typography@0.5.13(tailwindcss@3.4.4(ts-node@10.9.2(@types/node@18.19.39)(typescript@4.9.5)))':
+ dependencies:
+ lodash.castarray: 4.4.0
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ postcss-selector-parser: 6.0.10
+ tailwindcss: 3.4.4(ts-node@10.9.2(@types/node@18.19.39)(typescript@4.9.5))
+
+ '@tanem/svg-injector@10.1.68':
+ dependencies:
+ '@babel/runtime': 7.24.7
+ content-type: 1.0.5
+ tslib: 2.6.3
+
+ '@tanstack/react-virtual@3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@tanstack/virtual-core': 3.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@tanstack/virtual-core@3.8.1': {}
+
+ '@tediousjs/connection-string@0.5.0': {}
+
+ '@tsconfig/node10@1.0.11': {}
+
+ '@tsconfig/node12@1.0.11': {}
+
+ '@tsconfig/node14@1.0.3': {}
+
+ '@tsconfig/node16@1.0.4': {}
+
+ '@types/debug@4.1.12':
+ dependencies:
+ '@types/ms': 0.7.34
+
+ '@types/hast@2.3.10':
+ dependencies:
+ '@types/unist': 2.0.10
+
+ '@types/js-cookie@2.2.7': {}
+
+ '@types/json5@0.0.29': {}
+
+ '@types/lodash-es@4.17.12':
+ dependencies:
+ '@types/lodash': 4.17.6
+
+ '@types/lodash@4.17.6': {}
+
+ '@types/mdast@3.0.15':
+ dependencies:
+ '@types/unist': 2.0.10
+
+ '@types/micro-cors@0.1.5':
+ dependencies:
+ '@types/micro': 7.3.7
+
+ '@types/micro@7.3.7':
+ dependencies:
+ '@types/node': 18.19.39
+
+ '@types/ms@0.7.34': {}
+
+ '@types/mssql@8.1.2':
+ dependencies:
+ '@types/node': 18.19.39
+ '@types/tedious': 4.0.14
+ tarn: 3.0.2
+
+ '@types/node@18.19.39':
+ dependencies:
+ undici-types: 5.26.5
+
+ '@types/parse-json@4.0.2': {}
+
+ '@types/pg@8.11.6':
+ dependencies:
+ '@types/node': 18.19.39
+ pg-protocol: 1.6.1
+ pg-types: 4.0.2
+
+ '@types/prop-types@15.7.12': {}
+
+ '@types/react-dom@18.3.0':
+ dependencies:
+ '@types/react': 18.3.3
+
+ '@types/react-syntax-highlighter@15.5.13':
+ dependencies:
+ '@types/react': 18.3.3
+
+ '@types/react-transition-group@4.4.10':
+ dependencies:
+ '@types/react': 18.3.3
+
+ '@types/react@18.3.3':
+ dependencies:
+ '@types/prop-types': 15.7.12
+ csstype: 3.1.3
+
+ '@types/request-ip@0.0.37':
+ dependencies:
+ '@types/node': 18.19.39
+
+ '@types/tedious@4.0.14':
+ dependencies:
+ '@types/node': 18.19.39
+
+ '@types/unist@2.0.10': {}
+
+ '@types/uuid@9.0.8': {}
+
+ '@typescript-eslint/parser@5.62.0(eslint@8.20.0)(typescript@4.9.5)':
dependencies:
- '@typescript-eslint/scope-manager': 5.55.0
- '@typescript-eslint/types': 5.55.0
- '@typescript-eslint/typescript-estree': 5.55.0(typescript@4.9.5)
- debug: 4.3.4(supports-color@5.5.0)
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5)
+ debug: 4.3.5(supports-color@5.5.0)
eslint: 8.20.0
+ optionalDependencies:
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
- dev: true
- /@typescript-eslint/scope-manager@5.55.0:
- resolution: {integrity: sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@typescript-eslint/scope-manager@5.62.0':
dependencies:
- '@typescript-eslint/types': 5.55.0
- '@typescript-eslint/visitor-keys': 5.55.0
- dev: true
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
- /@typescript-eslint/types@5.55.0:
- resolution: {integrity: sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dev: true
+ '@typescript-eslint/types@5.62.0': {}
- /@typescript-eslint/typescript-estree@5.55.0(typescript@4.9.5):
- resolution: {integrity: sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
+ '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)':
dependencies:
- '@typescript-eslint/types': 5.55.0
- '@typescript-eslint/visitor-keys': 5.55.0
- debug: 4.3.4(supports-color@5.5.0)
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+ debug: 4.3.5(supports-color@5.5.0)
globby: 11.1.0
is-glob: 4.0.3
- semver: 7.3.8
+ semver: 7.6.2
tsutils: 3.21.0(typescript@4.9.5)
+ optionalDependencies:
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
- dev: true
- /@typescript-eslint/visitor-keys@5.55.0:
- resolution: {integrity: sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@typescript-eslint/visitor-keys@5.62.0':
dependencies:
- '@typescript-eslint/types': 5.55.0
- eslint-visitor-keys: 3.3.0
- dev: true
+ '@typescript-eslint/types': 5.62.0
+ eslint-visitor-keys: 3.4.3
- /@vercel/analytics@0.1.11(react@18.2.0):
- resolution: {integrity: sha512-mj5CPR02y0BRs1tN3oZcBNAX9a8NxsIUl9vElDPcqxnMfP0RbRc9fI9Ud7+QDg/1Izvt5uMumsr+6YsmVHcyuw==}
- peerDependencies:
- react: ^16.8||^17||^18
+ '@vercel/analytics@0.1.11(react@18.3.1)':
dependencies:
- react: 18.2.0
- dev: false
+ react: 18.3.1
- /@xobotyi/scrollbar-width@1.9.5:
- resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==}
- dev: false
+ '@xobotyi/scrollbar-width@1.9.5': {}
- /acorn-jsx@5.3.2(acorn@8.8.2):
- resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
- peerDependencies:
- acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ acorn-jsx@5.3.2(acorn@8.12.1):
dependencies:
- acorn: 8.8.2
- dev: true
+ acorn: 8.12.1
- /acorn-node@1.8.2:
- resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==}
+ acorn-walk@8.3.3:
dependencies:
- acorn: 7.4.1
- acorn-walk: 7.2.0
- xtend: 4.0.2
-
- /acorn-walk@7.2.0:
- resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
- engines: {node: '>=0.4.0'}
+ acorn: 8.12.1
- /acorn@7.4.1:
- resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
- engines: {node: '>=0.4.0'}
- hasBin: true
+ acorn@8.12.1: {}
- /acorn@8.8.2:
- resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==}
- engines: {node: '>=0.4.0'}
- hasBin: true
- dev: true
+ agent-base@7.1.1:
+ dependencies:
+ debug: 4.3.5(supports-color@5.5.0)
+ transitivePeerDependencies:
+ - supports-color
- /ajv@6.12.6:
- resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ ajv@6.12.6:
dependencies:
fast-deep-equal: 3.1.3
fast-json-stable-stringify: 2.1.0
json-schema-traverse: 0.4.1
uri-js: 4.4.1
- dev: true
- /ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
- dev: true
+ ansi-regex@5.0.1: {}
- /ansi-styles@3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
- engines: {node: '>=4'}
+ ansi-regex@6.0.1: {}
+
+ ansi-styles@3.2.1:
dependencies:
color-convert: 1.9.3
- dev: false
- /ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
+ ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
- dev: true
- /anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
+ ansi-styles@6.2.1: {}
+
+ any-promise@1.3.0: {}
+
+ anymatch@3.1.3:
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
- /arg@5.0.2:
- resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+ arg@4.1.0: {}
- /argparse@2.0.1:
- resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
- dev: true
+ arg@4.1.3: {}
- /aria-query@5.1.3:
- resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
+ arg@5.0.2: {}
+
+ argparse@2.0.1: {}
+
+ aria-hidden@1.2.4:
dependencies:
- deep-equal: 2.2.0
- dev: true
+ tslib: 2.6.3
- /array-buffer-byte-length@1.0.0:
- resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
+ aria-query@5.1.3:
dependencies:
- call-bind: 1.0.2
- is-array-buffer: 3.0.2
- dev: true
+ deep-equal: 2.2.3
- /array-includes@3.1.6:
- resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
- engines: {node: '>= 0.4'}
+ array-buffer-byte-length@1.0.1:
+ dependencies:
+ call-bind: 1.0.7
+ is-array-buffer: 3.0.4
+
+ array-includes@3.1.8:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- get-intrinsic: 1.2.0
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ get-intrinsic: 1.2.4
is-string: 1.0.7
- dev: true
- /array-union@2.1.0:
- resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
- engines: {node: '>=8'}
- dev: true
+ array-union@2.1.0: {}
- /array.prototype.flat@1.3.1:
- resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==}
- engines: {node: '>= 0.4'}
+ array.prototype.findlast@1.2.5:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- es-shim-unscopables: 1.0.0
- dev: true
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-shim-unscopables: 1.0.2
- /array.prototype.flatmap@1.3.1:
- resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
- engines: {node: '>= 0.4'}
+ array.prototype.findlastindex@1.2.5:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- es-shim-unscopables: 1.0.0
- dev: true
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-shim-unscopables: 1.0.2
- /array.prototype.tosorted@1.1.1:
- resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==}
+ array.prototype.flat@1.3.2:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- es-shim-unscopables: 1.0.0
- get-intrinsic: 1.2.0
- dev: true
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
- /ast-types-flow@0.0.7:
- resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
- dev: true
+ array.prototype.flatmap@1.3.2:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
- /asynckit@0.4.0:
- resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
- dev: false
+ array.prototype.toreversed@1.1.2:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
- /autoprefixer@10.4.14(postcss@8.4.21):
- resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
- engines: {node: ^10 || ^12 || >=14}
- hasBin: true
- peerDependencies:
- postcss: ^8.1.0
+ array.prototype.tosorted@1.1.4:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-shim-unscopables: 1.0.2
+
+ arraybuffer.prototype.slice@1.0.3:
+ dependencies:
+ array-buffer-byte-length: 1.0.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ is-array-buffer: 3.0.4
+ is-shared-array-buffer: 1.0.3
+
+ ast-types-flow@0.0.8: {}
+
+ asynckit@0.4.0: {}
+
+ autoprefixer@10.4.19(postcss@8.4.39):
dependencies:
- browserslist: 4.21.5
- caniuse-lite: 1.0.30001466
- fraction.js: 4.2.0
+ browserslist: 4.23.1
+ caniuse-lite: 1.0.30001640
+ fraction.js: 4.3.7
normalize-range: 0.1.2
- picocolors: 1.0.0
- postcss: 8.4.21
+ picocolors: 1.0.1
+ postcss: 8.4.39
postcss-value-parser: 4.2.0
- /available-typed-arrays@1.0.5:
- resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
- engines: {node: '>= 0.4'}
- dev: true
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.0.0
- /axe-core@4.6.3:
- resolution: {integrity: sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==}
- engines: {node: '>=4'}
- dev: true
+ axe-core@4.9.1: {}
- /axios@1.3.4:
- resolution: {integrity: sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==}
+ axios@1.7.2:
dependencies:
- follow-redirects: 1.15.2
+ follow-redirects: 1.15.6
form-data: 4.0.0
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
- dev: false
- /axobject-query@3.1.1:
- resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==}
+ axobject-query@3.1.1:
dependencies:
- deep-equal: 2.2.0
- dev: true
+ deep-equal: 2.2.3
- /babel-plugin-macros@3.1.0:
- resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
- engines: {node: '>=10', npm: '>=6'}
+ babel-plugin-macros@3.1.0:
dependencies:
- '@babel/runtime': 7.21.0
+ '@babel/runtime': 7.24.7
cosmiconfig: 7.1.0
- resolve: 1.22.1
- dev: false
+ resolve: 1.22.8
- /babel-plugin-styled-components@2.0.7(styled-components@5.3.9):
- resolution: {integrity: sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==}
- peerDependencies:
- styled-components: '>= 2'
+ babel-plugin-styled-components@2.1.4(@babel/core@7.24.7)(styled-components@5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0):
dependencies:
- '@babel/helper-annotate-as-pure': 7.18.6
- '@babel/helper-module-imports': 7.18.6
- babel-plugin-syntax-jsx: 6.18.0
+ '@babel/helper-annotate-as-pure': 7.24.7
+ '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0)
+ '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7)
lodash: 4.17.21
picomatch: 2.3.1
- styled-components: 5.3.9(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)
- dev: false
+ styled-components: 5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - supports-color
- /babel-plugin-syntax-jsx@6.18.0:
- resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==}
- dev: false
+ bail@2.0.2: {}
- /bail@2.0.2:
- resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
- dev: false
+ balanced-match@1.0.2: {}
- /balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- dev: true
+ base64-js@1.5.1: {}
- /binary-extensions@2.2.0:
- resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
- engines: {node: '>=8'}
+ binary-extensions@2.3.0: {}
- /brace-expansion@1.1.11:
- resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ bl@5.1.0:
+ dependencies:
+ buffer: 6.0.3
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ brace-expansion@1.1.11:
dependencies:
balanced-match: 1.0.2
concat-map: 0.0.1
- dev: true
- /braces@3.0.2:
- resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
- engines: {node: '>=8'}
+ brace-expansion@2.0.1:
dependencies:
- fill-range: 7.0.1
+ balanced-match: 1.0.2
- /browserslist@4.21.5:
- resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
+ braces@3.0.3:
dependencies:
- caniuse-lite: 1.0.30001466
- electron-to-chromium: 1.4.330
- node-releases: 2.0.10
- update-browserslist-db: 1.0.10(browserslist@4.21.5)
+ fill-range: 7.1.1
- /buffer-writer@2.0.0:
- resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==}
- engines: {node: '>=4'}
- dev: true
+ browserslist@4.23.1:
+ dependencies:
+ caniuse-lite: 1.0.30001640
+ electron-to-chromium: 1.4.816
+ node-releases: 2.0.14
+ update-browserslist-db: 1.1.0(browserslist@4.23.1)
- /call-bind@1.0.2:
- resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
+ buffer-equal-constant-time@1.0.1: {}
+
+ buffer@6.0.3:
dependencies:
- function-bind: 1.1.1
- get-intrinsic: 1.2.0
- dev: true
+ base64-js: 1.5.1
+ ieee754: 1.2.1
- /callsites@3.1.0:
- resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
- engines: {node: '>=6'}
+ busboy@1.6.0:
+ dependencies:
+ streamsearch: 1.1.0
- /camelcase-css@2.0.1:
- resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
- engines: {node: '>= 6'}
+ bytes@3.1.0: {}
- /camelize@1.0.1:
- resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
- dev: false
+ call-bind@1.0.7:
+ dependencies:
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ set-function-length: 1.2.2
- /caniuse-lite@1.0.30001466:
- resolution: {integrity: sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==}
+ callsites@3.1.0: {}
- /ccount@2.0.1:
- resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
- dev: false
+ camelcase-css@2.0.1: {}
- /chalk@2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
+ camelize@1.0.1: {}
+
+ caniuse-lite@1.0.30001640: {}
+
+ ccount@2.0.1: {}
+
+ chalk@2.4.2:
dependencies:
ansi-styles: 3.2.1
escape-string-regexp: 1.0.5
supports-color: 5.5.0
- dev: false
- /chalk@4.1.2:
- resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
- engines: {node: '>=10'}
+ chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
- dev: true
- /character-entities-legacy@1.1.4:
- resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==}
- dev: true
+ character-entities-legacy@1.1.4: {}
- /character-entities@1.2.4:
- resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==}
- dev: true
+ character-entities@1.2.4: {}
- /character-entities@2.0.2:
- resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
- dev: false
+ character-entities@2.0.2: {}
- /character-reference-invalid@1.1.4:
- resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
- dev: true
+ character-reference-invalid@1.1.4: {}
- /chokidar@3.5.3:
- resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
- engines: {node: '>= 8.10.0'}
+ chokidar@3.6.0:
dependencies:
anymatch: 3.1.3
- braces: 3.0.2
+ braces: 3.0.3
glob-parent: 5.1.2
is-binary-path: 2.1.0
is-glob: 4.0.3
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
- fsevents: 2.3.2
+ fsevents: 2.3.3
- /client-only@0.0.1:
- resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
- dev: false
+ client-only@0.0.1: {}
- /clsx@1.2.1:
- resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
- engines: {node: '>=6'}
- dev: false
+ clsx@2.1.1: {}
- /color-convert@1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ color-convert@1.9.3:
dependencies:
color-name: 1.1.3
- dev: false
- /color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
+ color-convert@2.0.1:
dependencies:
color-name: 1.1.4
- /color-name@1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
- dev: false
+ color-name@1.1.3: {}
- /color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ color-name@1.1.4: {}
- /color-string@1.9.1:
- resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+ combined-stream@1.0.8:
dependencies:
- color-name: 1.1.4
- simple-swizzle: 0.2.2
- dev: false
+ delayed-stream: 1.0.0
- /color@4.2.3:
- resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
- engines: {node: '>=12.5.0'}
- dependencies:
- color-convert: 2.0.1
- color-string: 1.9.1
- dev: false
+ comma-separated-tokens@1.0.8: {}
- /combined-stream@1.0.8:
- resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
- engines: {node: '>= 0.8'}
- dependencies:
- delayed-stream: 1.0.0
- dev: false
+ comma-separated-tokens@2.0.3: {}
- /comma-separated-tokens@1.0.8:
- resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==}
- dev: true
+ commander@11.1.0: {}
- /comma-separated-tokens@2.0.3:
- resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
- dev: false
+ commander@4.1.1: {}
- /concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
- dev: true
+ concat-map@0.0.1: {}
- /convert-source-map@1.9.0:
- resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
- dev: false
+ content-type@1.0.4: {}
- /copy-to-clipboard@3.3.3:
- resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
+ content-type@1.0.5: {}
+
+ convert-source-map@1.9.0: {}
+
+ convert-source-map@2.0.0: {}
+
+ cookie@0.5.0: {}
+
+ copy-to-clipboard@3.3.3:
dependencies:
toggle-selection: 1.0.6
- dev: false
- /cosmiconfig@7.1.0:
- resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
- engines: {node: '>=10'}
+ cosmiconfig@7.1.0:
dependencies:
- '@types/parse-json': 4.0.0
+ '@types/parse-json': 4.0.2
import-fresh: 3.3.0
parse-json: 5.2.0
path-type: 4.0.0
yaml: 1.10.2
- dev: false
- /cross-spawn@7.0.3:
- resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
- engines: {node: '>= 8'}
+ create-require@1.1.1: {}
+
+ cross-spawn@7.0.3:
dependencies:
path-key: 3.1.1
shebang-command: 2.0.0
which: 2.0.2
- dev: true
-
- /css-color-keywords@1.0.0:
- resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
- engines: {node: '>=4'}
- dev: false
- /css-in-js-utils@3.1.0:
- resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==}
- dependencies:
- hyphenate-style-name: 1.0.4
- dev: false
+ css-color-keywords@1.0.0: {}
- /css-selector-tokenizer@0.8.0:
- resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==}
+ css-in-js-utils@3.1.0:
dependencies:
- cssesc: 3.0.0
- fastparse: 1.1.2
- dev: false
+ hyphenate-style-name: 1.1.0
- /css-to-react-native@3.2.0:
- resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
+ css-to-react-native@3.2.0:
dependencies:
camelize: 1.0.1
css-color-keywords: 1.0.0
postcss-value-parser: 4.2.0
- dev: false
- /css-tree@1.1.3:
- resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
- engines: {node: '>=8.0.0'}
+ css-tree@1.1.3:
dependencies:
mdn-data: 2.0.14
source-map: 0.6.1
- dev: false
- /cssesc@3.0.0:
- resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
- engines: {node: '>=4'}
- hasBin: true
+ cssesc@3.0.0: {}
- /csstype@3.1.1:
- resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
+ csstype@3.1.3: {}
- /daisyui@2.51.5(autoprefixer@10.4.14)(postcss@8.4.21):
- resolution: {integrity: sha512-L05dRw0tasmz2Ha+10LhftEGLq4kaA8vRR/T0wDaXfHwqcgsf81jfXDJ6NlZ63Z7Rl1k3rj7UHs0l0p7CM3aYA==}
- peerDependencies:
- autoprefixer: ^10.0.2
- postcss: ^8.1.6
+ damerau-levenshtein@1.0.8: {}
+
+ data-view-buffer@1.0.1:
dependencies:
- autoprefixer: 10.4.14(postcss@8.4.21)
- color: 4.2.3
- css-selector-tokenizer: 0.8.0
- postcss: 8.4.21
- postcss-js: 4.0.1(postcss@8.4.21)
- tailwindcss: 3.2.7(postcss@8.4.21)
- transitivePeerDependencies:
- - ts-node
- dev: false
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
- /damerau-levenshtein@1.0.8:
- resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
- dev: true
+ data-view-byte-length@1.0.1:
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
- /dayjs@1.11.7:
- resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==}
- dev: false
+ data-view-byte-offset@1.0.0:
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
- /debug@3.2.7:
- resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
+ dayjs@1.11.11: {}
+
+ debug@3.2.7:
dependencies:
ms: 2.1.3
- dev: true
- /debug@4.3.4(supports-color@5.5.0):
- resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
+ debug@4.3.5(supports-color@5.5.0):
dependencies:
ms: 2.1.2
+ optionalDependencies:
supports-color: 5.5.0
- /decode-named-character-reference@1.0.2:
- resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+ decode-named-character-reference@1.0.2:
dependencies:
character-entities: 2.0.2
- dev: false
- /deep-equal@2.2.0:
- resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==}
+ deep-equal@2.2.3:
dependencies:
- call-bind: 1.0.2
+ array-buffer-byte-length: 1.0.1
+ call-bind: 1.0.7
es-get-iterator: 1.1.3
- get-intrinsic: 1.2.0
+ get-intrinsic: 1.2.4
is-arguments: 1.1.1
- is-array-buffer: 3.0.2
+ is-array-buffer: 3.0.4
is-date-object: 1.0.5
is-regex: 1.1.4
- is-shared-array-buffer: 1.0.2
+ is-shared-array-buffer: 1.0.3
isarray: 2.0.5
- object-is: 1.1.5
+ object-is: 1.1.6
object-keys: 1.1.1
- object.assign: 4.1.4
- regexp.prototype.flags: 1.4.3
- side-channel: 1.0.4
+ object.assign: 4.1.5
+ regexp.prototype.flags: 1.5.2
+ side-channel: 1.0.6
which-boxed-primitive: 1.0.2
- which-collection: 1.0.1
- which-typed-array: 1.1.9
- dev: true
+ which-collection: 1.0.2
+ which-typed-array: 1.1.15
- /deep-is@0.1.4:
- resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
- dev: true
+ deep-is@0.1.4: {}
- /deepmerge@4.3.1:
- resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
- engines: {node: '>=0.10.0'}
- dev: false
+ deepmerge@4.3.1: {}
- /define-properties@1.2.0:
- resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
- engines: {node: '>= 0.4'}
+ define-data-property@1.1.4:
dependencies:
- has-property-descriptors: 1.0.0
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ gopd: 1.0.1
+
+ define-lazy-prop@2.0.0: {}
+
+ define-properties@1.2.1:
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
object-keys: 1.1.1
- dev: true
- /defined@1.0.1:
- resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
+ delayed-stream@1.0.0: {}
- /delayed-stream@1.0.0:
- resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
- engines: {node: '>=0.4.0'}
- dev: false
+ denque@2.1.0: {}
- /denque@2.1.0:
- resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
- engines: {node: '>=0.10'}
- dev: true
+ depd@1.1.2: {}
- /dequal@2.0.3:
- resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
- engines: {node: '>=6'}
- dev: false
+ dequal@2.0.3: {}
- /detective@5.2.1:
- resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==}
- engines: {node: '>=0.8.0'}
- hasBin: true
- dependencies:
- acorn-node: 1.8.2
- defined: 1.0.1
- minimist: 1.2.8
+ detect-node-es@1.1.0: {}
- /didyoumean@1.2.2:
- resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+ didyoumean@1.2.2: {}
- /diff@5.1.0:
- resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
- engines: {node: '>=0.3.1'}
- dev: false
+ diff@4.0.2: {}
- /dir-glob@3.0.1:
- resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
- engines: {node: '>=8'}
+ diff@5.2.0: {}
+
+ dir-glob@3.0.1:
dependencies:
path-type: 4.0.0
- dev: true
- /dlv@1.1.3:
- resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+ dlv@1.1.3: {}
- /doctrine@2.1.0:
- resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
- engines: {node: '>=0.10.0'}
+ doctrine@2.1.0:
dependencies:
esutils: 2.0.3
- dev: true
- /doctrine@3.0.0:
- resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
- engines: {node: '>=6.0.0'}
+ doctrine@3.0.0:
dependencies:
esutils: 2.0.3
- dev: true
- /dom-helpers@5.2.1:
- resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
+ dom-helpers@5.2.1:
dependencies:
- '@babel/runtime': 7.21.0
- csstype: 3.1.1
- dev: false
+ '@babel/runtime': 7.24.7
+ csstype: 3.1.3
- /electron-to-chromium@1.4.330:
- resolution: {integrity: sha512-PqyefhybrVdjAJ45HaPLtuVaehiSw7C3ya0aad+rvmV53IVyXmYRk3pwIOb2TxTDTnmgQdn46NjMMaysx79/6Q==}
+ eastasianwidth@0.2.0: {}
- /emoji-regex@9.2.2:
- resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
- dev: true
+ ecdsa-sig-formatter@1.0.11:
+ dependencies:
+ safe-buffer: 5.2.1
- /error-ex@1.3.2:
- resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+ electron-to-chromium@1.4.816: {}
+
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
+ env-cmd@10.1.0:
+ dependencies:
+ commander: 4.1.1
+ cross-spawn: 7.0.3
+
+ error-ex@1.3.2:
dependencies:
is-arrayish: 0.2.1
- dev: false
- /error-stack-parser@2.1.4:
- resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==}
+ error-stack-parser@2.1.4:
dependencies:
stackframe: 1.3.4
- dev: false
- /es-abstract@1.21.2:
- resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==}
- engines: {node: '>= 0.4'}
- dependencies:
- array-buffer-byte-length: 1.0.0
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- es-set-tostringtag: 2.0.1
+ es-abstract@1.23.3:
+ dependencies:
+ array-buffer-byte-length: 1.0.1
+ arraybuffer.prototype.slice: 1.0.3
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ data-view-buffer: 1.0.1
+ data-view-byte-length: 1.0.1
+ data-view-byte-offset: 1.0.0
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-set-tostringtag: 2.0.3
es-to-primitive: 1.2.1
- function.prototype.name: 1.1.5
- get-intrinsic: 1.2.0
- get-symbol-description: 1.0.0
- globalthis: 1.0.3
+ function.prototype.name: 1.1.6
+ get-intrinsic: 1.2.4
+ get-symbol-description: 1.0.2
+ globalthis: 1.0.4
gopd: 1.0.1
- has: 1.0.3
- has-property-descriptors: 1.0.0
- has-proto: 1.0.1
+ has-property-descriptors: 1.0.2
+ has-proto: 1.0.3
has-symbols: 1.0.3
- internal-slot: 1.0.5
- is-array-buffer: 3.0.2
+ hasown: 2.0.2
+ internal-slot: 1.0.7
+ is-array-buffer: 3.0.4
is-callable: 1.2.7
- is-negative-zero: 2.0.2
+ is-data-view: 1.0.1
+ is-negative-zero: 2.0.3
is-regex: 1.1.4
- is-shared-array-buffer: 1.0.2
+ is-shared-array-buffer: 1.0.3
is-string: 1.0.7
- is-typed-array: 1.1.10
+ is-typed-array: 1.1.13
is-weakref: 1.0.2
- object-inspect: 1.12.3
+ object-inspect: 1.13.2
object-keys: 1.1.1
- object.assign: 4.1.4
- regexp.prototype.flags: 1.4.3
- safe-regex-test: 1.0.0
- string.prototype.trim: 1.2.7
- string.prototype.trimend: 1.0.6
- string.prototype.trimstart: 1.0.6
- typed-array-length: 1.0.4
+ object.assign: 4.1.5
+ regexp.prototype.flags: 1.5.2
+ safe-array-concat: 1.1.2
+ safe-regex-test: 1.0.3
+ string.prototype.trim: 1.2.9
+ string.prototype.trimend: 1.0.8
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.2
+ typed-array-byte-length: 1.0.1
+ typed-array-byte-offset: 1.0.2
+ typed-array-length: 1.0.6
unbox-primitive: 1.0.2
- which-typed-array: 1.1.9
- dev: true
+ which-typed-array: 1.1.15
- /es-get-iterator@1.1.3:
- resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
+ es-aggregate-error@1.0.13:
+ dependencies:
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ globalthis: 1.0.4
+ has-property-descriptors: 1.0.2
+ set-function-name: 2.0.2
+
+ es-define-property@1.0.0:
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.0
+ get-intrinsic: 1.2.4
+
+ es-errors@1.3.0: {}
+
+ es-get-iterator@1.1.3:
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
has-symbols: 1.0.3
is-arguments: 1.1.1
- is-map: 2.0.2
- is-set: 2.0.2
+ is-map: 2.0.3
+ is-set: 2.0.3
is-string: 1.0.7
isarray: 2.0.5
stop-iteration-iterator: 1.0.0
- dev: true
- /es-set-tostringtag@2.0.1:
- resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==}
- engines: {node: '>= 0.4'}
+ es-iterator-helpers@1.0.19:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-set-tostringtag: 2.0.3
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ globalthis: 1.0.4
+ has-property-descriptors: 1.0.2
+ has-proto: 1.0.3
+ has-symbols: 1.0.3
+ internal-slot: 1.0.7
+ iterator.prototype: 1.1.2
+ safe-array-concat: 1.1.2
+
+ es-object-atoms@1.0.0:
dependencies:
- get-intrinsic: 1.2.0
- has: 1.0.3
- has-tostringtag: 1.0.0
- dev: true
+ es-errors: 1.3.0
- /es-shim-unscopables@1.0.0:
- resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
+ es-set-tostringtag@2.0.3:
dependencies:
- has: 1.0.3
- dev: true
+ get-intrinsic: 1.2.4
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
- /es-to-primitive@1.2.1:
- resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
- engines: {node: '>= 0.4'}
+ es-shim-unscopables@1.0.2:
+ dependencies:
+ hasown: 2.0.2
+
+ es-to-primitive@1.2.1:
dependencies:
is-callable: 1.2.7
is-date-object: 1.0.5
is-symbol: 1.0.4
- dev: true
- /escalade@3.1.1:
- resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
- engines: {node: '>=6'}
+ escalade@3.1.2: {}
- /escape-string-regexp@1.0.5:
- resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
- engines: {node: '>=0.8.0'}
- dev: false
+ escape-string-regexp@1.0.5: {}
- /escape-string-regexp@4.0.0:
- resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
- engines: {node: '>=10'}
+ escape-string-regexp@4.0.0: {}
- /escape-string-regexp@5.0.0:
- resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
- engines: {node: '>=12'}
- dev: false
+ escape-string-regexp@5.0.0: {}
- /eslint-config-next@12.2.3(eslint@8.20.0)(typescript@4.9.5):
- resolution: {integrity: sha512-xAQqAqwa2bu9ZMRypz58ym4tNCo22Wc6LuoLpbpf3yW5c4ZkVib9934AgGDDvh2zKrP56Z6X0Pp6gNnuuZzcRw==}
- peerDependencies:
- eslint: ^7.23.0 || ^8.0.0
- typescript: '>=3.3.1'
- peerDependenciesMeta:
- typescript:
- optional: true
+ eslint-config-next@12.2.3(eslint@8.20.0)(typescript@4.9.5):
dependencies:
'@next/eslint-plugin-next': 12.2.3
- '@rushstack/eslint-patch': 1.2.0
- '@typescript-eslint/parser': 5.55.0(eslint@8.20.0)(typescript@4.9.5)
+ '@rushstack/eslint-patch': 1.10.3
+ '@typescript-eslint/parser': 5.62.0(eslint@8.20.0)(typescript@4.9.5)
eslint: 8.20.0
- eslint-import-resolver-node: 0.3.7
- eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.27.5)(eslint@8.20.0)
- eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.55.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.20.0)
- eslint-plugin-jsx-a11y: 6.7.1(eslint@8.20.0)
- eslint-plugin-react: 7.32.2(eslint@8.20.0)
- eslint-plugin-react-hooks: 4.6.0(eslint@8.20.0)
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.29.1)(eslint@8.20.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.20.0)(typescript@4.9.5))(eslint-import-resolver-typescript@2.7.1)(eslint@8.20.0)
+ eslint-plugin-jsx-a11y: 6.9.0(eslint@8.20.0)
+ eslint-plugin-react: 7.34.3(eslint@8.20.0)
+ eslint-plugin-react-hooks: 4.6.2(eslint@8.20.0)
+ optionalDependencies:
typescript: 4.9.5
transitivePeerDependencies:
- eslint-import-resolver-webpack
- supports-color
- dev: true
- /eslint-import-resolver-node@0.3.7:
- resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==}
+ eslint-config-prettier@8.10.0(eslint@8.20.0):
+ dependencies:
+ eslint: 8.20.0
+
+ eslint-import-resolver-node@0.3.9:
dependencies:
debug: 3.2.7
- is-core-module: 2.11.0
- resolve: 1.22.1
+ is-core-module: 2.14.0
+ resolve: 1.22.8
transitivePeerDependencies:
- supports-color
- dev: true
- /eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.27.5)(eslint@8.20.0):
- resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==}
- engines: {node: '>=4'}
- peerDependencies:
- eslint: '*'
- eslint-plugin-import: '*'
+ eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.29.1)(eslint@8.20.0):
dependencies:
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.3.5(supports-color@5.5.0)
eslint: 8.20.0
- eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.55.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.20.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.20.0)(typescript@4.9.5))(eslint-import-resolver-typescript@2.7.1)(eslint@8.20.0)
glob: 7.2.3
is-glob: 4.0.3
- resolve: 1.22.1
- tsconfig-paths: 3.14.2
+ resolve: 1.22.8
+ tsconfig-paths: 3.15.0
transitivePeerDependencies:
- supports-color
- dev: true
- /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.55.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@2.7.1)(eslint@8.20.0):
- resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
- engines: {node: '>=4'}
- peerDependencies:
- '@typescript-eslint/parser': '*'
- eslint: '*'
- eslint-import-resolver-node: '*'
- eslint-import-resolver-typescript: '*'
- eslint-import-resolver-webpack: '*'
- peerDependenciesMeta:
- '@typescript-eslint/parser':
- optional: true
- eslint:
- optional: true
- eslint-import-resolver-node:
- optional: true
- eslint-import-resolver-typescript:
- optional: true
- eslint-import-resolver-webpack:
- optional: true
+ eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.20.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.29.1)(eslint@8.20.0))(eslint@8.20.0):
dependencies:
- '@typescript-eslint/parser': 5.55.0(eslint@8.20.0)(typescript@4.9.5)
debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 5.62.0(eslint@8.20.0)(typescript@4.9.5)
eslint: 8.20.0
- eslint-import-resolver-node: 0.3.7
- eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.27.5)(eslint@8.20.0)
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.29.1)(eslint@8.20.0)
transitivePeerDependencies:
- supports-color
- dev: true
- /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.55.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.20.0):
- resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==}
- engines: {node: '>=4'}
- peerDependencies:
- '@typescript-eslint/parser': '*'
- eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
- peerDependenciesMeta:
- '@typescript-eslint/parser':
- optional: true
+ eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.20.0)(typescript@4.9.5))(eslint-import-resolver-typescript@2.7.1)(eslint@8.20.0):
dependencies:
- '@typescript-eslint/parser': 5.55.0(eslint@8.20.0)(typescript@4.9.5)
- array-includes: 3.1.6
- array.prototype.flat: 1.3.1
- array.prototype.flatmap: 1.3.1
+ array-includes: 3.1.8
+ array.prototype.findlastindex: 1.2.5
+ array.prototype.flat: 1.3.2
+ array.prototype.flatmap: 1.3.2
debug: 3.2.7
doctrine: 2.1.0
eslint: 8.20.0
- eslint-import-resolver-node: 0.3.7
- eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.55.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@2.7.1)(eslint@8.20.0)
- has: 1.0.3
- is-core-module: 2.11.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.20.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.29.1)(eslint@8.20.0))(eslint@8.20.0)
+ hasown: 2.0.2
+ is-core-module: 2.14.0
is-glob: 4.0.3
minimatch: 3.1.2
- object.values: 1.1.6
- resolve: 1.22.1
- semver: 6.3.0
- tsconfig-paths: 3.14.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.0
+ semver: 6.3.1
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 5.62.0(eslint@8.20.0)(typescript@4.9.5)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
- dev: true
- /eslint-plugin-jsx-a11y@6.7.1(eslint@8.20.0):
- resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==}
- engines: {node: '>=4.0'}
- peerDependencies:
- eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ eslint-plugin-jsx-a11y@6.9.0(eslint@8.20.0):
dependencies:
- '@babel/runtime': 7.21.0
aria-query: 5.1.3
- array-includes: 3.1.6
- array.prototype.flatmap: 1.3.1
- ast-types-flow: 0.0.7
- axe-core: 4.6.3
+ array-includes: 3.1.8
+ array.prototype.flatmap: 1.3.2
+ ast-types-flow: 0.0.8
+ axe-core: 4.9.1
axobject-query: 3.1.1
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
+ es-iterator-helpers: 1.0.19
eslint: 8.20.0
- has: 1.0.3
- jsx-ast-utils: 3.3.3
- language-tags: 1.0.5
+ hasown: 2.0.2
+ jsx-ast-utils: 3.3.5
+ language-tags: 1.0.9
minimatch: 3.1.2
- object.entries: 1.1.6
- object.fromentries: 2.0.6
- semver: 6.3.0
- dev: true
+ object.fromentries: 2.0.8
+ safe-regex-test: 1.0.3
+ string.prototype.includes: 2.0.0
- /eslint-plugin-react-hooks@4.6.0(eslint@8.20.0):
- resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
- engines: {node: '>=10'}
- peerDependencies:
- eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+ eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.20.0))(eslint@8.20.0)(prettier@2.8.8):
dependencies:
eslint: 8.20.0
- dev: true
+ prettier: 2.8.8
+ prettier-linter-helpers: 1.0.0
+ optionalDependencies:
+ eslint-config-prettier: 8.10.0(eslint@8.20.0)
- /eslint-plugin-react@7.32.2(eslint@8.20.0):
- resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==}
- engines: {node: '>=4'}
- peerDependencies:
- eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ eslint-plugin-react-hooks@4.6.2(eslint@8.20.0):
+ dependencies:
+ eslint: 8.20.0
+
+ eslint-plugin-react@7.34.3(eslint@8.20.0):
dependencies:
- array-includes: 3.1.6
- array.prototype.flatmap: 1.3.1
- array.prototype.tosorted: 1.1.1
+ array-includes: 3.1.8
+ array.prototype.findlast: 1.2.5
+ array.prototype.flatmap: 1.3.2
+ array.prototype.toreversed: 1.1.2
+ array.prototype.tosorted: 1.1.4
doctrine: 2.1.0
+ es-iterator-helpers: 1.0.19
eslint: 8.20.0
estraverse: 5.3.0
- jsx-ast-utils: 3.3.3
+ jsx-ast-utils: 3.3.5
minimatch: 3.1.2
- object.entries: 1.1.6
- object.fromentries: 2.0.6
- object.hasown: 1.1.2
- object.values: 1.1.6
+ object.entries: 1.1.8
+ object.fromentries: 2.0.8
+ object.hasown: 1.1.4
+ object.values: 1.2.0
prop-types: 15.8.1
- resolve: 2.0.0-next.4
- semver: 6.3.0
- string.prototype.matchall: 4.0.8
- dev: true
+ resolve: 2.0.0-next.5
+ semver: 6.3.1
+ string.prototype.matchall: 4.0.11
- /eslint-scope@7.1.1:
- resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ eslint-scope@7.2.2:
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
- dev: true
- /eslint-utils@3.0.0(eslint@8.20.0):
- resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
- engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
- peerDependencies:
- eslint: '>=5'
+ eslint-utils@3.0.0(eslint@8.20.0):
dependencies:
eslint: 8.20.0
eslint-visitor-keys: 2.1.0
- dev: true
- /eslint-visitor-keys@2.1.0:
- resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
- engines: {node: '>=10'}
- dev: true
+ eslint-visitor-keys@2.1.0: {}
- /eslint-visitor-keys@3.3.0:
- resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dev: true
+ eslint-visitor-keys@3.4.3: {}
- /eslint@8.20.0:
- resolution: {integrity: sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- hasBin: true
+ eslint@8.20.0:
dependencies:
'@eslint/eslintrc': 1.4.1
'@humanwhocodes/config-array': 0.9.5
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.3.5(supports-color@5.5.0)
doctrine: 3.0.0
escape-string-regexp: 4.0.0
- eslint-scope: 7.1.1
+ eslint-scope: 7.2.2
eslint-utils: 3.0.0(eslint@8.20.0)
- eslint-visitor-keys: 3.3.0
- espree: 9.5.0
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
esquery: 1.5.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 6.0.1
functional-red-black-tree: 1.0.1
glob-parent: 6.0.2
- globals: 13.20.0
- ignore: 5.2.4
+ globals: 13.24.0
+ ignore: 5.3.1
import-fresh: 3.3.0
imurmurhash: 0.1.4
is-glob: 4.0.3
@@ -2037,236 +6240,166 @@ packages:
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
- optionator: 0.9.1
+ optionator: 0.9.4
regexpp: 3.2.0
strip-ansi: 6.0.1
strip-json-comments: 3.1.1
text-table: 0.2.0
- v8-compile-cache: 2.3.0
+ v8-compile-cache: 2.4.0
transitivePeerDependencies:
- supports-color
- dev: true
- /espree@9.5.0:
- resolution: {integrity: sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ espree@9.6.1:
dependencies:
- acorn: 8.8.2
- acorn-jsx: 5.3.2(acorn@8.8.2)
- eslint-visitor-keys: 3.3.0
- dev: true
+ acorn: 8.12.1
+ acorn-jsx: 5.3.2(acorn@8.12.1)
+ eslint-visitor-keys: 3.4.3
- /esquery@1.5.0:
- resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
- engines: {node: '>=0.10'}
+ esquery@1.5.0:
dependencies:
estraverse: 5.3.0
- dev: true
- /esrecurse@4.3.0:
- resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
- engines: {node: '>=4.0'}
+ esrecurse@4.3.0:
dependencies:
estraverse: 5.3.0
- dev: true
- /estraverse@5.3.0:
- resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
- engines: {node: '>=4.0'}
- dev: true
+ estraverse@5.3.0: {}
- /esutils@2.0.3:
- resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
- engines: {node: '>=0.10.0'}
- dev: true
+ esutils@2.0.3: {}
- /eventsource-parser@1.0.0:
- resolution: {integrity: sha512-9jgfSCa3dmEme2ES3mPByGXfgZ87VbP97tng1G2nWwWx6bV2nYxm2AWCrbQjXToSe+yYlqaZNtxffR9IeQr95g==}
- engines: {node: '>=14.18'}
- dev: false
+ events@3.3.0: {}
- /extend@3.0.2:
- resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
- dev: false
+ eventsource-parser@1.1.2: {}
- /fast-deep-equal@3.1.3:
- resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ extend@3.0.2: {}
- /fast-glob@3.2.12:
- resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
- engines: {node: '>=8.6.0'}
+ fast-deep-equal@3.1.3: {}
+
+ fast-diff@1.3.0: {}
+
+ fast-glob@3.3.2:
dependencies:
'@nodelib/fs.stat': 2.0.5
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
- merge2: 1.4.1
- micromatch: 4.0.5
-
- /fast-json-stable-stringify@2.1.0:
- resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
- dev: true
-
- /fast-levenshtein@2.0.6:
- resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
- dev: true
+ merge2: 1.4.1
+ micromatch: 4.0.7
- /fast-loops@1.1.3:
- resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==}
- dev: false
+ fast-json-stable-stringify@2.1.0: {}
- /fast-shallow-equal@1.0.0:
- resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==}
- dev: false
+ fast-levenshtein@2.0.6: {}
- /fastest-stable-stringify@2.0.2:
- resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==}
- dev: false
+ fast-shallow-equal@1.0.0: {}
- /fastparse@1.1.2:
- resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==}
- dev: false
+ fastest-stable-stringify@2.0.2: {}
- /fastq@1.15.0:
- resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+ fastq@1.17.1:
dependencies:
reusify: 1.0.4
- /fault@1.0.4:
- resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==}
+ fault@1.0.4:
dependencies:
format: 0.2.2
- dev: true
- /file-entry-cache@6.0.1:
- resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
- engines: {node: ^10.12.0 || >=12.0.0}
+ file-entry-cache@6.0.1:
dependencies:
- flat-cache: 3.0.4
- dev: true
+ flat-cache: 3.2.0
- /fill-range@7.0.1:
- resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
- engines: {node: '>=8'}
+ fill-range@7.1.1:
dependencies:
to-regex-range: 5.0.1
- /find-root@1.1.0:
- resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
- dev: false
+ find-root@1.1.0: {}
- /flat-cache@3.0.4:
- resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
- engines: {node: ^10.12.0 || >=12.0.0}
+ flat-cache@3.2.0:
dependencies:
- flatted: 3.2.7
+ flatted: 3.3.1
+ keyv: 4.5.4
rimraf: 3.0.2
- dev: true
- /flatted@3.2.7:
- resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
- dev: true
+ flatted@3.3.1: {}
- /follow-redirects@1.15.2:
- resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
- engines: {node: '>=4.0'}
- peerDependencies:
- debug: '*'
- peerDependenciesMeta:
- debug:
- optional: true
- dev: false
+ follow-redirects@1.15.6: {}
- /for-each@0.3.3:
- resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+ for-each@0.3.3:
dependencies:
is-callable: 1.2.7
- dev: true
- /form-data@4.0.0:
- resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
- engines: {node: '>= 6'}
+ foreground-child@3.2.1:
+ dependencies:
+ cross-spawn: 7.0.3
+ signal-exit: 4.1.0
+
+ form-data@4.0.0:
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
- dev: false
- /format@0.2.2:
- resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
- engines: {node: '>=0.4.x'}
- dev: true
+ format@0.2.2: {}
- /fraction.js@4.2.0:
- resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
+ fraction.js@4.3.7: {}
- /fs.realpath@1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
- dev: true
+ fs.realpath@1.0.0: {}
- /fsevents@2.3.2:
- resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
- os: [darwin]
- requiresBuild: true
+ fsevents@2.3.3:
optional: true
- /function-bind@1.1.1:
- resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+ function-bind@1.1.2: {}
- /function.prototype.name@1.1.5:
- resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
- engines: {node: '>= 0.4'}
+ function.prototype.name@1.1.6:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
functions-have-names: 1.2.3
- dev: true
- /functional-red-black-tree@1.0.1:
- resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
- dev: true
+ functional-red-black-tree@1.0.1: {}
- /functions-have-names@1.2.3:
- resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
- dev: true
+ functions-have-names@1.2.3: {}
- /generate-function@2.3.1:
- resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==}
+ generate-function@2.3.1:
dependencies:
is-property: 1.0.2
- dev: true
- /get-intrinsic@1.2.0:
- resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==}
+ gensync@1.0.0-beta.2: {}
+
+ get-intrinsic@1.2.4:
dependencies:
- function-bind: 1.1.1
- has: 1.0.3
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ has-proto: 1.0.3
has-symbols: 1.0.3
- dev: true
+ hasown: 2.0.2
- /get-symbol-description@1.0.0:
- resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
- engines: {node: '>= 0.4'}
+ get-nonce@1.0.1: {}
+
+ get-symbol-description@1.0.2:
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.0
- dev: true
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
- /glob-parent@5.1.2:
- resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
- engines: {node: '>= 6'}
+ glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
- /glob-parent@6.0.2:
- resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
- engines: {node: '>=10.13.0'}
+ glob-parent@6.0.2:
dependencies:
is-glob: 4.0.3
- /glob@7.1.7:
- resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
+ glob-to-regexp@0.4.1: {}
+
+ glob@10.4.2:
+ dependencies:
+ foreground-child: 3.2.1
+ jackspeak: 3.4.0
+ minimatch: 9.0.5
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.0
+ path-scurry: 1.11.1
+
+ glob@7.1.7:
dependencies:
fs.realpath: 1.0.0
inflight: 1.0.6
@@ -2274,10 +6407,8 @@ packages:
minimatch: 3.1.2
once: 1.4.0
path-is-absolute: 1.0.1
- dev: true
- /glob@7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ glob@7.2.3:
dependencies:
fs.realpath: 1.0.0
inflight: 1.0.6
@@ -2285,596 +6416,512 @@ packages:
minimatch: 3.1.2
once: 1.4.0
path-is-absolute: 1.0.1
- dev: true
- /globals@11.12.0:
- resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
- engines: {node: '>=4'}
- dev: false
+ globals@11.12.0: {}
- /globals@13.20.0:
- resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
- engines: {node: '>=8'}
+ globals@13.24.0:
dependencies:
type-fest: 0.20.2
- dev: true
- /globalthis@1.0.3:
- resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
- engines: {node: '>= 0.4'}
+ globalthis@1.0.4:
dependencies:
- define-properties: 1.2.0
- dev: true
+ define-properties: 1.2.1
+ gopd: 1.0.1
- /globby@11.1.0:
- resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
- engines: {node: '>=10'}
+ globby@11.1.0:
dependencies:
array-union: 2.1.0
dir-glob: 3.0.1
- fast-glob: 3.2.12
- ignore: 5.2.4
+ fast-glob: 3.3.2
+ ignore: 5.3.1
merge2: 1.4.1
slash: 3.0.0
- dev: true
- /goober@2.1.12(csstype@3.1.1):
- resolution: {integrity: sha512-yXHAvO08FU1JgTXX6Zn6sYCUFfB/OJSX8HHjDSgerZHZmFKAb08cykp5LBw5QnmyMcZyPRMqkdyHUSSzge788Q==}
- peerDependencies:
- csstype: ^3.0.10
+ goober@2.1.14(csstype@3.1.3):
dependencies:
- csstype: 3.1.1
- dev: false
+ csstype: 3.1.3
- /gopd@1.0.1:
- resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+ gopd@1.0.1:
dependencies:
- get-intrinsic: 1.2.0
- dev: true
+ get-intrinsic: 1.2.4
- /has-bigints@1.0.2:
- resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
- dev: true
+ graceful-fs@4.2.11: {}
- /has-flag@3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
+ has-bigints@1.0.2: {}
- /has-flag@4.0.0:
- resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
- engines: {node: '>=8'}
- dev: true
+ has-flag@3.0.0: {}
+
+ has-flag@4.0.0: {}
- /has-property-descriptors@1.0.0:
- resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
+ has-property-descriptors@1.0.2:
dependencies:
- get-intrinsic: 1.2.0
- dev: true
+ es-define-property: 1.0.0
- /has-proto@1.0.1:
- resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
- engines: {node: '>= 0.4'}
- dev: true
+ has-proto@1.0.3: {}
- /has-symbols@1.0.3:
- resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
- engines: {node: '>= 0.4'}
- dev: true
+ has-symbols@1.0.3: {}
- /has-tostringtag@1.0.0:
- resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
- engines: {node: '>= 0.4'}
+ has-tostringtag@1.0.2:
dependencies:
has-symbols: 1.0.3
- dev: true
- /has@1.0.3:
- resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
- engines: {node: '>= 0.4.0'}
+ hasown@2.0.2:
dependencies:
- function-bind: 1.1.1
+ function-bind: 1.1.2
- /hast-util-parse-selector@2.2.5:
- resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==}
- dev: true
+ hast-util-parse-selector@2.2.5: {}
- /hast-util-whitespace@2.0.1:
- resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==}
- dev: false
+ hast-util-whitespace@2.0.1: {}
- /hastscript@6.0.0:
- resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==}
+ hastscript@6.0.0:
dependencies:
- '@types/hast': 2.3.4
+ '@types/hast': 2.3.10
comma-separated-tokens: 1.0.8
hast-util-parse-selector: 2.2.5
property-information: 5.6.0
space-separated-tokens: 1.1.5
- dev: true
- /highlight.js@10.7.3:
- resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
- dev: true
+ highlight.js@10.7.3: {}
- /highlight.js@11.7.0:
- resolution: {integrity: sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==}
- engines: {node: '>=12.0.0'}
- dev: false
+ highlight.js@11.9.0: {}
- /hoist-non-react-statics@3.3.2:
- resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+ hoist-non-react-statics@3.3.2:
dependencies:
react-is: 16.13.1
- dev: false
- /hyphenate-style-name@1.0.4:
- resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==}
- dev: false
+ html-parse-stringify@3.0.1:
+ dependencies:
+ void-elements: 3.1.0
- /iconv-lite@0.6.3:
- resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
- engines: {node: '>=0.10.0'}
+ http-errors@1.7.3:
+ dependencies:
+ depd: 1.1.2
+ inherits: 2.0.4
+ setprototypeof: 1.1.1
+ statuses: 1.5.0
+ toidentifier: 1.0.0
+
+ http-proxy-agent@7.0.2:
+ dependencies:
+ agent-base: 7.1.1
+ debug: 4.3.5(supports-color@5.5.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ https-proxy-agent@7.0.5:
+ dependencies:
+ agent-base: 7.1.1
+ debug: 4.3.5(supports-color@5.5.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ hyphenate-style-name@1.1.0: {}
+
+ i18next@22.5.1:
+ dependencies:
+ '@babel/runtime': 7.24.7
+
+ iconv-lite@0.4.24:
dependencies:
safer-buffer: 2.1.2
- dev: true
- /ignore@5.2.4:
- resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
- engines: {node: '>= 4'}
- dev: true
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
- /import-fresh@3.3.0:
- resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
- engines: {node: '>=6'}
+ ieee754@1.2.1: {}
+
+ ignore@5.3.1: {}
+
+ import-fresh@3.3.0:
dependencies:
parent-module: 1.0.1
resolve-from: 4.0.0
- /imurmurhash@0.1.4:
- resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
- engines: {node: '>=0.8.19'}
- dev: true
+ imurmurhash@0.1.4: {}
- /inflight@1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ inflight@1.0.6:
dependencies:
once: 1.4.0
wrappy: 1.0.2
- dev: true
- /inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
- dev: true
+ inherits@2.0.4: {}
- /inline-style-parser@0.1.1:
- resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
- dev: false
+ inline-style-parser@0.1.1: {}
- /inline-style-prefixer@6.0.4:
- resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==}
+ inline-style-prefixer@7.0.1:
dependencies:
css-in-js-utils: 3.1.0
- fast-loops: 1.1.3
- dev: false
- /internal-slot@1.0.5:
- resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
- engines: {node: '>= 0.4'}
+ internal-slot@1.0.7:
dependencies:
- get-intrinsic: 1.2.0
- has: 1.0.3
- side-channel: 1.0.4
- dev: true
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.0.6
- /is-alphabetical@1.0.4:
- resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
- dev: true
+ invariant@2.2.4:
+ dependencies:
+ loose-envify: 1.4.0
- /is-alphanumerical@1.0.4:
- resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==}
+ is-alphabetical@1.0.4: {}
+
+ is-alphanumerical@1.0.4:
dependencies:
is-alphabetical: 1.0.4
is-decimal: 1.0.4
- dev: true
- /is-arguments@1.1.1:
- resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
- engines: {node: '>= 0.4'}
+ is-arguments@1.1.1:
dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
- dev: true
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
- /is-array-buffer@3.0.2:
- resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
+ is-array-buffer@3.0.4:
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.0
- is-typed-array: 1.1.10
- dev: true
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
- /is-arrayish@0.2.1:
- resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
- dev: false
+ is-arrayish@0.2.1: {}
- /is-arrayish@0.3.2:
- resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
- dev: false
+ is-async-function@2.0.0:
+ dependencies:
+ has-tostringtag: 1.0.2
- /is-bigint@1.0.4:
- resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+ is-bigint@1.0.4:
dependencies:
has-bigints: 1.0.2
- dev: true
- /is-binary-path@2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
+ is-binary-path@2.1.0:
dependencies:
- binary-extensions: 2.2.0
+ binary-extensions: 2.3.0
- /is-boolean-object@1.1.2:
- resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
- engines: {node: '>= 0.4'}
+ is-boolean-object@1.1.2:
dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
- dev: true
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
- /is-buffer@2.0.5:
- resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==}
- engines: {node: '>=4'}
- dev: false
+ is-buffer@2.0.5: {}
- /is-callable@1.2.7:
- resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
- engines: {node: '>= 0.4'}
- dev: true
+ is-callable@1.2.7: {}
- /is-core-module@2.11.0:
- resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
+ is-core-module@2.14.0:
dependencies:
- has: 1.0.3
+ hasown: 2.0.2
- /is-date-object@1.0.5:
- resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
- engines: {node: '>= 0.4'}
+ is-data-view@1.0.1:
dependencies:
- has-tostringtag: 1.0.0
- dev: true
+ is-typed-array: 1.1.13
- /is-decimal@1.0.4:
- resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
- dev: true
+ is-date-object@1.0.5:
+ dependencies:
+ has-tostringtag: 1.0.2
- /is-extglob@2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
+ is-decimal@1.0.4: {}
- /is-glob@4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
+ is-docker@2.2.1: {}
+
+ is-extglob@2.1.1: {}
+
+ is-finalizationregistry@1.0.2:
+ dependencies:
+ call-bind: 1.0.7
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-generator-function@1.0.10:
+ dependencies:
+ has-tostringtag: 1.0.2
+
+ is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
- /is-hexadecimal@1.0.4:
- resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==}
- dev: true
+ is-hexadecimal@1.0.4: {}
- /is-map@2.0.2:
- resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
- dev: true
+ is-map@2.0.3: {}
- /is-negative-zero@2.0.2:
- resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
- engines: {node: '>= 0.4'}
- dev: true
+ is-negative-zero@2.0.3: {}
- /is-number-object@1.0.7:
- resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
- engines: {node: '>= 0.4'}
+ is-number-object@1.0.7:
dependencies:
- has-tostringtag: 1.0.0
- dev: true
+ has-tostringtag: 1.0.2
- /is-number@7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
+ is-number@7.0.0: {}
- /is-plain-obj@4.1.0:
- resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
- engines: {node: '>=12'}
- dev: false
+ is-plain-obj@4.1.0: {}
- /is-property@1.0.2:
- resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==}
- dev: true
+ is-property@1.0.2: {}
- /is-regex@1.1.4:
- resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
- engines: {node: '>= 0.4'}
+ is-regex@1.1.4:
dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
- dev: true
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
- /is-set@2.0.2:
- resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==}
- dev: true
+ is-set@2.0.3: {}
- /is-shared-array-buffer@1.0.2:
- resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
+ is-shared-array-buffer@1.0.3:
dependencies:
- call-bind: 1.0.2
- dev: true
+ call-bind: 1.0.7
- /is-string@1.0.7:
- resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
- engines: {node: '>= 0.4'}
+ is-string@1.0.7:
dependencies:
- has-tostringtag: 1.0.0
- dev: true
+ has-tostringtag: 1.0.2
- /is-symbol@1.0.4:
- resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
- engines: {node: '>= 0.4'}
+ is-symbol@1.0.4:
dependencies:
has-symbols: 1.0.3
- dev: true
- /is-typed-array@1.1.10:
- resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==}
- engines: {node: '>= 0.4'}
+ is-typed-array@1.1.13:
dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- for-each: 0.3.3
- gopd: 1.0.1
- has-tostringtag: 1.0.0
- dev: true
+ which-typed-array: 1.1.15
- /is-weakmap@2.0.1:
- resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
- dev: true
+ is-weakmap@2.0.2: {}
- /is-weakref@1.0.2:
- resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ is-weakref@1.0.2:
dependencies:
- call-bind: 1.0.2
- dev: true
+ call-bind: 1.0.7
- /is-weakset@2.0.2:
- resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==}
+ is-weakset@2.0.3:
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.0
- dev: true
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
- /isarray@2.0.5:
- resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
- dev: true
+ is-wsl@2.2.0:
+ dependencies:
+ is-docker: 2.2.1
- /isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
- dev: true
+ isarray@2.0.5: {}
- /js-cookie@2.2.1:
- resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==}
- dev: false
+ isexe@2.0.0: {}
- /js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ iterator.prototype@1.1.2:
+ dependencies:
+ define-properties: 1.2.1
+ get-intrinsic: 1.2.4
+ has-symbols: 1.0.3
+ reflect.getprototypeof: 1.0.6
+ set-function-name: 2.0.2
- /js-yaml@4.1.0:
- resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
- hasBin: true
+ jackspeak@3.4.0:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
+ jiti@1.21.6: {}
+
+ jose@4.15.9: {}
+
+ js-cookie@2.2.1: {}
+
+ js-md4@0.3.2: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.1.0:
dependencies:
argparse: 2.0.1
- dev: true
- /jsesc@2.5.2:
- resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
- engines: {node: '>=4'}
- hasBin: true
- dev: false
+ jsbi@4.3.0: {}
- /json-parse-even-better-errors@2.3.1:
- resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
- dev: false
+ jsesc@2.5.2: {}
- /json-schema-traverse@0.4.1:
- resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
- dev: true
+ json-buffer@3.0.1: {}
- /json-stable-stringify-without-jsonify@1.0.1:
- resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
- dev: true
+ json-parse-even-better-errors@2.3.1: {}
- /json5@1.0.2:
- resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
- hasBin: true
+ json-schema-traverse@0.4.1: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@1.0.2:
dependencies:
minimist: 1.2.8
- dev: true
- /jsx-ast-utils@3.3.3:
- resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
- engines: {node: '>=4.0'}
+ json5@2.2.3: {}
+
+ jsonwebtoken@9.0.2:
dependencies:
- array-includes: 3.1.6
- object.assign: 4.1.4
- dev: true
+ jws: 3.2.2
+ lodash.includes: 4.3.0
+ lodash.isboolean: 3.0.3
+ lodash.isinteger: 4.0.4
+ lodash.isnumber: 3.0.3
+ lodash.isplainobject: 4.0.6
+ lodash.isstring: 4.0.1
+ lodash.once: 4.1.1
+ ms: 2.1.3
+ semver: 7.6.2
- /kleur@4.1.5:
- resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
- engines: {node: '>=6'}
- dev: false
+ jsx-ast-utils@3.3.5:
+ dependencies:
+ array-includes: 3.1.8
+ array.prototype.flat: 1.3.2
+ object.assign: 4.1.5
+ object.values: 1.2.0
- /language-subtag-registry@0.3.22:
- resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
- dev: true
+ jwa@1.4.1:
+ dependencies:
+ buffer-equal-constant-time: 1.0.1
+ ecdsa-sig-formatter: 1.0.11
+ safe-buffer: 5.2.1
- /language-tags@1.0.5:
- resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==}
+ jwa@2.0.0:
dependencies:
- language-subtag-registry: 0.3.22
- dev: true
+ buffer-equal-constant-time: 1.0.1
+ ecdsa-sig-formatter: 1.0.11
+ safe-buffer: 5.2.1
- /levn@0.4.1:
- resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
- engines: {node: '>= 0.8.0'}
+ jws@3.2.2:
+ dependencies:
+ jwa: 1.4.1
+ safe-buffer: 5.2.1
+
+ jws@4.0.0:
+ dependencies:
+ jwa: 2.0.0
+ safe-buffer: 5.2.1
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ kleur@4.1.5: {}
+
+ language-subtag-registry@0.3.23: {}
+
+ language-tags@1.0.9:
+ dependencies:
+ language-subtag-registry: 0.3.23
+
+ levn@0.4.1:
dependencies:
prelude-ls: 1.2.1
type-check: 0.4.0
- dev: true
- /lilconfig@2.1.0:
- resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
- engines: {node: '>=10'}
+ lilconfig@2.1.0: {}
- /lines-and-columns@1.2.4:
- resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
- dev: false
+ lilconfig@3.1.2: {}
- /lodash-es@4.17.21:
- resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
- dev: false
+ lines-and-columns@1.2.4: {}
- /lodash.castarray@4.4.0:
- resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
- dev: true
+ lodash-es@4.17.21: {}
- /lodash.isplainobject@4.0.6:
- resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
- dev: true
+ lodash.castarray@4.4.0: {}
- /lodash.merge@4.6.2:
- resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
- dev: true
+ lodash.includes@4.3.0: {}
- /lodash@4.17.21:
- resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
- dev: false
+ lodash.isboolean@3.0.3: {}
- /long@5.2.1:
- resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==}
- dev: true
+ lodash.isinteger@4.0.4: {}
- /longest-streak@3.1.0:
- resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
- dev: false
+ lodash.isnumber@3.0.3: {}
- /loose-envify@1.4.0:
- resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
- hasBin: true
+ lodash.isplainobject@4.0.6: {}
+
+ lodash.isstring@4.0.1: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash.once@4.1.1: {}
+
+ lodash@4.17.21: {}
+
+ long@5.2.3: {}
+
+ longest-streak@3.1.0: {}
+
+ loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
- /lowlight@1.20.0:
- resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==}
+ lowlight@1.20.0:
dependencies:
fault: 1.0.4
highlight.js: 10.7.3
- dev: true
- /lru-cache@6.0.0:
- resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
- engines: {node: '>=10'}
+ lru-cache@10.3.0: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ lru-cache@6.0.0:
dependencies:
yallist: 4.0.0
- dev: true
- /lru-cache@7.18.3:
- resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
- engines: {node: '>=12'}
- dev: true
+ lru-cache@7.18.3: {}
- /markdown-table@3.0.3:
- resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
- dev: false
+ lru-cache@8.0.5: {}
- /mdast-util-definitions@5.1.2:
- resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
+ make-error@1.3.6: {}
+
+ markdown-table@3.0.3: {}
+
+ mdast-util-definitions@5.1.2:
dependencies:
- '@types/mdast': 3.0.11
- '@types/unist': 2.0.6
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.10
unist-util-visit: 4.1.2
- dev: false
- /mdast-util-find-and-replace@2.2.2:
- resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==}
+ mdast-util-find-and-replace@2.2.2:
dependencies:
- '@types/mdast': 3.0.11
+ '@types/mdast': 3.0.15
escape-string-regexp: 5.0.0
unist-util-is: 5.2.1
unist-util-visit-parents: 5.1.3
- dev: false
- /mdast-util-from-markdown@1.3.0:
- resolution: {integrity: sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==}
+ mdast-util-from-markdown@1.3.1:
dependencies:
- '@types/mdast': 3.0.11
- '@types/unist': 2.0.6
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.10
decode-named-character-reference: 1.0.2
- mdast-util-to-string: 3.1.1
- micromark: 3.1.0
- micromark-util-decode-numeric-character-reference: 1.0.0
- micromark-util-decode-string: 1.0.2
- micromark-util-normalize-identifier: 1.0.0
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
+ mdast-util-to-string: 3.2.0
+ micromark: 3.2.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-decode-string: 1.1.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
unist-util-stringify-position: 3.0.3
uvu: 0.5.6
transitivePeerDependencies:
- supports-color
- dev: false
- /mdast-util-gfm-autolink-literal@1.0.3:
- resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==}
+ mdast-util-gfm-autolink-literal@1.0.3:
dependencies:
- '@types/mdast': 3.0.11
+ '@types/mdast': 3.0.15
ccount: 2.0.1
mdast-util-find-and-replace: 2.2.2
- micromark-util-character: 1.1.0
- dev: false
+ micromark-util-character: 1.2.0
- /mdast-util-gfm-footnote@1.0.2:
- resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==}
+ mdast-util-gfm-footnote@1.0.2:
dependencies:
- '@types/mdast': 3.0.11
+ '@types/mdast': 3.0.15
mdast-util-to-markdown: 1.5.0
- micromark-util-normalize-identifier: 1.0.0
- dev: false
+ micromark-util-normalize-identifier: 1.1.0
- /mdast-util-gfm-strikethrough@1.0.3:
- resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==}
+ mdast-util-gfm-strikethrough@1.0.3:
dependencies:
- '@types/mdast': 3.0.11
+ '@types/mdast': 3.0.15
mdast-util-to-markdown: 1.5.0
- dev: false
- /mdast-util-gfm-table@1.0.7:
- resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==}
+ mdast-util-gfm-table@1.0.7:
dependencies:
- '@types/mdast': 3.0.11
+ '@types/mdast': 3.0.15
markdown-table: 3.0.3
- mdast-util-from-markdown: 1.3.0
+ mdast-util-from-markdown: 1.3.1
mdast-util-to-markdown: 1.5.0
transitivePeerDependencies:
- supports-color
- dev: false
- /mdast-util-gfm-task-list-item@1.0.2:
- resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==}
+ mdast-util-gfm-task-list-item@1.0.2:
dependencies:
- '@types/mdast': 3.0.11
+ '@types/mdast': 3.0.15
mdast-util-to-markdown: 1.5.0
- dev: false
- /mdast-util-gfm@2.0.2:
- resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==}
+ mdast-util-gfm@2.0.2:
dependencies:
- mdast-util-from-markdown: 1.3.0
+ mdast-util-from-markdown: 1.3.1
mdast-util-gfm-autolink-literal: 1.0.3
mdast-util-gfm-footnote: 1.0.2
mdast-util-gfm-strikethrough: 1.0.3
@@ -2883,549 +6930,465 @@ packages:
mdast-util-to-markdown: 1.5.0
transitivePeerDependencies:
- supports-color
- dev: false
- /mdast-util-phrasing@3.0.1:
- resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==}
+ mdast-util-phrasing@3.0.1:
dependencies:
- '@types/mdast': 3.0.11
+ '@types/mdast': 3.0.15
unist-util-is: 5.2.1
- dev: false
- /mdast-util-to-hast@12.3.0:
- resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==}
+ mdast-util-to-hast@12.3.0:
dependencies:
- '@types/hast': 2.3.4
- '@types/mdast': 3.0.11
+ '@types/hast': 2.3.10
+ '@types/mdast': 3.0.15
mdast-util-definitions: 5.1.2
- micromark-util-sanitize-uri: 1.1.0
+ micromark-util-sanitize-uri: 1.2.0
trim-lines: 3.0.1
unist-util-generated: 2.0.1
unist-util-position: 4.0.4
unist-util-visit: 4.1.2
- dev: false
- /mdast-util-to-markdown@1.5.0:
- resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==}
+ mdast-util-to-markdown@1.5.0:
dependencies:
- '@types/mdast': 3.0.11
- '@types/unist': 2.0.6
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.10
longest-streak: 3.1.0
mdast-util-phrasing: 3.0.1
- mdast-util-to-string: 3.1.1
- micromark-util-decode-string: 1.0.2
+ mdast-util-to-string: 3.2.0
+ micromark-util-decode-string: 1.1.0
unist-util-visit: 4.1.2
zwitch: 2.0.4
- dev: false
- /mdast-util-to-string@3.1.1:
- resolution: {integrity: sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA==}
+ mdast-util-to-string@3.2.0:
dependencies:
- '@types/mdast': 3.0.11
- dev: false
+ '@types/mdast': 3.0.15
- /mdn-data@2.0.14:
- resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
- dev: false
+ mdn-data@2.0.14: {}
- /merge2@1.4.1:
- resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
- engines: {node: '>= 8'}
+ merge2@1.4.1: {}
- /micromark-core-commonmark@1.0.6:
- resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==}
+ micro-cors@0.1.1: {}
+
+ micro@10.0.1:
+ dependencies:
+ arg: 4.1.0
+ content-type: 1.0.4
+ raw-body: 2.4.1
+
+ micromark-core-commonmark@1.1.0:
dependencies:
decode-named-character-reference: 1.0.2
- micromark-factory-destination: 1.0.0
- micromark-factory-label: 1.0.2
- micromark-factory-space: 1.0.0
- micromark-factory-title: 1.0.2
- micromark-factory-whitespace: 1.0.0
- micromark-util-character: 1.1.0
- micromark-util-chunked: 1.0.0
- micromark-util-classify-character: 1.0.0
- micromark-util-html-tag-name: 1.1.0
- micromark-util-normalize-identifier: 1.0.0
- micromark-util-resolve-all: 1.0.0
- micromark-util-subtokenize: 1.0.2
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
+ micromark-factory-destination: 1.1.0
+ micromark-factory-label: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-factory-title: 1.1.0
+ micromark-factory-whitespace: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-chunked: 1.1.0
+ micromark-util-classify-character: 1.1.0
+ micromark-util-html-tag-name: 1.2.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-subtokenize: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
uvu: 0.5.6
- dev: false
- /micromark-extension-gfm-autolink-literal@1.0.3:
- resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==}
+ micromark-extension-gfm-autolink-literal@1.0.5:
dependencies:
- micromark-util-character: 1.1.0
- micromark-util-sanitize-uri: 1.1.0
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
- uvu: 0.5.6
- dev: false
-
- /micromark-extension-gfm-footnote@1.0.4:
- resolution: {integrity: sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==}
- dependencies:
- micromark-core-commonmark: 1.0.6
- micromark-factory-space: 1.0.0
- micromark-util-character: 1.1.0
- micromark-util-normalize-identifier: 1.0.0
- micromark-util-sanitize-uri: 1.1.0
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
+ micromark-util-character: 1.2.0
+ micromark-util-sanitize-uri: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-extension-gfm-footnote@1.1.2:
+ dependencies:
+ micromark-core-commonmark: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-sanitize-uri: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
uvu: 0.5.6
- dev: false
- /micromark-extension-gfm-strikethrough@1.0.4:
- resolution: {integrity: sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==}
+ micromark-extension-gfm-strikethrough@1.0.7:
dependencies:
- micromark-util-chunked: 1.0.0
- micromark-util-classify-character: 1.0.0
- micromark-util-resolve-all: 1.0.0
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
+ micromark-util-chunked: 1.1.0
+ micromark-util-classify-character: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
uvu: 0.5.6
- dev: false
- /micromark-extension-gfm-table@1.0.5:
- resolution: {integrity: sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==}
+ micromark-extension-gfm-table@1.0.7:
dependencies:
- micromark-factory-space: 1.0.0
- micromark-util-character: 1.1.0
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
uvu: 0.5.6
- dev: false
- /micromark-extension-gfm-tagfilter@1.0.1:
- resolution: {integrity: sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==}
+ micromark-extension-gfm-tagfilter@1.0.2:
dependencies:
- micromark-util-types: 1.0.2
- dev: false
+ micromark-util-types: 1.1.0
- /micromark-extension-gfm-task-list-item@1.0.3:
- resolution: {integrity: sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==}
+ micromark-extension-gfm-task-list-item@1.0.5:
dependencies:
- micromark-factory-space: 1.0.0
- micromark-util-character: 1.1.0
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
uvu: 0.5.6
- dev: false
-
- /micromark-extension-gfm@2.0.1:
- resolution: {integrity: sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==}
- dependencies:
- micromark-extension-gfm-autolink-literal: 1.0.3
- micromark-extension-gfm-footnote: 1.0.4
- micromark-extension-gfm-strikethrough: 1.0.4
- micromark-extension-gfm-table: 1.0.5
- micromark-extension-gfm-tagfilter: 1.0.1
- micromark-extension-gfm-task-list-item: 1.0.3
- micromark-util-combine-extensions: 1.0.0
- micromark-util-types: 1.0.2
- dev: false
-
- /micromark-factory-destination@1.0.0:
- resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==}
- dependencies:
- micromark-util-character: 1.1.0
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
- dev: false
-
- /micromark-factory-label@1.0.2:
- resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==}
- dependencies:
- micromark-util-character: 1.1.0
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
- uvu: 0.5.6
- dev: false
- /micromark-factory-space@1.0.0:
- resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==}
+ micromark-extension-gfm@2.0.3:
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 1.0.5
+ micromark-extension-gfm-footnote: 1.1.2
+ micromark-extension-gfm-strikethrough: 1.0.7
+ micromark-extension-gfm-table: 1.0.7
+ micromark-extension-gfm-tagfilter: 1.0.2
+ micromark-extension-gfm-task-list-item: 1.0.5
+ micromark-util-combine-extensions: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-factory-destination@1.1.0:
dependencies:
- micromark-util-character: 1.1.0
- micromark-util-types: 1.0.2
- dev: false
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
- /micromark-factory-title@1.0.2:
- resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==}
+ micromark-factory-label@1.1.0:
dependencies:
- micromark-factory-space: 1.0.0
- micromark-util-character: 1.1.0
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
uvu: 0.5.6
- dev: false
- /micromark-factory-whitespace@1.0.0:
- resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==}
+ micromark-factory-space@1.1.0:
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-types: 1.1.0
+
+ micromark-factory-title@1.1.0:
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+
+ micromark-factory-whitespace@1.1.0:
dependencies:
- micromark-factory-space: 1.0.0
- micromark-util-character: 1.1.0
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
- dev: false
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
- /micromark-util-character@1.1.0:
- resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==}
+ micromark-util-character@1.2.0:
dependencies:
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
- dev: false
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
- /micromark-util-chunked@1.0.0:
- resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==}
+ micromark-util-chunked@1.1.0:
dependencies:
- micromark-util-symbol: 1.0.1
- dev: false
+ micromark-util-symbol: 1.1.0
- /micromark-util-classify-character@1.0.0:
- resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==}
+ micromark-util-classify-character@1.1.0:
dependencies:
- micromark-util-character: 1.1.0
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
- dev: false
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
- /micromark-util-combine-extensions@1.0.0:
- resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==}
+ micromark-util-combine-extensions@1.1.0:
dependencies:
- micromark-util-chunked: 1.0.0
- micromark-util-types: 1.0.2
- dev: false
+ micromark-util-chunked: 1.1.0
+ micromark-util-types: 1.1.0
- /micromark-util-decode-numeric-character-reference@1.0.0:
- resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==}
+ micromark-util-decode-numeric-character-reference@1.1.0:
dependencies:
- micromark-util-symbol: 1.0.1
- dev: false
+ micromark-util-symbol: 1.1.0
- /micromark-util-decode-string@1.0.2:
- resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==}
+ micromark-util-decode-string@1.1.0:
dependencies:
decode-named-character-reference: 1.0.2
- micromark-util-character: 1.1.0
- micromark-util-decode-numeric-character-reference: 1.0.0
- micromark-util-symbol: 1.0.1
- dev: false
+ micromark-util-character: 1.2.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-symbol: 1.1.0
- /micromark-util-encode@1.0.1:
- resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==}
- dev: false
+ micromark-util-encode@1.1.0: {}
- /micromark-util-html-tag-name@1.1.0:
- resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==}
- dev: false
+ micromark-util-html-tag-name@1.2.0: {}
- /micromark-util-normalize-identifier@1.0.0:
- resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==}
+ micromark-util-normalize-identifier@1.1.0:
dependencies:
- micromark-util-symbol: 1.0.1
- dev: false
+ micromark-util-symbol: 1.1.0
- /micromark-util-resolve-all@1.0.0:
- resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==}
+ micromark-util-resolve-all@1.1.0:
dependencies:
- micromark-util-types: 1.0.2
- dev: false
+ micromark-util-types: 1.1.0
- /micromark-util-sanitize-uri@1.1.0:
- resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==}
+ micromark-util-sanitize-uri@1.2.0:
dependencies:
- micromark-util-character: 1.1.0
- micromark-util-encode: 1.0.1
- micromark-util-symbol: 1.0.1
- dev: false
+ micromark-util-character: 1.2.0
+ micromark-util-encode: 1.1.0
+ micromark-util-symbol: 1.1.0
- /micromark-util-subtokenize@1.0.2:
- resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==}
+ micromark-util-subtokenize@1.1.0:
dependencies:
- micromark-util-chunked: 1.0.0
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
+ micromark-util-chunked: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
uvu: 0.5.6
- dev: false
- /micromark-util-symbol@1.0.1:
- resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==}
- dev: false
+ micromark-util-symbol@1.1.0: {}
- /micromark-util-types@1.0.2:
- resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==}
- dev: false
+ micromark-util-types@1.1.0: {}
- /micromark@3.1.0:
- resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==}
+ micromark@3.2.0:
dependencies:
- '@types/debug': 4.1.7
- debug: 4.3.4(supports-color@5.5.0)
+ '@types/debug': 4.1.12
+ debug: 4.3.5(supports-color@5.5.0)
decode-named-character-reference: 1.0.2
- micromark-core-commonmark: 1.0.6
- micromark-factory-space: 1.0.0
- micromark-util-character: 1.1.0
- micromark-util-chunked: 1.0.0
- micromark-util-combine-extensions: 1.0.0
- micromark-util-decode-numeric-character-reference: 1.0.0
- micromark-util-encode: 1.0.1
- micromark-util-normalize-identifier: 1.0.0
- micromark-util-resolve-all: 1.0.0
- micromark-util-sanitize-uri: 1.1.0
- micromark-util-subtokenize: 1.0.2
- micromark-util-symbol: 1.0.1
- micromark-util-types: 1.0.2
+ micromark-core-commonmark: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-chunked: 1.1.0
+ micromark-util-combine-extensions: 1.1.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-encode: 1.1.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-sanitize-uri: 1.2.0
+ micromark-util-subtokenize: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
uvu: 0.5.6
transitivePeerDependencies:
- supports-color
- dev: false
- /micromatch@4.0.5:
- resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
- engines: {node: '>=8.6'}
+ micromatch@4.0.7:
dependencies:
- braces: 3.0.2
+ braces: 3.0.3
picomatch: 2.3.1
- /mime-db@1.52.0:
- resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
- engines: {node: '>= 0.6'}
- dev: false
+ mime-db@1.52.0: {}
- /mime-types@2.1.35:
- resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
- engines: {node: '>= 0.6'}
+ mime-types@2.1.35:
dependencies:
mime-db: 1.52.0
- dev: false
- /minimatch@3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.11
- dev: true
- /minimist@1.2.8:
- resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.1
- /mri@1.2.0:
- resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
- engines: {node: '>=4'}
- dev: false
+ minimist@1.2.8: {}
- /ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ minipass@7.1.2: {}
- /ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- dev: true
+ mri@1.2.0: {}
- /mysql2@3.2.0:
- resolution: {integrity: sha512-0Vn6a9WSrq6fWwvPgrvIwnOCldiEcgbzapVRDAtDZ4cMTxN7pnGqCTx8EG32S/NYXl6AXkdO+9hV1tSIi/LigA==}
- engines: {node: '>= 8.0'}
+ ms@2.1.2: {}
+
+ ms@2.1.3: {}
+
+ mssql@9.3.2:
+ dependencies:
+ '@tediousjs/connection-string': 0.5.0
+ commander: 11.1.0
+ debug: 4.3.5(supports-color@5.5.0)
+ rfdc: 1.4.1
+ tarn: 3.0.2
+ tedious: 15.1.3
+ transitivePeerDependencies:
+ - supports-color
+
+ mysql2@3.10.2:
dependencies:
denque: 2.1.0
generate-function: 2.3.1
iconv-lite: 0.6.3
- long: 5.2.1
- lru-cache: 7.18.3
+ long: 5.2.3
+ lru-cache: 8.0.5
named-placeholders: 1.1.3
seq-queue: 0.0.5
sqlstring: 2.3.3
- dev: true
- /named-placeholders@1.1.3:
- resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==}
- engines: {node: '>=12.0.0'}
+ mz@2.7.0:
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
+
+ named-placeholders@1.1.3:
dependencies:
lru-cache: 7.18.3
- dev: true
- /nano-css@5.3.5(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==}
- peerDependencies:
- react: '*'
- react-dom: '*'
+ nano-css@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
+ '@jridgewell/sourcemap-codec': 1.4.15
css-tree: 1.1.3
- csstype: 3.1.1
+ csstype: 3.1.3
fastest-stable-stringify: 2.0.2
- inline-style-prefixer: 6.0.4
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
+ inline-style-prefixer: 7.0.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
rtl-css-js: 1.16.1
- sourcemap-codec: 1.4.8
stacktrace-js: 2.0.2
- stylis: 4.1.3
- dev: false
+ stylis: 4.3.2
- /nanoid@3.3.4:
- resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
+ nanoid@3.3.7: {}
- /natural-compare@1.4.0:
- resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
- dev: true
+ native-duplexpair@1.0.0: {}
- /next@13.2.4(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==}
- engines: {node: '>=14.6.0'}
- hasBin: true
- peerDependencies:
- '@opentelemetry/api': ^1.4.0
- fibers: '>= 3.1.0'
- node-sass: ^6.0.0 || ^7.0.0
- react: ^18.2.0
- react-dom: ^18.2.0
- sass: ^1.3.0
- peerDependenciesMeta:
- '@opentelemetry/api':
- optional: true
- fibers:
- optional: true
- node-sass:
- optional: true
- sass:
- optional: true
+ natural-compare@1.4.0: {}
+
+ next-auth@4.24.7(next@13.5.6(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nodemailer@6.9.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@next/env': 13.2.4
- '@swc/helpers': 0.4.14
- caniuse-lite: 1.0.30001466
- postcss: 8.4.14
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- styled-jsx: 5.1.1(react@18.2.0)
+ '@babel/runtime': 7.24.7
+ '@panva/hkdf': 1.2.1
+ cookie: 0.5.0
+ jose: 4.15.9
+ next: 13.5.6(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ oauth: 0.9.15
+ openid-client: 5.6.5
+ preact: 10.22.1
+ preact-render-to-string: 5.2.6(preact@10.22.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ uuid: 8.3.2
+ optionalDependencies:
+ nodemailer: 6.9.14
+
+ next@13.5.6(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@next/env': 13.5.6
+ '@swc/helpers': 0.5.2
+ busboy: 1.6.0
+ caniuse-lite: 1.0.30001640
+ postcss: 8.4.31
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ styled-jsx: 5.1.1(@babel/core@7.24.7)(react@18.3.1)
+ watchpack: 2.4.0
optionalDependencies:
- '@next/swc-android-arm-eabi': 13.2.4
- '@next/swc-android-arm64': 13.2.4
- '@next/swc-darwin-arm64': 13.2.4
- '@next/swc-darwin-x64': 13.2.4
- '@next/swc-freebsd-x64': 13.2.4
- '@next/swc-linux-arm-gnueabihf': 13.2.4
- '@next/swc-linux-arm64-gnu': 13.2.4
- '@next/swc-linux-arm64-musl': 13.2.4
- '@next/swc-linux-x64-gnu': 13.2.4
- '@next/swc-linux-x64-musl': 13.2.4
- '@next/swc-win32-arm64-msvc': 13.2.4
- '@next/swc-win32-ia32-msvc': 13.2.4
- '@next/swc-win32-x64-msvc': 13.2.4
+ '@next/swc-darwin-arm64': 13.5.6
+ '@next/swc-darwin-x64': 13.5.6
+ '@next/swc-linux-arm64-gnu': 13.5.6
+ '@next/swc-linux-arm64-musl': 13.5.6
+ '@next/swc-linux-x64-gnu': 13.5.6
+ '@next/swc-linux-x64-musl': 13.5.6
+ '@next/swc-win32-arm64-msvc': 13.5.6
+ '@next/swc-win32-ia32-msvc': 13.5.6
+ '@next/swc-win32-x64-msvc': 13.5.6
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
- dev: false
- /node-releases@2.0.10:
- resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
+ node-abort-controller@3.1.1: {}
- /normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
+ node-releases@2.0.14: {}
- /normalize-range@0.1.2:
- resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
- engines: {node: '>=0.10.0'}
+ nodemailer@6.9.14: {}
- /object-assign@4.1.1:
- resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
- engines: {node: '>=0.10.0'}
+ normalize-path@3.0.0: {}
- /object-hash@3.0.0:
- resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
- engines: {node: '>= 6'}
+ normalize-range@0.1.2: {}
- /object-inspect@1.12.3:
- resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
- dev: true
+ oauth@0.9.15: {}
- /object-is@1.1.5:
- resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==}
- engines: {node: '>= 0.4'}
+ object-assign@4.1.1: {}
+
+ object-hash@2.2.0: {}
+
+ object-hash@3.0.0: {}
+
+ object-inspect@1.13.2: {}
+
+ object-is@1.1.6:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- dev: true
+ call-bind: 1.0.7
+ define-properties: 1.2.1
- /object-keys@1.1.1:
- resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
- engines: {node: '>= 0.4'}
- dev: true
+ object-keys@1.1.1: {}
- /object.assign@4.1.4:
- resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
- engines: {node: '>= 0.4'}
+ object.assign@4.1.5:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
+ call-bind: 1.0.7
+ define-properties: 1.2.1
has-symbols: 1.0.3
object-keys: 1.1.1
- dev: true
- /object.entries@1.1.6:
- resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==}
- engines: {node: '>= 0.4'}
+ object.entries@1.1.8:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- dev: true
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
- /object.fromentries@2.0.6:
- resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==}
- engines: {node: '>= 0.4'}
+ object.fromentries@2.0.8:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- dev: true
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
- /object.hasown@1.1.2:
- resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==}
+ object.groupby@1.0.3:
dependencies:
- define-properties: 1.2.0
- es-abstract: 1.21.2
- dev: true
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
- /object.values@1.1.6:
- resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==}
- engines: {node: '>= 0.4'}
+ object.hasown@1.1.4:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- dev: true
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
- /once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ object.values@1.2.0:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+
+ obuf@1.1.2: {}
+
+ oidc-token-hash@5.0.3: {}
+
+ once@1.4.0:
dependencies:
wrappy: 1.0.2
- dev: true
- /optionator@0.9.1:
- resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
- engines: {node: '>= 0.8.0'}
+ open@8.4.2:
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+
+ openid-client@5.6.5:
+ dependencies:
+ jose: 4.15.9
+ lru-cache: 6.0.0
+ object-hash: 2.2.0
+ oidc-token-hash: 5.0.3
+
+ optionator@0.9.4:
dependencies:
deep-is: 0.1.4
fast-levenshtein: 2.0.6
levn: 0.4.1
prelude-ls: 1.2.1
type-check: 0.4.0
- word-wrap: 1.2.3
- dev: true
+ word-wrap: 1.2.5
- /packet-reader@1.0.0:
- resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==}
- dev: true
+ package-json-from-dist@1.0.0: {}
- /parent-module@1.0.1:
- resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
- engines: {node: '>=6'}
+ parent-module@1.0.1:
dependencies:
callsites: 3.1.0
- /parse-entities@2.0.0:
- resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==}
+ parse-entities@2.0.0:
dependencies:
character-entities: 1.2.4
character-entities-legacy: 1.1.4
@@ -3433,398 +7396,359 @@ packages:
is-alphanumerical: 1.0.4
is-decimal: 1.0.4
is-hexadecimal: 1.0.4
- dev: true
- /parse-json@5.2.0:
- resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
- engines: {node: '>=8'}
+ parse-json@5.2.0:
dependencies:
- '@babel/code-frame': 7.18.6
+ '@babel/code-frame': 7.24.7
error-ex: 1.3.2
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
- dev: false
- /path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
- dev: true
+ path-is-absolute@1.0.1: {}
- /path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
- engines: {node: '>=8'}
- dev: true
+ path-key@3.1.1: {}
- /path-parse@1.0.7:
- resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ path-parse@1.0.7: {}
- /path-type@4.0.0:
- resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
- engines: {node: '>=8'}
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.3.0
+ minipass: 7.1.2
- /pg-connection-string@2.5.0:
- resolution: {integrity: sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==}
- dev: true
+ path-type@4.0.0: {}
- /pg-int8@1.0.1:
- resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
- engines: {node: '>=4.0.0'}
- dev: true
+ pg-cloudflare@1.1.1:
+ optional: true
- /pg-pool@3.6.0(pg@8.10.0):
- resolution: {integrity: sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==}
- peerDependencies:
- pg: '>=8.0'
+ pg-connection-string@2.6.4: {}
+
+ pg-int8@1.0.1: {}
+
+ pg-numeric@1.0.2: {}
+
+ pg-pool@3.6.2(pg@8.12.0):
dependencies:
- pg: 8.10.0
- dev: true
+ pg: 8.12.0
- /pg-protocol@1.6.0:
- resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==}
- dev: true
+ pg-protocol@1.6.1: {}
- /pg-types@2.2.0:
- resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
- engines: {node: '>=4'}
+ pg-types@2.2.0:
dependencies:
pg-int8: 1.0.1
postgres-array: 2.0.0
postgres-bytea: 1.0.0
postgres-date: 1.0.7
postgres-interval: 1.2.0
- dev: true
- /pg@8.10.0:
- resolution: {integrity: sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==}
- engines: {node: '>= 8.0.0'}
- peerDependencies:
- pg-native: '>=3.0.1'
- peerDependenciesMeta:
- pg-native:
- optional: true
+ pg-types@4.0.2:
dependencies:
- buffer-writer: 2.0.0
- packet-reader: 1.0.0
- pg-connection-string: 2.5.0
- pg-pool: 3.6.0(pg@8.10.0)
- pg-protocol: 1.6.0
+ pg-int8: 1.0.1
+ pg-numeric: 1.0.2
+ postgres-array: 3.0.2
+ postgres-bytea: 3.0.0
+ postgres-date: 2.1.0
+ postgres-interval: 3.0.0
+ postgres-range: 1.1.4
+
+ pg@8.12.0:
+ dependencies:
+ pg-connection-string: 2.6.4
+ pg-pool: 3.6.2(pg@8.12.0)
+ pg-protocol: 1.6.1
pg-types: 2.2.0
pgpass: 1.0.5
- dev: true
+ optionalDependencies:
+ pg-cloudflare: 1.1.1
- /pgpass@1.0.5:
- resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
+ pgpass@1.0.5:
dependencies:
- split2: 4.1.0
- dev: true
+ split2: 4.2.0
- /picocolors@1.0.0:
- resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+ picocolors@1.0.1: {}
- /picomatch@2.3.1:
- resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
- engines: {node: '>=8.6'}
+ picomatch@2.3.1: {}
- /pify@2.3.0:
- resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
- engines: {node: '>=0.10.0'}
+ pify@2.3.0: {}
- /postcss-import@14.1.0(postcss@8.4.21):
- resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
- engines: {node: '>=10.0.0'}
- peerDependencies:
- postcss: ^8.0.0
+ pirates@4.0.6: {}
+
+ possible-typed-array-names@1.0.0: {}
+
+ postcss-import@15.1.0(postcss@8.4.39):
dependencies:
- postcss: 8.4.21
+ postcss: 8.4.39
postcss-value-parser: 4.2.0
read-cache: 1.0.0
- resolve: 1.22.1
+ resolve: 1.22.8
- /postcss-js@4.0.1(postcss@8.4.21):
- resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
- engines: {node: ^12 || ^14 || >= 16}
- peerDependencies:
- postcss: ^8.4.21
+ postcss-js@4.0.1(postcss@8.4.39):
dependencies:
camelcase-css: 2.0.1
- postcss: 8.4.21
+ postcss: 8.4.39
- /postcss-load-config@3.1.4(postcss@8.4.21):
- resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
- engines: {node: '>= 10'}
- peerDependencies:
- postcss: '>=8.0.9'
- ts-node: '>=9.0.0'
- peerDependenciesMeta:
- postcss:
- optional: true
- ts-node:
- optional: true
+ postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@18.19.39)(typescript@4.9.5)):
dependencies:
- lilconfig: 2.1.0
- postcss: 8.4.21
- yaml: 1.10.2
+ lilconfig: 3.1.2
+ yaml: 2.4.5
+ optionalDependencies:
+ postcss: 8.4.39
+ ts-node: 10.9.2(@types/node@18.19.39)(typescript@4.9.5)
- /postcss-nested@6.0.0(postcss@8.4.21):
- resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==}
- engines: {node: '>=12.0'}
- peerDependencies:
- postcss: ^8.2.14
+ postcss-nested@6.0.1(postcss@8.4.39):
dependencies:
- postcss: 8.4.21
- postcss-selector-parser: 6.0.11
+ postcss: 8.4.39
+ postcss-selector-parser: 6.1.0
- /postcss-selector-parser@6.0.10:
- resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
- engines: {node: '>=4'}
+ postcss-selector-parser@6.0.10:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
- dev: true
- /postcss-selector-parser@6.0.11:
- resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==}
- engines: {node: '>=4'}
+ postcss-selector-parser@6.1.0:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
- /postcss-value-parser@4.2.0:
- resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+ postcss-value-parser@4.2.0: {}
- /postcss@8.4.14:
- resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
- engines: {node: ^10 || ^12 || >=14}
+ postcss@8.4.31:
dependencies:
- nanoid: 3.3.4
- picocolors: 1.0.0
- source-map-js: 1.0.2
- dev: false
+ nanoid: 3.3.7
+ picocolors: 1.0.1
+ source-map-js: 1.2.0
- /postcss@8.4.21:
- resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==}
- engines: {node: ^10 || ^12 || >=14}
+ postcss@8.4.39:
dependencies:
- nanoid: 3.3.4
- picocolors: 1.0.0
- source-map-js: 1.0.2
+ nanoid: 3.3.7
+ picocolors: 1.0.1
+ source-map-js: 1.2.0
- /postgres-array@2.0.0:
- resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
- engines: {node: '>=4'}
- dev: true
+ postgres-array@2.0.0: {}
- /postgres-bytea@1.0.0:
- resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==}
- engines: {node: '>=0.10.0'}
- dev: true
+ postgres-array@3.0.2: {}
- /postgres-date@1.0.7:
- resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
- engines: {node: '>=0.10.0'}
- dev: true
+ postgres-bytea@1.0.0: {}
- /postgres-interval@1.2.0:
- resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
- engines: {node: '>=0.10.0'}
+ postgres-bytea@3.0.0:
+ dependencies:
+ obuf: 1.1.2
+
+ postgres-date@1.0.7: {}
+
+ postgres-date@2.1.0: {}
+
+ postgres-interval@1.2.0:
dependencies:
xtend: 4.0.2
- dev: true
- /prelude-ls@1.2.1:
- resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
- engines: {node: '>= 0.8.0'}
- dev: true
+ postgres-interval@3.0.0: {}
- /prismjs@1.27.0:
- resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==}
- engines: {node: '>=6'}
- dev: true
+ postgres-range@1.1.4: {}
- /prismjs@1.29.0:
- resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
- engines: {node: '>=6'}
- dev: true
+ preact-render-to-string@5.2.6(preact@10.22.1):
+ dependencies:
+ preact: 10.22.1
+ pretty-format: 3.8.0
- /prop-types@15.8.1:
- resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ preact@10.22.1: {}
+
+ prelude-ls@1.2.1: {}
+
+ prettier-linter-helpers@1.0.0:
+ dependencies:
+ fast-diff: 1.3.0
+
+ prettier@2.8.8: {}
+
+ pretty-format@3.8.0: {}
+
+ prisma@4.16.2:
+ dependencies:
+ '@prisma/engines': 4.16.2
+
+ prismjs@1.27.0: {}
+
+ prismjs@1.29.0: {}
+
+ prop-types@15.8.1:
dependencies:
loose-envify: 1.4.0
object-assign: 4.1.1
react-is: 16.13.1
- /property-information@5.6.0:
- resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==}
+ property-information@5.6.0:
dependencies:
xtend: 4.0.2
- dev: true
- /property-information@6.2.0:
- resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==}
- dev: false
+ property-information@6.5.0: {}
- /proxy-from-env@1.1.0:
- resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
- dev: false
+ proxy-from-env@1.1.0: {}
- /punycode@2.3.0:
- resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
- engines: {node: '>=6'}
- dev: true
+ punycode@2.3.1: {}
- /queue-microtask@1.2.3:
- resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ qs@6.12.2:
+ dependencies:
+ side-channel: 1.0.6
- /quick-lru@5.1.1:
- resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
- engines: {node: '>=10'}
+ queue-microtask@1.2.3: {}
- /react-data-table-component@7.5.3(react@18.2.0)(styled-components@5.3.9):
- resolution: {integrity: sha512-JhatRTgThAAa1HobPaPmkNPsjLT6+fnMIdtcXRCy+0bSYN7XJnTgob9Qyi4bjHh/8tMPTHtxZCV/TKiPwRvFMA==}
- peerDependencies:
- react: '>= 16.8.3'
- styled-components: '>= 4'
+ raw-body@2.4.1:
+ dependencies:
+ bytes: 3.1.0
+ http-errors: 1.7.3
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+
+ react-data-table-component@7.6.2(react@18.3.1)(styled-components@5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)):
dependencies:
deepmerge: 4.3.1
- react: 18.2.0
- styled-components: 5.3.9(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)
- dev: false
+ react: 18.3.1
+ styled-components: 5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)
- /react-dom@18.2.0(react@18.2.0):
- resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
- peerDependencies:
- react: ^18.2.0
+ react-dom@18.3.1(react@18.3.1):
dependencies:
loose-envify: 1.4.0
- react: 18.2.0
- scheduler: 0.23.0
- dev: false
+ react: 18.3.1
+ scheduler: 0.23.2
- /react-hot-toast@2.4.0(csstype@3.1.1)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-qnnVbXropKuwUpriVVosgo8QrB+IaPJCpL8oBI6Ov84uvHZ5QQcTp2qg6ku2wNfgJl6rlQXJIQU5q+5lmPOutA==}
- engines: {node: '>=10'}
- peerDependencies:
- react: '>=16'
- react-dom: '>=16'
+ react-hot-toast@2.4.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- goober: 2.1.12(csstype@3.1.1)
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
+ goober: 2.1.14(csstype@3.1.3)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
transitivePeerDependencies:
- csstype
- dev: false
- /react-icons@4.8.0(react@18.2.0):
- resolution: {integrity: sha512-N6+kOLcihDiAnj5Czu637waJqSnwlMNROzVZMhfX68V/9bu9qHaMIJC4UdozWoOk57gahFCNHwVvWzm0MTzRjg==}
- peerDependencies:
- react: '*'
+ react-i18next@12.3.1(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- react: 18.2.0
- dev: false
+ '@babel/runtime': 7.24.7
+ html-parse-stringify: 3.0.1
+ i18next: 22.5.1
+ react: 18.3.1
+ optionalDependencies:
+ react-dom: 18.3.1(react@18.3.1)
- /react-is@16.13.1:
- resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+ react-icons@4.12.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
- /react-is@18.2.0:
- resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
- dev: false
+ react-is@16.13.1: {}
- /react-loader-spinner@5.3.4(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-G2vw4ssX+RDZ/vfaeva06yfNqyFViv/u+tVZ3kFLy5TKNlNx2DbuwreBSpRtPespQA+VxinxUJsigwLwG9erOg==}
- peerDependencies:
- react: ^16.0.0 || ^17.0.0 || ^18.0.0
- react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0
+ react-is@18.3.1: {}
+
+ react-loader-spinner@5.5.0(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- react-is: 18.2.0
- styled-components: 5.3.9(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-is: 18.3.1
+ styled-components: 5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)
styled-tools: 1.7.2
- dev: false
+ transitivePeerDependencies:
+ - '@babel/core'
- /react-markdown@8.0.6(@types/react@18.0.28)(react@18.2.0):
- resolution: {integrity: sha512-KgPWsYgHuftdx510wwIzpwf+5js/iHqBR+fzxefv8Khk3mFbnioF1bmL2idHN3ler0LMQmICKeDrWnZrX9mtbQ==}
- peerDependencies:
- '@types/react': '>=16'
- react: '>=16'
+ react-markdown@8.0.7(@types/react@18.3.3)(react@18.3.1):
dependencies:
- '@types/hast': 2.3.4
- '@types/prop-types': 15.7.5
- '@types/react': 18.0.28
- '@types/unist': 2.0.6
+ '@types/hast': 2.3.10
+ '@types/prop-types': 15.7.12
+ '@types/react': 18.3.3
+ '@types/unist': 2.0.10
comma-separated-tokens: 2.0.3
hast-util-whitespace: 2.0.1
prop-types: 15.8.1
- property-information: 6.2.0
- react: 18.2.0
- react-is: 18.2.0
- remark-parse: 10.0.1
+ property-information: 6.5.0
+ react: 18.3.1
+ react-is: 18.3.1
+ remark-parse: 10.0.2
remark-rehype: 10.1.0
space-separated-tokens: 2.0.2
- style-to-object: 0.4.1
+ style-to-object: 0.4.4
unified: 10.1.2
unist-util-visit: 4.1.2
vfile: 5.3.7
transitivePeerDependencies:
- supports-color
- dev: false
- /react-syntax-highlighter@15.5.0(react@18.2.0):
- resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==}
- peerDependencies:
- react: '>= 0.14.0'
+ react-remove-scroll-bar@2.3.6(@types/react@18.3.3)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1)
+ tslib: 2.6.3
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ react-remove-scroll@2.5.5(@types/react@18.3.3)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1)
+ react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1)
+ tslib: 2.6.3
+ use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1)
+ use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ react-remove-scroll@2.5.7(@types/react@18.3.3)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1)
+ react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1)
+ tslib: 2.6.3
+ use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1)
+ use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1):
+ dependencies:
+ get-nonce: 1.0.1
+ invariant: 2.2.4
+ react: 18.3.1
+ tslib: 2.6.3
+ optionalDependencies:
+ '@types/react': 18.3.3
+
+ react-svg@16.1.34(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.24.7
+ '@tanem/svg-injector': 10.1.68
+ '@types/prop-types': 15.7.12
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-syntax-highlighter@15.5.0(react@18.3.1):
dependencies:
- '@babel/runtime': 7.21.0
+ '@babel/runtime': 7.24.7
highlight.js: 10.7.3
lowlight: 1.20.0
prismjs: 1.29.0
- react: 18.2.0
+ react: 18.3.1
refractor: 3.6.0
- dev: true
- /react-textarea-autosize@8.4.0(@types/react@18.0.28)(react@18.2.0):
- resolution: {integrity: sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==}
- engines: {node: '>=10'}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-textarea-autosize@8.5.3(@types/react@18.3.3)(react@18.3.1):
dependencies:
- '@babel/runtime': 7.21.0
- react: 18.2.0
- use-composed-ref: 1.3.0(react@18.2.0)
- use-latest: 1.2.1(@types/react@18.0.28)(react@18.2.0)
+ '@babel/runtime': 7.24.7
+ react: 18.3.1
+ use-composed-ref: 1.3.0(react@18.3.1)
+ use-latest: 1.2.1(@types/react@18.3.3)(react@18.3.1)
transitivePeerDependencies:
- '@types/react'
- dev: false
- /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==}
- peerDependencies:
- react: '>=16.6.0'
- react-dom: '>=16.6.0'
+ react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.21.0
+ '@babel/runtime': 7.24.7
dom-helpers: 5.2.1
loose-envify: 1.4.0
prop-types: 15.8.1
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- dev: false
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
- /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.5.0):
- resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==}
- peerDependencies:
- react: '*'
- tslib: '*'
+ react-universal-interface@0.6.2(react@18.3.1)(tslib@2.6.3):
dependencies:
- react: 18.2.0
- tslib: 2.5.0
- dev: false
+ react: 18.3.1
+ tslib: 2.6.3
- /react-use@17.4.0(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-use@17.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@types/js-cookie': 2.2.7
'@xobotyi/scrollbar-width': 1.9.5
@@ -3832,778 +7756,729 @@ packages:
fast-deep-equal: 3.1.3
fast-shallow-equal: 1.0.0
js-cookie: 2.2.1
- nano-css: 5.3.5(react-dom@18.2.0)(react@18.2.0)
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.5.0)
+ nano-css: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-universal-interface: 0.6.2(react@18.3.1)(tslib@2.6.3)
resize-observer-polyfill: 1.5.1
screenfull: 5.2.0
set-harmonic-interval: 1.0.1
throttle-debounce: 3.0.1
ts-easing: 0.2.0
- tslib: 2.5.0
- dev: false
+ tslib: 2.6.3
- /react@18.2.0:
- resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
- engines: {node: '>=0.10.0'}
+ react@18.3.1:
dependencies:
loose-envify: 1.4.0
- /read-cache@1.0.0:
- resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+ read-cache@1.0.0:
dependencies:
pify: 2.3.0
- /readdirp@3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readdirp@3.6.0:
dependencies:
picomatch: 2.3.1
- /refractor@3.6.0:
- resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==}
+ reflect.getprototypeof@1.0.6:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ globalthis: 1.0.4
+ which-builtin-type: 1.1.3
+
+ refractor@3.6.0:
dependencies:
hastscript: 6.0.0
parse-entities: 2.0.0
prismjs: 1.27.0
- dev: true
- /regenerator-runtime@0.13.11:
- resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
+ regenerator-runtime@0.14.1: {}
- /regexp.prototype.flags@1.4.3:
- resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
- engines: {node: '>= 0.4'}
+ regexp.prototype.flags@1.5.2:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- functions-have-names: 1.2.3
- dev: true
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ set-function-name: 2.0.2
- /regexpp@3.2.0:
- resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
- engines: {node: '>=8'}
- dev: true
+ regexpp@3.2.0: {}
- /remark-gfm@3.0.1:
- resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==}
+ remark-gfm@3.0.1:
dependencies:
- '@types/mdast': 3.0.11
+ '@types/mdast': 3.0.15
mdast-util-gfm: 2.0.2
- micromark-extension-gfm: 2.0.1
+ micromark-extension-gfm: 2.0.3
unified: 10.1.2
transitivePeerDependencies:
- supports-color
- dev: false
- /remark-parse@10.0.1:
- resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==}
+ remark-parse@10.0.2:
dependencies:
- '@types/mdast': 3.0.11
- mdast-util-from-markdown: 1.3.0
+ '@types/mdast': 3.0.15
+ mdast-util-from-markdown: 1.3.1
unified: 10.1.2
transitivePeerDependencies:
- supports-color
- dev: false
- /remark-rehype@10.1.0:
- resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==}
+ remark-rehype@10.1.0:
dependencies:
- '@types/hast': 2.3.4
- '@types/mdast': 3.0.11
+ '@types/hast': 2.3.10
+ '@types/mdast': 3.0.15
mdast-util-to-hast: 12.3.0
unified: 10.1.2
- dev: false
- /resize-observer-polyfill@1.5.1:
- resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
- dev: false
+ request-ip@3.3.0: {}
- /resolve-from@4.0.0:
- resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
- engines: {node: '>=4'}
+ resize-observer-polyfill@1.5.1: {}
- /resolve@1.22.1:
- resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
- hasBin: true
+ resolve-from@4.0.0: {}
+
+ resolve@1.22.8:
dependencies:
- is-core-module: 2.11.0
+ is-core-module: 2.14.0
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- /resolve@2.0.0-next.4:
- resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
- hasBin: true
+ resolve@2.0.0-next.5:
dependencies:
- is-core-module: 2.11.0
+ is-core-module: 2.14.0
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- dev: true
- /reusify@1.0.4:
- resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
- engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ reusify@1.0.4: {}
- /rimraf@3.0.2:
- resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
- hasBin: true
+ rfdc@1.4.1: {}
+
+ rimraf@3.0.2:
dependencies:
glob: 7.2.3
- dev: true
- /rtl-css-js@1.16.1:
- resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==}
+ rtl-css-js@1.16.1:
dependencies:
- '@babel/runtime': 7.21.0
- dev: false
+ '@babel/runtime': 7.24.7
- /run-parallel@1.2.0:
- resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
- /sade@1.8.1:
- resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
- engines: {node: '>=6'}
+ sade@1.8.1:
dependencies:
mri: 1.2.0
- dev: false
- /safe-regex-test@1.0.0:
- resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
+ safe-array-concat@1.1.2:
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ has-symbols: 1.0.3
+ isarray: 2.0.5
+
+ safe-buffer@5.2.1: {}
+
+ safe-regex-test@1.0.3:
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.0
+ call-bind: 1.0.7
+ es-errors: 1.3.0
is-regex: 1.1.4
- dev: true
- /safer-buffer@2.1.2:
- resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
- dev: true
+ safer-buffer@2.1.2: {}
- /scheduler@0.23.0:
- resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
+ scheduler@0.23.2:
dependencies:
loose-envify: 1.4.0
- dev: false
- /screenfull@5.2.0:
- resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==}
- engines: {node: '>=0.10.0'}
- dev: false
+ screenfull@5.2.0: {}
- /semver@6.3.0:
- resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
- hasBin: true
- dev: true
+ semver@6.3.1: {}
- /semver@7.3.8:
- resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==}
- engines: {node: '>=10'}
- hasBin: true
+ semver@7.6.2: {}
+
+ seq-queue@0.0.5: {}
+
+ set-function-length@1.2.2:
dependencies:
- lru-cache: 6.0.0
- dev: true
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.2
- /seq-queue@0.0.5:
- resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==}
- dev: true
+ set-function-name@2.0.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
- /set-harmonic-interval@1.0.1:
- resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==}
- engines: {node: '>=6.9'}
- dev: false
+ set-harmonic-interval@1.0.1: {}
- /shallowequal@1.1.0:
- resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
- dev: false
+ setprototypeof@1.1.1: {}
- /shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
+ shallowequal@1.1.0: {}
+
+ shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
- dev: true
- /shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
- dev: true
+ shebang-regex@3.0.0: {}
- /side-channel@1.0.4:
- resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+ side-channel@1.0.6:
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.0
- object-inspect: 1.12.3
- dev: true
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ object-inspect: 1.13.2
- /simple-swizzle@0.2.2:
- resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
- dependencies:
- is-arrayish: 0.3.2
- dev: false
+ signal-exit@4.1.0: {}
- /slash@3.0.0:
- resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
- engines: {node: '>=8'}
- dev: true
+ slash@3.0.0: {}
- /source-map-js@1.0.2:
- resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
- engines: {node: '>=0.10.0'}
+ source-map-js@1.2.0: {}
- /source-map@0.5.6:
- resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==}
- engines: {node: '>=0.10.0'}
- dev: false
+ source-map@0.5.6: {}
- /source-map@0.5.7:
- resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
- engines: {node: '>=0.10.0'}
- dev: false
+ source-map@0.5.7: {}
- /source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
- dev: false
+ source-map@0.6.1: {}
- /sourcemap-codec@1.4.8:
- resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
- deprecated: Please use @jridgewell/sourcemap-codec instead
- dev: false
+ space-separated-tokens@1.1.5: {}
- /space-separated-tokens@1.1.5:
- resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==}
- dev: true
+ space-separated-tokens@2.0.2: {}
- /space-separated-tokens@2.0.2:
- resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
- dev: false
+ split2@4.2.0: {}
- /split2@4.1.0:
- resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==}
- engines: {node: '>= 10.x'}
- dev: true
+ sprintf-js@1.1.3: {}
- /sqlstring@2.3.3:
- resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==}
- engines: {node: '>= 0.6'}
- dev: true
+ sqlstring@2.3.3: {}
- /stack-generator@2.0.10:
- resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==}
+ stack-generator@2.0.10:
dependencies:
stackframe: 1.3.4
- dev: false
- /stackframe@1.3.4:
- resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==}
- dev: false
+ stackframe@1.3.4: {}
- /stacktrace-gps@3.1.2:
- resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==}
+ stacktrace-gps@3.1.2:
dependencies:
source-map: 0.5.6
stackframe: 1.3.4
- dev: false
- /stacktrace-js@2.0.2:
- resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==}
+ stacktrace-js@2.0.2:
dependencies:
error-stack-parser: 2.1.4
stack-generator: 2.0.10
stacktrace-gps: 3.1.2
- dev: false
- /stop-iteration-iterator@1.0.0:
- resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
- engines: {node: '>= 0.4'}
+ statuses@1.5.0: {}
+
+ stop-iteration-iterator@1.0.0:
+ dependencies:
+ internal-slot: 1.0.7
+
+ stoppable@1.1.0: {}
+
+ streamsearch@1.1.0: {}
+
+ string-width@4.2.3:
dependencies:
- internal-slot: 1.0.5
- dev: true
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@5.1.2:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.0
- /string.prototype.matchall@4.0.8:
- resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==}
+ string.prototype.includes@2.0.0:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- get-intrinsic: 1.2.0
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+
+ string.prototype.matchall@4.0.11:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ get-intrinsic: 1.2.4
+ gopd: 1.0.1
has-symbols: 1.0.3
- internal-slot: 1.0.5
- regexp.prototype.flags: 1.4.3
- side-channel: 1.0.4
- dev: true
+ internal-slot: 1.0.7
+ regexp.prototype.flags: 1.5.2
+ set-function-name: 2.0.2
+ side-channel: 1.0.6
- /string.prototype.trim@1.2.7:
- resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==}
- engines: {node: '>= 0.4'}
+ string.prototype.trim@1.2.9:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- dev: true
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
- /string.prototype.trimend@1.0.6:
- resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==}
+ string.prototype.trimend@1.0.8:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- dev: true
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
- /string.prototype.trimstart@1.0.6:
- resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==}
+ string.prototype.trimstart@1.0.8:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- dev: true
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
- /strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
- dev: true
- /strip-bom@3.0.0:
- resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
- engines: {node: '>=4'}
- dev: true
+ strip-ansi@7.1.0:
+ dependencies:
+ ansi-regex: 6.0.1
- /strip-json-comments@3.1.1:
- resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
- engines: {node: '>=8'}
- dev: true
+ strip-bom@3.0.0: {}
+
+ strip-json-comments@3.1.1: {}
+
+ stripe@12.18.0:
+ dependencies:
+ '@types/node': 18.19.39
+ qs: 6.12.2
- /style-to-object@0.4.1:
- resolution: {integrity: sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==}
+ style-to-object@0.4.4:
dependencies:
inline-style-parser: 0.1.1
- dev: false
- /styled-components@5.3.9(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-Aj3kb13B75DQBo2oRwRa/APdB5rSmwUfN5exyarpX+x/tlM/rwZA2vVk2vQgVSP6WKaZJHWwiFrzgHt+CLtB4A==}
- engines: {node: '>=10'}
- peerDependencies:
- react: '>= 16.8.0'
- react-dom: '>= 16.8.0'
- react-is: '>= 16.8.0'
+ styled-components@5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1):
dependencies:
- '@babel/helper-module-imports': 7.18.6
- '@babel/traverse': 7.21.3(supports-color@5.5.0)
- '@emotion/is-prop-valid': 1.2.0
+ '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0)
+ '@babel/traverse': 7.24.7(supports-color@5.5.0)
+ '@emotion/is-prop-valid': 1.2.2
'@emotion/stylis': 0.8.5
'@emotion/unitless': 0.7.5
- babel-plugin-styled-components: 2.0.7(styled-components@5.3.9)
+ babel-plugin-styled-components: 2.1.4(@babel/core@7.24.7)(styled-components@5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0)
css-to-react-native: 3.2.0
hoist-non-react-statics: 3.3.2
- react: 18.2.0
- react-dom: 18.2.0(react@18.2.0)
- react-is: 18.2.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-is: 18.3.1
shallowequal: 1.1.0
supports-color: 5.5.0
- dev: false
+ transitivePeerDependencies:
+ - '@babel/core'
- /styled-jsx@5.1.1(react@18.2.0):
- resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
- engines: {node: '>= 12.0.0'}
- peerDependencies:
- '@babel/core': '*'
- babel-plugin-macros: '*'
- react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- babel-plugin-macros:
- optional: true
+ styled-jsx@5.1.1(@babel/core@7.24.7)(react@18.3.1):
dependencies:
client-only: 0.0.1
- react: 18.2.0
- dev: false
+ react: 18.3.1
+ optionalDependencies:
+ '@babel/core': 7.24.7
- /styled-tools@1.7.2:
- resolution: {integrity: sha512-IjLxzM20RMwAsx8M1QoRlCG/Kmq8lKzCGyospjtSXt/BTIIcvgTonaxQAsKnBrsZNwhpHzO9ADx5te0h76ILVg==}
- dev: false
+ styled-tools@1.7.2: {}
- /stylis@4.1.3:
- resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==}
- dev: false
+ stylis@4.2.0: {}
- /supports-color@5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
+ stylis@4.3.2: {}
+
+ sucrase@3.35.0:
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ commander: 4.1.1
+ glob: 10.4.2
+ lines-and-columns: 1.2.4
+ mz: 2.7.0
+ pirates: 4.0.6
+ ts-interface-checker: 0.1.13
+
+ supports-color@5.5.0:
dependencies:
has-flag: 3.0.0
- /supports-color@7.2.0:
- resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
- engines: {node: '>=8'}
+ supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
- dev: true
- /supports-preserve-symlinks-flag@1.0.0:
- resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
- engines: {node: '>= 0.4'}
+ supports-preserve-symlinks-flag@1.0.0: {}
- /tailwindcss@3.2.7(postcss@8.4.21):
- resolution: {integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==}
- engines: {node: '>=12.13.0'}
- hasBin: true
- peerDependencies:
- postcss: ^8.0.9
+ swr@2.2.5(react@18.3.1):
+ dependencies:
+ client-only: 0.0.1
+ react: 18.3.1
+ use-sync-external-store: 1.2.2(react@18.3.1)
+
+ tailwind-scrollbar-hide@1.1.7: {}
+
+ tailwindcss@3.4.4(ts-node@10.9.2(@types/node@18.19.39)(typescript@4.9.5)):
dependencies:
+ '@alloc/quick-lru': 5.2.0
arg: 5.0.2
- chokidar: 3.5.3
- color-name: 1.1.4
- detective: 5.2.1
+ chokidar: 3.6.0
didyoumean: 1.2.2
dlv: 1.1.3
- fast-glob: 3.2.12
+ fast-glob: 3.3.2
glob-parent: 6.0.2
is-glob: 4.0.3
+ jiti: 1.21.6
lilconfig: 2.1.0
- micromatch: 4.0.5
+ micromatch: 4.0.7
normalize-path: 3.0.0
object-hash: 3.0.0
- picocolors: 1.0.0
- postcss: 8.4.21
- postcss-import: 14.1.0(postcss@8.4.21)
- postcss-js: 4.0.1(postcss@8.4.21)
- postcss-load-config: 3.1.4(postcss@8.4.21)
- postcss-nested: 6.0.0(postcss@8.4.21)
- postcss-selector-parser: 6.0.11
- postcss-value-parser: 4.2.0
- quick-lru: 5.1.1
- resolve: 1.22.1
+ picocolors: 1.0.1
+ postcss: 8.4.39
+ postcss-import: 15.1.0(postcss@8.4.39)
+ postcss-js: 4.0.1(postcss@8.4.39)
+ postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@18.19.39)(typescript@4.9.5))
+ postcss-nested: 6.0.1(postcss@8.4.39)
+ postcss-selector-parser: 6.1.0
+ resolve: 1.22.8
+ sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
- /text-table@0.2.0:
- resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
- dev: true
+ tarn@3.0.2: {}
- /throttle-debounce@3.0.1:
- resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==}
- engines: {node: '>=10'}
- dev: false
+ tedious@15.1.3:
+ dependencies:
+ '@azure/identity': 2.1.0
+ '@azure/keyvault-keys': 4.8.0
+ '@js-joda/core': 5.6.3
+ bl: 5.1.0
+ es-aggregate-error: 1.0.13
+ iconv-lite: 0.6.3
+ js-md4: 0.3.2
+ jsbi: 4.3.0
+ native-duplexpair: 1.0.0
+ node-abort-controller: 3.1.1
+ punycode: 2.3.1
+ sprintf-js: 1.1.3
+ transitivePeerDependencies:
+ - supports-color
- /to-fast-properties@2.0.0:
- resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
- engines: {node: '>=4'}
- dev: false
+ text-table@0.2.0: {}
- /to-regex-range@5.0.1:
- resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
- engines: {node: '>=8.0'}
+ thenify-all@1.6.0:
+ dependencies:
+ thenify: 3.3.1
+
+ thenify@3.3.1:
+ dependencies:
+ any-promise: 1.3.0
+
+ throttle-debounce@3.0.1: {}
+
+ to-fast-properties@2.0.0: {}
+
+ to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
- /toggle-selection@1.0.6:
- resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
- dev: false
+ toggle-selection@1.0.6: {}
- /trim-lines@3.0.1:
- resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
- dev: false
+ toidentifier@1.0.0: {}
- /trough@2.1.0:
- resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==}
- dev: false
+ trim-lines@3.0.1: {}
- /ts-easing@0.2.0:
- resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==}
- dev: false
+ trough@2.2.0: {}
+
+ ts-easing@0.2.0: {}
+
+ ts-interface-checker@0.1.13: {}
- /tsconfig-paths@3.14.2:
- resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==}
+ ts-node@10.9.2(@types/node@18.19.39)(typescript@4.9.5):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.11
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 18.19.39
+ acorn: 8.12.1
+ acorn-walk: 8.3.3
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 4.9.5
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+
+ tsconfig-paths@3.15.0:
dependencies:
'@types/json5': 0.0.29
json5: 1.0.2
minimist: 1.2.8
strip-bom: 3.0.0
- dev: true
- /tslib@1.14.1:
- resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
- dev: true
+ tslib@1.14.1: {}
- /tslib@2.5.0:
- resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
- dev: false
+ tslib@2.6.3: {}
- /tsutils@3.21.0(typescript@4.9.5):
- resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
- engines: {node: '>= 6'}
- peerDependencies:
- typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+ tsutils@3.21.0(typescript@4.9.5):
dependencies:
tslib: 1.14.1
typescript: 4.9.5
- dev: true
- /type-check@0.4.0:
- resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
- engines: {node: '>= 0.8.0'}
+ type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
- dev: true
- /type-fest@0.20.2:
- resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
- engines: {node: '>=10'}
- dev: true
+ type-fest@0.20.2: {}
- /typed-array-length@1.0.4:
- resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
+ typed-array-buffer@1.0.2:
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-typed-array: 1.1.13
+
+ typed-array-byte-length@1.0.1:
+ dependencies:
+ call-bind: 1.0.7
for-each: 0.3.3
- is-typed-array: 1.1.10
- dev: true
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
- /typescript@4.9.5:
- resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
- engines: {node: '>=4.2.0'}
- hasBin: true
- dev: true
+ typed-array-byte-offset@1.0.2:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
- /unbox-primitive@1.0.2:
- resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+ typed-array-length@1.0.6:
+ dependencies:
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+ possible-typed-array-names: 1.0.0
+
+ typescript@4.9.5: {}
+
+ unbox-primitive@1.0.2:
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.7
has-bigints: 1.0.2
has-symbols: 1.0.3
which-boxed-primitive: 1.0.2
- dev: true
- /unified@10.1.2:
- resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==}
+ undici-types@5.26.5: {}
+
+ unified@10.1.2:
dependencies:
- '@types/unist': 2.0.6
+ '@types/unist': 2.0.10
bail: 2.0.2
extend: 3.0.2
is-buffer: 2.0.5
is-plain-obj: 4.1.0
- trough: 2.1.0
+ trough: 2.2.0
vfile: 5.3.7
- dev: false
- /unist-util-generated@2.0.1:
- resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==}
- dev: false
+ unist-util-generated@2.0.1: {}
- /unist-util-is@5.2.1:
- resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==}
+ unist-util-is@5.2.1:
dependencies:
- '@types/unist': 2.0.6
- dev: false
+ '@types/unist': 2.0.10
- /unist-util-position@4.0.4:
- resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==}
+ unist-util-position@4.0.4:
dependencies:
- '@types/unist': 2.0.6
- dev: false
+ '@types/unist': 2.0.10
- /unist-util-stringify-position@3.0.3:
- resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==}
+ unist-util-stringify-position@3.0.3:
dependencies:
- '@types/unist': 2.0.6
- dev: false
+ '@types/unist': 2.0.10
- /unist-util-visit-parents@5.1.3:
- resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==}
+ unist-util-visit-parents@5.1.3:
dependencies:
- '@types/unist': 2.0.6
+ '@types/unist': 2.0.10
unist-util-is: 5.2.1
- dev: false
- /unist-util-visit@4.1.2:
- resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==}
+ unist-util-visit@4.1.2:
dependencies:
- '@types/unist': 2.0.6
+ '@types/unist': 2.0.10
unist-util-is: 5.2.1
unist-util-visit-parents: 5.1.3
- dev: false
- /update-browserslist-db@1.0.10(browserslist@4.21.5):
- resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
+ unpipe@1.0.0: {}
+
+ update-browserslist-db@1.1.0(browserslist@4.23.1):
dependencies:
- browserslist: 4.21.5
- escalade: 3.1.1
- picocolors: 1.0.0
+ browserslist: 4.23.1
+ escalade: 3.1.2
+ picocolors: 1.0.1
- /uri-js@4.4.1:
- resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ uri-js@4.4.1:
dependencies:
- punycode: 2.3.0
- dev: true
+ punycode: 2.3.1
- /use-composed-ref@1.3.0(react@18.2.0):
- resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1):
dependencies:
- react: 18.2.0
- dev: false
+ react: 18.3.1
+ tslib: 2.6.3
+ optionalDependencies:
+ '@types/react': 18.3.3
- /use-isomorphic-layout-effect@1.1.2(@types/react@18.0.28)(react@18.2.0):
- resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ use-composed-ref@1.3.0(react@18.3.1):
dependencies:
- '@types/react': 18.0.28
- react: 18.2.0
- dev: false
+ react: 18.3.1
- /use-latest@1.2.1(@types/react@18.0.28)(react@18.2.0):
- resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ use-isomorphic-layout-effect@1.1.2(@types/react@18.3.3)(react@18.3.1):
dependencies:
- '@types/react': 18.0.28
- react: 18.2.0
- use-isomorphic-layout-effect: 1.1.2(@types/react@18.0.28)(react@18.2.0)
- dev: false
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.3
- /use-sync-external-store@1.2.0(react@18.2.0):
- resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ use-latest@1.2.1(@types/react@18.3.3)(react@18.3.1):
dependencies:
- react: 18.2.0
- dev: false
+ react: 18.3.1
+ use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.3)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
- /util-deprecate@1.0.2:
- resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1):
+ dependencies:
+ detect-node-es: 1.1.0
+ react: 18.3.1
+ tslib: 2.6.3
+ optionalDependencies:
+ '@types/react': 18.3.3
- /uuid@9.0.0:
- resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==}
- hasBin: true
- dev: false
+ use-sync-external-store@1.2.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
- /uvu@0.5.6:
- resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==}
- engines: {node: '>=8'}
- hasBin: true
+ use-sync-external-store@1.2.2(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ util-deprecate@1.0.2: {}
+
+ uuid@8.3.2: {}
+
+ uuid@9.0.1: {}
+
+ uvu@0.5.6:
dependencies:
dequal: 2.0.3
- diff: 5.1.0
+ diff: 5.2.0
kleur: 4.1.5
sade: 1.8.1
- dev: false
- /v8-compile-cache@2.3.0:
- resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}
- dev: true
+ v8-compile-cache-lib@3.0.1: {}
- /vfile-message@3.1.4:
- resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==}
+ v8-compile-cache@2.4.0: {}
+
+ vfile-message@3.1.4:
dependencies:
- '@types/unist': 2.0.6
+ '@types/unist': 2.0.10
unist-util-stringify-position: 3.0.3
- dev: false
- /vfile@5.3.7:
- resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==}
+ vfile@5.3.7:
dependencies:
- '@types/unist': 2.0.6
+ '@types/unist': 2.0.10
is-buffer: 2.0.5
unist-util-stringify-position: 3.0.3
vfile-message: 3.1.4
- dev: false
- /which-boxed-primitive@1.0.2:
- resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ void-elements@3.1.0: {}
+
+ watchpack@2.4.0:
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+
+ which-boxed-primitive@1.0.2:
dependencies:
is-bigint: 1.0.4
is-boolean-object: 1.1.2
is-number-object: 1.0.7
is-string: 1.0.7
is-symbol: 1.0.4
- dev: true
- /which-collection@1.0.1:
- resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==}
+ which-builtin-type@1.1.3:
+ dependencies:
+ function.prototype.name: 1.1.6
+ has-tostringtag: 1.0.2
+ is-async-function: 2.0.0
+ is-date-object: 1.0.5
+ is-finalizationregistry: 1.0.2
+ is-generator-function: 1.0.10
+ is-regex: 1.1.4
+ is-weakref: 1.0.2
+ isarray: 2.0.5
+ which-boxed-primitive: 1.0.2
+ which-collection: 1.0.2
+ which-typed-array: 1.1.15
+
+ which-collection@1.0.2:
dependencies:
- is-map: 2.0.2
- is-set: 2.0.2
- is-weakmap: 2.0.1
- is-weakset: 2.0.2
- dev: true
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.3
- /which-typed-array@1.1.9:
- resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==}
- engines: {node: '>= 0.4'}
+ which-typed-array@1.1.15:
dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
for-each: 0.3.3
gopd: 1.0.1
- has-tostringtag: 1.0.0
- is-typed-array: 1.1.10
- dev: true
+ has-tostringtag: 1.0.2
- /which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
- hasBin: true
+ which@2.0.2:
dependencies:
isexe: 2.0.0
- dev: true
- /word-wrap@1.2.3:
- resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
- engines: {node: '>=0.10.0'}
- dev: true
+ word-wrap@1.2.5: {}
- /wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
- dev: true
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
- /xtend@4.0.2:
- resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
- engines: {node: '>=0.4'}
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
- /yallist@4.0.0:
- resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
- dev: true
+ wrappy@1.0.2: {}
- /yaml@1.10.2:
- resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
- engines: {node: '>= 6'}
+ xtend@4.0.2: {}
- /zustand@4.3.6(react@18.2.0):
- resolution: {integrity: sha512-6J5zDxjxLE+yukC2XZWf/IyWVKnXT9b9HUv09VJ/bwGCpKNcaTqp7Ws28Xr8jnbvnZcdRaidztAPsXFBIqufiw==}
- engines: {node: '>=12.7.0'}
- peerDependencies:
- immer: '>=9.0'
- react: '>=16.8'
- peerDependenciesMeta:
- immer:
- optional: true
- react:
- optional: true
+ yallist@3.1.1: {}
+
+ yallist@4.0.0: {}
+
+ yaml@1.10.2: {}
+
+ yaml@2.4.5: {}
+
+ yn@3.1.1: {}
+
+ zustand@4.5.4(@types/react@18.3.3)(react@18.3.1):
dependencies:
- react: 18.2.0
- use-sync-external-store: 1.2.0(react@18.2.0)
- dev: false
+ use-sync-external-store: 1.2.0(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ react: 18.3.1
- /zwitch@2.0.4:
- resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
- dev: false
+ zwitch@2.0.4: {}
diff --git a/postcss.config.js b/postcss.config.js
index 33ad091d..12a703d9 100644
--- a/postcss.config.js
+++ b/postcss.config.js
@@ -3,4 +3,4 @@ module.exports = {
tailwindcss: {},
autoprefixer: {},
},
-}
+};
diff --git a/prisma/migrations/20230502100414_init/migration.sql b/prisma/migrations/20230502100414_init/migration.sql
new file mode 100644
index 00000000..83cf65c6
--- /dev/null
+++ b/prisma/migrations/20230502100414_init/migration.sql
@@ -0,0 +1,35 @@
+-- CreateTable
+CREATE TABLE "chat" (
+ "id" TEXT NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "model" JSONB NOT NULL DEFAULT '{}',
+ "ctx" JSONB NOT NULL DEFAULT '{}',
+
+ CONSTRAINT "chat_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "message" (
+ "id" TEXT NOT NULL,
+ "chat_id" TEXT NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "end_user" TEXT NOT NULL DEFAULT '',
+ "role" TEXT NOT NULL DEFAULT '',
+ "content" TEXT NOT NULL DEFAULT '',
+ "upvote" BOOLEAN NOT NULL DEFAULT false,
+ "downvote" BOOLEAN NOT NULL DEFAULT false,
+
+ CONSTRAINT "message_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE INDEX "chat_created_at_idx" ON "chat"("created_at");
+
+-- CreateIndex
+CREATE INDEX "message_chat_id_idx" ON "message"("chat_id");
+
+-- CreateIndex
+CREATE INDEX "message_created_at_idx" ON "message"("created_at");
+
+-- AddForeignKey
+ALTER TABLE "message" ADD CONSTRAINT "message_chat_id_fkey" FOREIGN KEY ("chat_id") REFERENCES "chat"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/prisma/migrations/20230505101306_account_and_payment/migration.sql b/prisma/migrations/20230505101306_account_and_payment/migration.sql
new file mode 100644
index 00000000..da5e7cc8
--- /dev/null
+++ b/prisma/migrations/20230505101306_account_and_payment/migration.sql
@@ -0,0 +1,99 @@
+-- CreateEnum
+CREATE TYPE "SubscriptionStatus" AS ENUM ('ACTIVE', 'CANCELED');
+
+-- CreateTable
+CREATE TABLE "subscription" (
+ "id" TEXT NOT NULL,
+ "user_id" TEXT NOT NULL DEFAULT '',
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "status" "SubscriptionStatus" NOT NULL DEFAULT 'ACTIVE',
+ "start_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "expire_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "payment_id" TEXT NOT NULL DEFAULT '',
+ "customer_id" TEXT NOT NULL DEFAULT '',
+
+ CONSTRAINT "subscription_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "accounts" (
+ "id" TEXT NOT NULL,
+ "user_id" TEXT NOT NULL,
+ "type" TEXT NOT NULL,
+ "provider" TEXT NOT NULL,
+ "provider_account_id" TEXT NOT NULL,
+ "refresh_token" TEXT,
+ "access_token" TEXT,
+ "expires_at" INTEGER,
+ "token_type" TEXT,
+ "scope" TEXT,
+ "id_token" TEXT,
+ "session_state" TEXT,
+
+ CONSTRAINT "accounts_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "sessions" (
+ "id" TEXT NOT NULL,
+ "session_token" TEXT NOT NULL,
+ "user_id" TEXT NOT NULL,
+ "expires" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "sessions_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "users" (
+ "id" TEXT NOT NULL,
+ "name" TEXT,
+ "email" TEXT,
+ "email_verified" TIMESTAMP(3),
+ "image" TEXT,
+ "stripe_id" TEXT,
+
+ CONSTRAINT "users_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "verificationtokens" (
+ "identifier" TEXT NOT NULL,
+ "token" TEXT NOT NULL,
+ "expires" TIMESTAMP(3) NOT NULL
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "subscription_payment_id_key" ON "subscription"("payment_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "accounts_provider_provider_account_id_key" ON "accounts"("provider", "provider_account_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "sessions_session_token_key" ON "sessions"("session_token");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "users_stripe_id_key" ON "users"("stripe_id");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "verificationtokens_token_key" ON "verificationtokens"("token");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "verificationtokens_identifier_token_key" ON "verificationtokens"("identifier", "token");
+
+-- CreateIndex
+CREATE INDEX "message_end_user_idx" ON "message"("end_user");
+
+-- CreateIndex
+CREATE INDEX "message_role_idx" ON "message"("role");
+
+-- AddForeignKey
+ALTER TABLE "subscription" ADD CONSTRAINT "subscription_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "accounts" ADD CONSTRAINT "accounts_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "sessions" ADD CONSTRAINT "sessions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/prisma/migrations/20230517161946_subscription/migration.sql b/prisma/migrations/20230517161946_subscription/migration.sql
new file mode 100644
index 00000000..d269872a
--- /dev/null
+++ b/prisma/migrations/20230517161946_subscription/migration.sql
@@ -0,0 +1,38 @@
+/*
+ Warnings:
+
+ - Added the required column `plan` to the `subscription` table without a default value. This is not possible if the table is not empty.
+
+*/
+-- CreateEnum
+CREATE TYPE "SubscriptionPlan" AS ENUM ('PRO');
+
+-- AlterTable
+ALTER TABLE "subscription" ADD COLUMN "amount" INTEGER NOT NULL DEFAULT 0,
+ADD COLUMN "currency" TEXT NOT NULL DEFAULT '',
+ADD COLUMN "description" TEXT NOT NULL DEFAULT '',
+ADD COLUMN "email" TEXT NOT NULL DEFAULT '',
+ADD COLUMN "plan" "SubscriptionPlan" NOT NULL,
+ADD COLUMN "receipt" TEXT NOT NULL DEFAULT '';
+
+-- CreateTable
+CREATE TABLE "usage" (
+ "id" TEXT NOT NULL,
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "end_user" TEXT NOT NULL DEFAULT '',
+ "count" INTEGER NOT NULL DEFAULT 0,
+
+ CONSTRAINT "usage_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE INDEX "usage_created_at_idx" ON "usage"("created_at");
+
+-- CreateIndex
+CREATE INDEX "usage_end_user_idx" ON "usage"("end_user");
+
+-- CreateIndex
+CREATE INDEX "subscription_user_id_idx" ON "subscription"("user_id");
+
+-- CreateIndex
+CREATE INDEX "subscription_email_idx" ON "subscription"("email");
diff --git a/prisma/migrations/20230518165639_created_at_to_users_table/migration.sql b/prisma/migrations/20230518165639_created_at_to_users_table/migration.sql
new file mode 100644
index 00000000..1769f2e9
--- /dev/null
+++ b/prisma/migrations/20230518165639_created_at_to_users_table/migration.sql
@@ -0,0 +1,5 @@
+-- AlterTable
+ALTER TABLE "users" ADD COLUMN "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP;
+
+-- CreateIndex
+CREATE INDEX "users_created_at_idx" ON "users"("created_at");
diff --git a/prisma/migrations/20230521103659_separate_payment_from_subscription/migration.sql b/prisma/migrations/20230521103659_separate_payment_from_subscription/migration.sql
new file mode 100644
index 00000000..963155c3
--- /dev/null
+++ b/prisma/migrations/20230521103659_separate_payment_from_subscription/migration.sql
@@ -0,0 +1,49 @@
+/*
+ Warnings:
+
+ - You are about to drop the column `amount` on the `subscription` table. All the data in the column will be lost.
+ - You are about to drop the column `currency` on the `subscription` table. All the data in the column will be lost.
+ - You are about to drop the column `customer_id` on the `subscription` table. All the data in the column will be lost.
+ - You are about to drop the column `description` on the `subscription` table. All the data in the column will be lost.
+ - You are about to drop the column `payment_id` on the `subscription` table. All the data in the column will be lost.
+ - You are about to drop the column `receipt` on the `subscription` table. All the data in the column will be lost.
+
+*/
+-- DropIndex
+DROP INDEX "subscription_payment_id_key";
+
+-- AlterTable
+ALTER TABLE "subscription" DROP COLUMN "amount",
+DROP COLUMN "currency",
+DROP COLUMN "customer_id",
+DROP COLUMN "description",
+DROP COLUMN "payment_id",
+DROP COLUMN "receipt";
+
+-- CreateTable
+CREATE TABLE "payment" (
+ "id" TEXT NOT NULL,
+ "user_id" TEXT NOT NULL DEFAULT '',
+ "email" TEXT NOT NULL DEFAULT '',
+ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "payment_id" TEXT NOT NULL DEFAULT '',
+ "customer_id" TEXT NOT NULL DEFAULT '',
+ "description" TEXT NOT NULL DEFAULT '',
+ "amount" INTEGER NOT NULL DEFAULT 0,
+ "currency" TEXT NOT NULL DEFAULT '',
+ "receipt" TEXT NOT NULL DEFAULT '',
+
+ CONSTRAINT "payment_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE INDEX "payment_user_id_idx" ON "payment"("user_id");
+
+-- CreateIndex
+CREATE INDEX "payment_email_idx" ON "payment"("email");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "payment_payment_id_key" ON "payment"("payment_id");
+
+-- AddForeignKey
+ALTER TABLE "payment" ADD CONSTRAINT "payment_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/prisma/migrations/20230521112004_remove_subscription_status_add_cancel_at/migration.sql b/prisma/migrations/20230521112004_remove_subscription_status_add_cancel_at/migration.sql
new file mode 100644
index 00000000..7765269e
--- /dev/null
+++ b/prisma/migrations/20230521112004_remove_subscription_status_add_cancel_at/migration.sql
@@ -0,0 +1,12 @@
+/*
+ Warnings:
+
+ - You are about to drop the column `status` on the `subscription` table. All the data in the column will be lost.
+
+*/
+-- AlterTable
+ALTER TABLE "subscription" DROP COLUMN "status",
+ADD COLUMN "canceled_at" TIMESTAMP(3);
+
+-- DropEnum
+DROP TYPE "SubscriptionStatus";
diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml
new file mode 100644
index 00000000..fbffa92c
--- /dev/null
+++ b/prisma/migrations/migration_lock.toml
@@ -0,0 +1,3 @@
+# Please do not edit this file manually
+# It should be added in your version-control system (i.e. Git)
+provider = "postgresql"
\ No newline at end of file
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
new file mode 100644
index 00000000..a1428490
--- /dev/null
+++ b/prisma/schema.prisma
@@ -0,0 +1,162 @@
+// This is your Prisma schema file,
+// learn more about it in the docs: https://pris.ly/d/prisma-schema
+
+// Ideally, we want to separate usage collection from the metadata, however Prisma does not support
+// multiple databases properly. https://github.com/prisma/prisma/issues/2443 solution does not
+// generate the proper client.
+
+generator client {
+ provider = "prisma-client-js"
+}
+
+datasource db {
+ provider = "postgresql"
+ // Connection pooling URL
+ url = env("DATABASE_URL")
+ // Connection pooling is not supported by Prisma migrate yet. So need to use directUrl
+ directUrl = env("DATABASE_DIRECT_URL")
+}
+
+model Chat {
+ id String @id @default(cuid())
+ createdAt DateTime @default(now()) @map("created_at")
+ model Json @default("{}")
+ ctx Json @default("{}")
+ messages Message[]
+
+ @@index([createdAt], map: "chat_created_at_idx")
+ @@map("chat")
+}
+
+model Message {
+ id String @id @default(cuid())
+ chat Chat @relation(fields: [chatId], references: [id])
+ chatId String @map("chat_id")
+ createdAt DateTime @default(now()) @map("created_at")
+ endUser String @default("") @map("end_user")
+ role String @default("")
+ content String @default("")
+ upvote Boolean @default(false)
+ downvote Boolean @default(false)
+
+ @@index([chatId], map: "message_chat_id_idx")
+ @@index([createdAt], map: "message_created_at_idx")
+ @@index([endUser], map: "message_end_user_idx")
+ @@index([role], map: "message_role_idx")
+ @@map("message")
+}
+
+model Usage {
+ id String @id @default(cuid())
+ createdAt DateTime @default(now()) @map("created_at")
+ endUser String @default("") @map("end_user")
+ count Int @default(0)
+
+ @@index([createdAt], map: "usage_created_at_idx")
+ @@index([endUser], map: "usage_end_user_idx")
+ @@map("usage")
+}
+
+model Subscription {
+ id String @id @default(cuid())
+ user User @relation(fields: [userId], references: [id])
+ userId String @default("") @map("user_id")
+ // Denormalize to avoid join with the user table
+ email String @default("") @map("email")
+ createdAt DateTime @default(now()) @map("created_at")
+ canceledAt DateTime? @map("canceled_at")
+ startAt DateTime @default(now()) @map("start_at")
+ expireAt DateTime @default(now()) @map("expire_at")
+ plan SubscriptionPlan
+
+ @@index([userId], map: "subscription_user_id_idx")
+ @@index([email], map: "subscription_email_idx")
+ @@map("subscription")
+}
+
+enum SubscriptionPlan {
+ PRO
+}
+
+model Payment {
+ id String @id @default(cuid())
+ user User @relation(fields: [userId], references: [id])
+ userId String @default("") @map("user_id")
+ // Denormalize to avoid join with the user table
+ email String @default("") @map("email")
+ createdAt DateTime @default(now()) @map("created_at")
+ paymentId String @default("") @map("payment_id")
+ customerId String @default("") @map("customer_id")
+ description String @default("")
+ amount Int @default(0)
+ currency String @default("")
+ receipt String @default("")
+
+ @@unique([paymentId])
+ @@index([userId], map: "payment_user_id_idx")
+ @@index([email], map: "payment_email_idx")
+ @@map("payment")
+}
+
+// NextAuth Prisma Schema Begin
+// Below are the auth related prisma schema to support NextAuth.js. In partiular, the email flow
+// requires this. https://authjs.dev/reference/adapter/prisma
+model Account {
+ id String @id @default(cuid())
+ userId String @map("user_id")
+ type String
+ provider String
+ providerAccountId String @map("provider_account_id")
+ refresh_token String? @db.Text
+ access_token String? @db.Text
+ expires_at Int?
+ token_type String?
+ scope String?
+ id_token String? @db.Text
+ session_state String?
+
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+
+ @@unique([provider, providerAccountId])
+ @@map("accounts")
+}
+
+model Session {
+ id String @id @default(cuid())
+ sessionToken String @unique @map("session_token")
+ userId String @map("user_id")
+ expires DateTime
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+
+ @@map("sessions")
+}
+
+model User {
+ id String @id @default(cuid())
+ name String?
+ email String? @unique
+ emailVerified DateTime? @map("email_verified")
+ image String?
+ accounts Account[]
+ sessions Session[]
+
+ subscriptions Subscription[]
+ payments Payment[]
+ // The stripe customer id corresponds to this user
+ stripeId String? @unique @map("stripe_id")
+ createdAt DateTime @default(now()) @map("created_at")
+
+ @@index([createdAt], map: "users_created_at_idx")
+ @@map("users")
+}
+
+model VerificationToken {
+ identifier String
+ token String @unique
+ expires DateTime
+
+ @@unique([identifier, token])
+ @@map("verificationtokens")
+}
+
+// NextAuth Prisma Schema End
diff --git a/prisma/seed.ts b/prisma/seed.ts
new file mode 100644
index 00000000..6cb9d90d
--- /dev/null
+++ b/prisma/seed.ts
@@ -0,0 +1,62 @@
+import { PrismaClient, Prisma } from "@prisma/client";
+import { v4 as uuidv4 } from "uuid";
+
+const prisma = new PrismaClient();
+
+const chatData: Prisma.ChatCreateInput[] = [
+ {
+ id: uuidv4(),
+ createdAt: new Date(),
+ model: {},
+ ctx: {},
+ messages: {
+ create: [
+ {
+ id: uuidv4(),
+ createdAt: new Date(),
+ role: "system",
+ content: "You are a bot",
+ upvote: true,
+ downvote: false,
+ },
+ {
+ id: uuidv4(),
+ createdAt: new Date(),
+ role: "user",
+ content: "What can I help you with today?",
+ upvote: true,
+ downvote: false,
+ },
+ {
+ id: uuidv4(),
+ createdAt: new Date(),
+ role: "assistant",
+ content: "Hello",
+ upvote: true,
+ downvote: false,
+ },
+ ],
+ },
+ },
+];
+
+async function main() {
+ console.log(`Start seeding ...`);
+ for (const c of chatData) {
+ const chat = await prisma.chat.create({
+ data: c,
+ });
+ console.log(`Created chat with id: ${chat.id}`);
+ }
+ console.log(`Seeding finished.`);
+}
+
+main()
+ .then(async () => {
+ await prisma.$disconnect();
+ })
+ .catch(async (e) => {
+ console.error(e);
+ await prisma.$disconnect();
+ process.exit(1);
+ });
diff --git a/process.d.ts b/process.d.ts
new file mode 100644
index 00000000..a97806b2
--- /dev/null
+++ b/process.d.ts
@@ -0,0 +1,52 @@
+declare namespace NodeJS {
+ export interface ProcessEnv {
+ // Required. Node environment.
+ NODE_ENV: string;
+ // Optional. Set to "true" to use the database. Need to use string as env is always string.
+ // We can't prefix DATABASE_URL with NEXT_PUBLIC_ because it contains sensitive information that
+ // should not be exposed to the client.
+ NEXT_PUBLIC_USE_DATABASE: string;
+ // Required if NEXT_PUBLIC_USE_DATABASE is true. Postgres database connection string to store
+ // the data. e.g. postgresql://postgres:YOUR_PASSWORD@localhost:5432/sqlchat?schema=sqlchat
+ DATABASE_URL: string;
+ // Optional. Set to "true" to allow users to bring their own OpenAI API key.
+ NEXT_PUBLIC_ALLOW_SELF_OPENAI_KEY: string;
+ // Required. Do not share your OpenAI API key with anyone! It should remain a secret.
+ OPENAI_API_KEY: string;
+ // Optional.For users who belong to multiple organizations,
+ // you can pass a header to specify which organization is used for an API request.
+ // Usage from these API requests will count as usage for the specified organization.
+ OPENAI_ORGANIZATION: string;
+ // Optional. OpenAI API endpoint. Defaults to https://api.openai.com.
+ OPENAI_API_ENDPOINT: string;
+ // Optional. NextAuth.js URL. Defaults to the current domain.
+ NEXTAUTH_URL: string;
+ // Optional. NextAuth.js secret. Defaults to a randomly generated string.
+ NEXTAUTH_SECRET: string;
+ // Optional. NextAuth.js GitHub OAuth client ID.
+ GITHUB_ID: string;
+ // Optional. NextAuth.js GitHub OAuth client secret.
+ GITHUB_SECRET: string;
+ // Optional. NextAuth.js Google OAuth client ID.
+ GOOGLE_CLIENT_ID: string;
+ // Optional. NextAuth.js Google OAuth client secret.
+ GOOGLE_CLIENT_SECRET: string;
+ // Optional. NextAuth.js email server.
+ // This can't be tested locally. Must be deployed to the web to send mail.
+ // https://next-auth.js.org/providers/email
+ EMAIL_SERVER: string;
+ EMAIL_FROM: string;
+ // Optional. Stripe publishable key.
+ NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: string;
+ // Optional. Stripe API key.
+ STRIPE_API_KEY: string;
+ // Optional. Stripe webhook secret.
+ STRIPE_WEBHOOK_SECRET: string;
+ // Optional. Stripe price id for Pro plan 1 month subscription.
+ NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_1_MONTH_SUBSCRIPTION: string;
+ // Optional. Stripe price id for Pro plan 3 month subscription.
+ NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_3_MONTH_SUBSCRIPTION: string;
+ // Optional. Stripe price id for Pro plan 1 year subscription.
+ NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_1_YEAR_SUBSCRIPTION: string;
+ }
+}
diff --git a/public/chat-logo-and-text-dark-mode.webp b/public/chat-logo-and-text-dark-mode.webp
new file mode 100644
index 00000000..3da4dbbf
Binary files /dev/null and b/public/chat-logo-and-text-dark-mode.webp differ
diff --git a/public/craft-by-bytebase-dark-mode.webp b/public/craft-by-bytebase-dark-mode.webp
new file mode 100644
index 00000000..e5dc2003
Binary files /dev/null and b/public/craft-by-bytebase-dark-mode.webp differ
diff --git a/public/db-clickhouse.png b/public/db-clickhouse.png
new file mode 100644
index 00000000..b734b8ca
Binary files /dev/null and b/public/db-clickhouse.png differ
diff --git a/public/db-hive.png b/public/db-hive.png
new file mode 100644
index 00000000..016d9549
Binary files /dev/null and b/public/db-hive.png differ
diff --git a/public/db-mysql.png b/public/db-mysql.png
new file mode 100644
index 00000000..efbfddb5
Binary files /dev/null and b/public/db-mysql.png differ
diff --git a/public/db-oceanbase.png b/public/db-oceanbase.png
new file mode 100644
index 00000000..be49a766
Binary files /dev/null and b/public/db-oceanbase.png differ
diff --git a/public/db-oracle.png b/public/db-oracle.png
new file mode 100644
index 00000000..2ba5fd05
Binary files /dev/null and b/public/db-oracle.png differ
diff --git a/public/db-postgres.png b/public/db-postgres.png
new file mode 100644
index 00000000..60dc7d30
Binary files /dev/null and b/public/db-postgres.png differ
diff --git a/public/db-snowflake.png b/public/db-snowflake.png
new file mode 100644
index 00000000..ea2828f5
Binary files /dev/null and b/public/db-snowflake.png differ
diff --git a/public/db-sqlserver.png b/public/db-sqlserver.png
new file mode 100644
index 00000000..44370119
Binary files /dev/null and b/public/db-sqlserver.png differ
diff --git a/public/db-tidb.png b/public/db-tidb.png
new file mode 100644
index 00000000..c85eff59
Binary files /dev/null and b/public/db-tidb.png differ
diff --git a/public/error-exceed-openai-quota.webp b/public/error-exceed-openai-quota.webp
new file mode 100644
index 00000000..0cae08ab
Binary files /dev/null and b/public/error-exceed-openai-quota.webp differ
diff --git a/public/error-network.webp b/public/error-network.webp
new file mode 100644
index 00000000..9c35ffd9
Binary files /dev/null and b/public/error-network.webp differ
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 00000000..b58767bc
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/privacy.md b/public/privacy.md
new file mode 100644
index 00000000..6b7ed966
--- /dev/null
+++ b/public/privacy.md
@@ -0,0 +1,46 @@
+# SQL Chat Privacy Policy
+
+*Last Updated: May 21, 2023*
+
+We respect your privacy and are committed to protecting your personal information. This Privacy Policy explains how we collect, use, and disclose your personal information when you use our application that calls LLM provider's API.
+
+## Collection of Application Data
+
+* All database connection configs are stored locally in your browser. You can also visit settings to clear the data.
+* We send the database schema to the LLM provider. No table data will be sent there.
+* We collect the conversation message to improve the product.
+
+## Collection of Personal Information
+
+We may collect certain personal information from you when you use our application, such as your name and email address. We collect this information in order to communicate with you about our services and to provide you with technical support.
+
+## Use of Personal Information
+
+We may use your personal information to:
+
+* Communicate with you about our services
+* Provide you with technical support
+* Improve our application and services
+* Comply with legal obligations
+
+## Disclosure of Personal Information
+
+We do not sell, trade, or otherwise transfer your personal information to third parties. However, we may disclose your personal information in the following circumstances:
+
+* To our service providers who assist us in providing our services to you
+* To comply with legal obligations or to protect our rights or the rights of others
+
+## Security of Personal Information
+
+We take reasonable measures to protect your personal information from unauthorized access, disclosure, or destruction. However, no method of transmission over the internet or electronic storage is completely secure, and we cannot guarantee absolute security.
+
+
+## Changes to this Privacy Policy
+
+We may update this Privacy Policy from time to time by posting a new versionon our website. We encourage you to review this Privacy Policy periodically for any changes. Your continued use of our application and services after any modifications to this Privacy Policy will constitute your acceptance of such modifications.
+
+For more information about our privacy and data protection practices, including how to exercise your privacy rights, please visit the [Bytebase Privacy Policy](https://bytebase.com/privacy).
+
+## Contact Us
+
+Please contact us at support@bytebase.com if you have questions about this Privacy Policy.
\ No newline at end of file
diff --git a/public/screenshot1.webp b/public/screenshot1.webp
index 0cdf41e8..95354cee 100644
Binary files a/public/screenshot1.webp and b/public/screenshot1.webp differ
diff --git a/public/screenshot2.webp b/public/screenshot2.webp
index 2b4b6df4..9f3ddadb 100644
Binary files a/public/screenshot2.webp and b/public/screenshot2.webp differ
diff --git a/public/screenshot3.webp b/public/screenshot3.webp
new file mode 100644
index 00000000..f26098a5
Binary files /dev/null and b/public/screenshot3.webp differ
diff --git a/public/terms.md b/public/terms.md
new file mode 100644
index 00000000..39c93836
--- /dev/null
+++ b/public/terms.md
@@ -0,0 +1,12 @@
+# Terms of Service
+
+*Last Updated: May 21, 2023*
+
+## Refund Policy
+
+All fees and charges are earned upon receipt by us and are nonrefundable.
+
+
+## Contact Us
+
+Please contact us at support@bytebase.com if you have questions about this Terms of Service.
\ No newline at end of file
diff --git a/public/wechat-qrcode.webp b/public/wechat-qrcode.webp
index 92ded4d7..49aff86d 100644
Binary files a/public/wechat-qrcode.webp and b/public/wechat-qrcode.webp differ
diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore
deleted file mode 100644
index aba21e24..00000000
--- a/src-tauri/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Generated by Cargo
-# will have compiled files and executables
-/target/
diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
deleted file mode 100644
index 1b00ac38..00000000
--- a/src-tauri/Cargo.lock
+++ /dev/null
@@ -1,3214 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "adler"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
-
-[[package]]
-name = "aho-corasick"
-version = "0.7.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "alloc-no-stdlib"
-version = "2.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
-
-[[package]]
-name = "alloc-stdlib"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
-dependencies = [
- "alloc-no-stdlib",
-]
-
-[[package]]
-name = "anyhow"
-version = "1.0.70"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
-
-[[package]]
-name = "app"
-version = "0.1.0"
-dependencies = [
- "serde",
- "serde_json",
- "tauri",
- "tauri-build",
-]
-
-[[package]]
-name = "atk"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd"
-dependencies = [
- "atk-sys",
- "bitflags",
- "glib",
- "libc",
-]
-
-[[package]]
-name = "atk-sys"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6"
-dependencies = [
- "glib-sys",
- "gobject-sys",
- "libc",
- "system-deps 6.0.4",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "base64"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
-
-[[package]]
-name = "base64"
-version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "block"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
-
-[[package]]
-name = "block-buffer"
-version = "0.10.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "brotli"
-version = "3.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68"
-dependencies = [
- "alloc-no-stdlib",
- "alloc-stdlib",
- "brotli-decompressor",
-]
-
-[[package]]
-name = "brotli-decompressor"
-version = "2.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744"
-dependencies = [
- "alloc-no-stdlib",
- "alloc-stdlib",
-]
-
-[[package]]
-name = "bstr"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09"
-dependencies = [
- "memchr",
- "serde",
-]
-
-[[package]]
-name = "bytemuck"
-version = "1.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea"
-
-[[package]]
-name = "byteorder"
-version = "1.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
-
-[[package]]
-name = "bytes"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
-
-[[package]]
-name = "cairo-rs"
-version = "0.15.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc"
-dependencies = [
- "bitflags",
- "cairo-sys-rs",
- "glib",
- "libc",
- "thiserror",
-]
-
-[[package]]
-name = "cairo-sys-rs"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8"
-dependencies = [
- "glib-sys",
- "libc",
- "system-deps 6.0.4",
-]
-
-[[package]]
-name = "cargo_toml"
-version = "0.13.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "497049e9477329f8f6a559972ee42e117487d01d1e8c2cc9f836ea6fa23a9e1a"
-dependencies = [
- "serde",
- "toml 0.5.11",
-]
-
-[[package]]
-name = "cc"
-version = "1.0.79"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
-
-[[package]]
-name = "cesu8"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
-
-[[package]]
-name = "cfb"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74f89d248799e3f15f91b70917f65381062a01bb8e222700ea0e5a7ff9785f9c"
-dependencies = [
- "byteorder",
- "uuid 0.8.2",
-]
-
-[[package]]
-name = "cfg-expr"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7"
-dependencies = [
- "smallvec",
-]
-
-[[package]]
-name = "cfg-expr"
-version = "0.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a35b255461940a32985c627ce82900867c61db1659764d3675ea81963f72a4c6"
-dependencies = [
- "smallvec",
-]
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "cocoa"
-version = "0.24.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a"
-dependencies = [
- "bitflags",
- "block",
- "cocoa-foundation",
- "core-foundation",
- "core-graphics",
- "foreign-types",
- "libc",
- "objc",
-]
-
-[[package]]
-name = "cocoa-foundation"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6"
-dependencies = [
- "bitflags",
- "block",
- "core-foundation",
- "core-graphics-types",
- "foreign-types",
- "libc",
- "objc",
-]
-
-[[package]]
-name = "color_quant"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
-
-[[package]]
-name = "combine"
-version = "4.6.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4"
-dependencies = [
- "bytes",
- "memchr",
-]
-
-[[package]]
-name = "convert_case"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
-
-[[package]]
-name = "core-foundation"
-version = "0.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "core-foundation-sys"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
-
-[[package]]
-name = "core-graphics"
-version = "0.22.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb"
-dependencies = [
- "bitflags",
- "core-foundation",
- "core-graphics-types",
- "foreign-types",
- "libc",
-]
-
-[[package]]
-name = "core-graphics-types"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
-dependencies = [
- "bitflags",
- "core-foundation",
- "foreign-types",
- "libc",
-]
-
-[[package]]
-name = "cpufeatures"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "crc32fast"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "crossbeam-channel"
-version = "0.5.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c"
-dependencies = [
- "cfg-if",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.8.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "crypto-common"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
-dependencies = [
- "generic-array",
- "typenum",
-]
-
-[[package]]
-name = "cssparser"
-version = "0.27.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a"
-dependencies = [
- "cssparser-macros",
- "dtoa-short",
- "itoa 0.4.8",
- "matches",
- "phf 0.8.0",
- "proc-macro2",
- "quote",
- "smallvec",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "cssparser-macros"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e"
-dependencies = [
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "ctor"
-version = "0.1.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
-dependencies = [
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "darling"
-version = "0.13.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c"
-dependencies = [
- "darling_core",
- "darling_macro",
-]
-
-[[package]]
-name = "darling_core"
-version = "0.13.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610"
-dependencies = [
- "fnv",
- "ident_case",
- "proc-macro2",
- "quote",
- "strsim",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "darling_macro"
-version = "0.13.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835"
-dependencies = [
- "darling_core",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "derive_more"
-version = "0.99.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
-dependencies = [
- "convert_case",
- "proc-macro2",
- "quote",
- "rustc_version",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "digest"
-version = "0.10.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
-dependencies = [
- "block-buffer",
- "crypto-common",
-]
-
-[[package]]
-name = "dirs-next"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
-dependencies = [
- "cfg-if",
- "dirs-sys-next",
-]
-
-[[package]]
-name = "dirs-sys-next"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
-dependencies = [
- "libc",
- "redox_users",
- "winapi",
-]
-
-[[package]]
-name = "dispatch"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
-
-[[package]]
-name = "dtoa"
-version = "0.4.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
-
-[[package]]
-name = "dtoa-short"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6"
-dependencies = [
- "dtoa",
-]
-
-[[package]]
-name = "dunce"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c"
-
-[[package]]
-name = "embed_plist"
-version = "1.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
-
-[[package]]
-name = "encoding_rs"
-version = "0.8.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "errno"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0"
-dependencies = [
- "errno-dragonfly",
- "libc",
- "windows-sys",
-]
-
-[[package]]
-name = "errno-dragonfly"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
-dependencies = [
- "cc",
- "libc",
-]
-
-[[package]]
-name = "fastrand"
-version = "1.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
-dependencies = [
- "instant",
-]
-
-[[package]]
-name = "field-offset"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3cf3a800ff6e860c863ca6d4b16fd999db8b752819c1606884047b73e468535"
-dependencies = [
- "memoffset",
- "rustc_version",
-]
-
-[[package]]
-name = "filetime"
-version = "0.2.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412"
-dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall 0.2.16",
- "windows-sys",
-]
-
-[[package]]
-name = "flate2"
-version = "1.0.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841"
-dependencies = [
- "crc32fast",
- "miniz_oxide",
-]
-
-[[package]]
-name = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
-[[package]]
-name = "foreign-types"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
-dependencies = [
- "foreign-types-shared",
-]
-
-[[package]]
-name = "foreign-types-shared"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
-
-[[package]]
-name = "form_urlencoded"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
-dependencies = [
- "percent-encoding",
-]
-
-[[package]]
-name = "futf"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
-dependencies = [
- "mac",
- "new_debug_unreachable",
-]
-
-[[package]]
-name = "futures-channel"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
-dependencies = [
- "futures-core",
-]
-
-[[package]]
-name = "futures-core"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
-
-[[package]]
-name = "futures-executor"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
-dependencies = [
- "futures-core",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-io"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
-
-[[package]]
-name = "futures-macro"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.12",
-]
-
-[[package]]
-name = "futures-task"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
-
-[[package]]
-name = "futures-util"
-version = "0.3.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
-dependencies = [
- "futures-core",
- "futures-macro",
- "futures-task",
- "pin-project-lite",
- "pin-utils",
- "slab",
-]
-
-[[package]]
-name = "fxhash"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
-dependencies = [
- "byteorder",
-]
-
-[[package]]
-name = "gdk"
-version = "0.15.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8"
-dependencies = [
- "bitflags",
- "cairo-rs",
- "gdk-pixbuf",
- "gdk-sys",
- "gio",
- "glib",
- "libc",
- "pango",
-]
-
-[[package]]
-name = "gdk-pixbuf"
-version = "0.15.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a"
-dependencies = [
- "bitflags",
- "gdk-pixbuf-sys",
- "gio",
- "glib",
- "libc",
-]
-
-[[package]]
-name = "gdk-pixbuf-sys"
-version = "0.15.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7"
-dependencies = [
- "gio-sys",
- "glib-sys",
- "gobject-sys",
- "libc",
- "system-deps 6.0.4",
-]
-
-[[package]]
-name = "gdk-sys"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88"
-dependencies = [
- "cairo-sys-rs",
- "gdk-pixbuf-sys",
- "gio-sys",
- "glib-sys",
- "gobject-sys",
- "libc",
- "pango-sys",
- "pkg-config",
- "system-deps 6.0.4",
-]
-
-[[package]]
-name = "gdkx11-sys"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178"
-dependencies = [
- "gdk-sys",
- "glib-sys",
- "libc",
- "system-deps 6.0.4",
- "x11",
-]
-
-[[package]]
-name = "generator"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33a20a288a94683f5f4da0adecdbe095c94a77c295e514cc6484e9394dd8376e"
-dependencies = [
- "cc",
- "libc",
- "log",
- "rustversion",
- "windows 0.44.0",
-]
-
-[[package]]
-name = "generic-array"
-version = "0.14.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
-dependencies = [
- "typenum",
- "version_check",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.1.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
-dependencies = [
- "cfg-if",
- "libc",
- "wasi 0.9.0+wasi-snapshot-preview1",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.2.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
-dependencies = [
- "cfg-if",
- "libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
-]
-
-[[package]]
-name = "gio"
-version = "0.15.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b"
-dependencies = [
- "bitflags",
- "futures-channel",
- "futures-core",
- "futures-io",
- "gio-sys",
- "glib",
- "libc",
- "once_cell",
- "thiserror",
-]
-
-[[package]]
-name = "gio-sys"
-version = "0.15.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d"
-dependencies = [
- "glib-sys",
- "gobject-sys",
- "libc",
- "system-deps 6.0.4",
- "winapi",
-]
-
-[[package]]
-name = "glib"
-version = "0.15.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d"
-dependencies = [
- "bitflags",
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-task",
- "glib-macros",
- "glib-sys",
- "gobject-sys",
- "libc",
- "once_cell",
- "smallvec",
- "thiserror",
-]
-
-[[package]]
-name = "glib-macros"
-version = "0.15.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a"
-dependencies = [
- "anyhow",
- "heck 0.4.1",
- "proc-macro-crate",
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "glib-sys"
-version = "0.15.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4"
-dependencies = [
- "libc",
- "system-deps 6.0.4",
-]
-
-[[package]]
-name = "glob"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
-
-[[package]]
-name = "globset"
-version = "0.4.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc"
-dependencies = [
- "aho-corasick",
- "bstr",
- "fnv",
- "log",
- "regex",
-]
-
-[[package]]
-name = "gobject-sys"
-version = "0.15.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a"
-dependencies = [
- "glib-sys",
- "libc",
- "system-deps 6.0.4",
-]
-
-[[package]]
-name = "gtk"
-version = "0.15.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0"
-dependencies = [
- "atk",
- "bitflags",
- "cairo-rs",
- "field-offset",
- "futures-channel",
- "gdk",
- "gdk-pixbuf",
- "gio",
- "glib",
- "gtk-sys",
- "gtk3-macros",
- "libc",
- "once_cell",
- "pango",
- "pkg-config",
-]
-
-[[package]]
-name = "gtk-sys"
-version = "0.15.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84"
-dependencies = [
- "atk-sys",
- "cairo-sys-rs",
- "gdk-pixbuf-sys",
- "gdk-sys",
- "gio-sys",
- "glib-sys",
- "gobject-sys",
- "libc",
- "pango-sys",
- "system-deps 6.0.4",
-]
-
-[[package]]
-name = "gtk3-macros"
-version = "0.15.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d"
-dependencies = [
- "anyhow",
- "proc-macro-crate",
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
-
-[[package]]
-name = "heck"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
-dependencies = [
- "unicode-segmentation",
-]
-
-[[package]]
-name = "heck"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
-
-[[package]]
-name = "hermit-abi"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "hermit-abi"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
-
-[[package]]
-name = "html5ever"
-version = "0.25.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148"
-dependencies = [
- "log",
- "mac",
- "markup5ever",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "http"
-version = "0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
-dependencies = [
- "bytes",
- "fnv",
- "itoa 1.0.6",
-]
-
-[[package]]
-name = "http-range"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573"
-
-[[package]]
-name = "ico"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "031530fe562d8c8d71c0635013d6d155bbfe8ba0aa4b4d2d24ce8af6b71047bd"
-dependencies = [
- "byteorder",
- "png",
-]
-
-[[package]]
-name = "ident_case"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
-
-[[package]]
-name = "idna"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
-dependencies = [
- "unicode-bidi",
- "unicode-normalization",
-]
-
-[[package]]
-name = "ignore"
-version = "0.4.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d"
-dependencies = [
- "crossbeam-utils",
- "globset",
- "lazy_static",
- "log",
- "memchr",
- "regex",
- "same-file",
- "thread_local",
- "walkdir",
- "winapi-util",
-]
-
-[[package]]
-name = "image"
-version = "0.24.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a"
-dependencies = [
- "bytemuck",
- "byteorder",
- "color_quant",
- "num-rational",
- "num-traits",
-]
-
-[[package]]
-name = "indexmap"
-version = "1.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
-dependencies = [
- "autocfg",
- "hashbrown",
-]
-
-[[package]]
-name = "infer"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20b2b533137b9cad970793453d4f921c2e91312a6d88b1085c07bc15fc51bb3b"
-dependencies = [
- "cfb",
-]
-
-[[package]]
-name = "instant"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "io-lifetimes"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb"
-dependencies = [
- "hermit-abi 0.3.1",
- "libc",
- "windows-sys",
-]
-
-[[package]]
-name = "itoa"
-version = "0.4.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
-
-[[package]]
-name = "itoa"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
-
-[[package]]
-name = "javascriptcore-rs"
-version = "0.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c"
-dependencies = [
- "bitflags",
- "glib",
- "javascriptcore-rs-sys",
-]
-
-[[package]]
-name = "javascriptcore-rs-sys"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c"
-dependencies = [
- "glib-sys",
- "gobject-sys",
- "libc",
- "system-deps 5.0.0",
-]
-
-[[package]]
-name = "jni"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c"
-dependencies = [
- "cesu8",
- "combine",
- "jni-sys",
- "log",
- "thiserror",
- "walkdir",
-]
-
-[[package]]
-name = "jni-sys"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
-
-[[package]]
-name = "json-patch"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3fa5a61630976fc4c353c70297f2e93f1930e3ccee574d59d618ccbd5154ce"
-dependencies = [
- "serde",
- "serde_json",
- "treediff",
-]
-
-[[package]]
-name = "kuchiki"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358"
-dependencies = [
- "cssparser",
- "html5ever",
- "matches",
- "selectors",
-]
-
-[[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-
-[[package]]
-name = "libc"
-version = "0.2.140"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
-
-[[package]]
-name = "line-wrap"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
-dependencies = [
- "safemem",
-]
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f"
-
-[[package]]
-name = "lock_api"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
-dependencies = [
- "autocfg",
- "scopeguard",
-]
-
-[[package]]
-name = "log"
-version = "0.4.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "loom"
-version = "0.5.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5"
-dependencies = [
- "cfg-if",
- "generator",
- "scoped-tls",
- "serde",
- "serde_json",
- "tracing",
- "tracing-subscriber",
-]
-
-[[package]]
-name = "mac"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
-
-[[package]]
-name = "malloc_buf"
-version = "0.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "markup5ever"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd"
-dependencies = [
- "log",
- "phf 0.8.0",
- "phf_codegen",
- "string_cache",
- "string_cache_codegen",
- "tendril",
-]
-
-[[package]]
-name = "matchers"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
-dependencies = [
- "regex-automata",
-]
-
-[[package]]
-name = "matches"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
-
-[[package]]
-name = "memchr"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
-
-[[package]]
-name = "memoffset"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "miniz_oxide"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
-dependencies = [
- "adler",
-]
-
-[[package]]
-name = "ndk"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4"
-dependencies = [
- "bitflags",
- "jni-sys",
- "ndk-sys",
- "num_enum",
- "thiserror",
-]
-
-[[package]]
-name = "ndk-context"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
-
-[[package]]
-name = "ndk-sys"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97"
-dependencies = [
- "jni-sys",
-]
-
-[[package]]
-name = "new_debug_unreachable"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
-
-[[package]]
-name = "nodrop"
-version = "0.1.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
-
-[[package]]
-name = "nu-ansi-term"
-version = "0.46.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
-dependencies = [
- "overload",
- "winapi",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
-dependencies = [
- "autocfg",
- "num-traits",
-]
-
-[[package]]
-name = "num-rational"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
-dependencies = [
- "autocfg",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "num_cpus"
-version = "1.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
-dependencies = [
- "hermit-abi 0.2.6",
- "libc",
-]
-
-[[package]]
-name = "num_enum"
-version = "0.5.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9"
-dependencies = [
- "num_enum_derive",
-]
-
-[[package]]
-name = "num_enum_derive"
-version = "0.5.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799"
-dependencies = [
- "proc-macro-crate",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "objc"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
-dependencies = [
- "malloc_buf",
- "objc_exception",
-]
-
-[[package]]
-name = "objc_exception"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "objc_id"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b"
-dependencies = [
- "objc",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.17.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
-
-[[package]]
-name = "overload"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
-
-[[package]]
-name = "pango"
-version = "0.15.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f"
-dependencies = [
- "bitflags",
- "glib",
- "libc",
- "once_cell",
- "pango-sys",
-]
-
-[[package]]
-name = "pango-sys"
-version = "0.15.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa"
-dependencies = [
- "glib-sys",
- "gobject-sys",
- "libc",
- "system-deps 6.0.4",
-]
-
-[[package]]
-name = "parking_lot"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
-dependencies = [
- "lock_api",
- "parking_lot_core",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.9.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
-dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall 0.2.16",
- "smallvec",
- "windows-sys",
-]
-
-[[package]]
-name = "paste"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79"
-
-[[package]]
-name = "percent-encoding"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
-
-[[package]]
-name = "phf"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
-dependencies = [
- "phf_macros 0.8.0",
- "phf_shared 0.8.0",
- "proc-macro-hack",
-]
-
-[[package]]
-name = "phf"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
-dependencies = [
- "phf_macros 0.10.0",
- "phf_shared 0.10.0",
- "proc-macro-hack",
-]
-
-[[package]]
-name = "phf_codegen"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
-dependencies = [
- "phf_generator 0.8.0",
- "phf_shared 0.8.0",
-]
-
-[[package]]
-name = "phf_generator"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
-dependencies = [
- "phf_shared 0.8.0",
- "rand 0.7.3",
-]
-
-[[package]]
-name = "phf_generator"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
-dependencies = [
- "phf_shared 0.10.0",
- "rand 0.8.5",
-]
-
-[[package]]
-name = "phf_macros"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c"
-dependencies = [
- "phf_generator 0.8.0",
- "phf_shared 0.8.0",
- "proc-macro-hack",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "phf_macros"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0"
-dependencies = [
- "phf_generator 0.10.0",
- "phf_shared 0.10.0",
- "proc-macro-hack",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "phf_shared"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
-dependencies = [
- "siphasher",
-]
-
-[[package]]
-name = "phf_shared"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
-dependencies = [
- "siphasher",
-]
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
-
-[[package]]
-name = "pin-utils"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
-
-[[package]]
-name = "pkg-config"
-version = "0.3.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
-
-[[package]]
-name = "plist"
-version = "1.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9bd9647b268a3d3e14ff09c23201133a62589c658db02bb7388c7246aafe0590"
-dependencies = [
- "base64 0.21.0",
- "indexmap",
- "line-wrap",
- "quick-xml",
- "serde",
- "time",
-]
-
-[[package]]
-name = "png"
-version = "0.17.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638"
-dependencies = [
- "bitflags",
- "crc32fast",
- "flate2",
- "miniz_oxide",
-]
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
-
-[[package]]
-name = "precomputed-hash"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
-
-[[package]]
-name = "proc-macro-crate"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
-dependencies = [
- "once_cell",
- "toml_edit",
-]
-
-[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
-dependencies = [
- "proc-macro-error-attr",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
-dependencies = [
- "proc-macro2",
- "quote",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-hack"
-version = "0.5.20+deprecated"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.54"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e472a104799c74b514a57226160104aa483546de37e839ec50e3c2e41dd87534"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "quick-xml"
-version = "0.28.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5c1a97b1bc42b1d550bfb48d4262153fe400a12bab1511821736f7eac76d7e2"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "rand"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
-dependencies = [
- "getrandom 0.1.16",
- "libc",
- "rand_chacha 0.2.2",
- "rand_core 0.5.1",
- "rand_hc",
- "rand_pcg",
-]
-
-[[package]]
-name = "rand"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
-dependencies = [
- "libc",
- "rand_chacha 0.3.1",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.5.1",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
-dependencies = [
- "ppv-lite86",
- "rand_core 0.6.4",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
-dependencies = [
- "getrandom 0.1.16",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-dependencies = [
- "getrandom 0.2.8",
-]
-
-[[package]]
-name = "rand_hc"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
-dependencies = [
- "rand_core 0.5.1",
-]
-
-[[package]]
-name = "rand_pcg"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
-dependencies = [
- "rand_core 0.5.1",
-]
-
-[[package]]
-name = "raw-window-handle"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9"
-
-[[package]]
-name = "redox_syscall"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
-name = "redox_users"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
-dependencies = [
- "getrandom 0.2.8",
- "redox_syscall 0.2.16",
- "thiserror",
-]
-
-[[package]]
-name = "regex"
-version = "1.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
-dependencies = [
- "regex-syntax",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.6.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
-
-[[package]]
-name = "rustc_version"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
-dependencies = [
- "semver",
-]
-
-[[package]]
-name = "rustix"
-version = "0.37.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d097081ed288dfe45699b72f5b5d648e5f15d64d900c7080273baa20c16a6849"
-dependencies = [
- "bitflags",
- "errno",
- "io-lifetimes",
- "libc",
- "linux-raw-sys",
- "windows-sys",
-]
-
-[[package]]
-name = "rustversion"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06"
-
-[[package]]
-name = "ryu"
-version = "1.0.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
-
-[[package]]
-name = "safemem"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
-
-[[package]]
-name = "same-file"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "scoped-tls"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
-
-[[package]]
-name = "scopeguard"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
-
-[[package]]
-name = "selectors"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe"
-dependencies = [
- "bitflags",
- "cssparser",
- "derive_more",
- "fxhash",
- "log",
- "matches",
- "phf 0.8.0",
- "phf_codegen",
- "precomputed-hash",
- "servo_arc",
- "smallvec",
- "thin-slice",
-]
-
-[[package]]
-name = "semver"
-version = "1.0.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "serde"
-version = "1.0.159"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.159"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.12",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.95"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744"
-dependencies = [
- "itoa 1.0.6",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "serde_repr"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.12",
-]
-
-[[package]]
-name = "serde_spanned"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "serde_with"
-version = "1.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff"
-dependencies = [
- "serde",
- "serde_with_macros",
-]
-
-[[package]]
-name = "serde_with_macros"
-version = "1.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082"
-dependencies = [
- "darling",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "serialize-to-javascript"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb"
-dependencies = [
- "serde",
- "serde_json",
- "serialize-to-javascript-impl",
-]
-
-[[package]]
-name = "serialize-to-javascript-impl"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "servo_arc"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432"
-dependencies = [
- "nodrop",
- "stable_deref_trait",
-]
-
-[[package]]
-name = "sha2"
-version = "0.10.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest",
-]
-
-[[package]]
-name = "sharded-slab"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
-name = "siphasher"
-version = "0.3.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
-
-[[package]]
-name = "slab"
-version = "0.4.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "smallvec"
-version = "1.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
-
-[[package]]
-name = "soup2"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0"
-dependencies = [
- "bitflags",
- "gio",
- "glib",
- "libc",
- "once_cell",
- "soup2-sys",
-]
-
-[[package]]
-name = "soup2-sys"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf"
-dependencies = [
- "bitflags",
- "gio-sys",
- "glib-sys",
- "gobject-sys",
- "libc",
- "system-deps 5.0.0",
-]
-
-[[package]]
-name = "stable_deref_trait"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
-
-[[package]]
-name = "state"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b"
-dependencies = [
- "loom",
-]
-
-[[package]]
-name = "string_cache"
-version = "0.8.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b"
-dependencies = [
- "new_debug_unreachable",
- "once_cell",
- "parking_lot",
- "phf_shared 0.10.0",
- "precomputed-hash",
- "serde",
-]
-
-[[package]]
-name = "string_cache_codegen"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988"
-dependencies = [
- "phf_generator 0.10.0",
- "phf_shared 0.10.0",
- "proc-macro2",
- "quote",
-]
-
-[[package]]
-name = "strsim"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
-
-[[package]]
-name = "syn"
-version = "1.0.109"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79d9531f94112cfc3e4c8f5f02cb2b58f72c97b7efd85f70203cc6d8efda5927"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "system-deps"
-version = "5.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e"
-dependencies = [
- "cfg-expr 0.9.1",
- "heck 0.3.3",
- "pkg-config",
- "toml 0.5.11",
- "version-compare 0.0.11",
-]
-
-[[package]]
-name = "system-deps"
-version = "6.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "555fc8147af6256f3931a36bb83ad0023240ce9cf2b319dec8236fd1f220b05f"
-dependencies = [
- "cfg-expr 0.14.0",
- "heck 0.4.1",
- "pkg-config",
- "toml 0.7.3",
- "version-compare 0.1.1",
-]
-
-[[package]]
-name = "tao"
-version = "0.15.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac8e6399427c8494f9849b58694754d7cc741293348a6836b6c8d2c5aa82d8e6"
-dependencies = [
- "bitflags",
- "cairo-rs",
- "cc",
- "cocoa",
- "core-foundation",
- "core-graphics",
- "crossbeam-channel",
- "dispatch",
- "gdk",
- "gdk-pixbuf",
- "gdk-sys",
- "gdkx11-sys",
- "gio",
- "glib",
- "glib-sys",
- "gtk",
- "image",
- "instant",
- "jni",
- "lazy_static",
- "libc",
- "log",
- "ndk",
- "ndk-context",
- "ndk-sys",
- "objc",
- "once_cell",
- "parking_lot",
- "paste",
- "png",
- "raw-window-handle",
- "scopeguard",
- "serde",
- "unicode-segmentation",
- "uuid 1.3.0",
- "windows 0.39.0",
- "windows-implement",
- "x11-dl",
-]
-
-[[package]]
-name = "tar"
-version = "0.4.38"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6"
-dependencies = [
- "filetime",
- "libc",
- "xattr",
-]
-
-[[package]]
-name = "tauri"
-version = "1.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe7e0f1d535e7cbbbab43c82be4fc992b84f9156c16c160955617e0260ebc449"
-dependencies = [
- "anyhow",
- "cocoa",
- "dirs-next",
- "embed_plist",
- "encoding_rs",
- "flate2",
- "futures-util",
- "glib",
- "glob",
- "gtk",
- "heck 0.4.1",
- "http",
- "ignore",
- "objc",
- "once_cell",
- "percent-encoding",
- "rand 0.8.5",
- "raw-window-handle",
- "semver",
- "serde",
- "serde_json",
- "serde_repr",
- "serialize-to-javascript",
- "state",
- "tar",
- "tauri-macros",
- "tauri-runtime",
- "tauri-runtime-wry",
- "tauri-utils",
- "tempfile",
- "thiserror",
- "tokio",
- "url",
- "uuid 1.3.0",
- "webkit2gtk",
- "webview2-com",
- "windows 0.39.0",
-]
-
-[[package]]
-name = "tauri-build"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8807c85d656b2b93927c19fe5a5f1f1f348f96c2de8b90763b3c2d561511f9b4"
-dependencies = [
- "anyhow",
- "cargo_toml",
- "heck 0.4.1",
- "json-patch",
- "semver",
- "serde_json",
- "tauri-utils",
- "winres",
-]
-
-[[package]]
-name = "tauri-codegen"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14388d484b6b1b5dc0f6a7d6cc6433b3b230bec85eaa576adcdf3f9fafa49251"
-dependencies = [
- "base64 0.13.1",
- "brotli",
- "ico",
- "json-patch",
- "plist",
- "png",
- "proc-macro2",
- "quote",
- "semver",
- "serde",
- "serde_json",
- "sha2",
- "tauri-utils",
- "thiserror",
- "time",
- "uuid 1.3.0",
- "walkdir",
-]
-
-[[package]]
-name = "tauri-macros"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "069319e5ecbe653a799b94b0690d9f9bf5d00f7b1d3989aa331c524d4e354075"
-dependencies = [
- "heck 0.4.1",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
- "tauri-codegen",
- "tauri-utils",
-]
-
-[[package]]
-name = "tauri-runtime"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c507d954d08ac8705d235bc70ec6975b9054fb95ff7823af72dbb04186596f3b"
-dependencies = [
- "gtk",
- "http",
- "http-range",
- "rand 0.8.5",
- "raw-window-handle",
- "serde",
- "serde_json",
- "tauri-utils",
- "thiserror",
- "uuid 1.3.0",
- "webview2-com",
- "windows 0.39.0",
-]
-
-[[package]]
-name = "tauri-runtime-wry"
-version = "0.12.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36b1c5764a41a13176a4599b5b7bd0881bea7d94dfe45e1e755f789b98317e30"
-dependencies = [
- "cocoa",
- "gtk",
- "percent-encoding",
- "rand 0.8.5",
- "raw-window-handle",
- "tauri-runtime",
- "tauri-utils",
- "uuid 1.3.0",
- "webkit2gtk",
- "webview2-com",
- "windows 0.39.0",
- "wry",
-]
-
-[[package]]
-name = "tauri-utils"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5abbc109a6eb45127956ffcc26ef0e875d160150ac16cfa45d26a6b2871686f1"
-dependencies = [
- "brotli",
- "ctor",
- "glob",
- "heck 0.4.1",
- "html5ever",
- "infer",
- "json-patch",
- "kuchiki",
- "memchr",
- "phf 0.10.1",
- "proc-macro2",
- "quote",
- "semver",
- "serde",
- "serde_json",
- "serde_with",
- "thiserror",
- "url",
- "walkdir",
- "windows 0.39.0",
-]
-
-[[package]]
-name = "tempfile"
-version = "3.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
-dependencies = [
- "cfg-if",
- "fastrand",
- "redox_syscall 0.3.5",
- "rustix",
- "windows-sys",
-]
-
-[[package]]
-name = "tendril"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
-dependencies = [
- "futf",
- "mac",
- "utf-8",
-]
-
-[[package]]
-name = "thin-slice"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
-
-[[package]]
-name = "thiserror"
-version = "1.0.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
-dependencies = [
- "thiserror-impl",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "1.0.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.12",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
-dependencies = [
- "cfg-if",
- "once_cell",
-]
-
-[[package]]
-name = "time"
-version = "0.3.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890"
-dependencies = [
- "itoa 1.0.6",
- "serde",
- "time-core",
- "time-macros",
-]
-
-[[package]]
-name = "time-core"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
-
-[[package]]
-name = "time-macros"
-version = "0.2.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36"
-dependencies = [
- "time-core",
-]
-
-[[package]]
-name = "tinyvec"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
-dependencies = [
- "tinyvec_macros",
-]
-
-[[package]]
-name = "tinyvec_macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
-
-[[package]]
-name = "tokio"
-version = "1.27.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001"
-dependencies = [
- "autocfg",
- "bytes",
- "num_cpus",
- "pin-project-lite",
- "windows-sys",
-]
-
-[[package]]
-name = "toml"
-version = "0.5.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "toml"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21"
-dependencies = [
- "serde",
- "serde_spanned",
- "toml_datetime",
- "toml_edit",
-]
-
-[[package]]
-name = "toml_datetime"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.19.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13"
-dependencies = [
- "indexmap",
- "serde",
- "serde_spanned",
- "toml_datetime",
- "winnow",
-]
-
-[[package]]
-name = "tracing"
-version = "0.1.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
-dependencies = [
- "cfg-if",
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
-dependencies = [
- "once_cell",
- "valuable",
-]
-
-[[package]]
-name = "tracing-log"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
-dependencies = [
- "lazy_static",
- "log",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
-dependencies = [
- "matchers",
- "nu-ansi-term",
- "once_cell",
- "regex",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
-]
-
-[[package]]
-name = "treediff"
-version = "3.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff"
-dependencies = [
- "serde_json",
-]
-
-[[package]]
-name = "typenum"
-version = "1.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
-
-[[package]]
-name = "unicode-bidi"
-version = "0.3.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
-
-[[package]]
-name = "unicode-normalization"
-version = "0.1.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
-dependencies = [
- "tinyvec",
-]
-
-[[package]]
-name = "unicode-segmentation"
-version = "1.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
-
-[[package]]
-name = "url"
-version = "2.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
-dependencies = [
- "form_urlencoded",
- "idna",
- "percent-encoding",
- "serde",
-]
-
-[[package]]
-name = "utf-8"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
-
-[[package]]
-name = "uuid"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
-
-[[package]]
-name = "uuid"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79"
-dependencies = [
- "getrandom 0.2.8",
-]
-
-[[package]]
-name = "valuable"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
-
-[[package]]
-name = "version-compare"
-version = "0.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b"
-
-[[package]]
-name = "version-compare"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29"
-
-[[package]]
-name = "version_check"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
-
-[[package]]
-name = "walkdir"
-version = "2.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
-dependencies = [
- "same-file",
- "winapi-util",
-]
-
-[[package]]
-name = "wasi"
-version = "0.9.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
-
-[[package]]
-name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
-
-[[package]]
-name = "webkit2gtk"
-version = "0.18.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370"
-dependencies = [
- "bitflags",
- "cairo-rs",
- "gdk",
- "gdk-sys",
- "gio",
- "gio-sys",
- "glib",
- "glib-sys",
- "gobject-sys",
- "gtk",
- "gtk-sys",
- "javascriptcore-rs",
- "libc",
- "once_cell",
- "soup2",
- "webkit2gtk-sys",
-]
-
-[[package]]
-name = "webkit2gtk-sys"
-version = "0.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3"
-dependencies = [
- "atk-sys",
- "bitflags",
- "cairo-sys-rs",
- "gdk-pixbuf-sys",
- "gdk-sys",
- "gio-sys",
- "glib-sys",
- "gobject-sys",
- "gtk-sys",
- "javascriptcore-rs-sys",
- "libc",
- "pango-sys",
- "pkg-config",
- "soup2-sys",
- "system-deps 6.0.4",
-]
-
-[[package]]
-name = "webview2-com"
-version = "0.19.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178"
-dependencies = [
- "webview2-com-macros",
- "webview2-com-sys",
- "windows 0.39.0",
- "windows-implement",
-]
-
-[[package]]
-name = "webview2-com-macros"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "webview2-com-sys"
-version = "0.19.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7"
-dependencies = [
- "regex",
- "serde",
- "serde_json",
- "thiserror",
- "windows 0.39.0",
- "windows-bindgen",
- "windows-metadata",
-]
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-util"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
-dependencies = [
- "winapi",
-]
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows"
-version = "0.39.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a"
-dependencies = [
- "windows-implement",
- "windows_aarch64_msvc 0.39.0",
- "windows_i686_gnu 0.39.0",
- "windows_i686_msvc 0.39.0",
- "windows_x86_64_gnu 0.39.0",
- "windows_x86_64_msvc 0.39.0",
-]
-
-[[package]]
-name = "windows"
-version = "0.44.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b"
-dependencies = [
- "windows-targets",
-]
-
-[[package]]
-name = "windows-bindgen"
-version = "0.39.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41"
-dependencies = [
- "windows-metadata",
- "windows-tokens",
-]
-
-[[package]]
-name = "windows-implement"
-version = "0.39.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7"
-dependencies = [
- "syn 1.0.109",
- "windows-tokens",
-]
-
-[[package]]
-name = "windows-metadata"
-version = "0.39.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278"
-
-[[package]]
-name = "windows-sys"
-version = "0.45.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
-dependencies = [
- "windows-targets",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
-dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc 0.42.2",
- "windows_i686_gnu 0.42.2",
- "windows_i686_msvc 0.42.2",
- "windows_x86_64_gnu 0.42.2",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc 0.42.2",
-]
-
-[[package]]
-name = "windows-tokens"
-version = "0.39.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597"
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.39.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.39.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.39.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.39.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.39.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
-
-[[package]]
-name = "winnow"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "winres"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c"
-dependencies = [
- "toml 0.5.11",
-]
-
-[[package]]
-name = "wry"
-version = "0.23.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c1ad8e2424f554cc5bdebe8aa374ef5b433feff817aebabca0389961fc7ef98"
-dependencies = [
- "base64 0.13.1",
- "block",
- "cocoa",
- "core-graphics",
- "crossbeam-channel",
- "dunce",
- "gdk",
- "gio",
- "glib",
- "gtk",
- "html5ever",
- "http",
- "kuchiki",
- "libc",
- "log",
- "objc",
- "objc_id",
- "once_cell",
- "serde",
- "serde_json",
- "sha2",
- "soup2",
- "tao",
- "thiserror",
- "url",
- "webkit2gtk",
- "webkit2gtk-sys",
- "webview2-com",
- "windows 0.39.0",
- "windows-implement",
-]
-
-[[package]]
-name = "x11"
-version = "2.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e"
-dependencies = [
- "libc",
- "pkg-config",
-]
-
-[[package]]
-name = "x11-dl"
-version = "2.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f"
-dependencies = [
- "libc",
- "once_cell",
- "pkg-config",
-]
-
-[[package]]
-name = "xattr"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc"
-dependencies = [
- "libc",
-]
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
deleted file mode 100644
index f50058b3..00000000
--- a/src-tauri/Cargo.toml
+++ /dev/null
@@ -1,28 +0,0 @@
-[package]
-name = "app"
-version = "0.1.0"
-description = "A Tauri App"
-authors = ["you"]
-license = ""
-repository = ""
-default-run = "app"
-edition = "2021"
-rust-version = "1.59"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[build-dependencies]
-tauri-build = { version = "1.2.1", features = [] }
-
-[dependencies]
-serde_json = "1.0"
-serde = { version = "1.0", features = ["derive"] }
-tauri = { version = "1.2.4", features = [] }
-
-[features]
-# by default Tauri runs in production mode
-# when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL
-default = [ "custom-protocol" ]
-# this feature is used for production builds where `devPath` points to the filesystem
-# DO NOT remove this
-custom-protocol = [ "tauri/custom-protocol" ]
diff --git a/src-tauri/build.rs b/src-tauri/build.rs
deleted file mode 100644
index 795b9b7c..00000000
--- a/src-tauri/build.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-fn main() {
- tauri_build::build()
-}
diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png
deleted file mode 100644
index 77e7d233..00000000
Binary files a/src-tauri/icons/128x128.png and /dev/null differ
diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png
deleted file mode 100644
index 0f7976f1..00000000
Binary files a/src-tauri/icons/128x128@2x.png and /dev/null differ
diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png
deleted file mode 100644
index 98fda06f..00000000
Binary files a/src-tauri/icons/32x32.png and /dev/null differ
diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png
deleted file mode 100644
index f35d84ff..00000000
Binary files a/src-tauri/icons/Square107x107Logo.png and /dev/null differ
diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png
deleted file mode 100644
index 1823bb26..00000000
Binary files a/src-tauri/icons/Square142x142Logo.png and /dev/null differ
diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png
deleted file mode 100644
index dc2b22ce..00000000
Binary files a/src-tauri/icons/Square150x150Logo.png and /dev/null differ
diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png
deleted file mode 100644
index 0ed3984c..00000000
Binary files a/src-tauri/icons/Square284x284Logo.png and /dev/null differ
diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png
deleted file mode 100644
index 60bf0ead..00000000
Binary files a/src-tauri/icons/Square30x30Logo.png and /dev/null differ
diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png
deleted file mode 100644
index c8ca0ad1..00000000
Binary files a/src-tauri/icons/Square310x310Logo.png and /dev/null differ
diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png
deleted file mode 100644
index 8756459b..00000000
Binary files a/src-tauri/icons/Square44x44Logo.png and /dev/null differ
diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png
deleted file mode 100644
index 2c8023cc..00000000
Binary files a/src-tauri/icons/Square71x71Logo.png and /dev/null differ
diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png
deleted file mode 100644
index 2c5e6034..00000000
Binary files a/src-tauri/icons/Square89x89Logo.png and /dev/null differ
diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png
deleted file mode 100644
index 17d142c0..00000000
Binary files a/src-tauri/icons/StoreLogo.png and /dev/null differ
diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns
deleted file mode 100644
index a2993adc..00000000
Binary files a/src-tauri/icons/icon.icns and /dev/null differ
diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico
deleted file mode 100644
index 06c23c82..00000000
Binary files a/src-tauri/icons/icon.ico and /dev/null differ
diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png
deleted file mode 100644
index d1756ce4..00000000
Binary files a/src-tauri/icons/icon.png and /dev/null differ
diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs
deleted file mode 100644
index e994ea4d..00000000
--- a/src-tauri/src/main.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-#![cfg_attr(
- all(not(debug_assertions), target_os = "windows"),
- windows_subsystem = "windows"
-)]
-
-fn main() {
- tauri::Builder::default()
- .run(tauri::generate_context!())
- .expect("error while running tauri application");
-}
diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json
deleted file mode 100644
index 61ed746f..00000000
--- a/src-tauri/tauri.conf.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
- "$schema": "../node_modules/@tauri-apps/cli/schema.json",
- "build": {
- "beforeBuildCommand": "npm run build",
- "beforeDevCommand": "npm run dev",
- "devPath": "http://localhost:3000",
- "distDir": "../.next"
- },
- "package": {
- "productName": "sqlchat",
- "version": "0.1.0"
- },
- "tauri": {
- "allowlist": {
- "all": false
- },
- "bundle": {
- "active": true,
- "category": "DeveloperTool",
- "copyright": "",
- "deb": {
- "depends": []
- },
- "externalBin": [],
- "icon": ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"],
- "identifier": "com.tauri.dev",
- "longDescription": "",
- "macOS": {
- "entitlements": null,
- "exceptionDomain": "",
- "frameworks": [],
- "providerShortName": null,
- "signingIdentity": null
- },
- "resources": [],
- "shortDescription": "",
- "targets": "all",
- "windows": {
- "certificateThumbprint": null,
- "digestAlgorithm": "sha256",
- "timestampUrl": ""
- }
- },
- "security": {
- "csp": null
- },
- "updater": {
- "active": false
- },
- "windows": [
- {
- "fullscreen": false,
- "height": 600,
- "resizable": true,
- "title": "SQL Chat",
- "width": 800
- }
- ]
- }
-}
diff --git a/src/components/AccountView.tsx b/src/components/AccountView.tsx
new file mode 100644
index 00000000..e65946e4
--- /dev/null
+++ b/src/components/AccountView.tsx
@@ -0,0 +1,78 @@
+import { signIn, useSession } from "next-auth/react";
+import Link from "next/link";
+import { useTranslation } from "react-i18next";
+import PaymentHistoryTable from "./PaymentHistoryTable";
+import { getDateString } from "@/utils";
+
+const AccountView = () => {
+ const { t } = useTranslation();
+ const { data: session } = useSession();
+
+ const expired = session?.user?.subscription?.expireAt && session?.user?.subscription?.expireAt < Date.now();
+
+ return (
+ <>
+ {!session && (
+ signIn()}
+ >
+ {t("common.sign-in")}
+
+ )}
+ {session?.user && (
+
+
+
+ {session.user.image && (
+
+ )}
+
{session.user.email ?? session.user.name}
+
+ {t("common.sign-out")}
+
+
+
+ {!!expired && (
+
+ {t("setting.plan.expired")}
+
+ )}
+
+ {t(`setting.plan.${session.user.subscription.plan.toLowerCase()}`)}
+
+
+ {t("setting.plan.n-question-per-month", {
+ count: session.user.subscription.quota,
+ })}
+
+ {session.user.subscription.plan === "PRO" && (
+
+ {getDateString(session.user.subscription.startAt)}
+ {` - `}
+ {getDateString(session.user.subscription.expireAt)}
+
+ )}
+
+
+
+
+ )}
+ >
+ );
+};
+
+export default AccountView;
diff --git a/src/components/ActionConfirmModal.tsx b/src/components/ActionConfirmModal.tsx
index 5ab9d837..ae4f696d 100644
--- a/src/components/ActionConfirmModal.tsx
+++ b/src/components/ActionConfirmModal.tsx
@@ -1,4 +1,5 @@
-import Icon from "./Icon";
+import { useTranslation } from "react-i18next";
+import Modal from "./kit/Modal";
export interface ActionConfirmModalProps {
title: string;
@@ -10,33 +11,28 @@ export interface ActionConfirmModalProps {
const ActionConfirmModal = (props: ActionConfirmModalProps) => {
const { close, confirm, title, content, confirmButtonStyle } = props;
+ const { t } = useTranslation();
return (
-
-
-
{title}
-
-
+
+
+
+
+ {t("common.close")}
+
+
{
+ confirm();
+ close();
+ }}
+ >
+ {t("common.confirm")}
-
-
-
- Close
-
- {
- confirm();
- close();
- }}
- >
- Confirm
-
-
-
+
);
};
diff --git a/src/components/BetaBadge.tsx b/src/components/BetaBadge.tsx
new file mode 100644
index 00000000..7eefcdce
--- /dev/null
+++ b/src/components/BetaBadge.tsx
@@ -0,0 +1,19 @@
+interface Props {
+ className?: string;
+}
+
+const BetaBadge: React.FC
= (props: Props) => {
+ const { className } = props;
+
+ return (
+
+ Beta
+
+ );
+};
+
+export default BetaBadge;
diff --git a/src/components/ChatView/Header.tsx b/src/components/ChatView/Header.tsx
deleted file mode 100644
index bf800ea9..00000000
--- a/src/components/ChatView/Header.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import { useEffect } from "react";
-import { useChatStore } from "@/store";
-import Icon from "../Icon";
-import GitHubStarBadge from "../GitHubStarBadge";
-
-interface Props {
- className?: string;
-}
-
-const Header = (props: Props) => {
- const { className } = props;
- const chatStore = useChatStore();
- const currentChat = chatStore.currentChat;
- const title = currentChat?.title || "SQL Chat";
-
- useEffect(() => {
- document.title = `${title}`;
- }, [title]);
-
- return (
-
-
-
-
-
- {title}
-
-
-
{title}
-
-
- );
-};
-
-export default Header;
diff --git a/src/components/ChatView/MessageView.tsx b/src/components/ChatView/MessageView.tsx
deleted file mode 100644
index a87a0ec0..00000000
--- a/src/components/ChatView/MessageView.tsx
+++ /dev/null
@@ -1,143 +0,0 @@
-import { Menu, MenuItem } from "@mui/material";
-import dayjs from "dayjs";
-import { ReactElement, useState } from "react";
-import { ThreeDots } from "react-loader-spinner";
-import { toast } from "react-hot-toast";
-import ReactMarkdown from "react-markdown";
-import remarkGfm from "remark-gfm";
-import { useChatStore, useConnectionStore, useMessageStore, useUserStore } from "@/store";
-import { Message } from "@/types";
-import Icon from "../Icon";
-import { CodeBlock } from "../CodeBlock";
-import EngineIcon from "../EngineIcon";
-
-interface Props {
- message: Message;
-}
-
-const MessageView = (props: Props) => {
- const message = props.message;
- const userStore = useUserStore();
- const chatStore = useChatStore();
- const connectionStore = useConnectionStore();
- const messageStore = useMessageStore();
- const [menuAnchorEl, setMenuAnchorEl] = useState(null);
- const isCurrentUser = message.creatorId === userStore.currentUser.id;
- const showMenu = Boolean(menuAnchorEl);
- const connection = connectionStore.getConnectionById(chatStore.getChatById(message.chatId)?.connectionId || "");
-
- const handleMoreMenuClick = (event: React.MouseEvent) => {
- if (menuAnchorEl) {
- setMenuAnchorEl(null);
- } else {
- setMenuAnchorEl(event.currentTarget);
- }
- };
-
- const copyMessage = () => {
- navigator.clipboard.writeText(message.content);
- toast.success("Copied to clipboard");
- setMenuAnchorEl(null);
- };
-
- const deleteMessage = (message: Message) => {
- messageStore.clearMessage((item) => item.id !== message.id);
- setMenuAnchorEl(null);
- };
-
- return (
-
- {isCurrentUser ? (
- <>
-
- {message.content}
-
-
-
-
- >
- ) : (
- <>
-
- {connection ? (
-
- ) : (
-
- )}
-
- {message.status === "LOADING" && message.content === "" ? (
-
-
-
- ) : (
- <>
-
-
-
-
- );
- },
- code({ children }) {
- return `{children}`;
- },
- }}
- >
- {message.content}
-
- {dayjs(message.createdAt).format("lll")}
-
-
-
-
-
-
setMenuAnchorEl(null)}
- MenuListProps={{
- "aria-labelledby": "basic-button",
- }}
- >
-
-
- Copy
-
- deleteMessage(message)}>
-
- Delete
-
-
-
- >
- )}
- >
- )}
-
- );
-};
-
-export default MessageView;
diff --git a/src/components/ChatView/index.tsx b/src/components/ChatView/index.tsx
deleted file mode 100644
index 5fd23606..00000000
--- a/src/components/ChatView/index.tsx
+++ /dev/null
@@ -1,215 +0,0 @@
-import { head, last } from "lodash-es";
-import { useEffect, useRef, useState } from "react";
-import { toast } from "react-hot-toast";
-import { getAssistantById, getPromptGeneratorOfAssistant, useChatStore, useMessageStore, useConnectionStore } from "@/store";
-import { CreatorRole, Message } from "@/types";
-import { countTextTokens, generateUUID } from "@/utils";
-import Header from "./Header";
-import EmptyView from "../EmptyView";
-import MessageView from "./MessageView";
-import MessageTextarea from "./MessageTextarea";
-import DataStorageBanner from "../DataStorageBanner";
-
-// The maximum number of tokens that can be sent to the OpenAI API.
-// reference: https://platform.openai.com/docs/api-reference/completions/create#completions/create-max_tokens
-const MAX_TOKENS = 4000;
-
-const ChatView = () => {
- const connectionStore = useConnectionStore();
- const chatStore = useChatStore();
- const messageStore = useMessageStore();
- const [isStickyAtBottom, setIsStickyAtBottom] = useState(true);
- const [showHeaderShadow, setShowHeaderShadow] = useState(false);
- const chatViewRef = useRef(null);
- const currentChat = chatStore.currentChat;
- const messageList = messageStore.messageList.filter((message) => message.chatId === currentChat?.id);
- const lastMessage = last(messageList);
-
- useEffect(() => {
- messageStore.messageList.map((message) => {
- if (message.status === "LOADING" && message.content === "") {
- messageStore.updateMessage(message.id, {
- content: "Failed to send the message.",
- status: "FAILED",
- });
- }
- });
-
- const handleChatViewScroll = () => {
- if (!chatViewRef.current) {
- return;
- }
- setShowHeaderShadow((chatViewRef.current?.scrollTop || 0) > 0);
- setIsStickyAtBottom(chatViewRef.current.scrollTop + chatViewRef.current.clientHeight >= chatViewRef.current.scrollHeight);
- };
- chatViewRef.current?.addEventListener("scroll", handleChatViewScroll);
-
- return () => {
- chatViewRef.current?.removeEventListener("scroll", handleChatViewScroll);
- };
- }, []);
-
- useEffect(() => {
- if (!chatViewRef.current) {
- return;
- }
- chatViewRef.current.scrollTop = chatViewRef.current.scrollHeight;
- }, [currentChat, lastMessage?.id]);
-
- useEffect(() => {
- if (!chatViewRef.current) {
- return;
- }
-
- if (lastMessage?.status === "LOADING" && isStickyAtBottom) {
- chatViewRef.current.scrollTop = chatViewRef.current.scrollHeight;
- }
- }, [lastMessage?.status, lastMessage?.content, isStickyAtBottom]);
-
- useEffect(() => {
- if (
- currentChat?.connectionId === connectionStore.currentConnectionCtx?.connection.id &&
- currentChat?.databaseName === connectionStore.currentConnectionCtx?.database?.name
- ) {
- return;
- }
-
- // Auto select the first chat when the current connection changes.
- const chatList = chatStore.chatList.filter(
- (chat) =>
- chat.connectionId === connectionStore.currentConnectionCtx?.connection.id &&
- chat.databaseName === connectionStore.currentConnectionCtx?.database?.name
- );
- chatStore.setCurrentChat(head(chatList));
- }, [currentChat, connectionStore.currentConnectionCtx]);
-
- const sendMessageToCurrentChat = async () => {
- const currentChat = chatStore.getState().currentChat;
- if (!currentChat) {
- return;
- }
- if (lastMessage?.status === "LOADING") {
- return;
- }
-
- const messageList = messageStore.getState().messageList.filter((message) => message.chatId === currentChat.id);
- let prompt = "";
- let tokens = 0;
-
- const message: Message = {
- id: generateUUID(),
- chatId: currentChat.id,
- creatorId: currentChat.assistantId,
- creatorRole: CreatorRole.Assistant,
- createdAt: Date.now(),
- content: "",
- status: "LOADING",
- };
- messageStore.addMessage(message);
-
- if (connectionStore.currentConnectionCtx?.database) {
- let schema = "";
- try {
- const tables = await connectionStore.getOrFetchDatabaseSchema(connectionStore.currentConnectionCtx?.database);
- for (const table of tables) {
- if (tokens < MAX_TOKENS / 2) {
- tokens += countTextTokens(schema + table.structure);
- schema += table.structure;
- }
- }
- } catch (error: any) {
- toast.error(error.message);
- }
- const promptGenerator = getPromptGeneratorOfAssistant(getAssistantById(currentChat.assistantId)!);
- prompt = promptGenerator(schema);
- }
- let formatedMessageList = [];
- for (let i = messageList.length - 1; i >= 0; i--) {
- const message = messageList[i];
- if (tokens < MAX_TOKENS) {
- tokens += countTextTokens(message.content);
- formatedMessageList.unshift({
- role: message.creatorRole,
- content: message.content,
- });
- }
- }
- formatedMessageList.unshift({
- role: CreatorRole.System,
- content: prompt,
- });
-
- const rawRes = await fetch("/api/chat", {
- method: "POST",
- body: JSON.stringify({
- messages: formatedMessageList,
- }),
- });
-
- if (!rawRes.ok) {
- console.error(rawRes);
- let errorMessage = "Failed to request message, please check your network.";
- try {
- const res = await rawRes.json();
- errorMessage = res.error.message;
- } catch (error) {
- // do nth
- }
- messageStore.updateMessage(message.id, {
- content: errorMessage,
- status: "FAILED",
- });
- return;
- }
-
- const data = rawRes.body;
- if (!data) {
- toast.error("No data return");
- return;
- }
-
- const reader = data.getReader();
- const decoder = new TextDecoder("utf-8");
- let done = false;
- while (!done) {
- const { value, done: readerDone } = await reader.read();
- if (value) {
- const char = decoder.decode(value);
- if (char) {
- message.content = message.content + char;
- messageStore.updateMessage(message.id, {
- content: message.content,
- });
- }
- }
- done = readerDone;
- }
- messageStore.updateMessage(message.id, {
- status: "DONE",
- });
- };
-
- return (
-
-
-
-
-
-
- {messageList.length === 0 ? (
-
- ) : (
- messageList.map((message) => )
- )}
-
-
-
-
-
- );
-};
-
-export default ChatView;
diff --git a/src/components/ClearConversationButton.tsx b/src/components/ClearConversationButton.tsx
new file mode 100644
index 00000000..8f941e01
--- /dev/null
+++ b/src/components/ClearConversationButton.tsx
@@ -0,0 +1,27 @@
+import { useState } from "react";
+import { useConversationStore, useMessageStore } from "@/store";
+import Icon from "./Icon";
+import ClearConversationConfirmModal from "./ClearConversationConfirmModal";
+
+const ClearConversationButton = () => {
+ const conversationStore = useConversationStore();
+ const messageStore = useMessageStore();
+ const [showConfirmModal, setShowConfirmModal] = useState(false);
+ const messageList = messageStore.messageList.filter((message) => message.conversationId === conversationStore.currentConversationId);
+
+ return (
+ <>
+ setShowConfirmModal(true)}
+ >
+
+
+
+ {showConfirmModal && setShowConfirmModal(false)} />}
+ >
+ );
+};
+
+export default ClearConversationButton;
diff --git a/src/components/ClearConversationConfirmModal.tsx b/src/components/ClearConversationConfirmModal.tsx
new file mode 100644
index 00000000..d7be4836
--- /dev/null
+++ b/src/components/ClearConversationConfirmModal.tsx
@@ -0,0 +1,39 @@
+import { useTranslation } from "react-i18next";
+import { useConversationStore, useMessageStore } from "@/store";
+import Modal from "./kit/Modal";
+
+interface Props {
+ close: () => void;
+}
+
+const ClearConversationConfirmModal = (props: Props) => {
+ const { close } = props;
+ const { t } = useTranslation();
+ const conversationStore = useConversationStore();
+ const messageStore = useMessageStore();
+
+ const handleClearMessages = () => {
+ messageStore.clearMessage((item) => item.conversationId !== conversationStore.currentConversationId);
+ close();
+ };
+
+ return (
+
+
+
+
Are you sure to clear the messages in current conversation?
+
+
+
+ {t("common.close")}
+
+
+ {t("common.clear")}
+
+
+
+
+ );
+};
+
+export default ClearConversationConfirmModal;
diff --git a/src/components/ClearDataButton.tsx b/src/components/ClearDataButton.tsx
index a062653f..34bd56a8 100644
--- a/src/components/ClearDataButton.tsx
+++ b/src/components/ClearDataButton.tsx
@@ -1,18 +1,18 @@
import { useState } from "react";
-import { createPortal } from "react-dom";
+import { useTranslation } from "react-i18next";
import ClearDataConfirmModal from "./ClearDataConfirmModal";
const ClearDataButton = () => {
+ const { t } = useTranslation();
const [showClearDataConfirmModal, setShowClearDataConfirmModal] = useState(false);
return (
<>
- setShowClearDataConfirmModal(true)}>
- Clear
+ setShowClearDataConfirmModal(true)}>
+ {t("common.clear")}
- {showClearDataConfirmModal &&
- createPortal( setShowClearDataConfirmModal(false)} />, document.body)}
+ {showClearDataConfirmModal && setShowClearDataConfirmModal(false)} />}
>
);
};
diff --git a/src/components/ClearDataConfirmModal.tsx b/src/components/ClearDataConfirmModal.tsx
index e034a0b2..cebe873a 100644
--- a/src/components/ClearDataConfirmModal.tsx
+++ b/src/components/ClearDataConfirmModal.tsx
@@ -1,5 +1,6 @@
import { toast } from "react-hot-toast";
-import Icon from "./Icon";
+import { useTranslation } from "react-i18next";
+import Modal from "./kit/Modal";
interface Props {
close: () => void;
@@ -7,36 +8,33 @@ interface Props {
const ClearDataConfirmModal = (props: Props) => {
const { close } = props;
+ const { t } = useTranslation();
const handleClearData = () => {
window.localStorage.clear();
close();
- toast.success("Message cleared. The page will be reloaded.");
+ toast.success("Data cleared. The page will be reloaded.");
setTimeout(() => {
window.location.reload();
}, 500);
};
return (
-
-
-
Clear all data
-
-
-
-
+
+
+
SQL Chat saves all your data in your local browser. Are you sure to clear all of them?
-
+
- Close
+ {t("common.close")}
- Clear data
+ {t("common.clear")}
-
+
);
};
diff --git a/src/components/CodeBlock.tsx b/src/components/CodeBlock.tsx
index 194f2b0e..c74c3a7c 100644
--- a/src/components/CodeBlock.tsx
+++ b/src/components/CodeBlock.tsx
@@ -1,34 +1,34 @@
+import copy from "copy-to-clipboard";
import { toast } from "react-hot-toast";
+import { useTranslation } from "react-i18next";
import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
import { oneDark } from "react-syntax-highlighter/dist/cjs/styles/prism";
import { useConnectionStore, useQueryStore } from "@/store";
-import { checkStatementIsSelect } from "@/utils";
import Icon from "./Icon";
+import Tooltip from "./kit/Tooltip";
+import { Id } from "@/types";
interface Props {
language: string;
value: string;
+ messageId: Id;
+ wrapLongLines?: boolean;
}
export const CodeBlock = (props: Props) => {
- const { language, value } = props;
+ const { language, value, messageId, wrapLongLines } = props;
+ const { t } = useTranslation();
const connectionStore = useConnectionStore();
const queryStore = useQueryStore();
const currentConnectionCtx = connectionStore.currentConnectionCtx;
// Only show execute button in the following situations:
- // * SQL code, and it is a SELECT statement;
+ // * SQL code;
// * Connection setup;
- const showExecuteButton =
- language.toUpperCase() === "SQL" && checkStatementIsSelect(value) && currentConnectionCtx?.connection && currentConnectionCtx?.database;
+ const showExecuteButton = currentConnectionCtx?.connection && currentConnectionCtx?.database && language.toUpperCase() === "SQL";
const copyToClipboard = () => {
- if (!navigator.clipboard || !navigator.clipboard.writeText) {
- toast.error("Failed to copy to clipboard");
- return;
- }
- navigator.clipboard.writeText(value).then(() => {
- toast.success("Copied to clipboard");
- });
+ copy(value);
+ toast.success("Copied to clipboard");
};
const handleExecuteQuery = () => {
@@ -40,6 +40,7 @@ export const CodeBlock = (props: Props) => {
queryStore.setContext({
connection: currentConnectionCtx.connection,
database: currentConnectionCtx.database,
+ messageId: messageId,
statement: value,
});
queryStore.toggleDrawer(true);
@@ -48,25 +49,32 @@ export const CodeBlock = (props: Props) => {
return (
-
{language}
+
{language}
-
-
-
- {showExecuteButton && (
+
+
+
+
+ {showExecuteButton && (
+
-
+ {t("common.run-sql")}
)}
-
+
{value}
diff --git a/src/components/ConnectionSidebar.tsx b/src/components/ConnectionSidebar.tsx
index ad6bb2bf..301d8a88 100644
--- a/src/components/ConnectionSidebar.tsx
+++ b/src/components/ConnectionSidebar.tsx
@@ -1,86 +1,149 @@
-import { head } from "lodash-es";
+import { Drawer } from "@mui/material";
import { useEffect, useState } from "react";
-import { createPortal } from "react-dom";
-import { useChatStore, useConnectionStore, useLayoutStore } from "@/store";
-import { Chat, Connection } from "@/types";
+import { useTranslation } from "react-i18next";
+import { useConnectionStore, useConversationStore, useLayoutStore, ResponsiveWidth, useSettingStore } from "@/store";
+import { Engine, Table, Schema } from "@/types";
+import useLoading from "@/hooks/useLoading";
+import Select from "./kit/Select";
import Icon from "./Icon";
-import EngineIcon from "./EngineIcon";
-import CreateConnectionModal from "./CreateConnectionModal";
-import SettingModal from "./SettingModal";
-import EditChatTitleModal from "./EditChatTitleModal";
+import DarkModeSwitch from "./DarkModeSwitch";
+import ConnectionList from "./Sidebar/ConnectionList";
+import QuotaView from "./QuotaView";
+import { countTextTokens, getModel, hasFeature } from "../utils";
+import SettingAvatarIcon from "./SettingAvatarIcon";
+import Checkbox from "./kit/Checkbox";
+import { head } from "lodash-es";
-interface State {
- showCreateConnectionModal: boolean;
- showSettingModal: boolean;
- showEditChatTitleModal: boolean;
-}
+interface State {}
const ConnectionSidebar = () => {
+ const { t } = useTranslation();
+ const settingStore = useSettingStore();
const layoutStore = useLayoutStore();
const connectionStore = useConnectionStore();
- const chatStore = useChatStore();
- const [state, setState] = useState
({
- showCreateConnectionModal: false,
- showSettingModal: false,
- showEditChatTitleModal: false,
- });
- const [editConnectionModalContext, setEditConnectionModalContext] = useState();
- const [editChatTitleModalContext, setEditChatTitleModalContext] = useState();
+ const conversationStore = useConversationStore();
const [isRequestingDatabase, setIsRequestingDatabase] = useState(false);
- const connectionList = connectionStore.connectionList;
const currentConnectionCtx = connectionStore.currentConnectionCtx;
const databaseList = connectionStore.databaseList.filter((database) => database.connectionId === currentConnectionCtx?.connection.id);
- const chatList = chatStore.chatList.filter(
- (chat) => chat.connectionId === currentConnectionCtx?.connection.id && chat.databaseName === currentConnectionCtx?.database?.name
- );
+ const [tableList, updateTableList] = useState([]);
+ const [schemaList, updateSchemaList] = useState([]);
+ const selectedTableNameList: string[] =
+ conversationStore.getConversationById(conversationStore.currentConversationId)?.selectedTableNameList || [];
+ const selectedSchemaName: string =
+ conversationStore.getConversationById(conversationStore.currentConversationId)?.selectedSchemaName || "";
+ const tableSchemaLoadingState = useLoading();
+ const currentConversation = conversationStore.getConversationById(conversationStore.currentConversationId);
+ const maxToken = getModel(settingStore.setting.openAIApiConfig?.model || "").max_token;
+ const [totalToken, setTotalToken] = useState(0);
+ const hasSchemaProperty: boolean =
+ currentConnectionCtx?.connection.engineType === Engine.PostgreSQL || currentConnectionCtx?.connection.engineType === Engine.MSSQL;
+
+ useEffect(() => {
+ const handleWindowResize = () => {
+ if (window.innerWidth < ResponsiveWidth.sm) {
+ layoutStore.toggleSidebar(false);
+ layoutStore.setIsMobileView(true);
+ } else {
+ layoutStore.toggleSidebar(true);
+ layoutStore.setIsMobileView(false);
+ }
+ };
+
+ handleWindowResize();
+ window.addEventListener("resize", handleWindowResize);
+
+ return () => {
+ window.removeEventListener("resize", handleWindowResize);
+ };
+ }, []);
+
+ useEffect(() => {
+ // update total token
+ const totalToken = selectedTableNameList.reduce((totalToken, tableName) => {
+ const table = tableList.find((table) => table.name === tableName);
+ // because old cache didn't have token, So the value may is undefined.
+ return totalToken + (table?.token || countTextTokens(table?.structure || ""));
+ }, 0);
+ setTotalToken(totalToken);
+ }, [selectedTableNameList, tableList]);
useEffect(() => {
if (currentConnectionCtx?.connection) {
setIsRequestingDatabase(true);
connectionStore.getOrFetchDatabaseList(currentConnectionCtx.connection).finally(() => {
setIsRequestingDatabase(false);
+ const database = databaseList.find(
+ (database) => database.name === useConnectionStore.getState().currentConnectionCtx?.database?.name
+ );
+ if (database) {
+ tableSchemaLoadingState.setLoading();
+ connectionStore.getOrFetchDatabaseSchema(database).then(() => {
+ tableSchemaLoadingState.setFinish();
+ });
+ }
});
} else {
setIsRequestingDatabase(false);
}
}, [currentConnectionCtx?.connection]);
- const toggleCreateConnectionModal = (show = true) => {
- setState({
- ...state,
- showCreateConnectionModal: show,
- });
- setEditConnectionModalContext(undefined);
- };
+ useEffect(() => {
+ const schemaList =
+ connectionStore.databaseList.find(
+ (database) =>
+ database.connectionId === currentConnectionCtx?.connection.id && database.name === currentConnectionCtx?.database?.name
+ )?.schemaList || [];
- const toggleSettingModal = (show = true) => {
- setState({
- ...state,
- showSettingModal: show,
- });
- };
+ updateSchemaList(schemaList);
+ // need to create a conversation. otherwise updateSelectedSchemaName will failed.
+ createConversation();
+ }, [connectionStore, hasSchemaProperty, currentConnectionCtx]);
- const toggleEditChatTitleModal = (show = true) => {
- setState({
- ...state,
- showEditChatTitleModal: show,
- });
- };
+ useEffect(() => {
+ const tableList = schemaList.find((schema) => schema.name === selectedSchemaName)?.tables || [];
+ updateTableList(tableList);
- const handleConnectionSelect = async (connection: Connection) => {
- const databaseList = await connectionStore.getOrFetchDatabaseList(connection);
- connectionStore.setCurrentConnectionCtx({
- connection,
- database: head(databaseList),
- });
- };
+ // By default, select as many tables up to the maximum token.
+ const defaultCheckedTableList = [];
+ if (selectedTableNameList.length === 0) {
+ let tokenCount = 0;
+ for (const table of tableList) {
+ tokenCount += countTextTokens(table?.structure || "");
+ if (tokenCount > maxToken) {
+ break;
+ }
+ defaultCheckedTableList.push(table.name);
+ }
+ conversationStore.updateSelectedTablesNameList(defaultCheckedTableList);
+ }
+ }, [selectedSchemaName, schemaList]);
+
+ useEffect(() => {
+ if (hasSchemaProperty && selectedSchemaName === "" && schemaList.length > 0) {
+ conversationStore.updateSelectedSchemaName(head(schemaList)?.name || "");
+ }
+ }, [schemaList, currentConversation]);
- const handleEditConnection = (connection: Connection) => {
- setState({
- ...state,
- showCreateConnectionModal: true,
+ const syncDatabaseList = async () => {
+ if (!currentConnectionCtx?.connection) {
+ return;
+ }
+
+ const prevDatabase = currentConnectionCtx.database;
+ const databaseList = await connectionStore.getOrFetchDatabaseList(currentConnectionCtx.connection, true);
+
+ // Retain the existing database if it exists in the new database list.
+ const database = databaseList.find((database) => database.name === prevDatabase?.name);
+ connectionStore.setCurrentConnectionCtx({
+ connection: currentConnectionCtx.connection,
+ database: database ? database : head(databaseList),
});
- setEditConnectionModalContext(connection);
+ if (database) {
+ tableSchemaLoadingState.setLoading();
+ connectionStore.getOrFetchDatabaseSchema(database).then(() => {
+ tableSchemaLoadingState.setFinish();
+ });
+ }
};
const handleDatabaseNameSelect = async (databaseName: string) => {
@@ -94,179 +157,177 @@ const ConnectionSidebar = () => {
connection: currentConnectionCtx.connection,
database: database,
});
- };
-
- const handleCreateChat = () => {
- if (!currentConnectionCtx) {
- chatStore.createChat();
- } else {
- chatStore.createChat(currentConnectionCtx.connection.id, currentConnectionCtx.database?.name);
+ if (database) {
+ tableSchemaLoadingState.setLoading();
+ connectionStore.getOrFetchDatabaseSchema(database).then(() => {
+ tableSchemaLoadingState.setFinish();
+ });
}
};
- const handleChatSelect = (chat: Chat) => {
- chatStore.setCurrentChat(chat);
- layoutStore.toggleSidebar(false);
+ // only create conversation when currentConversation is null.
+ // Note: This function is used to solve issue #95
+ // https://github.com/sqlchat/sqlchat/issues/95
+ const createConversation = () => {
+ if (!currentConversation) {
+ if (!currentConnectionCtx) {
+ conversationStore.createConversation();
+ } else {
+ conversationStore.createConversation(currentConnectionCtx.connection.id, currentConnectionCtx.database?.name);
+ }
+ }
};
- const handleEditChatTitle = (chat: Chat) => {
- setEditChatTitleModalContext(chat);
- setState({
- ...state,
- showEditChatTitleModal: true,
- });
+ const handleTableCheckboxChange = async (tableName: string, value: boolean) => {
+ if (value) {
+ conversationStore.updateSelectedTablesNameList([...selectedTableNameList, tableName]);
+ } else {
+ conversationStore.updateSelectedTablesNameList(selectedTableNameList.filter((name) => name !== tableName));
+ }
};
- const handleDeleteChat = (chat: Chat) => {
- chatStore.clearChat((item) => item.id !== chat.id);
- if (chatStore.currentChat?.id === chat.id) {
- chatStore.setCurrentChat(undefined);
- }
+ const handleSchemaNameSelect = async (schemaName: string) => {
+ // need to empty selectedTableNameList when schemaName changed. because selectedTableNameList may not exist in new schema.
+ conversationStore.updateSelectedTablesNameList([]);
+ conversationStore.updateSelectedSchemaName(schemaName);
};
return (
<>
-
-
-
-
+
layoutStore.toggleSidebar(false)}
+ ModalProps={{ disablePortal: true }}
+ >
+
+
-
connectionStore.setCurrentConnectionCtx(undefined)}
- >
-
-
- {connectionList.map((connection) => (
-
handleConnectionSelect(connection)}
- >
- {
- e.stopPropagation();
- handleEditConnection(connection);
- }}
- >
-
-
-
-
- ))}
-
toggleCreateConnectionModal(true)}
- >
-
-
+
-
-
toggleSettingModal(true)}
- >
-
-
+
+
+
-
+
- {isRequestingDatabase && (
-
-
Loading
+ {isRequestingDatabase ? (
+
+ {t("common.loading")}
+ ) : (
+ currentConnectionCtx && (
+
syncDatabaseList()}
+ className="flex space-x-1 items-center justify-center mb-4 mt-4 w-full px-2 py-1 border rounded-lg dark:text-gray-300 bg-white dark:bg-zinc-700 hover:bg-gray-100 dark:hover:bg-zinc-800"
+ >
+
+ {t("connection.refresh-schema")}
+
+ )
)}
{databaseList.length > 0 && (
-
-
Select your database:
-
+ handleDatabaseNameSelect(e.target.value)}
- >
- {databaseList.map((database) => (
-
- {database.name}
-
- ))}
-
+ itemList={databaseList.map((database) => {
+ return {
+ label: database.name,
+ value: database.name,
+ };
+ })}
+ onValueChange={(databaseName) => handleDatabaseNameSelect(databaseName)}
+ placeholder={t("connection.select-database") || ""}
+ />
)}
- {chatList.map((chat) => (
-
handleChatSelect(chat)}
- >
- {chat.id === chatStore.currentChat?.id ? (
-
- ) : (
-
- )}
-
{chat.title || "SQL Chat"}
-
- {
- e.stopPropagation();
- handleEditChatTitle(chat);
- }}
- />
- {
- e.stopPropagation();
- handleDeleteChat(chat);
- }}
- />
-
+ {hasSchemaProperty && schemaList.length > 0 && (
+
{
+ return {
+ label: schema.name,
+ value: schema.name,
+ };
+ })}
+ onValueChange={(schema) => handleSchemaNameSelect(schema)}
+ placeholder={t("connection.select-schema") || ""}
+ />
+ )}
+
+ {currentConnectionCtx && !tableSchemaLoadingState.isLoading && (
+
+
{t("connection.total-token")}
+
+ {totalToken}/{maxToken}
+
- ))}
-
-
- New Chat
-
+ )}
+
+ {currentConnectionCtx &&
+ (tableSchemaLoadingState.isLoading ? (
+
+ {t("common.loading")}
+
+ ) : (
+ tableList.length > 0 &&
+ tableList.map((table) => {
+ return (
+
+
+ {table.token || countTextTokens(table.structure)}
+
+
+ );
+ })
+ ))}
-
-
-
- {createPortal(
-
toggleCreateConnectionModal(false)}
- />,
- document.body
- )}
-
- {createPortal( toggleSettingModal(false)} />, document.body)}
-
- {state.showEditChatTitleModal &&
- editChatTitleModalContext &&
- createPortal( toggleEditChatTitleModal(false)} chat={editChatTitleModalContext} />, document.body)}
+
>
);
};
diff --git a/src/components/ConversationTabsView.tsx b/src/components/ConversationTabsView.tsx
new file mode 100644
index 00000000..710a92dd
--- /dev/null
+++ b/src/components/ConversationTabsView.tsx
@@ -0,0 +1,131 @@
+import { useState } from "react";
+import { useTranslation } from "react-i18next";
+import { useConnectionStore, useConversationStore, useLayoutStore } from "@/store";
+import { Conversation } from "@/types";
+import Icon from "./Icon";
+import Dropdown, { DropdownItem } from "./kit/Dropdown";
+import UpdateConversationModal from "./UpdateConversationModal";
+
+interface ConversationTabProps {
+ conversation: Conversation;
+ selected: boolean;
+ onClick: (conversation: Conversation) => void;
+ onEdit: (conversation: Conversation) => void;
+ onDelete: (conversation: Conversation) => void;
+}
+
+const ConversationTab = (props: ConversationTabProps) => {
+ const { conversation, selected, onClick, onEdit, onDelete } = props;
+ const { t } = useTranslation();
+
+ return (
+ onClick(conversation)}
+ >
+
{conversation.title}
+
+
+
+ }
+ >
+
+ onEdit(conversation)}
+ >
+
+ {t("common.edit")}
+
+ onDelete(conversation)}
+ >
+
+ {t("common.delete")}
+
+
+
+
+ );
+};
+
+const ConversationTabsView = () => {
+ const { t } = useTranslation();
+ const layoutStore = useLayoutStore();
+ const connectionStore = useConnectionStore();
+ const conversationStore = useConversationStore();
+ const [updateConversationModalContext, setUpdateConversationModalContext] = useState(undefined);
+ const currentConnectionCtx = connectionStore.currentConnectionCtx;
+ const conversationList = conversationStore.conversationList.filter(
+ (conversation) =>
+ conversation.connectionId === currentConnectionCtx?.connection.id &&
+ conversation.databaseName === currentConnectionCtx?.database?.name
+ );
+
+ const handleCreateConversation = () => {
+ if (!currentConnectionCtx) {
+ conversationStore.createConversation();
+ } else {
+ conversationStore.createConversation(currentConnectionCtx.connection.id, currentConnectionCtx.database?.name);
+ }
+ };
+
+ const handleConversationClick = (conversation: Conversation) => {
+ conversationStore.setCurrentConversationId(conversation.id);
+ if (layoutStore.isMobileView) {
+ layoutStore.toggleSidebar(false);
+ }
+ };
+
+ const handleEditConversation = (conversation: Conversation) => {
+ setUpdateConversationModalContext(conversation);
+ };
+
+ const handleDeleteConversation = (conversation: Conversation) => {
+ conversationStore.clearConversation((item) => item.id !== conversation.id);
+ if (conversationStore.currentConversationId === conversation.id) {
+ conversationStore.setCurrentConversationId(undefined);
+ }
+ };
+
+ return (
+ <>
+
+
+ {conversationList.map((conversation) => {
+ return (
+
+ );
+ })}
+
+
0 && "ml-2"}`}>
+
+
+ {conversationList.length === 0 && t("conversation.new-chat")}
+
+
+
+
+ {updateConversationModalContext && (
+ setUpdateConversationModalContext(undefined)} conversation={updateConversationModalContext} />
+ )}
+ >
+ );
+};
+
+export default ConversationTabsView;
diff --git a/src/components/ConversationView/Header.tsx b/src/components/ConversationView/Header.tsx
new file mode 100644
index 00000000..264d8109
--- /dev/null
+++ b/src/components/ConversationView/Header.tsx
@@ -0,0 +1,61 @@
+import { useEffect, useState } from "react";
+import { useConversationStore, useLayoutStore } from "@/store";
+import useDarkMode from "@/hooks/useDarkmode";
+import { hasFeature } from "@/utils";
+import Icon from "../Icon";
+import GitHubStarBadge from "../GitHubStarBadge";
+import SchemaDrawer from "../SchemaDrawer";
+import ConversationTabsView from "../ConversationTabsView";
+
+interface Props {
+ className?: string;
+}
+
+const Header = (props: Props) => {
+ const { className } = props;
+ const layoutStore = useLayoutStore();
+ const conversationStore = useConversationStore();
+ const isDarkMode = useDarkMode();
+ const [showSchemaDrawer, setShowSchemaDrawer] = useState(false);
+ const currentConversationId = conversationStore.currentConversationId;
+ const title = conversationStore.getConversationById(currentConversationId)?.title || "SQL Chat";
+
+ useEffect(() => {
+ document.title = `${title}`;
+ }, [title]);
+
+ return (
+ <>
+
+
+
+ layoutStore.toggleSidebar()}
+ >
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export default Header;
diff --git a/src/components/ChatView/MessageTextarea.tsx b/src/components/ConversationView/MessageTextarea.tsx
similarity index 67%
rename from src/components/ChatView/MessageTextarea.tsx
rename to src/components/ConversationView/MessageTextarea.tsx
index c82bd8cf..2f703e75 100644
--- a/src/components/ChatView/MessageTextarea.tsx
+++ b/src/components/ConversationView/MessageTextarea.tsx
@@ -1,22 +1,20 @@
import { useEffect, useRef, useState } from "react";
import { toast } from "react-hot-toast";
+import { useTranslation } from "react-i18next";
import TextareaAutosize from "react-textarea-autosize";
-import { useChatStore, useConnectionStore, useMessageStore, useUserStore } from "@/store";
-import { CreatorRole } from "@/types";
-import { generateUUID } from "@/utils";
+import { useConversationStore, useConnectionStore } from "@/store";
import Icon from "../Icon";
interface Props {
disabled?: boolean;
- sendMessage: () => Promise;
+ sendMessage: (content: string) => Promise;
}
const MessageTextarea = (props: Props) => {
const { disabled, sendMessage } = props;
+ const { t } = useTranslation();
const connectionStore = useConnectionStore();
- const userStore = useUserStore();
- const chatStore = useChatStore();
- const messageStore = useMessageStore();
+ const conversationStore = useConversationStore();
const [value, setValue] = useState("");
const [isInIME, setIsInIME] = useState(false);
const textareaRef = useRef(null);
@@ -32,13 +30,13 @@ const MessageTextarea = (props: Props) => {
};
const handleSend = async () => {
- let chat = chatStore.currentChat;
- if (!chat) {
+ let conversation = conversationStore.getConversationById(conversationStore.currentConversationId);
+ if (!conversation) {
const currentConnectionCtx = connectionStore.currentConnectionCtx;
if (!currentConnectionCtx) {
- chat = chatStore.createChat();
+ conversation = conversationStore.createConversation();
} else {
- chat = chatStore.createChat(currentConnectionCtx.connection.id, currentConnectionCtx.database?.name);
+ conversation = conversationStore.createConversation(currentConnectionCtx.connection.id, currentConnectionCtx.database?.name);
}
}
if (!value) {
@@ -49,18 +47,9 @@ const MessageTextarea = (props: Props) => {
return;
}
- messageStore.addMessage({
- id: generateUUID(),
- chatId: chat.id,
- creatorId: userStore.currentUser.id,
- creatorRole: CreatorRole.User,
- createdAt: Date.now(),
- content: value,
- status: "DONE",
- });
setValue("");
textareaRef.current!.value = "";
- await sendMessage();
+ await sendMessage(value);
};
const handleKeyDown = (event: React.KeyboardEvent) => {
@@ -71,11 +60,11 @@ const MessageTextarea = (props: Props) => {
};
return (
-
+
{
onKeyDown={handleKeyDown}
/>
diff --git a/src/components/ConversationView/MessageView.tsx b/src/components/ConversationView/MessageView.tsx
new file mode 100644
index 00000000..dfb353c7
--- /dev/null
+++ b/src/components/ConversationView/MessageView.tsx
@@ -0,0 +1,181 @@
+import dayjs from "dayjs";
+import { useSession } from "next-auth/react";
+import { ReactElement, useState } from "react";
+import { useTranslation } from "react-i18next";
+import { toast } from "react-hot-toast";
+import ReactMarkdown from "react-markdown";
+import remarkGfm from "remark-gfm";
+import { useConversationStore, useConnectionStore, useMessageStore, useUserStore, useSettingStore } from "@/store";
+import { Message } from "@/types";
+import Dropdown, { DropdownItem } from "../kit/Dropdown";
+import Icon from "../Icon";
+import { CodeBlock } from "../CodeBlock";
+import EngineIcon from "../EngineIcon";
+import ThreeDotsLoader from "./ThreeDotsLoader";
+
+interface Props {
+ message: Message;
+}
+
+const MessageView = (props: Props) => {
+ const message = props.message;
+ const { data: session } = useSession();
+ const { t } = useTranslation();
+ const settingStore = useSettingStore();
+ const userStore = useUserStore();
+ const conversationStore = useConversationStore();
+ const connectionStore = useConnectionStore();
+ const messageStore = useMessageStore();
+ const isCurrentUser = message.creatorId === userStore.currentUser.id;
+ const connection = connectionStore.getConnectionById(conversationStore.getConversationById(message.conversationId)?.connectionId || "");
+
+ const copyMessage = () => {
+ navigator.clipboard.writeText(message.content);
+ toast.success("Copied to clipboard");
+ };
+
+ const deleteMessage = (message: Message) => {
+ messageStore.clearMessage((item) => item.id !== message.id);
+ };
+
+ return (
+
+ {isCurrentUser ? (
+ <>
+
+
+
+
+ }
+ >
+
+
+
+ {t("common.copy")}
+
+ deleteMessage(message)}
+ >
+
+ {t("common.delete")}
+
+
+
+
+
+
+ {message.content}
+
+
+
+ {session?.user ? (
+ session.user.image ? (
+
+ ) : (
+
+ {session.user.name ? session.user.name.charAt(0) : session.user.email?.charAt(0)}
+
+ )
+ ) : (
+
+ )}
+
+ >
+ ) : (
+ <>
+
+ {connection ? (
+
+ ) : (
+
+ )}
+
+ {message.status === "LOADING" && message.content === "" ? (
+
+
+
+ ) : (
+ <>
+
+
+
+
+ );
+ },
+ code({ children }) {
+ return {children};
+ },
+ }}
+ >
+ {message.content}
+
+
+ {dayjs(message.createdAt).locale(settingStore.setting.locale).format("lll")}
+
+
+
+
+
+
+ }
+ >
+
+
+
+ {t("common.copy")}
+
+ deleteMessage(message)}
+ >
+
+ {t("common.delete")}
+
+
+
+
+ >
+ )}
+ >
+ )}
+
+ );
+};
+
+export default MessageView;
diff --git a/src/components/ConversationView/ThreeDotsLoader.tsx b/src/components/ConversationView/ThreeDotsLoader.tsx
new file mode 100644
index 00000000..a87980cd
--- /dev/null
+++ b/src/components/ConversationView/ThreeDotsLoader.tsx
@@ -0,0 +1,30 @@
+import { useEffect, useState } from "react";
+import { ThreeDots } from "react-loader-spinner";
+import { useSettingStore } from "@/store";
+
+const ThreeDotsLoader = () => {
+ const settingStore = useSettingStore();
+ const [color, setColor] = useState("gray");
+
+ useEffect(() => {
+ const theme = settingStore.setting.theme;
+ let appearance = theme;
+ if (theme === "system") {
+ if (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) {
+ appearance = "dark";
+ } else {
+ appearance = "light";
+ }
+ }
+
+ if (appearance === "dark") {
+ setColor("white");
+ } else {
+ setColor("gray");
+ }
+ }, [settingStore.setting.theme]);
+
+ return ;
+};
+
+export default ThreeDotsLoader;
diff --git a/src/components/ConversationView/index.tsx b/src/components/ConversationView/index.tsx
new file mode 100644
index 00000000..585fbb6b
--- /dev/null
+++ b/src/components/ConversationView/index.tsx
@@ -0,0 +1,352 @@
+import axios from "axios";
+import { head, last } from "lodash-es";
+import { useSession } from "next-auth/react";
+import { useEffect, useRef, useState } from "react";
+import { toast } from "react-hot-toast";
+import {
+ getAssistantById,
+ getPromptGeneratorOfAssistant,
+ useConversationStore,
+ useMessageStore,
+ useConnectionStore,
+ useSettingStore,
+ useLayoutStore,
+ useUserStore,
+} from "@/store";
+import { Conversation, CreatorRole, Message } from "@/types";
+import { countTextTokens, generateUUID, getModel, hasFeature, generateDbPromptFromContext } from "@/utils";
+import getEventEmitter from "@/utils/event-emitter";
+import Header from "./Header";
+import EmptyView from "../EmptyView";
+import MessageView from "./MessageView";
+import ClearConversationButton from "../ClearConversationButton";
+import MessageTextarea from "./MessageTextarea";
+import DataStorageBanner from "../DataStorageBanner";
+import DBHubBanner from "../DBHubBanner";
+import SchemaDrawer from "../SchemaDrawer";
+import Icon from "../Icon";
+import { useTranslation } from "react-i18next";
+
+const ConversationView = () => {
+ const { data: session } = useSession();
+ const { t } = useTranslation();
+ const settingStore = useSettingStore();
+ const layoutStore = useLayoutStore();
+ const connectionStore = useConnectionStore();
+ const conversationStore = useConversationStore();
+ const userStore = useUserStore();
+ const messageStore = useMessageStore();
+ const [isStickyAtBottom, setIsStickyAtBottom] = useState(true);
+ const [showHeaderShadow, setShowHeaderShadow] = useState(false);
+ const conversationViewRef = useRef(null);
+ const currentConversation = conversationStore.getConversationById(conversationStore.currentConversationId);
+ const messageList = currentConversation
+ ? messageStore.messageList.filter((message: Message) => message.conversationId === currentConversation.id)
+ : [];
+ const lastMessage = last(messageList);
+ const [showSchemaDrawer, setShowSchemaDrawer] = useState(false);
+
+ useEffect(() => {
+ messageStore.messageList.map((message: Message) => {
+ if (message.status === "LOADING") {
+ if (message.content === "") {
+ messageStore.updateMessage(message.id, {
+ content: "Failed to send the message.",
+ status: "FAILED",
+ });
+ } else {
+ messageStore.updateMessage(message.id, {
+ status: "DONE",
+ });
+ }
+ }
+ });
+
+ const handleConversationViewScroll = () => {
+ if (!conversationViewRef.current) {
+ return;
+ }
+ setShowHeaderShadow((conversationViewRef.current?.scrollTop || 0) > 0);
+ setIsStickyAtBottom(
+ conversationViewRef.current.scrollTop + conversationViewRef.current.clientHeight >= conversationViewRef.current.scrollHeight
+ );
+ };
+ conversationViewRef.current?.addEventListener("scroll", handleConversationViewScroll);
+
+ return () => {
+ conversationViewRef.current?.removeEventListener("scroll", handleConversationViewScroll);
+ };
+ }, []);
+
+ useEffect(() => {
+ if (!conversationViewRef.current) {
+ return;
+ }
+ conversationViewRef.current.scrollTop = conversationViewRef.current.scrollHeight;
+ }, [currentConversation, lastMessage?.id]);
+
+ useEffect(() => {
+ if (!conversationViewRef.current) {
+ return;
+ }
+
+ if (lastMessage?.status === "LOADING" && isStickyAtBottom) {
+ conversationViewRef.current.scrollTop = conversationViewRef.current.scrollHeight;
+ }
+ }, [lastMessage?.status, lastMessage?.content, isStickyAtBottom]);
+
+ useEffect(() => {
+ if (
+ currentConversation?.connectionId === connectionStore.currentConnectionCtx?.connection.id &&
+ currentConversation?.databaseName === connectionStore.currentConnectionCtx?.database?.name
+ ) {
+ return;
+ }
+
+ // Auto select the first conversation when the current connection changes.
+ const conversationList = conversationStore.conversationList.filter(
+ (conversation: Conversation) =>
+ conversation.connectionId === connectionStore.currentConnectionCtx?.connection.id &&
+ conversation.databaseName === connectionStore.currentConnectionCtx?.database?.name
+ );
+ conversationStore.setCurrentConversationId(head(conversationList)?.id);
+ }, [currentConversation, connectionStore.currentConnectionCtx]);
+
+ const sendMessageToCurrentConversation = async (userPrompt: string) => {
+ const currentConversation = conversationStore.getConversationById(conversationStore.getState().currentConversationId);
+ if (!currentConversation) {
+ return;
+ }
+ if (lastMessage?.status === "LOADING") {
+ return;
+ }
+
+ // Add user message to the store.
+ const userMessage: Message = {
+ id: generateUUID(),
+ conversationId: currentConversation.id,
+ creatorId: userStore.currentUser.id,
+ creatorRole: CreatorRole.User,
+ createdAt: Date.now(),
+ content: userPrompt,
+ status: "DONE",
+ };
+ messageStore.addMessage(userMessage);
+
+ // Construct the system prompt
+ const messageList = messageStore.getState().messageList.filter((message: Message) => message.conversationId === currentConversation.id);
+ const promptGenerator = getPromptGeneratorOfAssistant(getAssistantById(currentConversation.assistantId)!);
+ let dbPrompt = promptGenerator();
+ const maxToken = getModel(settingStore.setting.openAIApiConfig?.model || "").max_token;
+ // Squeeze as much prompt as possible under the token limit, the prompt is in the order of:
+ // 1. Assistant specific prompt with database schema if applicable.
+ // 2. A list of previous exchanges.
+ // 3. The current user prompt.
+ //
+ // The priority to fill in the prompt is in the order of:
+ // 1. The current user prompt.
+ // 2. Assistant specific prompt with database schema if applicable.
+ // 3. A list of previous exchanges
+ let tokens = countTextTokens(userPrompt);
+
+ // Augument with database schema if available
+ if (connectionStore.currentConnectionCtx?.database) {
+ const schemaList = await connectionStore.getOrFetchDatabaseSchema(connectionStore.currentConnectionCtx?.database);
+ try {
+ dbPrompt = generateDbPromptFromContext(
+ promptGenerator,
+ connectionStore.currentConnectionCtx.connection.engineType,
+ schemaList,
+ currentConversation.selectedSchemaName || "",
+ currentConversation.selectedTableNameList || [],
+ maxToken,
+ userPrompt
+ );
+ } catch (error: any) {
+ toast.error(error.message);
+ }
+ }
+
+ // Sliding window to add messages with DONE status all the way back up until we reach the token
+ // limit.
+ let usageMessageList: Message[] = [];
+ let formatedMessageList = [];
+ for (let i = messageList.length - 1; i >= 0; i--) {
+ const message = messageList[i];
+ if (message.status === "DONE") {
+ if (tokens < maxToken) {
+ tokens += countTextTokens(message.content);
+ formatedMessageList.unshift({
+ role: message.creatorRole,
+ content: message.content,
+ });
+ }
+ }
+ }
+
+ // Add the db prompt as the first context.
+ formatedMessageList.unshift({
+ role: CreatorRole.System,
+ content: dbPrompt,
+ });
+
+ // Add the user prompt as the last context.
+ formatedMessageList.push({
+ role: CreatorRole.User,
+ content: userPrompt,
+ });
+
+ const requestHeaders: any = {};
+ if (session?.user.id) {
+ requestHeaders["Authorization"] = `Bearer ${session?.user.id}`;
+ }
+ if (settingStore.setting.openAIApiConfig?.key) {
+ requestHeaders["x-openai-key"] = settingStore.setting.openAIApiConfig?.key;
+ }
+ if (settingStore.setting.openAIApiConfig?.endpoint) {
+ requestHeaders["x-openai-endpoint"] = settingStore.setting.openAIApiConfig?.endpoint;
+ }
+ if (settingStore.setting.openAIApiConfig?.model) {
+ requestHeaders["x-openai-model"] = settingStore.setting.openAIApiConfig?.model;
+ }
+ const rawRes = await fetch("/api/chat", {
+ method: "POST",
+ body: JSON.stringify({
+ messages: formatedMessageList,
+ }),
+ headers: requestHeaders,
+ });
+
+ if (!rawRes.ok) {
+ console.error(rawRes);
+ let errorMessage = "Failed to request message, please check your network.";
+ try {
+ const res = await rawRes.json();
+ errorMessage = res.error.message;
+ } catch (error) {
+ // do nth
+ }
+ messageStore.addMessage({
+ id: generateUUID(),
+ conversationId: currentConversation.id,
+ creatorId: currentConversation.assistantId,
+ creatorRole: CreatorRole.Assistant,
+ createdAt: Date.now(),
+ content: errorMessage,
+ status: "FAILED",
+ });
+ return;
+ }
+
+ // Add PENDING assistant message to the store.
+ const assistantMessage: Message = {
+ id: generateUUID(),
+ conversationId: currentConversation.id,
+ creatorId: currentConversation.assistantId,
+ creatorRole: CreatorRole.Assistant,
+ createdAt: Date.now(),
+ content: "",
+ status: "LOADING",
+ };
+ messageStore.addMessage(assistantMessage);
+
+ const data = rawRes.body;
+ if (!data) {
+ toast.error("No data return");
+ return;
+ }
+
+ const reader = data.getReader();
+ const decoder = new TextDecoder("utf-8");
+ let done = false;
+ while (!done) {
+ const { value, done: readerDone } = await reader.read();
+ if (value) {
+ const char = decoder.decode(value);
+ if (char) {
+ assistantMessage.content = assistantMessage.content + char;
+ messageStore.updateMessage(assistantMessage.id, {
+ content: assistantMessage.content,
+ });
+ }
+ }
+ done = readerDone;
+ }
+ messageStore.updateMessage(assistantMessage.id, {
+ status: "DONE",
+ });
+
+ // Emit usage update event so quota widget can update.
+ getEventEmitter().emit("usage.update");
+
+ if (hasFeature("collect")) {
+ // Collect system prompt
+ // We only collect the db prompt for the system prompt. We do not collect the intermediate
+ // exchange to save space since those can be derived from the previous record.
+ usageMessageList.push({
+ id: generateUUID(),
+ createdAt: Date.now(),
+ creatorRole: CreatorRole.System,
+ content: dbPrompt,
+ } as Message);
+
+ // Collect user message
+ usageMessageList.push(userMessage);
+
+ // Collect assistant response
+ usageMessageList.push(assistantMessage);
+
+ axios
+ .post(
+ "/api/collect",
+ {
+ conversation: currentConversation,
+ messages: usageMessageList,
+ },
+ {
+ headers: requestHeaders,
+ }
+ )
+ .catch(() => {
+ // do nth
+ });
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+ {messageList.length === 0 ? (
+
+ ) : (
+ messageList.map((message: Message) => )
+ )}
+
+
+
+
+
setShowSchemaDrawer(true)}>
+ {
+
+
+ {t("prompt.self")}
+
+ }
+
+ {showSchemaDrawer &&
setShowSchemaDrawer(false)} />}
+
+
+ );
+};
+
+export default ConversationView;
diff --git a/src/components/CreateConnectionModal.tsx b/src/components/CreateConnectionModal.tsx
index 21affa1d..e0844ab2 100644
--- a/src/components/CreateConnectionModal.tsx
+++ b/src/components/CreateConnectionModal.tsx
@@ -1,28 +1,32 @@
import { cloneDeep, head } from "lodash-es";
import { ChangeEvent, useEffect, useState } from "react";
-import { createPortal } from "react-dom";
import { toast } from "react-hot-toast";
+import { useTranslation } from "react-i18next";
import TextareaAutosize from "react-textarea-autosize";
import { useConnectionStore } from "@/store";
-import { Connection, Engine, ResponseObject } from "@/types";
+import { Connection, Engine, ResponseObject, SSLOptions } from "@/types";
+import Radio from "./kit/Radio";
+import TextField from "./kit/TextField";
+import Modal from "./kit/Modal";
import Icon from "./Icon";
+import EngineIcon from "./EngineIcon";
import DataStorageBanner from "./DataStorageBanner";
import ActionConfirmModal from "./ActionConfirmModal";
+import RequiredStar from "./RequiredStar";
interface Props {
- show: boolean;
connection?: Connection;
close: () => void;
}
-type SSLType = "none" | "ca-only" | "full";
+type SSLType = "preferred" | "ca-only" | "full";
type SSLFieldType = "ca" | "cert" | "key";
const SSLTypeOptions = [
{
- label: "None",
- value: "none",
+ label: "Preferred",
+ value: "preferred",
},
{
label: "CA Only",
@@ -34,49 +38,81 @@ const SSLTypeOptions = [
},
];
+const engines = [
+ {
+ type: Engine.MySQL,
+ name: "MySQL",
+ defaultPort: "3306",
+ },
+ {
+ type: Engine.PostgreSQL,
+ name: "PostgreSQL",
+ defaultPort: "5432",
+ },
+ {
+ type: Engine.MSSQL,
+ name: "SQL Server",
+ defaultPort: "1433",
+ },
+ {
+ type: Engine.TiDB,
+ name: "TiDB Serverless",
+ defaultPort: "4000",
+ },
+ {
+ type: Engine.OceanBase,
+ name: "OceanBase",
+ defaultPort: "2881",
+ },
+ // {
+ // type: Engine.Snowflake,
+ // name: "Snowflake",
+ // defaultPort: "443",
+ // },
+ // {
+ // type: Engine.Hive,
+ // name: "Hive",
+ // defaultPort: "4000",
+ // },
+];
+
const defaultConnection: Connection = {
id: "",
title: "",
engineType: Engine.MySQL,
host: "",
- port: "",
+ port: "3306",
username: "",
password: "",
};
const CreateConnectionModal = (props: Props) => {
- const { show, connection: editConnection, close } = props;
+ const { connection: editConnection, close } = props;
+ const { t } = useTranslation();
const connectionStore = useConnectionStore();
const [connection, setConnection] = useState(defaultConnection);
const [showDeleteConnectionModal, setShowDeleteConnectionModal] = useState(false);
- const [sslType, setSSLType] = useState("none");
+ const [sslType, setSSLType] = useState("preferred");
const [selectedSSLField, setSelectedSSLField] = useState("ca");
const [isRequesting, setIsRequesting] = useState(false);
const showDatabaseField = connection.engineType === Engine.PostgreSQL;
const isEditing = editConnection !== undefined;
- const allowSave = connection.host !== "" && connection.username !== "";
+ const allowSave = connection.title !== "" && connection.host !== "" && connection.username !== "";
useEffect(() => {
- if (show) {
- const connection = isEditing ? editConnection : defaultConnection;
- setConnection(connection);
- if (connection.ssl) {
- if (connection.ssl.ca && connection.ssl.cert && connection.ssl.key) {
- setSSLType("full");
- } else {
- setSSLType("ca-only");
- }
+ const connection = isEditing ? editConnection : defaultConnection;
+ setConnection(connection);
+ if (connection.ssl) {
+ if (connection.ssl.ca && connection.ssl.cert && connection.ssl.key) {
+ setSSLType("full");
} else {
- setSSLType("none");
+ setSSLType("ca-only");
}
- setSelectedSSLField("ca");
- setIsRequesting(false);
- setShowDeleteConnectionModal(false);
}
- }, [show]);
+ }, []);
useEffect(() => {
- let ssl = undefined;
+ let ssl: SSLOptions | undefined = undefined;
if (sslType === "ca-only") {
ssl = {
ca: "",
@@ -88,10 +124,10 @@ const CreateConnectionModal = (props: Props) => {
key: "",
};
}
- setConnection({
+ setConnection((connection) => ({
...connection,
- ssl,
- });
+ ssl: ssl,
+ }));
setSelectedSSLField("ca");
}, [sslType]);
@@ -138,7 +174,7 @@ const CreateConnectionModal = (props: Props) => {
});
};
- const handleCreateConnection = async () => {
+ const handleUpsertConnection = async () => {
if (isRequesting) {
return;
}
@@ -207,94 +243,99 @@ const CreateConnectionModal = (props: Props) => {
return (
<>
-
-
-
{isEditing ? "Edit Connection" : "Create Connection"}
-
-
-
-
-
-
- Database Type
- setPartialConnection({ engineType: e.target.value as Engine })}
- >
- MySQL
- PostgreSQL
-
-
-
- Host
- setPartialConnection({ host: e.target.value })}
- />
-
-
-
Port
-
setPartialConnection({ port: e.target.value })}
- />
+
+
+
+
+
+ {t("connection.database-type")}
+
+
+
+ {engines.map((engine) => (
+
setPartialConnection({ engineType: engine.type, port: engine.defaultPort })}
+ >
+
+
+
+ {engine.name}
+
+
+ ))}
- {showDatabaseField && (
-
- Database Name
- setPartialConnection({ database: e.target.value })}
- />
-
- )}
+
+
+
+ {t("connection.title")}
+
+
+ setPartialConnection({ title: value })} />
+
+
+
+ {t("connection.host")}
+
+
+ setPartialConnection({ host: value })} />
+
+
+ {t("connection.port")}
+ setPartialConnection({ port: value })} />
+
+ {showDatabaseField && (
- Username
- setPartialConnection({ username: e.target.value })}
+ {t("connection.database-name")}
+ setPartialConnection({ database: value })}
/>
+ )}
+
+
+ {t("connection.username")}
+
+
+ setPartialConnection({ username: value })}
+ />
+
+
+ {t("connection.password")}
+ setPartialConnection({ password: value })}
+ />
+
+ {connection.engineType === Engine.TiDB ? (
- Password
- setPartialConnection({ password: e.target.value })}
- />
+ {t("connection.tidb-serverless-ssl-hint")}
+ ) : (
SSL
{SSLTypeOptions.map((option) => (
-
-
+ setSSLType(e.target.value as SSLType)}
+ onChange={(value) => setSSLType(value as SSLType)}
/>
{option.label}
))}
- {sslType !== "none" && (
+ {sslType !== "preferred" && (
<>
{
>
)}
-
-
-
-
- {isEditing && (
-
setShowDeleteConnectionModal(true)}>
- Delete
-
+ {connection.engineType === Engine.MSSQL && (
+
+
Encrypt
+
+
+ setPartialConnection({ encrypt: e.target.checked })}
+ />
+ Encrypt connection
+
+
+
)}
-
-
- Close
-
-
- {isRequesting && }
- Save
+ )}
+
+
+
+
+ {isEditing && (
+ setShowDeleteConnectionModal(true)}>
+ {t("common.delete")}
-
+ )}
+
+
+
+ {t("common.close")}
+
+
+ {isRequesting && }
+ {t("common.save")}
+
-
+
- {showDeleteConnectionModal &&
- createPortal(
-
setShowDeleteConnectionModal(false)}
- confirm={() => handleDeleteConnection()}
- />,
- document.body
- )}
+ {showDeleteConnectionModal && (
+ setShowDeleteConnectionModal(false)}
+ confirm={() => handleDeleteConnection()}
+ />
+ )}
>
);
};
diff --git a/src/components/DBHubBanner.tsx b/src/components/DBHubBanner.tsx
new file mode 100644
index 00000000..209e9816
--- /dev/null
+++ b/src/components/DBHubBanner.tsx
@@ -0,0 +1,41 @@
+import { useTranslation } from "react-i18next";
+import { useLocalStorage } from "react-use";
+import Icon from "./Icon";
+
+interface Props {
+ className?: string;
+ alwaysShow?: boolean;
+}
+
+const DBHubBanner = (props: Props) => {
+ const { className, alwaysShow } = props;
+ const { t } = useTranslation();
+ const [hideBanner, setHideBanner] = useLocalStorage("hide-github-banner", false);
+ const show = alwaysShow || !hideBanner;
+
+ return (
+
+ );
+};
+
+export default DBHubBanner;
diff --git a/src/components/DarkModeSwitch.tsx b/src/components/DarkModeSwitch.tsx
new file mode 100644
index 00000000..9064c285
--- /dev/null
+++ b/src/components/DarkModeSwitch.tsx
@@ -0,0 +1,29 @@
+import { useSettingStore } from "@/store";
+import useDarkMode from "@/hooks/useDarkmode";
+import Icon from "./Icon";
+
+const DarkModeSwitch = () => {
+ const settingStore = useSettingStore();
+ const isDarkMode = useDarkMode();
+
+ const switchDarkMode = () => {
+ if (isDarkMode) {
+ settingStore.setTheme("light");
+ } else {
+ settingStore.setTheme("dark");
+ }
+ };
+
+ const ModeIcon = isDarkMode ? Icon.IoMdMoon : Icon.IoMdSunny;
+
+ return (
+
+
+
+ );
+};
+
+export default DarkModeSwitch;
diff --git a/src/components/DataStorageBanner.tsx b/src/components/DataStorageBanner.tsx
index 7f6ad5f2..16288310 100644
--- a/src/components/DataStorageBanner.tsx
+++ b/src/components/DataStorageBanner.tsx
@@ -1,3 +1,4 @@
+import { useTranslation } from "react-i18next";
import { useLocalStorage } from "react-use";
import Icon from "./Icon";
@@ -8,6 +9,7 @@ interface Props {
const DataStorageBanner = (props: Props) => {
const { className, alwaysShow } = props;
+ const { t } = useTranslation();
const [hideBanner, setHideBanner] = useLocalStorage("hide-local-storage-banner", false);
const show = alwaysShow || !hideBanner;
@@ -15,11 +17,11 @@ const DataStorageBanner = (props: Props) => {
- Connection settings are stored in your local browser
+ {t("banner.data-storage")}
{!alwaysShow && (
setHideBanner(true)}>
diff --git a/src/components/DebugView.tsx b/src/components/DebugView.tsx
new file mode 100644
index 00000000..7af93c2d
--- /dev/null
+++ b/src/components/DebugView.tsx
@@ -0,0 +1,17 @@
+import { useSession } from "next-auth/react";
+
+const PricingView = () => {
+ const { data: session } = useSession();
+
+ return (
+
+
Debug View
+
Session Info
+
+ {JSON.stringify(session, null, "\t")}
+
+
+ );
+};
+
+export default PricingView;
diff --git a/src/components/EditChatTitleModal.tsx b/src/components/EditChatTitleModal.tsx
deleted file mode 100644
index 90c45750..00000000
--- a/src/components/EditChatTitleModal.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import { useState } from "react";
-import { toast } from "react-hot-toast";
-import { useChatStore } from "@/store";
-import { Chat } from "@/types";
-import Icon from "./Icon";
-
-interface Props {
- chat: Chat;
- close: () => void;
-}
-
-const EditMessageTitleModal = (props: Props) => {
- const { close, chat } = props;
- const chatStore = useChatStore();
- const [title, setTitle] = useState(chat.title);
- const allowSave = title !== "";
-
- const handleSaveEdit = () => {
- const formatedTitle = title.trim();
- if (formatedTitle === "") {
- return;
- }
-
- chatStore.updateChat(chat.id, {
- title: formatedTitle,
- });
- toast.success("Chat title updated");
- close();
- };
-
- return (
-
-
-
Edit chat title
-
-
-
-
- setTitle(e.target.value)}
- />
-
-
-
- Close
-
-
- Save
-
-
-
-
- );
-};
-
-export default EditMessageTitleModal;
diff --git a/src/components/EmptyView.tsx b/src/components/EmptyView.tsx
index 88f72957..7a50154a 100644
--- a/src/components/EmptyView.tsx
+++ b/src/components/EmptyView.tsx
@@ -1,6 +1,5 @@
-import { useChatStore, useConnectionStore, useMessageStore, useUserStore } from "@/store";
-import { CreatorRole } from "@/types";
-import { generateUUID } from "@/utils";
+import { useConversationStore, useConnectionStore, useMessageStore } from "@/store";
+import useDarkMode from "@/hooks/useDarkmode";
import Icon from "./Icon";
// examples are used to show some examples to the user.
@@ -8,43 +7,33 @@ const examples = ["Give me an example schema about employee", "How to create a v
interface Props {
className?: string;
- sendMessage: () => Promise;
+ sendMessage: (content: string) => Promise;
}
const EmptyView = (props: Props) => {
const { className, sendMessage } = props;
const connectionStore = useConnectionStore();
- const chatStore = useChatStore();
- const userStore = useUserStore();
+ const conversationStore = useConversationStore();
const messageStore = useMessageStore();
+ const isDarkMode = useDarkMode();
const handleExampleClick = async (content: string) => {
- let chat = chatStore.currentChat;
- if (!chat) {
+ let conversation = conversationStore.getConversationById(conversationStore.currentConversationId);
+ if (!conversation) {
const currentConnectionCtx = connectionStore.currentConnectionCtx;
if (!currentConnectionCtx) {
- chat = chatStore.createChat();
+ conversation = conversationStore.createConversation();
} else {
- chat = chatStore.createChat(currentConnectionCtx.connection.id, currentConnectionCtx.database?.name);
+ conversation = conversationStore.createConversation(currentConnectionCtx.connection.id, currentConnectionCtx.database?.name);
}
}
-
- messageStore.addMessage({
- id: generateUUID(),
- chatId: chat.id,
- creatorId: userStore.currentUser.id,
- creatorRole: CreatorRole.User,
- createdAt: Date.now(),
- content: content,
- status: "DONE",
- });
- await sendMessage();
+ await sendMessage(content);
};
return (
-
+
@@ -53,7 +42,7 @@ const EmptyView = (props: Props) => {
{examples.map((example) => (
handleExampleClick(example)}
>
{`"${example}"`} →
@@ -63,14 +52,20 @@ const EmptyView = (props: Props) => {
Capabilities
-
Remembers what user said earlier in the conversation
-
Allows user to provide follow-up corrections
+
+ Remembers what user said earlier in the conversation
+
+
+ Allows user to provide follow-up corrections
+
Limitations
-
May occasionally generate incorrect information
-
+
+ May occasionally generate incorrect information
+
+
May occasionally produce harmful instructions or biased content
diff --git a/src/components/EngineIcon.tsx b/src/components/EngineIcon.tsx
index d397707c..e1587f42 100644
--- a/src/components/EngineIcon.tsx
+++ b/src/components/EngineIcon.tsx
@@ -10,9 +10,15 @@ const EngineIcon = (props: Props) => {
const { className, engine } = props;
if (engine === Engine.MySQL) {
- return
;
+ return
;
} else if (engine === Engine.PostgreSQL) {
- return
;
+ return
;
+ } else if (engine === Engine.MSSQL) {
+ return
;
+ } else if (engine === Engine.TiDB) {
+ return
;
+ } else if (engine === Engine.OceanBase) {
+ return
;
} else {
return
;
}
diff --git a/src/components/ExecutionView/DataTableView.tsx b/src/components/ExecutionView/DataTableView.tsx
new file mode 100644
index 00000000..4e5f6c14
--- /dev/null
+++ b/src/components/ExecutionView/DataTableView.tsx
@@ -0,0 +1,39 @@
+import { head } from "lodash-es";
+import DataTable from "react-data-table-component";
+import { useTranslation } from "react-i18next";
+import { RawResult } from "@/types";
+import Icon from "../Icon";
+
+interface Props {
+ rawResults: RawResult[];
+}
+
+const DataTableView = (props: Props) => {
+ const { rawResults } = props;
+ const { t } = useTranslation();
+ const columns = Object.keys(head(rawResults) || {}).map((key) => {
+ return {
+ name: key,
+ sortable: true,
+ selector: (row: any) => row[key],
+ };
+ });
+
+ return rawResults.length === 0 ? (
+
+
+ {t("execution.message.no-data")}
+
+ ) : (
+
+ );
+};
+
+export default DataTableView;
diff --git a/src/components/ExecutionView/ExecutionWarningBanner.tsx b/src/components/ExecutionView/ExecutionWarningBanner.tsx
new file mode 100644
index 00000000..904e9dc2
--- /dev/null
+++ b/src/components/ExecutionView/ExecutionWarningBanner.tsx
@@ -0,0 +1,22 @@
+import { useTranslation } from "react-i18next";
+import Icon from "../Icon";
+
+interface Props {
+ className?: string;
+}
+
+const ExecutionWarningBanner = (props: Props) => {
+ const { className } = props;
+ const { t } = useTranslation();
+
+ return (
+
+
+
+ {t("banner.non-select-sql-warning")}
+
+
+ );
+};
+
+export default ExecutionWarningBanner;
diff --git a/src/components/ExecutionView/NotificationView.tsx b/src/components/ExecutionView/NotificationView.tsx
new file mode 100644
index 00000000..b1c28539
--- /dev/null
+++ b/src/components/ExecutionView/NotificationView.tsx
@@ -0,0 +1,12 @@
+interface Props {
+ message: string;
+ style: "info" | "error";
+}
+
+const NotificationView = (props: Props) => {
+ const { message, style } = props;
+ const additionalStyle = style === "error" ? "text-red-500" : "text-gray-500";
+ return
{message}
;
+};
+
+export default NotificationView;
diff --git a/src/components/GitHubStarBadge.tsx b/src/components/GitHubStarBadge.tsx
index a981579b..f641938b 100644
--- a/src/components/GitHubStarBadge.tsx
+++ b/src/components/GitHubStarBadge.tsx
@@ -37,12 +37,12 @@ const GitHubStarBadge = (props: Props) => {
-
+
Star
diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx
index f5ddd801..5b2bb892 100644
--- a/src/components/Icon.tsx
+++ b/src/components/Icon.tsx
@@ -3,6 +3,7 @@ import * as Bi from "react-icons/bi";
import * as Bs from "react-icons/bs";
import * as Di from "react-icons/di";
import * as Fi from "react-icons/fi";
+import * as Gi from "react-icons/gi";
import * as Io from "react-icons/io";
import * as Io5 from "react-icons/io5";
@@ -12,6 +13,7 @@ const Icon = {
...Bs,
...Di,
...Fi,
+ ...Gi,
...Io,
...Io5,
};
diff --git a/src/components/LocaleSelector.tsx b/src/components/LocaleSelector.tsx
new file mode 100644
index 00000000..05c627d5
--- /dev/null
+++ b/src/components/LocaleSelector.tsx
@@ -0,0 +1,36 @@
+import { useSettingStore } from "@/store";
+import { Locale } from "@/types";
+import Select from "./kit/Select";
+
+interface LocaleItem {
+ value: Locale;
+ label: string;
+}
+
+const localeItemList: LocaleItem[] = [
+ {
+ value: "en",
+ label: "English",
+ },
+ {
+ value: "zh",
+ label: "简体中文",
+ },
+ {
+ value: "es",
+ label: "Español",
+ },
+];
+
+const LocaleSelector = () => {
+ const settingStore = useSettingStore();
+ const locale = settingStore.setting.locale;
+
+ const handleLocaleChange = (locale: Locale) => {
+ settingStore.setLocale(locale);
+ };
+
+ return ;
+};
+
+export default LocaleSelector;
diff --git a/src/components/MarkdownRenderer.tsx b/src/components/MarkdownRenderer.tsx
new file mode 100644
index 00000000..7e2445d3
--- /dev/null
+++ b/src/components/MarkdownRenderer.tsx
@@ -0,0 +1,33 @@
+import React, { useState, useEffect } from "react";
+import ReactMarkdown from "react-markdown";
+
+interface MarkdownRendererProps {
+ url: string;
+}
+
+function MarkdownRenderer(props: MarkdownRendererProps) {
+ const [markdown, setMarkdown] = useState("");
+
+ useEffect(() => {
+ const fetchData = async () => {
+ const response = await fetch(props.url);
+ const data = await response.text();
+ setMarkdown(data);
+ };
+ fetchData();
+ }, [props.url]);
+
+ return (
+ {children}
,
+ li: ({ children }) => {children} ,
+ }}
+ >
+ {markdown}
+
+ );
+}
+
+export default MarkdownRenderer;
diff --git a/src/components/MessageLoader.tsx b/src/components/MessageLoader.tsx
deleted file mode 100644
index 603baa06..00000000
--- a/src/components/MessageLoader.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { ThreeDots } from "react-loader-spinner";
-import { useConnectionStore } from "@/store";
-import EngineIcon from "./EngineIcon";
-
-const MessageLoader = () => {
- const connectionStore = useConnectionStore();
- const connection = connectionStore.currentConnectionCtx?.connection;
-
- return (
-
-
- {connection ? (
-
- ) : (
-
- )}
-
-
-
-
-
- );
-};
-
-export default MessageLoader;
diff --git a/src/components/OpenAIApiConfigView.tsx b/src/components/OpenAIApiConfigView.tsx
new file mode 100644
index 00000000..c86e56dc
--- /dev/null
+++ b/src/components/OpenAIApiConfigView.tsx
@@ -0,0 +1,155 @@
+import { useState } from "react";
+import { useTranslation } from "react-i18next";
+import { useDebounce } from "react-use";
+import { useSettingStore } from "@/store";
+import { OpenAIApiConfig } from "@/types";
+import { allowSelfOpenAIKey, hasFeature } from "@/utils";
+import Radio from "./kit/Radio";
+import TextField from "./kit/TextField";
+import Tooltip from "./kit/Tooltip";
+
+const OpenAIApiConfigView = () => {
+ const { t } = useTranslation();
+ const settingStore = useSettingStore();
+ const [openAIApiConfig, setOpenAIApiConfig] = useState(settingStore.setting.openAIApiConfig);
+ const [maskKey, setMaskKey] = useState(true);
+
+ const models = [
+ {
+ id: "gpt-3.5-turbo",
+ title: `GPT-3.5 Turbo`,
+ cost: 1,
+ disabled: false,
+ tooltip: "",
+ },
+ {
+ id: "gpt-4-turbo",
+ title: `GPT-4 Turbo`,
+ cost: 20,
+ disabled: false,
+ tooltip: "",
+ },
+ {
+ id: "gpt-4",
+ title: `GPT-4`,
+ cost: 60,
+ disabled: false,
+ tooltip: "",
+ },
+ {
+ id: "gpt-4o",
+ title: `GPT-4o`,
+ cost: 10,
+ disabled: false,
+ tooltip: "",
+ },
+ {
+ id: "deepseek-chat",
+ title: `Deepseek Chat`,
+ cost: 1,
+ disabled: false,
+ tooltip: "",
+ },
+ ];
+
+ const maskedKey = (str: string) => {
+ if (str.length < 7) {
+ return str;
+ }
+ const firstThree = str.slice(0, 3);
+ const lastFour = str.slice(-4);
+ const middle = ".".repeat(str.length - 7);
+ return `${firstThree}${middle}${lastFour}`;
+ };
+
+ useDebounce(
+ () => {
+ settingStore.setOpenAIApiConfig(openAIApiConfig);
+ },
+ 300,
+ [openAIApiConfig]
+ );
+
+ const handleSetOpenAIApiConfig = (config: Partial) => {
+ setOpenAIApiConfig({
+ ...openAIApiConfig,
+ ...config,
+ });
+ setMaskKey(false);
+ };
+
+ const modelRadio = (model: any) => {
+ return (
+
+ handleSetOpenAIApiConfig({ model: value })}
+ />
+
+ {model.title} {hasFeature("quota") ? `(${t("setting.openai-api-configuration.quota-per-ask", { count: model.cost })})` : ""}
+
+
+ );
+ };
+
+ return (
+ <>
+
+
+
{t("setting.openai-api-configuration.model")}
+ {allowSelfOpenAIKey() &&
{t("setting.openai-api-configuration.model-description")}
}
+
+
+ {models.map((model) =>
+ model.disabled ? (
+
+ {modelRadio(model)}
+
+ ) : (
+ modelRadio(model)
+ )
+ )}
+
+
+
+ {allowSelfOpenAIKey() && (
+ <>
+
+
OpenAI API Key
+
{t("setting.openai-api-configuration.key-description")}
+
handleSetOpenAIApiConfig({ key: value })}
+ />
+
+
+
OpenAI API Endpoint
+
+
handleSetOpenAIApiConfig({ endpoint: value })}
+ />
+
+ >
+ )}
+
+ >
+ );
+};
+
+export default OpenAIApiConfigView;
diff --git a/src/components/PaymentHistoryTable.tsx b/src/components/PaymentHistoryTable.tsx
new file mode 100644
index 00000000..59dd1e61
--- /dev/null
+++ b/src/components/PaymentHistoryTable.tsx
@@ -0,0 +1,82 @@
+import axios from "axios";
+import { t } from "i18next";
+import { useSession } from "next-auth/react";
+import { useEffect, useState } from "react";
+import { Payment } from "@/types";
+import { getCurrencySymbol, getDateString } from "@/utils";
+
+const PaymentHistoryTable = () => {
+ const [list, setList] = useState([]);
+ const { data: session } = useSession();
+
+ useEffect(() => {
+ const refreshPaymentList = async (userId: string) => {
+ let list: Payment[] = [];
+ try {
+ const { data } = await axios.get("/api/payment", {
+ headers: { Authorization: `Bearer ${userId}` },
+ });
+ list = data;
+ } catch (error) {
+ // do nth
+ }
+ setList(list);
+ };
+
+ if (session?.user.id) {
+ refreshPaymentList(session.user.id);
+ }
+ }, [session]);
+
+ if (list.length === 0) {
+ return <>>;
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ {t("common.date")}
+
+
+ {t("common.description")}
+
+
+ {t("common.amount")}
+
+
+
+
+
+ {list.map((payment) => (
+
+
+ {getDateString(payment.createdAt)}
+
+ {payment.description}
+
+ {getCurrencySymbol(payment.currency.toLocaleUpperCase())}
+ {payment.amount / 100}
+
+
+
+ {t("setting.subscription.view-receipt")}
+
+
+
+ ))}
+
+
+
+
+
+
+ );
+};
+
+export default PaymentHistoryTable;
diff --git a/src/components/PricingView.tsx b/src/components/PricingView.tsx
new file mode 100644
index 00000000..a983b97d
--- /dev/null
+++ b/src/components/PricingView.tsx
@@ -0,0 +1,95 @@
+import { signIn, useSession } from "next-auth/react";
+import { useTranslation } from "react-i18next";
+
+import getStripe from "../utils/get-stripejs";
+import { fetchPostJSON } from "../utils/api-helpers";
+
+const checkout = async (priceId: string) => {
+ // Create a Checkout Session.
+ const response = await fetchPostJSON("/api/checkout_sessions", {
+ price: priceId,
+ });
+
+ if (response.statusCode === 500) {
+ console.error(response.message);
+ return;
+ }
+
+ // Redirect to Checkout.
+ const stripe = await getStripe();
+ const { error } = await stripe!.redirectToCheckout({
+ // Make the id field from the Checkout Session creation API response
+ // available to this file, so you can provide it as parameter here
+ // instead of the {{CHECKOUT_SESSION_ID}} placeholder.
+ sessionId: response.id,
+ });
+ // If `redirectToCheckout` fails due to a browser or network
+ // error, display the localized error message to your customer
+ // using `error.message`.
+ console.warn(error.message);
+};
+
+const PricingView = () => {
+ const { t } = useTranslation();
+ const { data: session, status } = useSession();
+
+ const tiers = [
+ {
+ name: t("setting.plan.1-month"),
+ priceId: process.env.NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_1_MONTH_SUBSCRIPTION,
+ priceMonthly: "$10",
+ buyButton: t("setting.plan.purhcase-1-month"),
+ },
+ {
+ name: t("setting.plan.n-months", {
+ count: 3,
+ }),
+ priceId: process.env.NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_3_MONTH_SUBSCRIPTION,
+ priceMonthly: "$15",
+ buyButton: t("setting.plan.purhcase-n-months", {
+ count: 3,
+ }),
+ },
+ {
+ name: t("setting.plan.n-months", {
+ count: 12,
+ }),
+ priceId: process.env.NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_1_YEAR_SUBSCRIPTION,
+ priceMonthly: "$30",
+ buyButton: t("setting.plan.purhcase-n-months", {
+ count: 12,
+ }),
+ },
+ ];
+
+ return (
+
+
+
+ {t("setting.plan.n-question-per-month", {
+ count: 1000,
+ })}
+
+
+
+
+ {tiers.map((tier) => (
+
+
+ {tier.name} - {tier.priceMonthly}
+
+ (session?.user?.email ? checkout(tier.priceId) : signIn())}
+ className="mt-6 block rounded-md bg-indigo-600 px-4 py-2.5 text-center text-xl font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
+ >
+ {session?.user?.email ? tier.buyButton : t("payment.sign-in-to-buy")}
+
+
+ ))}
+
+
+
+ );
+};
+
+export default PricingView;
diff --git a/src/components/ProductHuntBanner.tsx b/src/components/ProductHuntBanner.tsx
new file mode 100644
index 00000000..2985e3e8
--- /dev/null
+++ b/src/components/ProductHuntBanner.tsx
@@ -0,0 +1,35 @@
+import { useTranslation } from "react-i18next";
+import { useLocalStorage } from "react-use";
+import Icon from "./Icon";
+
+interface Props {
+ className?: string;
+}
+
+const ProductHuntBanner = (props: Props) => {
+ const { className } = props;
+ const { t } = useTranslation();
+ const [hideBanner, setHideBanner] = useLocalStorage("hide-product-hunt-banner", false);
+ const show = !hideBanner;
+
+ return (
+
+ );
+};
+
+export default ProductHuntBanner;
diff --git a/src/components/QueryDrawer.tsx b/src/components/QueryDrawer.tsx
index 2edbbb45..81c774b1 100644
--- a/src/components/QueryDrawer.tsx
+++ b/src/components/QueryDrawer.tsx
@@ -1,41 +1,55 @@
import { Drawer } from "@mui/material";
-import { head } from "lodash-es";
import { useEffect, useState } from "react";
-import DataTable from "react-data-table-component";
import { toast } from "react-hot-toast";
+import { useTranslation } from "react-i18next";
import TextareaAutosize from "react-textarea-autosize";
-import { useQueryStore } from "@/store";
-import { ResponseObject } from "@/types";
+import { useQueryStore, useMessageStore } from "@/store";
+import { ExecutionResult, ResponseObject } from "@/types";
+import { checkStatementIsSelect, getMessageFromExecutionResult } from "@/utils";
+import Tooltip from "./kit/Tooltip";
import Icon from "./Icon";
import EngineIcon from "./EngineIcon";
-
-type RawQueryResult = {
- [key: string]: any;
-};
+import DataTableView from "./ExecutionView/DataTableView";
+import NotificationView from "./ExecutionView/NotificationView";
+import ExecutionWarningBanner from "./ExecutionView/ExecutionWarningBanner";
const QueryDrawer = () => {
+ const { t } = useTranslation();
const queryStore = useQueryStore();
- const [rawResults, setRawResults] = useState([]);
+ const messageStore = useMessageStore();
+ const [executionResult, setExecutionResult] = useState(undefined);
+ const [originalStatement, setOriginalStatement] = useState("");
+ const [statement, setStatement] = useState("");
+ const [isLoading, setIsLoading] = useState(false);
const context = queryStore.context;
- const [statement, setStatement] = useState(context?.statement || "");
- const [isLoading, setIsLoading] = useState(true);
- const columns = Object.keys(head(rawResults) || {}).map((key) => {
- return {
- name: key,
- sortable: true,
- selector: (row: RawQueryResult) => row[key],
- };
- });
+ const executionMessage = executionResult ? getMessageFromExecutionResult(executionResult) : "";
+ const showExecutionWarningBanner = statement.trim() && !checkStatementIsSelect(statement);
useEffect(() => {
if (!queryStore.showDrawer) {
return;
}
- setStatement(context?.statement || "");
- executeStatement(context?.statement || "");
+ const statement = context?.statement || "";
+ setStatement(statement);
+ // Save original statement when open QueryDrawer.
+ if (!originalStatement) {
+ setOriginalStatement(statement);
+ }
+
+ if (statement !== "" && checkStatementIsSelect(statement)) {
+ executeStatement(statement);
+ }
+ setExecutionResult(undefined);
}, [context, queryStore.showDrawer]);
+ // Reset original statement to "" when close QueryDrawer.
+ useEffect(() => {
+ if (!queryStore.showDrawer) {
+ setOriginalStatement("");
+ }
+ }, [queryStore.showDrawer]);
+
const executeStatement = async (statement: string) => {
if (!statement) {
toast.error("Please enter a statement.");
@@ -45,12 +59,12 @@ const QueryDrawer = () => {
if (!context) {
toast.error("No execution context found.");
setIsLoading(false);
- setRawResults([]);
+ setExecutionResult(undefined);
return;
}
setIsLoading(true);
- setRawResults([]);
+ setExecutionResult(undefined);
const { connection, database } = context;
try {
const response = await fetch("/api/connection/execute", {
@@ -64,11 +78,14 @@ const QueryDrawer = () => {
statement,
}),
});
- const result = (await response.json()) as ResponseObject;
+ const result = (await response.json()) as ResponseObject;
if (result.message) {
- toast.error(result.message);
+ setExecutionResult({
+ rawResult: [],
+ error: result.message,
+ });
} else {
- setRawResults(result.data);
+ setExecutionResult(result.data);
}
} catch (error) {
console.error(error);
@@ -78,59 +95,68 @@ const QueryDrawer = () => {
}
};
- const close = () => queryStore.toggleDrawer(false);
+ const close = () => {
+ if (originalStatement !== statement && context?.messageId) {
+ messageStore.updateStatement(context?.messageId, originalStatement, statement);
+ }
+ queryStore.toggleDrawer(false);
+ };
return (
-
-
-
+
+
+
-
Execute query
+
{t("execution.title")}
{!context ? (
- No connection selected.
+ {t("execution.message.no-connection")}
) : (
<>
- Connection:
+ {t("connection.self")}:
{context.database?.name}
-
+ {showExecutionWarningBanner &&
}
+
setStatement(e.target.value)}
/>
executeStatement(statement)}
>
-
+ {t("common.run-sql")}
{isLoading ? (
- Executing
-
- ) : rawResults.length === 0 ? (
-
-
- No data return.
+ {t("execution.message.executing")}
) : (
-
-
-
+ <>
+ {executionResult ? (
+ executionMessage ? (
+
+ ) : (
+
+ )
+ ) : (
+ <>>
+ )}
+ >
)}
>
diff --git a/src/components/QuotaOverflowBanner.tsx b/src/components/QuotaOverflowBanner.tsx
new file mode 100644
index 00000000..791b9039
--- /dev/null
+++ b/src/components/QuotaOverflowBanner.tsx
@@ -0,0 +1,40 @@
+import { useTranslation } from "react-i18next";
+import { useLocalStorage } from "react-use";
+import { allowSelfOpenAIKey } from "@/utils";
+import Link from "next/link";
+import Icon from "./Icon";
+
+interface Props {
+ className?: string;
+}
+
+const QuotaOverflowBanner = (props: Props) => {
+ const { className } = props;
+ const { t } = useTranslation();
+ const [hideBanner, setHideBanner] = useLocalStorage("hide-quota-overflow-banner", false);
+ const show = !hideBanner;
+
+ return (
+ <>
+
+
+ {t("banner.quota-overflow")}{" "}
+ {allowSelfOpenAIKey() && (
+
+ {t("banner.use-my-key")}
+
+ )}
+
+
setHideBanner(true)}>
+
+
+
+ >
+ );
+};
+
+export default QuotaOverflowBanner;
diff --git a/src/components/QuotaView.tsx b/src/components/QuotaView.tsx
new file mode 100644
index 00000000..e292312b
--- /dev/null
+++ b/src/components/QuotaView.tsx
@@ -0,0 +1,91 @@
+import { signIn, useSession } from "next-auth/react";
+import axios from "axios";
+import { useEffect, useState } from "react";
+import Link from "next/link";
+import { useTranslation } from "react-i18next";
+import { Quota } from "@/types";
+import getEventEmitter from "@/utils/event-emitter";
+import { allowSelfOpenAIKey } from "@/utils";
+
+interface Props {
+ className?: string;
+}
+
+const QuotaView = (props: Props) => {
+ const [quota, setQuota] = useState
({ current: 0, limit: 0 });
+ const { t } = useTranslation();
+ const { data: session } = useSession();
+
+ const showSupplyOwnKey = !session || quota.current >= quota.limit;
+ const expired = session?.user?.subscription?.expireAt && session?.user?.subscription?.expireAt < Date.now();
+ const showActionButton = !session || session.user.subscription.plan === "FREE" || expired;
+
+ const refreshQuota = async (userId: string) => {
+ let quota: Quota = { current: 0, limit: 0 };
+ try {
+ const { data } = await axios.get("/api/usage", {
+ headers: { Authorization: `Bearer ${userId}` },
+ });
+ quota = data;
+ } catch (error) {
+ // do nth
+ }
+ setQuota(quota);
+ };
+
+ getEventEmitter().on("usage.update", () => {
+ if (session?.user.id) {
+ refreshQuota(session.user.id);
+ }
+ });
+
+ useEffect(() => {
+ if (session?.user.id) {
+ refreshQuota(session.user.id);
+ }
+ }, [session]);
+
+ return (
+
+
+
+ {session ? t(`setting.plan.${session.user.subscription.plan.toLowerCase()}`) : t("setting.plan.guest")}
+
+ {!!expired && (
+
+ {t("setting.plan.expired")}
+
+ )}
+
+
+
{t("common.quota")}
+
= quota.limit ? "text-red-600" : "text-black dark:text-gray-300"}>
+ {quota.current}/{quota.limit}
+
+
+ {!!showActionButton &&
+ (session ? (
+
+ {expired ? t("setting.plan.renew") : t("setting.plan.upgrade")}
+
+ ) : (
+
signIn()}
+ >
+ {t("setting.plan.signup-for-more")}
+
+ ))}
+ {allowSelfOpenAIKey() && !!showSupplyOwnKey && (
+
+ {t("banner.use-my-key")}
+
+ )}
+
+ );
+};
+
+export default QuotaView;
diff --git a/src/components/RequiredStar.tsx b/src/components/RequiredStar.tsx
new file mode 100644
index 00000000..aa5caeb9
--- /dev/null
+++ b/src/components/RequiredStar.tsx
@@ -0,0 +1,5 @@
+const RequiredStar = () => {
+ return * ;
+};
+
+export default RequiredStar;
diff --git a/src/components/SchemaDrawer.tsx b/src/components/SchemaDrawer.tsx
new file mode 100644
index 00000000..95b38217
--- /dev/null
+++ b/src/components/SchemaDrawer.tsx
@@ -0,0 +1,70 @@
+import { encode } from "@nem035/gpt-3-encoder";
+import { Drawer } from "@mui/material";
+import { useEffect, useState } from "react";
+import Icon from "./Icon";
+import { getAssistantById, getPromptGeneratorOfAssistant, useConnectionStore, useConversationStore, useSettingStore } from "@/store";
+import { getModel, generateDbPromptFromContext } from "@/utils";
+import { CodeBlock } from "./CodeBlock";
+import { useTranslation } from "react-i18next";
+
+interface Props {
+ close: () => void;
+}
+
+const SchemaDrawer = (props: Props) => {
+ const { t } = useTranslation();
+ const conversationStore = useConversationStore();
+ const connectionStore = useConnectionStore();
+ const settingStore = useSettingStore();
+ const currentConversation = conversationStore.getConversationById(conversationStore.currentConversationId);
+ const maxToken = getModel(settingStore.setting.openAIApiConfig?.model || "").max_token;
+ const [prompt, setPrompt] = useState("");
+
+ const getPrompt = async () => {
+ if (!currentConversation) return;
+ const promptGenerator = getPromptGeneratorOfAssistant(getAssistantById(currentConversation.assistantId)!);
+ let dbPrompt = promptGenerator();
+ if (connectionStore.currentConnectionCtx?.database) {
+ const schemaList = await connectionStore.getOrFetchDatabaseSchema(connectionStore.currentConnectionCtx?.database);
+ dbPrompt = generateDbPromptFromContext(
+ promptGenerator,
+ connectionStore.currentConnectionCtx.connection.engineType,
+ schemaList,
+ currentConversation.selectedSchemaName || "",
+ currentConversation.selectedTableNameList || [],
+ maxToken
+ );
+ }
+ setPrompt(dbPrompt);
+ };
+
+ useEffect(() => {
+ // TODO: initial state with current conversation.
+ }, []);
+
+ useEffect(() => {
+ getPrompt();
+ }, []);
+
+ const close = () => props.close();
+ return (
+
+
+
+
+
+
+
{t("prompt.current-conversation")}
+
+ {t("connection.total-token")} {encode(prompt).length}/{maxToken}
+
+
+
+
+
+
+
+ );
+};
+
+export default SchemaDrawer;
diff --git a/src/components/SettingAvatarIcon.tsx b/src/components/SettingAvatarIcon.tsx
new file mode 100644
index 00000000..33b77d26
--- /dev/null
+++ b/src/components/SettingAvatarIcon.tsx
@@ -0,0 +1,46 @@
+import { useSession } from "next-auth/react";
+import { useTranslation } from "react-i18next";
+import Link from "next/link";
+import { hasFeature } from "../utils";
+import Tooltip from "./kit/Tooltip";
+import Icon from "./Icon";
+
+interface Props {}
+
+const SettingAvatarIcon = (props: Props) => {
+ const { t } = useTranslation();
+ const { data: session } = useSession();
+
+ return (
+
+
+ {(!hasFeature("account") || !session) && (
+
+
+
+ )}
+ {hasFeature("account") && session?.user && (
+
+ {session.user.image ? (
+
+ ) : (
+
+ {session.user.name ? session.user.name.charAt(0) : session.user.email?.charAt(0)}
+
+ )}
+
+ )}
+
+
+ );
+};
+
+export default SettingAvatarIcon;
diff --git a/src/components/SettingGeneralView.tsx b/src/components/SettingGeneralView.tsx
new file mode 100644
index 00000000..25906f5a
--- /dev/null
+++ b/src/components/SettingGeneralView.tsx
@@ -0,0 +1,82 @@
+import React from "react";
+import { useTranslation } from "react-i18next";
+import { hasFeature } from "../utils";
+import Icon from "./Icon";
+import AccountView from "./AccountView";
+import DebugView from "./DebugView";
+import PricingView from "./PricingView";
+import WeChatQRCodeView from "./WeChatQRCodeView";
+import ClearDataButton from "./ClearDataButton";
+import LocaleSelector from "./LocaleSelector";
+import ThemeSelector from "./ThemeSelector";
+import OpenAIApiConfigView from "./OpenAIApiConfigView";
+
+const SettingGeneralView = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+ {hasFeature("debug") && (
+
+
+
+ )}
+
+ {hasFeature("payment") && (
+
+ )}
+
+ {hasFeature("account") && (
+
+ )}
+
+
+
+
+
+ {t("setting.basic.language")}
+
+
+
+ {t("setting.theme.self")}
+
+
+
+
+
+
+ {t("setting.data.clear-all-data")}
+
+
+
+
+
+
+ );
+};
+
+export default SettingGeneralView;
diff --git a/src/components/SettingModal.tsx b/src/components/SettingModal.tsx
deleted file mode 100644
index 01925e20..00000000
--- a/src/components/SettingModal.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import Icon from "./Icon";
-import WeChatQRCodeView from "./WeChatQRCodeView";
-import ClearDataButton from "./ClearDataButton";
-
-interface Props {
- show: boolean;
- close: () => void;
-}
-
-const SettingModal = (props: Props) => {
- const { show, close } = props;
-
- return (
-
- );
-};
-
-export default SettingModal;
diff --git a/src/components/Sidebar/ConnectionList.tsx b/src/components/Sidebar/ConnectionList.tsx
new file mode 100644
index 00000000..da0e912e
--- /dev/null
+++ b/src/components/Sidebar/ConnectionList.tsx
@@ -0,0 +1,96 @@
+import { head } from "lodash-es";
+import { useState } from "react";
+import { useTranslation } from "react-i18next";
+import { useConnectionStore } from "@/store";
+import { Connection } from "@/types";
+import Tooltip from "../kit/Tooltip";
+import Icon from "../Icon";
+import EngineIcon from "../EngineIcon";
+import CreateConnectionModal from "../CreateConnectionModal";
+
+interface State {
+ showCreateConnectionModal: boolean;
+ showUpdateConversationModal: boolean;
+}
+
+const ConnectionList = () => {
+ const { t } = useTranslation();
+ const connectionStore = useConnectionStore();
+ const [state, setState] = useState({
+ showCreateConnectionModal: false,
+ showUpdateConversationModal: false,
+ });
+ const [editConnectionModalContext, setEditConnectionModalContext] = useState();
+ const connectionList = connectionStore.connectionList;
+ const currentConnectionCtx = connectionStore.currentConnectionCtx;
+
+ const toggleCreateConnectionModal = (show = true) => {
+ setState({
+ ...state,
+ showCreateConnectionModal: show,
+ });
+ setEditConnectionModalContext(undefined);
+ };
+
+ const handleConnectionSelect = async (connection: Connection) => {
+ const databaseList = await connectionStore.getOrFetchDatabaseList(connection);
+ connectionStore.setCurrentConnectionCtx({
+ connection,
+ database: head(databaseList),
+ });
+ };
+
+ const handleEditConnection = (connection: Connection) => {
+ setState({
+ ...state,
+ showCreateConnectionModal: true,
+ });
+ setEditConnectionModalContext(connection);
+ };
+
+ return (
+ <>
+ connectionStore.setCurrentConnectionCtx(undefined)}
+ >
+
+
+ {connectionList.map((connection) => (
+
+ handleConnectionSelect(connection)}
+ >
+ {
+ e.stopPropagation();
+ handleEditConnection(connection);
+ }}
+ >
+
+
+
+
+
+ ))}
+
+ toggleCreateConnectionModal(true)}
+ >
+
+
+
+
+ {state.showCreateConnectionModal && (
+ toggleCreateConnectionModal(false)} />
+ )}
+ >
+ );
+};
+
+export default ConnectionList;
diff --git a/src/components/Sidebar/ConversationList.tsx b/src/components/Sidebar/ConversationList.tsx
new file mode 100644
index 00000000..eb99b386
--- /dev/null
+++ b/src/components/Sidebar/ConversationList.tsx
@@ -0,0 +1,123 @@
+import { useState } from "react";
+import { useTranslation } from "react-i18next";
+import { useConversationStore, useConnectionStore, useLayoutStore } from "@/store";
+import { Conversation } from "@/types";
+import Dropdown, { DropdownItem } from "../kit/Dropdown";
+import Icon from "../Icon";
+import UpdateConversationModal from "../UpdateConversationModal";
+
+interface State {
+ showUpdateConversationModal: boolean;
+}
+
+const ConversationList = () => {
+ const { t } = useTranslation();
+ const layoutStore = useLayoutStore();
+ const connectionStore = useConnectionStore();
+ const conversationStore = useConversationStore();
+ const [state, setState] = useState({
+ showUpdateConversationModal: false,
+ });
+ const [updateConversationModalContext, setUpdateConversationModalContext] = useState();
+ const currentConnectionCtx = connectionStore.currentConnectionCtx;
+ const conversationList = conversationStore.conversationList.filter(
+ (conversation) =>
+ conversation.connectionId === currentConnectionCtx?.connection.id &&
+ conversation.databaseName === currentConnectionCtx?.database?.name
+ );
+
+ const toggleUpdateConversationModal = (show = true) => {
+ setState({
+ ...state,
+ showUpdateConversationModal: show,
+ });
+ };
+
+ const handleCreateConversation = () => {
+ if (!currentConnectionCtx) {
+ conversationStore.createConversation();
+ } else {
+ conversationStore.createConversation(currentConnectionCtx.connection.id, currentConnectionCtx.database?.name);
+ }
+ };
+
+ const handleConversationSelect = (conversation: Conversation) => {
+ conversationStore.setCurrentConversationId(conversation.id);
+ if (layoutStore.isMobileView) {
+ layoutStore.toggleSidebar(false);
+ }
+ };
+
+ const handleEditConversation = (conversation: Conversation) => {
+ setUpdateConversationModalContext(conversation);
+ setState({
+ ...state,
+ showUpdateConversationModal: true,
+ });
+ };
+
+ const handleDeleteConversation = (conversation: Conversation) => {
+ conversationStore.clearConversation((item) => item.id !== conversation.id);
+ if (conversationStore.currentConversationId === conversation.id) {
+ conversationStore.setCurrentConversationId(undefined);
+ }
+ };
+
+ return (
+ <>
+ {conversationList.map((conversation) => (
+ handleConversationSelect(conversation)}
+ >
+ {conversation.id === conversationStore.currentConversationId ? (
+
+ ) : (
+
+ )}
+
{conversation.title || "SQL Chat"}
+
+
+
+ }
+ >
+
+ handleEditConversation(conversation)}
+ >
+
+ {t("common.edit")}
+
+ handleDeleteConversation(conversation)}
+ >
+
+ {t("common.delete")}
+
+
+
+
+ ))}
+
+
+ {t("conversation.new-chat")}
+
+
+ {updateConversationModalContext && state.showUpdateConversationModal && (
+ toggleUpdateConversationModal(false)} conversation={updateConversationModalContext} />
+ )}
+ >
+ );
+};
+
+export default ConversationList;
diff --git a/src/components/StripeCheckPaymentBanner.tsx b/src/components/StripeCheckPaymentBanner.tsx
new file mode 100644
index 00000000..b6c04ec0
--- /dev/null
+++ b/src/components/StripeCheckPaymentBanner.tsx
@@ -0,0 +1,42 @@
+import useSWR from "swr";
+import { useTranslation } from "react-i18next";
+import { useRouter } from "next/router";
+import { useState } from "react";
+import { fetchGetJSON } from "../utils/api-helpers";
+import Icon from "./Icon";
+
+interface Props {
+ sessionId: string;
+}
+
+const StripeCheckPaymentBanner = (props: Props) => {
+ const { sessionId } = props;
+ const { t } = useTranslation();
+ const [hideBanner, setHideBanner] = useState(false);
+ const show = !hideBanner;
+
+ const router = useRouter();
+
+ // Fetch CheckoutSession from static page via
+ // https://nextjs.org/docs/basic-features/data-fetching#static-generation
+ const { data } = useSWR(router.query.session_id ? `/api/checkout_sessions/${sessionId}` : null, fetchGetJSON);
+
+ return (
+ <>
+
+
+ {t("payment.self")} {data?.payment_intent?.status ?? t("common.loading")}
+
+
setHideBanner(true)}>
+
+
+
+ >
+ );
+};
+
+export default StripeCheckPaymentBanner;
diff --git a/src/components/ThemeSelector.tsx b/src/components/ThemeSelector.tsx
new file mode 100644
index 00000000..86e0782d
--- /dev/null
+++ b/src/components/ThemeSelector.tsx
@@ -0,0 +1,38 @@
+import { useTranslation } from "react-i18next";
+import { useSettingStore } from "@/store";
+import { Theme } from "@/types";
+import Select from "./kit/Select";
+
+interface ThemeItem {
+ value: Theme;
+ label: string;
+}
+
+const ThemeSelector = () => {
+ const { t } = useTranslation();
+ const settingStore = useSettingStore();
+ const theme = settingStore.setting.theme;
+
+ const themeItemList: ThemeItem[] = [
+ {
+ value: "system",
+ label: t("setting.theme.system"),
+ },
+ {
+ value: "light",
+ label: t("setting.theme.light"),
+ },
+ {
+ value: "dark",
+ label: t("setting.theme.dark"),
+ },
+ ];
+
+ const handleThemeChange = (theme: Theme) => {
+ settingStore.setTheme(theme);
+ };
+
+ return ;
+};
+
+export default ThemeSelector;
diff --git a/src/components/ThemeSwitch.tsx b/src/components/ThemeSwitch.tsx
new file mode 100644
index 00000000..e7555081
--- /dev/null
+++ b/src/components/ThemeSwitch.tsx
@@ -0,0 +1,23 @@
+import { useSettingStore } from "@/store";
+import Icon from "./Icon";
+
+const ThemeSwitch = () => {
+ const settingStore = useSettingStore();
+ const theme = settingStore.setting.theme;
+
+ const handleThemeChange = () => {
+ if (theme === "light") {
+ settingStore.setLocale("zh");
+ } else {
+ settingStore.setLocale("en");
+ }
+ };
+
+ return (
+
+
+
+ );
+};
+
+export default ThemeSwitch;
diff --git a/src/components/UpdateConversationModal.tsx b/src/components/UpdateConversationModal.tsx
new file mode 100644
index 00000000..d6feedb7
--- /dev/null
+++ b/src/components/UpdateConversationModal.tsx
@@ -0,0 +1,82 @@
+import { useState } from "react";
+import { toast } from "react-hot-toast";
+import { useTranslation } from "react-i18next";
+import { assistantList, useConversationStore } from "@/store";
+import { Conversation } from "@/types";
+import TextField from "./kit/TextField";
+import Modal from "./kit/Modal";
+import Select from "./kit/Select";
+import Icon from "./Icon";
+import BetaBadge from "./BetaBadge";
+
+interface Props {
+ conversation: Conversation;
+ close: () => void;
+}
+
+const UpdateConversationModal = (props: Props) => {
+ const { close, conversation } = props;
+ const { t } = useTranslation();
+ const conversationStore = useConversationStore();
+ const [title, setTitle] = useState(conversation.title);
+ const [assistantId, setAssistantId] = useState(conversation.assistantId);
+ const allowSave = title !== "";
+ const assistantItems = assistantList.map((assistant) => {
+ return {
+ value: assistant.id,
+ label: assistant.name,
+ };
+ });
+ const currentAssistant = assistantList.find((assistant) => assistant.id === assistantId);
+
+ const handleSaveEdit = () => {
+ const formatedTitle = title.trim();
+ if (formatedTitle === "") {
+ return;
+ }
+
+ conversationStore.updateConversation(conversation.id, {
+ title: formatedTitle,
+ assistantId: assistantId,
+ });
+ toast.success("Conversation updated");
+ close();
+ };
+
+ return (
+
+
+ {t("conversation.title")}
+ setTitle(value)} />
+
+
+
+
+ {t("common.close")}
+
+
+ {t("common.save")}
+
+
+
+ );
+};
+
+export default UpdateConversationModal;
diff --git a/src/components/WeChatQRCodeView.tsx b/src/components/WeChatQRCodeView.tsx
index da910309..d63200b5 100644
--- a/src/components/WeChatQRCodeView.tsx
+++ b/src/components/WeChatQRCodeView.tsx
@@ -1,32 +1,18 @@
-import { Popover } from "@mui/material";
-import { useState } from "react";
+import { useTranslation } from "react-i18next";
import Icon from "./Icon";
const WeChatQRCodeView = () => {
- const [wechatAnchorEl, setWeChatAnchorEl] = useState(null);
- const openWeChatQrCodePopover = Boolean(wechatAnchorEl);
+ const { t } = useTranslation();
return (
- <>
- setWeChatAnchorEl(e.currentTarget)}
- >
-
- Join WeChat Group
-
- setWeChatAnchorEl(null)}
- anchorOrigin={{
- vertical: "bottom",
- horizontal: "left",
- }}
- >
-
-
- >
+
+
+ {t("social.join-wechat-group")}
+
);
};
diff --git a/src/components/kit/Checkbox.tsx b/src/components/kit/Checkbox.tsx
new file mode 100644
index 00000000..f64abe63
--- /dev/null
+++ b/src/components/kit/Checkbox.tsx
@@ -0,0 +1,34 @@
+import * as CheckboxUI from "@radix-ui/react-checkbox";
+import { CheckIcon, DividerHorizontalIcon } from "@radix-ui/react-icons";
+import { ReactNode } from "react";
+
+interface CheckboxProps {
+ value: boolean;
+ label: string;
+ onValueChange: (tableName: string, value: boolean) => void;
+}
+const Checkbox = (props: CheckboxProps & { children?: ReactNode }) => {
+ const { value, label, onValueChange, children } = props;
+ return (
+
+ );
+};
+
+export default Checkbox;
diff --git a/src/components/kit/Dropdown.tsx b/src/components/kit/Dropdown.tsx
new file mode 100644
index 00000000..36a8fc4d
--- /dev/null
+++ b/src/components/kit/Dropdown.tsx
@@ -0,0 +1,28 @@
+import * as DropdownUI from "@radix-ui/react-dropdown-menu";
+import { ReactNode } from "react";
+
+interface Props {
+ children: ReactNode;
+ tigger: ReactNode;
+}
+
+const Dropdown = (props: Props) => {
+ const { children, tigger } = props;
+
+ return (
+
+ e.stopPropagation()}>
+ {tigger}
+
+
+
+ {children}
+
+
+
+ );
+};
+
+export const DropdownItem = DropdownUI.Item;
+
+export default Dropdown;
diff --git a/src/components/kit/Modal.tsx b/src/components/kit/Modal.tsx
new file mode 100644
index 00000000..b328a54f
--- /dev/null
+++ b/src/components/kit/Modal.tsx
@@ -0,0 +1,36 @@
+import { Modal as ModalUI } from "@mui/material";
+import { ReactNode } from "react";
+import Icon from "../Icon";
+
+interface Props {
+ title: string;
+ children: ReactNode;
+ onClose: () => void;
+ className?: string;
+}
+
+const Modal = (props: Props) => {
+ const { children, title, onClose, className } = props;
+
+ return (
+
+
+
{title}
+
+
+
+
{children}
+
+
+ );
+};
+
+export default Modal;
diff --git a/src/components/kit/Popover.tsx b/src/components/kit/Popover.tsx
new file mode 100644
index 00000000..0873cf87
--- /dev/null
+++ b/src/components/kit/Popover.tsx
@@ -0,0 +1,29 @@
+import * as PopoverUI from "@radix-ui/react-popover";
+import { ReactNode } from "react";
+
+interface Props {
+ className?: string;
+ children: ReactNode;
+ tigger: ReactNode;
+}
+
+const Popover = (props: Props) => {
+ const { className, children, tigger } = props;
+
+ return (
+
+ {tigger}
+
+
+ {children}
+
+
+
+ );
+};
+
+export default Popover;
diff --git a/src/components/kit/Radio.tsx b/src/components/kit/Radio.tsx
new file mode 100644
index 00000000..694c887e
--- /dev/null
+++ b/src/components/kit/Radio.tsx
@@ -0,0 +1,39 @@
+import { HTMLInputTypeAttribute } from "react";
+
+interface Props {
+ value: string;
+ onChange?: (value: string) => void;
+ type?: HTMLInputTypeAttribute;
+ className?: string;
+ disabled?: boolean;
+ checked?: boolean;
+}
+
+const getDefaultProps = () => ({
+ value: "",
+ onChange: () => {},
+ type: "radio",
+ className: "",
+ disabled: false,
+ checked: false,
+});
+
+const Radio = (props: Props) => {
+ const { value, disabled, className, type, checked, onChange } = {
+ ...getDefaultProps(),
+ ...props,
+ };
+
+ return (
+ onChange(e.target.value)}
+ />
+ );
+};
+
+export default Radio;
diff --git a/src/components/kit/Select.tsx b/src/components/kit/Select.tsx
new file mode 100644
index 00000000..a309d4cb
--- /dev/null
+++ b/src/components/kit/Select.tsx
@@ -0,0 +1,72 @@
+import * as SelectUI from "@radix-ui/react-select";
+import * as ScrollArea from "@radix-ui/react-scroll-area";
+import React from "react";
+import Icon from "../Icon";
+
+interface Props {
+ value: T;
+ itemList: {
+ value: T;
+ label: string;
+ }[];
+ className?: string;
+ placeholder?: string;
+ onValueChange: (value: T) => void;
+}
+
+const Select = (props: Props) => {
+ const { itemList, value, placeholder, className, onValueChange } = props;
+
+ return (
+
+
+
+
+
+
+
+
+
+ 7 ? "h-80 overflow-hidden" : "max-h-80 overflow-auto"
+ } border dark:border-zinc-800 rounded-lg drop-shadow-lg`}
+ type="auto"
+ >
+
+
+
+ {placeholder && {placeholder} }
+ {itemList.map((item) => (
+
+ {item.label}
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+};
+
+export default Select;
diff --git a/src/components/kit/TextField.tsx b/src/components/kit/TextField.tsx
new file mode 100644
index 00000000..bcb1020d
--- /dev/null
+++ b/src/components/kit/TextField.tsx
@@ -0,0 +1,39 @@
+import { HTMLInputTypeAttribute } from "react";
+
+interface Props {
+ value: string;
+ onChange?: (value: string) => void;
+ type?: HTMLInputTypeAttribute;
+ className?: string;
+ disabled?: boolean;
+ placeholder?: string;
+}
+
+const getDefaultProps = () => ({
+ value: "",
+ onChange: () => {},
+ type: "text",
+ className: "",
+ disabled: false,
+ placeholder: "",
+});
+
+const TextField = (props: Props) => {
+ const { value, disabled, className, placeholder, type, onChange } = {
+ ...getDefaultProps(),
+ ...props,
+ };
+
+ return (
+ onChange(e.target.value)}
+ />
+ );
+};
+
+export default TextField;
diff --git a/src/components/kit/Tooltip.tsx b/src/components/kit/Tooltip.tsx
new file mode 100644
index 00000000..b431e041
--- /dev/null
+++ b/src/components/kit/Tooltip.tsx
@@ -0,0 +1,34 @@
+import * as TooltipUI from "@radix-ui/react-tooltip";
+
+type Side = "top" | "right" | "bottom" | "left";
+
+interface Props {
+ title: string;
+ side: Side;
+ children: React.ReactNode;
+}
+
+const Tooltip = (props: Props) => {
+ const { title, side, children } = props;
+
+ return (
+
+
+ {children}
+
+
+ {title}
+
+
+
+
+
+ );
+};
+
+export default Tooltip;
diff --git a/src/hooks/useDarkmode.ts b/src/hooks/useDarkmode.ts
new file mode 100644
index 00000000..d9f615ab
--- /dev/null
+++ b/src/hooks/useDarkmode.ts
@@ -0,0 +1,17 @@
+import { useSettingStore } from "@/store";
+import { useEffect, useState } from "react";
+
+const useDarkMode = () => {
+ const settingStore = useSettingStore();
+ const [isDarkMode, setIsDarkMode] = useState(false);
+
+ useEffect(() => {
+ setTimeout(() => {
+ setIsDarkMode(document.documentElement.classList.contains("dark"));
+ });
+ }, [settingStore.setting.theme]);
+
+ return isDarkMode;
+};
+
+export default useDarkMode;
diff --git a/src/hooks/useLoading.ts b/src/hooks/useLoading.ts
new file mode 100644
index 00000000..51c27c6b
--- /dev/null
+++ b/src/hooks/useLoading.ts
@@ -0,0 +1,36 @@
+import { useState } from "react";
+
+// React state hook that manage a state of loading
+const useLoading = (initialState = true) => {
+ const [state, setState] = useState({ isLoading: initialState, isFailed: false, isSucceed: false });
+
+ return {
+ ...state,
+ setLoading: () => {
+ setState({
+ ...state,
+ isLoading: true,
+ isFailed: false,
+ isSucceed: false,
+ });
+ },
+ setFinish: () => {
+ setState({
+ ...state,
+ isLoading: false,
+ isFailed: false,
+ isSucceed: true,
+ });
+ },
+ setError: () => {
+ setState({
+ ...state,
+ isLoading: false,
+ isFailed: true,
+ isSucceed: false,
+ });
+ },
+ };
+};
+
+export default useLoading;
diff --git a/src/lib/connectors/index.ts b/src/lib/connectors/index.ts
index c48c5b6b..c883598f 100644
--- a/src/lib/connectors/index.ts
+++ b/src/lib/connectors/index.ts
@@ -1,13 +1,13 @@
-import { Connection, Engine } from "@/types";
+import { Connection, Engine, ExecutionResult, Schema } from "@/types";
import mysql from "./mysql";
import postgres from "./postgres";
+import mssql from "./mssql";
export interface Connector {
testConnection: () => Promise;
- execute: (databaseName: string, statement: string) => Promise;
+ execute: (databaseName: string, statement: string) => Promise;
getDatabases: () => Promise;
- getTables: (databaseName: string) => Promise;
- getTableStructure: (databaseName: string, tableName: string) => Promise;
+ getTableSchema: (databaseName: string) => Promise;
}
export const newConnector = (connection: Connection): Connector => {
@@ -16,6 +16,10 @@ export const newConnector = (connection: Connection): Connector => {
return mysql(connection);
case Engine.PostgreSQL:
return postgres(connection);
+ case Engine.MSSQL:
+ return mssql(connection);
+ case Engine.OceanBase:
+ return mysql(connection);
default:
throw new Error("Unsupported engine type.");
}
diff --git a/src/lib/connectors/mssql/index.ts b/src/lib/connectors/mssql/index.ts
new file mode 100644
index 00000000..929aa04e
--- /dev/null
+++ b/src/lib/connectors/mssql/index.ts
@@ -0,0 +1,111 @@
+import { ConnectionPool } from "mssql";
+import { Connection, ExecutionResult, Schema, Table } from "@/types";
+import { Connector } from "..";
+
+const systemDatabases = ["master", "tempdb", "model", "msdb"];
+
+const getMSSQLConnection = async (connection: Connection): Promise => {
+ const connectionOptions: any = {
+ server: connection.host,
+ port: parseInt(connection.port),
+ user: connection.username,
+ password: connection.password,
+ database: connection.database,
+ options: {
+ encrypt: connection.encrypt === true,
+ },
+ };
+ if (connection.ssl) {
+ connectionOptions.ssl = {
+ ca: connection.ssl?.ca,
+ cert: connection.ssl?.cert,
+ key: connection.ssl?.key,
+ };
+ }
+ const pool = await new ConnectionPool(connectionOptions).connect();
+ return pool;
+};
+
+const testConnection = async (connection: Connection): Promise => {
+ const pool = await getMSSQLConnection(connection);
+ await pool.close();
+ return true;
+};
+
+const execute = async (connection: Connection, databaseName: string, statement: string): Promise => {
+ const pool = await getMSSQLConnection(connection);
+ const request = pool.request();
+ const result = await request.query(`USE ${databaseName}; ${statement}`);
+ await pool.close();
+
+ const executionResult: ExecutionResult = {
+ rawResult: result.recordset,
+ affectedRows: result.rowsAffected.length,
+ };
+ return executionResult;
+};
+
+const getDatabases = async (connection: Connection): Promise => {
+ const pool = await getMSSQLConnection(connection);
+ const request = pool.request();
+ const result = await request.query(`SELECT name FROM sys.databases WHERE name NOT IN ('${systemDatabases.join("','")}');`);
+ await pool.close();
+ const databaseList = [];
+ for (const row of result.recordset) {
+ if (row["name"]) {
+ databaseList.push(row["name"]);
+ }
+ }
+ return databaseList;
+};
+
+const getTableSchema = async (connection: Connection, databaseName: string): Promise => {
+ const pool = await getMSSQLConnection(connection);
+ const request = pool.request();
+ const schemaList: Schema[] = [];
+ const result = await request.query(
+ `SELECT TABLE_NAME as table_name, TABLE_SCHEMA as table_schema FROM ${databaseName}.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE';`
+ );
+ for (const row of result.recordset) {
+ if (row["table_name"]) {
+ const schema = schemaList.find((schema) => schema.name === row["table_schema"]);
+ if (schema) {
+ schema.tables.push({ name: row["table_name"] as string, structure: "" } as Table);
+ } else {
+ schemaList.push({
+ name: row["table_schema"],
+ tables: [{ name: row["table_name"], structure: "" } as Table],
+ });
+ }
+ }
+ }
+
+ for (const schema of schemaList) {
+ for (const table of schema.tables) {
+ const { recordset } = await request.query(
+ `SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE FROM ${databaseName}.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='${schema.name}' AND TABLE_NAME='${table.name}';`
+ );
+ const columnList = [];
+ // Transform to standard schema string.
+ for (const row of recordset) {
+ columnList.push(
+ `${row["COLUMN_NAME"]} ${row["DATA_TYPE"].toUpperCase()} ${String(row["IS_NULLABLE"]).toUpperCase() === "NO" ? "NOT NULL" : ""}`
+ );
+ }
+ table.structure = `CREATE TABLE [${table.name}] (\n${columnList.join(",\n")}\n);`;
+ }
+ }
+ await pool.close();
+ return schemaList;
+};
+
+const newConnector = (connection: Connection): Connector => {
+ return {
+ testConnection: () => testConnection(connection),
+ execute: (databaseName: string, statement: string) => execute(connection, databaseName, statement),
+ getDatabases: () => getDatabases(connection),
+ getTableSchema: (databaseName: string) => getTableSchema(connection, databaseName),
+ };
+};
+
+export default newConnector;
diff --git a/src/lib/connectors/mysql/index.ts b/src/lib/connectors/mysql/index.ts
index b98cef2e..76bde3d7 100644
--- a/src/lib/connectors/mysql/index.ts
+++ b/src/lib/connectors/mysql/index.ts
@@ -1,6 +1,6 @@
import { ConnectionOptions } from "mysql2";
import mysql, { RowDataPacket } from "mysql2/promise";
-import { Connection } from "@/types";
+import { Connection, ExecutionResult, Table, Schema } from "@/types";
import { Connector } from "..";
const systemDatabases = ["information_schema", "mysql", "performance_schema", "sys"];
@@ -19,8 +19,28 @@ const getMySQLConnection = async (connection: Connection): Promise => {
const execute = async (connection: Connection, databaseName: string, statement: string): Promise => {
connection.database = databaseName;
const conn = await getMySQLConnection(connection);
- const [rows] = await conn.query(statement);
+ const [rows] = await conn.execute(statement);
conn.destroy();
- return rows;
+
+ const executionResult: ExecutionResult = {
+ rawResult: [],
+ affectedRows: 0,
+ };
+ if (Array.isArray(rows)) {
+ executionResult.rawResult = rows;
+ } else {
+ executionResult.affectedRows = rows.affectedRows;
+ }
+ return executionResult;
};
const getDatabases = async (connection: Connection): Promise => {
@@ -54,30 +84,31 @@ const getDatabases = async (connection: Connection): Promise => {
return databaseList;
};
-const getTables = async (connection: Connection, databaseName: string): Promise => {
+const getTableSchema = async (connection: Connection, databaseName: string): Promise => {
const conn = await getMySQLConnection(connection);
+ // get All tableList from database
const [rows] = await conn.query(
- `SELECT TABLE_NAME as table_name FROM information_schema.tables WHERE TABLE_SCHEMA=? AND TABLE_TYPE='BASE TABLE';`,
+ // SYSTEM VERSIONED is a special table for MariaDB https://mariadb.com/kb/en/system-versioned-tables/
+ `SELECT TABLE_NAME as table_name FROM information_schema.tables WHERE TABLE_SCHEMA=? AND (TABLE_TYPE='BASE TABLE' || TABLE_TYPE='SYSTEM VERSIONED');`,
[databaseName]
);
- conn.destroy();
const tableList = [];
for (const row of rows) {
if (row["table_name"]) {
tableList.push(row["table_name"]);
}
}
- return tableList;
-};
+ const SchemaList: Schema[] = [{ name: "", tables: [] as Table[] }];
-const getTableStructure = async (connection: Connection, databaseName: string, tableName: string): Promise => {
- const conn = await getMySQLConnection(connection);
- const [rows] = await conn.query(`SHOW CREATE TABLE \`${databaseName}\`.\`${tableName}\`;`);
- conn.destroy();
- if (rows.length !== 1) {
- throw new Error("Unexpected number of rows.");
+ for (const tableName of tableList) {
+ const [rows] = await conn.query(`SHOW CREATE TABLE \`${databaseName}\`.\`${tableName}\`;`);
+ if (rows.length !== 1) {
+ throw new Error("Unexpected number of rows.");
+ }
+
+ SchemaList[0].tables.push({ name: tableName, structure: rows[0]["Create Table"] || "" });
}
- return rows[0]["Create Table"] || "";
+ return SchemaList;
};
const newConnector = (connection: Connection): Connector => {
@@ -85,8 +116,7 @@ const newConnector = (connection: Connection): Connector => {
testConnection: () => testConnection(connection),
execute: (databaseName: string, statement: string) => execute(connection, databaseName, statement),
getDatabases: () => getDatabases(connection),
- getTables: (databaseName: string) => getTables(connection, databaseName),
- getTableStructure: (databaseName: string, tableName: string) => getTableStructure(connection, databaseName, tableName),
+ getTableSchema: (databaseName: string) => getTableSchema(connection, databaseName),
};
};
diff --git a/src/lib/connectors/postgres/index.ts b/src/lib/connectors/postgres/index.ts
index 6633ae6e..6be83bf1 100644
--- a/src/lib/connectors/postgres/index.ts
+++ b/src/lib/connectors/postgres/index.ts
@@ -1,14 +1,20 @@
import { Client, ClientConfig } from "pg";
-import { Connection } from "@/types";
+import { Connection, ExecutionResult, Table, Schema } from "@/types";
import { Connector } from "..";
-const newPostgresClient = (connection: Connection) => {
+const systemSchemas =
+ "'information_schema', 'pg_catalog', 'pg_toast', '_timescaledb_cache', '_timescaledb_catalog', '_timescaledb_internal', '_timescaledb_config', 'timescaledb_information', 'timescaledb_experimental'";
+
+const systemTables = "'_prisma_migrations'";
+
+const newPostgresClient = async (connection: Connection) => {
const clientConfig: ClientConfig = {
host: connection.host,
port: Number(connection.port),
user: connection.username,
password: connection.password,
database: connection.database,
+ application_name: "sqlchat",
};
if (connection.ssl) {
clientConfig.ssl = {
@@ -16,68 +22,120 @@ const newPostgresClient = (connection: Connection) => {
cert: connection.ssl?.cert,
key: connection.ssl?.key,
};
+ } else {
+ clientConfig.ssl = {
+ rejectUnauthorized: false,
+ };
}
- return new Client(clientConfig);
+
+ let client = new Client(clientConfig);
+
+ if (connection.ssl) {
+ await client.connect();
+ } else {
+ try {
+ await client.connect();
+ } catch (error) {
+ // Because node-postgres didn't implement `sslmode: preferred`. So first try to connect via SSL, otherwise connect via non-SSL.
+ // Connecting postgres via non-ssl requires `clientConfig.ssl` is undefined. ref: https://github.com/sqlchat/sqlchat/issues/108
+ if (error instanceof Error && error.message.includes("The server does not support SSL connections")) {
+ clientConfig.ssl = undefined;
+ client = new Client(clientConfig);
+ await client.connect();
+ } else {
+ throw error;
+ }
+ }
+ }
+ return client;
};
const testConnection = async (connection: Connection): Promise => {
- const client = newPostgresClient(connection);
- await client.connect();
+ const client = await newPostgresClient(connection);
await client.end();
return true;
};
-const execute = async (connection: Connection, _: string, statement: string): Promise => {
- const client = newPostgresClient(connection);
- await client.connect();
- const { rows } = await client.query(statement);
+const execute = async (connection: Connection, databaseName: string, statement: string): Promise => {
+ connection.database = databaseName;
+ const client = await newPostgresClient(connection);
+ const { rows, rowCount } = await client.query(statement);
await client.end();
- return rows;
+
+ const executionResult: ExecutionResult = {
+ rawResult: rows,
+ affectedRows: rowCount,
+ };
+ // For those SELECT statement, we should set the affectedRows to undefined.
+ if (executionResult.rawResult.length === rowCount) {
+ executionResult.affectedRows = undefined;
+ }
+ return executionResult;
};
const getDatabases = async (connection: Connection): Promise => {
- const client = newPostgresClient(connection);
- await client.connect();
+ const client = await newPostgresClient(connection);
+ if (connection.database) {
+ await client.end();
+ return [connection.database];
+ }
+
+ const { rows } = await client.query(`SELECT datname FROM pg_database;`);
await client.end();
- // Because PostgreSQL needs to specify a database to connect to, we use the default database.
- return [connection.database!];
+ const databaseList = [];
+ for (const row of rows) {
+ if (row["datname"]) {
+ databaseList.push(row["datname"]);
+ }
+ }
+ await client.end();
+ return databaseList;
};
-const getTables = async (connection: Connection, databaseName: string): Promise => {
- const client = newPostgresClient(connection);
- await client.connect();
+const getTableSchema = async (connection: Connection, databaseName: string): Promise => {
+ connection.database = databaseName;
+ const client = await newPostgresClient(connection);
const { rows } = await client.query(
- `SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE' AND table_catalog=$1;`,
+ `SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN (${systemSchemas}) AND table_name NOT IN (${systemTables}) AND (table_type='BASE TABLE' or table_type='VIEW') AND table_catalog=$1;`,
[databaseName]
);
- await client.end();
- const tableList = [];
+
+ const schemaList: Schema[] = [];
for (const row of rows) {
if (row["table_name"]) {
- tableList.push(row["table_name"]);
+ const schema = schemaList.find((schema) => schema.name === row["table_schema"]);
+ if (schema) {
+ schema.tables.push({ name: row["table_name"] as string, structure: "" } as Table);
+ } else {
+ schemaList.push({
+ name: row["table_schema"],
+ tables: [{ name: row["table_name"], structure: "" } as Table],
+ });
+ }
}
}
- return tableList;
-};
-const getTableStructure = async (connection: Connection, _: string, tableName: string): Promise => {
- const client = newPostgresClient(connection);
- await client.connect();
- const { rows } = await client.query(
- `SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema='public' AND table_name=$1;`,
- [tableName]
- );
- await client.end();
- const columnList = [];
- // TODO(steven): transform it to standard schema string.
- for (const row of rows) {
- columnList.push(
- `${row["column_name"]} ${row["data_type"].toUpperCase()} ${String(row["is_nullable"]).toUpperCase() === "NO" ? "NOT NULL" : ""}`
- );
+ for (const schema of schemaList) {
+ for (const table of schema.tables) {
+ const { rows: result } = await client.query(
+ `SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema NOT IN (${systemSchemas}) AND table_name=$1 AND table_schema=$2;`,
+ [table.name, schema.name]
+ );
+ const columnList = [];
+ // TODO(steven): transform it to standard schema string.
+ for (const row of result) {
+ columnList.push(
+ `${row["column_name"]} ${row["data_type"].toUpperCase()} ${String(row["is_nullable"]).toUpperCase() === "NO" ? "NOT NULL" : ""}`
+ );
+ }
+
+ let fullTableName = schema.name == "public" ? `"${table.name}"` : `"${schema.name}"."${table.name}"`;
+ table.structure = `CREATE TABLE ${fullTableName} (\n${columnList.join(",\n")}\n);`;
+ }
}
- return `CREATE TABLE \`${tableName}\` (
- ${columnList.join(",\n")}
- );`;
+
+ await client.end();
+ return schemaList;
};
const newConnector = (connection: Connection): Connector => {
@@ -85,8 +143,7 @@ const newConnector = (connection: Connection): Connector => {
testConnection: () => testConnection(connection),
execute: (databaseName: string, statement: string) => execute(connection, databaseName, statement),
getDatabases: () => getDatabases(connection),
- getTables: (databaseName: string) => getTables(connection, databaseName),
- getTableStructure: (databaseName: string, tableName: string) => getTableStructure(connection, databaseName, tableName),
+ getTableSchema: (databaseName: string) => getTableSchema(connection, databaseName),
};
};
diff --git a/src/locales/en.json b/src/locales/en.json
new file mode 100644
index 00000000..10530504
--- /dev/null
+++ b/src/locales/en.json
@@ -0,0 +1,131 @@
+{
+ "common": {
+ "clear": "Clear",
+ "close": "Close",
+ "confirm": "Confirm",
+ "save": "Save",
+ "edit": "Edit",
+ "loading": "Loading",
+ "setting": "Setting",
+ "copy": "Copy",
+ "delete": "Delete",
+ "run-sql": "Run SQL",
+ "sign-in": "Sign in",
+ "sign-out": "Sign out",
+ "back": "Back",
+ "quota": "Monthly Quota",
+ "date": "Date",
+ "description": "Description",
+ "amount": "Amount"
+ },
+ "conversation": {
+ "new-chat": "New Chat",
+ "conversation-title": "Conversation title",
+ "update": "Update conversation",
+ "title": "Title"
+ },
+ "connection": {
+ "self": "Connection",
+ "new": "Create Connection",
+ "edit": "Edit Connection",
+ "refresh-schema": "Refresh Schema",
+ "select-database": "Select your database",
+ "select-table": "Select your table",
+ "select-schema": "Select your Schema",
+ "all-tables": "All Tables",
+ "total-token": "Tokens",
+ "database-type": "Database type",
+ "title": "Title",
+ "host": "Host",
+ "port": "Port",
+ "database-name": "Database name",
+ "username": "Username",
+ "password": "Password",
+ "empty-select": "clear selection",
+ "select-all": "select all",
+ "tidb-serverless-ssl-hint": "SSL is enabled by default"
+ },
+ "prompt": {
+ "self": "Prompt",
+ "current-conversation": "Current conversation prompt"
+ },
+ "assistant": {
+ "self": "Bot",
+ "create-your-bot": "Can't find the bot you need? Create one"
+ },
+ "execution": {
+ "title": "Execute SQL",
+ "message": {
+ "executing": "Executing query...",
+ "no-connection": "No connection selected",
+ "no-data": "No data returned"
+ }
+ },
+ "editor": {
+ "placeholder": "Enter your question here..."
+ },
+ "setting": {
+ "self": "Setting",
+ "general": "General",
+ "plan": {
+ "guest": "Guest",
+ "free": "Free",
+ "pro": "Pro",
+ "pro-early-bird": "🐤 Early Bird - Pro 50% OFF",
+ "signup-for-more": "Sign up for more",
+ "upgrade": "Upgrade",
+ "renew": "Renew",
+ "expired": "Expired",
+ "n-question-per-month": "{{count}} quota / month",
+ "1-month": "1 month",
+ "n-months": "{{count}} months",
+ "purhcase-1-month": "Purchase 1 month",
+ "purhcase-n-months": "Purchase {{count}} months"
+ },
+ "subscription": {
+ "self": "Subscription",
+ "view-receipt": "View receipt"
+ },
+ "account": {
+ "self": "Account"
+ },
+ "basic": {
+ "self": "Basic",
+ "language": "Language"
+ },
+ "theme": {
+ "self": "Theme",
+ "system": "Follow system",
+ "light": "Light",
+ "dark": "Dark"
+ },
+ "openai-api-configuration": {
+ "self": "OpenAI API configuration",
+ "model": "Model",
+ "model-description": "Quota won't be consumed if you provide your own key below.",
+ "quota-per-ask": "{{count}} quota per ask",
+ "key-description": "Bring your own key to waive quota requirement.",
+ "find-my-key": "Find my key",
+ "endpoint-description": "Optional endpoint pointing to your own compatible server or gateway."
+ },
+ "data": {
+ "self": "Data",
+ "clear-all-data": "Clear all data"
+ }
+ },
+ "social": {
+ "join-discord-channel": "Join Discord Channel",
+ "join-wechat-group": "Join WeChat Group"
+ },
+ "banner": {
+ "data-storage": "Connection settings are stored in your local browser",
+ "non-select-sql-warning": "The current statement may be non-SELECT SQL, which will result in a database schema or data change. Make sure you know what you are doing.",
+ "product-hunt": "🚀🚀🚀 We just launched on Product Hunt, please give us a vote! 🚀🚀🚀",
+ "quota-overflow": "We are running out of quota. You can still supply your own OpenAI API key to continue using.",
+ "use-my-key": "Use my own key"
+ },
+ "payment": {
+ "self": "Payment",
+ "sign-in-to-buy": "Sign in to buy"
+ }
+}
diff --git a/src/locales/es.json b/src/locales/es.json
new file mode 100644
index 00000000..baead01d
--- /dev/null
+++ b/src/locales/es.json
@@ -0,0 +1,130 @@
+{
+ "common": {
+ "clear": "Limpiar",
+ "close": "Cerrar",
+ "confirm": "Confirmar",
+ "save": "Guardar",
+ "edit": "Editar",
+ "loading": "Cargando",
+ "setting": "Configuración",
+ "copy": "Copiar",
+ "delete": "Borrar",
+ "run-sql": "Ejecutar SQL",
+ "sign-in": "Iniciar sesión",
+ "sign-out": "Desconectar",
+ "back": "Volver",
+ "quota": "Cuota Mensual",
+ "date": "Fecha",
+ "description": "Descripción",
+ "amount": "Cantidad"
+ },
+ "conversation": {
+ "new-chat": "Nuevo Chat",
+ "conversation-title": "Título de la conversación",
+ "update": "Actualizar conversación",
+ "title": "Titulo"
+ },
+ "connection": {
+ "self": "Conexión",
+ "new": "Crear Conexión",
+ "edit": "Editar Conexión",
+ "refresh-schema": "Actualizar Esquema",
+ "select-database": "Selecciona tu base de datos",
+ "database-type": "Tipo de Base de Datos",
+ "title": "Nombre",
+ "host": "Servidor",
+ "port": "Puerto",
+ "database-name": "Nombre de Base de Datos",
+ "username": "Usuario",
+ "password": "Contraseña",
+ "empty-select": "limpiar selección",
+ "select-all": "seleccionar todo",
+ "total-token": "Tokens",
+ "tidb-serverless-ssl-hint": "SSL está habilitado de forma predeterminada",
+ "select-table": "Selecciona tu tabla",
+ "select-schema": "Selecciona tu Esquema",
+ "all-tables": "Todas las Tablas"
+ },
+ "prompt": {
+ "view": "Prompt",
+ "current-conversation": "Mensaje de conversación actual"
+ },
+ "assistant": {
+ "self": "Bot",
+ "create-your-bot": "¿No encuentras el bot que necesitas? Crea uno"
+ },
+ "execution": {
+ "title": "Ejecutar consulta",
+ "message": {
+ "executing": "Ejecutando consulta...",
+ "no-connection": "No se ha seleccionado una conexión",
+ "no-data": "No hay datos para mostrar"
+ }
+ },
+ "editor": {
+ "placeholder": "Ingresa tu pregunta aquí..."
+ },
+ "setting": {
+ "self": "Configuración",
+ "general": "General",
+ "plan": {
+ "guest": "Invitado",
+ "free": "Gratis",
+ "pro": "Pro",
+ "pro-early-bird": "🐤 Early Bird - Pro 50% de descuento",
+ "signup-for-more": "Regístrese para obtener más",
+ "upgrade": "Mejora",
+ "renew": "Renovar",
+ "expired": "Expirado",
+ "n-question-per-month": "{{count}} Cuota / mes",
+ "1-month": "1 mes",
+ "n-months": "{{count}} meses",
+ "purhcase-1-month": "Comprar 1 mes",
+ "purhcase-n-months": "Comprar {{count}} meses"
+ },
+ "subscription": {
+ "self": "Suscripción",
+ "view-receipt": "Ver recibo"
+ },
+ "account": {
+ "self": "Cuenta"
+ },
+ "basic": {
+ "self": "Básico",
+ "language": "Idioma"
+ },
+ "theme": {
+ "self": "Tema",
+ "system": "Usar tema del sistema",
+ "light": "Claro",
+ "dark": "Oscuro"
+ },
+ "openai-api-configuration": {
+ "self": "Configuración del API de OpenAI",
+ "model": "Modelo",
+ "model-description": "La cuota no se consumirá si proporciona su propia clave a continuación.",
+ "key-description": "Indique su propia clave para retirarse del límite por cuota.",
+ "find-my-key": "Encuentra mi llave",
+ "endpoint-description": "Endpoint opcional que apunta a su propio servidor o gateway compatible."
+ },
+ "data": {
+ "self": "Datos",
+ "clear-all-data": "Limpiar todos los datos"
+ }
+ },
+ "social": {
+ "join-discord-channel": "Unirse al canal de Discord",
+ "join-wechat-group": "Unirse al grupo de WeChat"
+ },
+ "banner": {
+ "data-storage": "Las configuraciones de conexión y las consultas se almacenan en tu navegador",
+ "non-select-sql-warning": "La declaración actual puede no ser SELECT SQL, lo que dará como resultado un esquema de base de datos o un cambio de datos. Asegúrate de saber lo que estás haciendo.",
+ "product-hunt": "🚀🚀🚀 Acabamos de lanzar en Product Hunt, ¡por favor, vota por nosotros! 🚀🚀🚀",
+ "quota-overflow": "Cuota excedida. Proporcione su propia clave API de OpenAI.",
+ "use-my-key": "Usar mi propia clave"
+ },
+ "payment": {
+ "self": "Pago",
+ "sign-in-to-buy": "Inicia sesión para comprar"
+ }
+}
diff --git a/src/locales/i18n.ts b/src/locales/i18n.ts
new file mode 100644
index 00000000..3c4fd4bf
--- /dev/null
+++ b/src/locales/i18n.ts
@@ -0,0 +1,22 @@
+import i18n from "i18next";
+import { initReactI18next } from "react-i18next";
+import enLocale from "./en.json";
+import zhLocale from "./zh.json";
+import esLocale from "./es.json";
+
+i18n.use(initReactI18next).init({
+ resources: {
+ en: {
+ translation: enLocale,
+ },
+ zh: {
+ translation: zhLocale,
+ },
+ es: {
+ translation: esLocale,
+ },
+ },
+ fallbackLng: "en",
+});
+
+export default i18n;
diff --git a/src/locales/zh.json b/src/locales/zh.json
new file mode 100644
index 00000000..4a1c844e
--- /dev/null
+++ b/src/locales/zh.json
@@ -0,0 +1,131 @@
+{
+ "common": {
+ "clear": "清除",
+ "close": "关闭",
+ "confirm": "确认",
+ "save": "保存",
+ "edit": "编辑",
+ "loading": "加载中",
+ "setting": "设置",
+ "copy": "复制",
+ "delete": "删除",
+ "run-sql": "运行 SQL",
+ "sign-in": "登录",
+ "sign-out": "登出",
+ "back": "返回",
+ "quota": "每月额度",
+ "date": "日期",
+ "description": "描述",
+ "amount": "金额"
+ },
+ "conversation": {
+ "new-chat": "新建会话",
+ "conversation-title": "会话标题",
+ "update": "更新会话",
+ "title": "标题"
+ },
+ "connection": {
+ "self": "连接",
+ "new": "创建连接",
+ "edit": "编辑连接",
+ "refresh-schema": "刷新 Schema",
+ "select-database": "选择数据库",
+ "select-table": "选择数据表",
+ "select-schema": "选择 Schema",
+ "all-tables": "全部表",
+ "select-all": "选择全部",
+ "total-token": "Token",
+ "empty-select": "清空选择",
+ "database-type": "数据库类型",
+ "title": "标题",
+ "host": "主机",
+ "port": "端口",
+ "database-name": "数据库",
+ "username": "用户名",
+ "password": "密码",
+ "tidb-serverless-ssl-hint": "SSL 默认已开启"
+ },
+ "prompt": {
+ "view": "提示词",
+ "current-conversation": "当前会话的提示词"
+ },
+ "assistant": {
+ "self": "机器人",
+ "create-your-bot": "找不到需要的机器人?创建一个"
+ },
+ "execution": {
+ "title": "执行 SQL",
+ "message": {
+ "executing": "正在执行查询...",
+ "no-connection": "未选择连接",
+ "no-data": "未返回数据"
+ }
+ },
+ "editor": {
+ "placeholder": "在此输入您的问题..."
+ },
+ "setting": {
+ "self": "设置",
+ "general": "通用",
+ "plan": {
+ "guest": "访客",
+ "free": "免费版",
+ "pro": "专业版",
+ "pro-early-bird": "🐤 早鸟优惠 - 专业版 5 折",
+ "signup-for-more": "注册获得额度",
+ "upgrade": "升级",
+ "renew": "续费",
+ "expired": "已过期",
+ "n-question-per-month": "{{count}} 点额度 / 月",
+ "1-month": "1 个月",
+ "n-months": "{{count}} 个月",
+ "purhcase-1-month": "购买 1 个月",
+ "purhcase-n-months": "购买 {{count}} 个月"
+ },
+ "subscription": {
+ "self": "订阅",
+ "view-receipt": "查看收据"
+ },
+ "account": {
+ "self": "账户"
+ },
+ "basic": {
+ "self": "基础",
+ "language": "语言"
+ },
+ "theme": {
+ "self": "主题",
+ "system": "跟随系统",
+ "light": "浅色",
+ "dark": "深色"
+ },
+ "openai-api-configuration": {
+ "self": "OpenAI API 配置",
+ "model": "模型",
+ "model-description": "如果您提供自己的 key,额度是不会消耗的。",
+ "quota-per-ask": "每一个提问消耗 {{count}} 点额度",
+ "find-my-key": "找到我的 Key",
+ "key-description": "一旦您提供了自己的 key,额度就不受限制了。",
+ "endpoint-description": "可选的 endpoint 指向接口兼容的服务器或者网关。"
+ },
+ "data": {
+ "self": "数据",
+ "clear-all-data": "清除所有数据"
+ }
+ },
+ "social": {
+ "join-discord-channel": "加入 Discord 频道",
+ "join-wechat-group": "加入微信群"
+ },
+ "banner": {
+ "data-storage": "连接设置存储在您的本地浏览器中",
+ "non-select-sql-warning": "当前语句可能是非 SELECT SQL,这将导致数据库模式或数据变化。",
+ "product-hunt": "🚀🚀🚀 我们刚在 Product Hunt 发布, 来给我们点个赞! 🚀🚀🚀",
+ "quota-overflow": "我们的 OpenAI 额度已用完,请提供您自己的 OpenAI API key。",
+ "use-my-key": "提供我自己的 key"
+ },
+ "payment": {
+ "self": "支付",
+ "sign-in-to-buy": "登录后购买"
+ }
+}
diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx
index 7f5bcd98..3dfb690f 100644
--- a/src/pages/_app.tsx
+++ b/src/pages/_app.tsx
@@ -1,22 +1,83 @@
-import { AppProps } from "next/app";
-import React from "react";
-import { Toaster } from "react-hot-toast";
import { Analytics } from "@vercel/analytics/react";
+import { SessionProvider } from "next-auth/react";
import dayjs from "dayjs";
import localizedFormat from "dayjs/plugin/localizedFormat";
+import { AppProps } from "next/app";
+import React, { useEffect } from "react";
+import { Toaster } from "react-hot-toast";
+import { useTranslation } from "react-i18next";
+import { useSettingStore } from "@/store";
+import { hasDatabase } from "@/utils";
+
dayjs.extend(localizedFormat);
+import "dayjs/locale/zh";
+import "@/locales/i18n";
import "@/styles/tailwind.css";
import "@/styles/global.css";
import "@/styles/data-table.css";
+import "@/styles/mui.css";
+
+import type { Session } from "next-auth";
+
+function MyApp({ Component, pageProps: { session, ...pageProps } }: AppProps<{ session: Session }>) {
+ const { i18n } = useTranslation();
+ const settingStore = useSettingStore();
+
+ // Check whether those NEXT_PUBLIC_ envs are properly exposed in frontend.
+ // See https://github.com/vercel/next.js/discussions/17641
+ console.log("Has database:", hasDatabase());
+
+ useEffect(() => {
+ const darkMediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
+ const handleColorSchemeChange = (e: MediaQueryListEvent) => {
+ if (settingStore.getState().setting.theme === "system") {
+ const theme = e.matches ? "dark" : "light";
+ document.documentElement.classList.remove("dark");
+ document.documentElement.classList.remove("light");
+ document.documentElement.classList.add(theme);
+ }
+ };
+
+ try {
+ if (darkMediaQuery.addEventListener) {
+ darkMediaQuery.addEventListener("change", handleColorSchemeChange);
+ } else {
+ darkMediaQuery.addListener(handleColorSchemeChange);
+ }
+ } catch (error) {
+ console.error("failed to initial color scheme listener", error);
+ }
+ }, []);
+
+ useEffect(() => {
+ const locale = settingStore.setting.locale;
+ i18n.changeLanguage(locale);
+ document.documentElement.setAttribute("lang", locale);
+ }, [settingStore.setting.locale]);
+
+ useEffect(() => {
+ const theme = settingStore.setting.theme;
+ let currentAppearance = theme;
+ if (theme === "system") {
+ if (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) {
+ currentAppearance = "dark";
+ } else {
+ currentAppearance = "light";
+ }
+ }
+
+ document.documentElement.classList.remove("dark");
+ document.documentElement.classList.remove("light");
+ document.documentElement.classList.add(currentAppearance);
+ }, [settingStore.setting.theme]);
-function MyApp({ Component, pageProps }: AppProps) {
return (
- <>
+
- >
+
);
}
diff --git a/src/pages/api/auth/[...nextauth].ts b/src/pages/api/auth/[...nextauth].ts
new file mode 100644
index 00000000..c41e4d23
--- /dev/null
+++ b/src/pages/api/auth/[...nextauth].ts
@@ -0,0 +1,59 @@
+import NextAuth, { NextAuthOptions } from "next-auth";
+import GithubProvider from "next-auth/providers/github";
+import GoogleProvider from "next-auth/providers/google";
+import { PrismaAdapter } from "@next-auth/prisma-adapter";
+import EmailProvider from "next-auth/providers/email";
+import { PrismaClient } from "@prisma/client";
+import { getSubscriptionByEmail } from "../utils/subscription";
+import { hasFeature } from "@/utils";
+
+const prisma = new PrismaClient();
+
+// For more information on each option (and a full list of options) go to
+// https://next-auth.js.org/configuration/options
+export const authOptions: NextAuthOptions = {
+ adapter: hasFeature("account") ? PrismaAdapter(prisma) : undefined,
+ // https://next-auth.js.org/configuration/providers/oauth
+ providers: hasFeature("account")
+ ? [
+ EmailProvider({
+ server: process.env.EMAIL_SERVER,
+ from: process.env.EMAIL_FROM || "noreply@sqlchat.ai",
+ // maxAge: 24 * 60 * 60, // How long email links are valid for (default 24h)
+ }),
+ GoogleProvider({
+ clientId: process.env.GOOGLE_CLIENT_ID,
+ clientSecret: process.env.GOOGLE_CLIENT_SECRET,
+ }),
+ GithubProvider({
+ clientId: process.env.GITHUB_ID,
+ clientSecret: process.env.GITHUB_SECRET,
+ }),
+ ]
+ : [],
+ cookies: {
+ sessionToken: {
+ name: `next-auth.session-token`,
+ options: {
+ httpOnly: true,
+ sameSite: "lax",
+ path: "/",
+ secure: true,
+ },
+ },
+ },
+ callbacks: {
+ async session({ session, user }) {
+ session.user.id = user.id;
+ session.user.subscription = await getSubscriptionByEmail(user.email);
+ session.user.stripeId = user.stripeId;
+ return session;
+ },
+ },
+ theme: {
+ brandColor: "#4F46E5",
+ logo: "/chat-logo.webp",
+ },
+};
+
+export default NextAuth(authOptions);
diff --git a/src/pages/api/auth/end-user.ts b/src/pages/api/auth/end-user.ts
new file mode 100644
index 00000000..3b8ece94
--- /dev/null
+++ b/src/pages/api/auth/end-user.ts
@@ -0,0 +1,35 @@
+import { PrismaClient } from "@prisma/client";
+import { NextApiRequest, NextApiResponse } from "next";
+import { getServerSession } from "next-auth/next";
+import requestIp from "request-ip";
+import { authOptions } from "./[...nextauth]";
+
+const prisma = new PrismaClient();
+
+// Returns the login user email or the client IP address
+export const getEndUser = async (req: NextApiRequest, res: NextApiResponse): Promise => {
+ // Get from server session if available
+ const serverSession = await getServerSession(req, res, authOptions);
+ if (serverSession?.user?.email) {
+ return serverSession.user.email;
+ }
+
+ // Get from session token if available
+ const token = req.headers.authorization?.substring(7);
+ if (token) {
+ const sessionInDb = await prisma.session.findUnique({
+ where: { sessionToken: token },
+ });
+ if (sessionInDb?.userId) {
+ const user = await prisma.user.findUnique({
+ where: { id: sessionInDb.userId },
+ });
+ if (user?.email) {
+ return user.email;
+ }
+ }
+ }
+
+ // Get from client IP address
+ return requestIp.getClientIp(req) || "";
+};
diff --git a/src/pages/api/chat.ts b/src/pages/api/chat.ts
index be5566fa..4919e952 100644
--- a/src/pages/api/chat.ts
+++ b/src/pages/api/chat.ts
@@ -1,34 +1,128 @@
import { createParser, ParsedEvent, ReconnectInterval } from "eventsource-parser";
import { NextRequest } from "next/server";
-import { openAIApiEndpoint, openAIApiKey } from "@/utils";
+import { openAIApiEndpoint, openAIApiKey, openAIOrganization, hasFeature, getModel } from "@/utils";
+// Needs Edge for streaming response.
export const config = {
runtime: "edge",
};
-const apiEndpoint = new URL(`${openAIApiEndpoint}/v1/chat/completions`);
+const getApiEndpoint = (apiEndpoint: string) => {
+ const url = new URL(apiEndpoint);
+ url.pathname = "/v1/chat/completions";
+ return url;
+};
const handler = async (req: NextRequest) => {
const reqBody = await req.json();
- const res = await fetch(apiEndpoint, {
- headers: {
- "Content-Type": "application/json",
- Authorization: `Bearer ${openAIApiKey}`,
- },
+ const apiKey = req.headers.get("x-openai-key") || openAIApiKey;
+
+ if (!apiKey) {
+ return new Response(
+ JSON.stringify({
+ error: {
+ message: "OpenAI API Key is missing. You can supply your own key via [Setting](/setting).",
+ },
+ }),
+ {
+ headers: {
+ "Content-Type": "application/json",
+ },
+ status: 401,
+ }
+ );
+ }
+
+ const useServerKey = !req.headers.get("x-openai-key");
+ const sessionToken = req.cookies.get("next-auth.session-token")?.value;
+ const currentUrl = new URL(req.url);
+ const usageUrl = new URL(currentUrl.protocol + "//" + currentUrl.host + "/api/usage");
+ const requestHeaders: any = {
+ Authorization: `Bearer ${sessionToken}`,
+ };
+ if (req.headers.get("x-openai-model")) {
+ // Pass model to usage API to calculate usage
+ requestHeaders["x-openai-model"] = req.headers.get("x-openai-model");
+ }
+
+ if (useServerKey) {
+ if (hasFeature("account") && !sessionToken) {
+ return new Response(
+ JSON.stringify({
+ error: {
+ message: "Please sign up to get free quota.",
+ },
+ }),
+ {
+ headers: {
+ "Content-Type": "application/json",
+ },
+ status: 401,
+ }
+ );
+ }
+
+ if (hasFeature("quota")) {
+ const usageRes = await fetch(usageUrl, {
+ method: "GET",
+ headers: requestHeaders,
+ });
+ if (!usageRes.ok) {
+ return new Response(usageRes.body, {
+ status: 500,
+ statusText: usageRes.statusText,
+ });
+ }
+
+ const usage = await usageRes.json();
+ if (usage.current >= usage.limit) {
+ return new Response(
+ JSON.stringify({
+ error: {
+ message: `You have reached your monthly quota: ${usage.current}/${usage.limit}.`,
+ },
+ }),
+ {
+ headers: {
+ "Content-Type": "application/json",
+ },
+ status: 401,
+ }
+ );
+ }
+ }
+ }
+
+ let headers: { [key: string]: string } = {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${apiKey}`,
+ };
+
+ if (openAIOrganization) {
+ headers["OpenAI-Organization"] = openAIOrganization;
+ }
+
+ const apiEndpoint = getApiEndpoint(req.headers.get("x-openai-endpoint") || openAIApiEndpoint);
+ const model = getModel(req.headers.get("x-openai-model") || "");
+ const remoteRes = await fetch(apiEndpoint, {
+ headers: headers,
method: "POST",
body: JSON.stringify({
- model: "gpt-3.5-turbo",
+ model: model.name,
messages: reqBody.messages,
- temperature: 0,
- frequency_penalty: 0.0,
- presence_penalty: 0.0,
+ temperature: model.temperature,
+ frequency_penalty: model.frequency_penalty,
+ presence_penalty: model.presence_penalty,
stream: true,
+ // Send end-user IP to help OpenAI monitor and detect abuse.
+ // It's intentionally not using email to avoid leaking user's email to OpenAI.
+ user: req.ip,
}),
});
- if (!res.ok) {
- return new Response(res.body, {
- status: res.status,
- statusText: res.statusText,
+ if (!remoteRes.ok) {
+ return new Response(remoteRes.body, {
+ status: remoteRes.status,
+ statusText: remoteRes.statusText,
});
}
@@ -54,11 +148,20 @@ const handler = async (req: NextRequest) => {
}
};
const parser = createParser(streamParser);
- for await (const chunk of res.body as any) {
+ for await (const chunk of remoteRes.body as any) {
parser.feed(decoder.decode(chunk));
}
},
});
+
+ if (useServerKey && hasFeature("quota")) {
+ // Increment usage count
+ await fetch(usageUrl, {
+ method: "POST",
+ headers: requestHeaders,
+ });
+ }
+
return new Response(stream);
};
diff --git a/src/pages/api/checkout_sessions/[id].ts b/src/pages/api/checkout_sessions/[id].ts
new file mode 100644
index 00000000..5d2fc218
--- /dev/null
+++ b/src/pages/api/checkout_sessions/[id].ts
@@ -0,0 +1,24 @@
+import { NextApiRequest, NextApiResponse } from "next";
+import Stripe from "stripe";
+
+const stripe = new Stripe(process.env.STRIPE_API_KEY, {
+ // https://github.com/stripe/stripe-node#configuration
+ apiVersion: "2022-11-15",
+});
+
+export default async function handler(req: NextApiRequest, res: NextApiResponse) {
+ const id: string = req.query.id as string;
+ try {
+ if (!id.startsWith("cs_")) {
+ throw Error("Incorrect CheckoutSession ID.");
+ }
+ const checkout_session: Stripe.Checkout.Session = await stripe.checkout.sessions.retrieve(id, {
+ expand: ["payment_intent"],
+ });
+
+ res.status(200).json(checkout_session);
+ } catch (err) {
+ const errorMessage = err instanceof Error ? err.message : "Internal server error";
+ res.status(500).json({ statusCode: 500, message: errorMessage });
+ }
+}
diff --git a/src/pages/api/checkout_sessions/index.ts b/src/pages/api/checkout_sessions/index.ts
new file mode 100644
index 00000000..6b0fa752
--- /dev/null
+++ b/src/pages/api/checkout_sessions/index.ts
@@ -0,0 +1,72 @@
+import { NextApiRequest, NextApiResponse } from "next";
+import { getServerSession } from "next-auth/next";
+import { authOptions } from "../auth/[...nextauth]";
+import { PrismaClient } from "@prisma/client";
+import Stripe from "stripe";
+
+const stripe = new Stripe(process.env.STRIPE_API_KEY, {
+ // https://github.com/stripe/stripe-node#configuration
+ apiVersion: "2022-11-15",
+});
+
+const prisma = new PrismaClient();
+
+export default async function handler(req: NextApiRequest, res: NextApiResponse) {
+ const session = await getServerSession(req, res, authOptions);
+
+ if (!session?.user?.email) {
+ res.status(401).json({ statusCode: 401, message: "Unauthorized" });
+ return;
+ }
+
+ if (req.method === "POST") {
+ const email = session?.user?.email!;
+ const user = await prisma.user.findUniqueOrThrow({
+ where: { email: email },
+ });
+ try {
+ // Create Checkout Sessions from body params.
+ const params: Stripe.Checkout.SessionCreateParams = {
+ submit_type: "pay",
+ mode: "payment",
+ payment_method_types: ["affirm", "alipay", "card", "cashapp", "klarna", "link", "wechat_pay"],
+ line_items: [
+ {
+ price: req.body.price,
+ quantity: 1,
+ },
+ ],
+ payment_method_options: {
+ wechat_pay: {
+ client: "web",
+ },
+ },
+ payment_intent_data: {
+ // not compatiable with affirm, alipay, klarna, wechat_pay
+ // setup_future_usage: "off_session",
+ metadata: {
+ email: session?.user?.email!,
+ plan: "PRO",
+ price: req.body.price,
+ },
+ },
+ // Link customer if present otherwise pass email and let Stripe create a new customer.
+ // customer and customer_email can't be set at the same time.
+ customer: user.stripeId || undefined,
+ customer_email: user.stripeId ? undefined : email,
+ customer_creation: user.stripeId ? undefined : "always",
+ success_url: `${req.headers.origin}/setting?session_id={CHECKOUT_SESSION_ID}`,
+ cancel_url: `${req.headers.origin}/setting`,
+ };
+ const checkoutSession: Stripe.Checkout.Session = await stripe.checkout.sessions.create(params);
+
+ res.status(200).json(checkoutSession);
+ } catch (err) {
+ const errorMessage = err instanceof Error ? err.message : "Internal server error";
+ res.status(500).json({ statusCode: 500, message: errorMessage });
+ }
+ } else {
+ res.setHeader("Allow", "POST");
+ res.status(405).end("Method Not Allowed");
+ }
+}
diff --git a/src/pages/api/collect.ts b/src/pages/api/collect.ts
new file mode 100644
index 00000000..a1e68f5a
--- /dev/null
+++ b/src/pages/api/collect.ts
@@ -0,0 +1,59 @@
+import { PrismaClient } from "@prisma/client";
+import { NextApiRequest, NextApiResponse } from "next";
+import { Conversation, Message } from "@/types";
+import { getModel } from "@/utils";
+import { getEndUser } from "./auth/end-user";
+
+const prisma = new PrismaClient();
+
+export default async function handler(req: NextApiRequest, res: NextApiResponse) {
+ if (req.method !== "POST") {
+ return res.status(405).json([]);
+ }
+ const conversation = req.body.conversation as Conversation;
+ const messages = req.body.messages as Message[];
+ try {
+ const chat = await prisma.chat.findUnique({
+ where: {
+ id: conversation.id,
+ },
+ });
+ const endUser = await getEndUser(req, res);
+ if (chat) {
+ await prisma.message.createMany({
+ data: messages.map((message) => ({
+ chatId: chat.id,
+ createdAt: new Date(message.createdAt),
+ endUser: endUser,
+ role: message.creatorRole,
+ content: message.content,
+ upvote: false,
+ downvote: false,
+ })),
+ });
+ } else {
+ await prisma.chat.create({
+ data: {
+ id: conversation.id,
+ createdAt: new Date(conversation.createdAt),
+ model: getModel((req.headers["x-openai-model"] as string) || ""),
+ ctx: {},
+ messages: {
+ create: messages.map((message) => ({
+ createdAt: new Date(message.createdAt),
+ endUser: endUser,
+ role: message.creatorRole,
+ content: message.content,
+ upvote: false,
+ downvote: false,
+ })),
+ },
+ },
+ });
+ }
+ } catch (err) {
+ console.error(err);
+ }
+
+ res.status(200).json(true);
+}
diff --git a/src/pages/api/connection/db.ts b/src/pages/api/connection/db.ts
index 84c5ee44..b4f57064 100644
--- a/src/pages/api/connection/db.ts
+++ b/src/pages/api/connection/db.ts
@@ -1,6 +1,8 @@
import { NextApiRequest, NextApiResponse } from "next";
import { newConnector } from "@/lib/connectors";
import { Connection } from "@/types";
+import { changeTiDBConnectionToMySQL } from "@/utils";
+import { Engine } from "@/types/connection";
// POST /api/connection/db
// req body: { connection: Connection }
@@ -10,7 +12,11 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
return res.status(405).json([]);
}
- const connection = req.body.connection as Connection;
+ let connection = req.body.connection as Connection;
+ if (connection.engineType === Engine.TiDB) {
+ connection = changeTiDBConnectionToMySQL(connection);
+ }
+
try {
const connector = newConnector(connection);
const databaseNameList = await connector.getDatabases();
diff --git a/src/pages/api/connection/db_schema.ts b/src/pages/api/connection/db_schema.ts
index a801834a..d5ff9863 100644
--- a/src/pages/api/connection/db_schema.ts
+++ b/src/pages/api/connection/db_schema.ts
@@ -1,6 +1,8 @@
import { NextApiRequest, NextApiResponse } from "next";
import { newConnector } from "@/lib/connectors";
-import { Connection, Table } from "@/types";
+import { Connection, Schema } from "@/types";
+import { changeTiDBConnectionToMySQL } from "@/utils";
+import { Engine } from "@/types/connection";
// POST /api/connection/db_schema
// req body: { connection: Connection, db: string }
@@ -10,21 +12,19 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
return res.status(405).json([]);
}
- const connection = req.body.connection as Connection;
+ let connection = req.body.connection as Connection;
+ if (connection.engineType === Engine.TiDB) {
+ connection = changeTiDBConnectionToMySQL(connection);
+ }
+
const db = req.body.db as string;
+
try {
const connector = newConnector(connection);
- const tableStructures: Table[] = [];
- const rawTableNameList = await connector.getTables(db);
- for (const tableName of rawTableNameList) {
- const structure = await connector.getTableStructure(db, tableName);
- tableStructures.push({
- name: tableName,
- structure,
- });
- }
+ const schemaList: Schema[] = await connector.getTableSchema(db);
+
res.status(200).json({
- data: tableStructures,
+ data: schemaList,
});
} catch (error: any) {
res.status(400).json({
diff --git a/src/pages/api/connection/execute.ts b/src/pages/api/connection/execute.ts
index fb4f7b40..900f1837 100644
--- a/src/pages/api/connection/execute.ts
+++ b/src/pages/api/connection/execute.ts
@@ -1,7 +1,8 @@
import { NextApiRequest, NextApiResponse } from "next";
import { newConnector } from "@/lib/connectors";
import { Connection } from "@/types";
-import { checkStatementIsSelect } from "@/utils";
+import { changeTiDBConnectionToMySQL } from "@/utils";
+import { Engine } from "@/types/connection";
// POST /api/connection/execute
// req body: { connection: Connection, db: string, statement: string }
@@ -10,13 +11,12 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
return res.status(405).json(false);
}
- const connection = req.body.connection as Connection;
+ let connection = req.body.connection as Connection;
+ if (connection.engineType === Engine.TiDB) {
+ connection = changeTiDBConnectionToMySQL(connection);
+ }
const db = req.body.db as string;
const statement = req.body.statement as string;
- // We only support SELECT statements for now.
- if (!checkStatementIsSelect(statement)) {
- return res.status(400).json([]);
- }
try {
const connector = newConnector(connection);
diff --git a/src/pages/api/connection/test.ts b/src/pages/api/connection/test.ts
index d9ec669c..5a54803f 100644
--- a/src/pages/api/connection/test.ts
+++ b/src/pages/api/connection/test.ts
@@ -1,6 +1,8 @@
import { NextApiRequest, NextApiResponse } from "next";
import { newConnector } from "@/lib/connectors";
import { Connection } from "@/types";
+import { changeTiDBConnectionToMySQL } from "@/utils";
+import { Engine } from "@/types/connection";
// POST /api/connection/test
// req body: { connection: Connection }
@@ -10,7 +12,10 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
return res.status(405).json(false);
}
- const connection = req.body.connection as Connection;
+ let connection = req.body.connection as Connection;
+ if (connection.engineType === Engine.TiDB) {
+ connection = changeTiDBConnectionToMySQL(connection);
+ }
try {
const connector = newConnector(connection);
await connector.testConnection();
diff --git a/src/pages/api/payment.ts b/src/pages/api/payment.ts
new file mode 100644
index 00000000..fcfe19af
--- /dev/null
+++ b/src/pages/api/payment.ts
@@ -0,0 +1,16 @@
+import { NextApiRequest, NextApiResponse } from "next";
+import { getEndUser } from "./auth/end-user";
+import { getPaymentListByEmail } from "./utils/payment";
+
+const handler = async (req: NextApiRequest, res: NextApiResponse) => {
+ if (req.method !== "GET") {
+ return res.status(405).json([]);
+ }
+
+ const endUser = await getEndUser(req, res);
+ const paymentList = await getPaymentListByEmail(endUser);
+
+ res.status(200).json(paymentList);
+};
+
+export default handler;
diff --git a/src/pages/api/usage.ts b/src/pages/api/usage.ts
new file mode 100644
index 00000000..87c6690f
--- /dev/null
+++ b/src/pages/api/usage.ts
@@ -0,0 +1,40 @@
+import { NextApiRequest, NextApiResponse } from "next";
+import { getServerSession } from "next-auth/next";
+import { authOptions } from "./auth/[...nextauth]";
+import { getSubscriptionByEmail } from "./utils/subscription";
+import { getModel } from "@/utils";
+import { addUsage, getCurrentMonthUsage } from "./utils/usage";
+import { getEndUser } from "./auth/end-user";
+import { Quota } from "@/types";
+
+const handler = async (req: NextApiRequest, res: NextApiResponse) => {
+ if (req.method !== "GET" && req.method !== "POST") {
+ return res.status(405).json([]);
+ }
+
+ const endUser = await getEndUser(req, res);
+
+ // Get from server session if available
+ const serverSession = await getServerSession(req, res, authOptions);
+ let subscripion = serverSession?.user?.subscription;
+ if (!subscripion) {
+ subscripion = await getSubscriptionByEmail(endUser);
+ }
+
+ let usage = 0;
+ if (req.method === "GET") {
+ usage = await getCurrentMonthUsage(endUser);
+ } else if (req.method === "POST") {
+ const model = getModel((req.headers["x-openai-model"] as string) || "");
+ usage = await addUsage(endUser, model.cost_per_call);
+ }
+
+ const quota: Quota = {
+ current: usage,
+ limit: subscripion.quota,
+ };
+
+ res.status(200).json(quota);
+};
+
+export default handler;
diff --git a/src/pages/api/utils/payment.ts b/src/pages/api/utils/payment.ts
new file mode 100644
index 00000000..179fe009
--- /dev/null
+++ b/src/pages/api/utils/payment.ts
@@ -0,0 +1,25 @@
+import { Payment } from "@/types";
+import { PrismaClient } from "@prisma/client";
+
+const prisma = new PrismaClient();
+
+export const getPaymentListByEmail = async (email: string): Promise => {
+ const payments = await prisma.payment.findMany({
+ where: { email: email },
+ orderBy: { createdAt: "desc" },
+ });
+
+ const result: Payment[] = [];
+ for (const payment of payments) {
+ result.push({
+ id: payment.id,
+ email: payment.email,
+ createdAt: payment.createdAt.getTime(),
+ amount: payment.amount,
+ currency: payment.currency,
+ receipt: payment.receipt,
+ description: payment.description,
+ });
+ }
+ return result;
+};
diff --git a/src/pages/api/utils/subscription.ts b/src/pages/api/utils/subscription.ts
new file mode 100644
index 00000000..54282fd2
--- /dev/null
+++ b/src/pages/api/utils/subscription.ts
@@ -0,0 +1,47 @@
+import { PlanConfig, PlanType, Subscription } from "@/types";
+import { PrismaClient } from "@prisma/client";
+
+const prisma = new PrismaClient();
+
+export const getSubscriptionByEmail = async (email: string): Promise => {
+ const subscriptions = await prisma.subscription.findMany({
+ where: { email: email },
+ orderBy: { expireAt: "desc" },
+ });
+
+ // Return the latest active subscription if exists.
+ for (const subscription of subscriptions) {
+ const result: Subscription = {
+ id: subscription.id,
+ plan: subscription.plan as PlanType,
+ quota: PlanConfig[subscription.plan].quota,
+ startAt: subscription.startAt.getTime(),
+ expireAt: subscription.expireAt.getTime(),
+ canceledAt: subscription.canceledAt?.getTime(),
+ };
+ if (!result.canceledAt && result.expireAt > Date.now()) {
+ return result;
+ }
+ }
+
+ // Return the latest subscripion if exists.
+ for (const subscription of subscriptions) {
+ return {
+ id: subscription.id,
+ plan: subscription.plan as PlanType,
+ quota: PlanConfig["FREE"].quota,
+ startAt: subscription.startAt.getTime(),
+ expireAt: subscription.expireAt.getTime(),
+ canceledAt: subscription.canceledAt?.getTime(),
+ };
+ }
+
+ // Return a FREE subscription.
+ return {
+ id: "",
+ plan: "FREE",
+ quota: PlanConfig["FREE"].quota,
+ startAt: 0,
+ expireAt: 0,
+ };
+};
diff --git a/src/pages/api/utils/usage.ts b/src/pages/api/utils/usage.ts
new file mode 100644
index 00000000..c8fa0e1d
--- /dev/null
+++ b/src/pages/api/utils/usage.ts
@@ -0,0 +1,59 @@
+import { PrismaClient } from "@prisma/client";
+
+const prisma = new PrismaClient();
+
+export const getCurrentMonthUsage = async (endUser: string): Promise => {
+ const now = new Date();
+ const start = new Date(now.getFullYear(), now.getMonth(), 1);
+ const end = new Date(now.getFullYear(), now.getMonth() + 1, 1);
+ const aggregations = await prisma.usage.aggregate({
+ _sum: {
+ count: true,
+ },
+ where: {
+ endUser: endUser,
+ createdAt: {
+ gte: start,
+ lt: end,
+ },
+ },
+ });
+
+ return aggregations._sum.count || 0;
+};
+
+// We coerce individual usage to the begining of the day to reduce the usage records.
+export const addUsage = async (endUser: string, addition: number): Promise => {
+ const now = new Date();
+ const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
+ const usage = await prisma.usage.findFirst({
+ where: {
+ endUser: endUser,
+ createdAt: today,
+ },
+ });
+
+ let newUsage = 0;
+ if (usage) {
+ newUsage = usage.count + addition;
+ await prisma.usage.update({
+ where: {
+ id: usage.id,
+ },
+ data: {
+ count: newUsage,
+ },
+ });
+ } else {
+ newUsage = addition;
+ await prisma.usage.create({
+ data: {
+ endUser: endUser,
+ createdAt: today,
+ count: newUsage,
+ },
+ });
+ }
+
+ return newUsage;
+};
diff --git a/src/pages/api/webhook/index.ts b/src/pages/api/webhook/index.ts
new file mode 100644
index 00000000..dbaf7aa2
--- /dev/null
+++ b/src/pages/api/webhook/index.ts
@@ -0,0 +1,129 @@
+import { PrismaClient, Prisma, SubscriptionPlan } from "@prisma/client";
+import { buffer } from "micro";
+import Cors from "micro-cors";
+import { NextApiRequest, NextApiResponse } from "next";
+import Stripe from "stripe";
+import { getSubscriptionByEmail } from "../utils/subscription";
+import { getPlanFromPriceId } from "@/utils";
+
+const stripe = new Stripe(process.env.STRIPE_API_KEY, {
+ // https://github.com/stripe/stripe-node#configuration
+ apiVersion: "2022-11-15",
+});
+
+const webhookSecret: string = process.env.STRIPE_WEBHOOK_SECRET!;
+const prisma = new PrismaClient();
+
+// Stripe requires the raw body to construct the event.
+export const config = {
+ api: {
+ bodyParser: false,
+ },
+};
+
+const cors = Cors({
+ allowMethods: ["POST", "HEAD"],
+});
+
+const webhookHandler = async (req: NextApiRequest, res: NextApiResponse) => {
+ if (req.method === "POST") {
+ const buf = await buffer(req);
+ const sig = req.headers["stripe-signature"]!;
+
+ let event: Stripe.Event;
+
+ try {
+ event = stripe.webhooks.constructEvent(buf.toString(), sig, webhookSecret);
+ } catch (err) {
+ const errorMessage = err instanceof Error ? err.message : "Unknown error";
+ // On error, log and return the error message.
+ if (err! instanceof Error) console.log(err);
+ console.log(`❌ Error message: ${errorMessage}`);
+ res.status(400).send(`Webhook Error: ${errorMessage}`);
+ return;
+ }
+
+ // Cast event data to Stripe object.
+ if (event.type === "payment_intent.succeeded") {
+ const paymentIntent = event.data.object as Stripe.PaymentIntent;
+ const charge = await stripe.charges.retrieve(paymentIntent.latest_charge as string);
+
+ let plan;
+ try {
+ plan = getPlanFromPriceId(paymentIntent.metadata.price);
+ } catch (err) {
+ console.log(err);
+ res.status(400).send(`Invalid price id: ${paymentIntent.metadata.price}`);
+ return;
+ }
+
+ const customerId = paymentIntent.customer as string;
+ if (customerId) {
+ // Save the stripe customer id so that we can relate this customer to future payments.
+ await prisma.user.update({
+ where: {
+ email: paymentIntent.metadata.email,
+ },
+ data: {
+ stripeId: customerId,
+ },
+ });
+ }
+
+ const user = await prisma.user.findUniqueOrThrow({
+ where: { email: paymentIntent.metadata.email },
+ });
+
+ const payment: Prisma.PaymentUncheckedCreateInput = {
+ userId: user.id,
+ email: paymentIntent.metadata.email,
+ createdAt: new Date(paymentIntent.created * 1000),
+ paymentId: paymentIntent.id,
+ customerId: customerId || "",
+ description: plan.description,
+ amount: paymentIntent.amount,
+ currency: paymentIntent.currency,
+ receipt: charge.receipt_url as string,
+ };
+ await prisma.payment.create({ data: payment });
+
+ const currentSubscription = await getSubscriptionByEmail(paymentIntent.metadata.email);
+ // Create a new subscription if there is no active paid subscription.
+ if (currentSubscription.plan === "FREE" || currentSubscription.canceledAt || currentSubscription.expireAt < new Date().getTime()) {
+ const today = new Date(new Date().setHours(0, 0, 0, 0));
+ // Subtract 1 second from the year from now to make it 23:59:59
+ const yearFromNow = new Date(new Date(new Date().setHours(0, 0, 0, 0)).setMonth(today.getMonth() + plan.month) - 1000);
+ const subscription: Prisma.SubscriptionUncheckedCreateInput = {
+ userId: user.id,
+ email: paymentIntent.metadata.email,
+ createdAt: new Date(paymentIntent.created * 1000),
+ startAt: today,
+ expireAt: yearFromNow,
+ plan: paymentIntent.metadata.plan as SubscriptionPlan,
+ };
+ await prisma.subscription.create({ data: subscription });
+ } else {
+ // Extend the current subscription if there is an active paid subscription.
+ const expireAt = new Date(Math.max(currentSubscription.expireAt, new Date().getTime()));
+ expireAt.setMonth(expireAt.getMonth() + plan.month);
+ await prisma.subscription.update({
+ where: { id: currentSubscription.id },
+ data: {
+ expireAt,
+ },
+ });
+ }
+ } else if (event.type === "payment_intent.payment_failed") {
+ const paymentIntent = event.data.object as Stripe.PaymentIntent;
+ console.log(`❌ Payment failed: ${paymentIntent.last_payment_error?.message}`);
+ }
+
+ // Return a response to acknowledge receipt of the event.
+ res.json({ received: true });
+ } else {
+ res.setHeader("Allow", "POST");
+ res.status(405).end("Method Not Allowed");
+ }
+};
+
+export default cors(webhookHandler as any);
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index 69707b40..9b5f777d 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -2,65 +2,39 @@ import { NextPage } from "next";
import Head from "next/head";
import dynamic from "next/dynamic";
import Script from "next/script";
-import React, { useEffect } from "react";
-import { ResponsiveWidth, useLayoutStore } from "@/store";
+import React from "react";
// Use dynamic import to avoid page hydrated.
// reference: https://github.com/pmndrs/zustand/issues/1145#issuecomment-1316431268
const ConnectionSidebar = dynamic(() => import("@/components/ConnectionSidebar"), {
ssr: false,
});
-const ChatView = dynamic(() => import("@/components/ChatView"), {
+const ConversationView = dynamic(() => import("@/components/ConversationView"), {
ssr: false,
});
const QueryDrawer = dynamic(() => import("@/components/QueryDrawer"), {
ssr: false,
});
-const ChatPage: NextPage = () => {
- const layoutStore = useLayoutStore();
-
- useEffect(() => {
- const handleWindowResize = () => {
- if (window.innerWidth < ResponsiveWidth.lg) {
- layoutStore.toggleSidebar(false);
- } else {
- layoutStore.toggleSidebar(true);
- }
- };
-
- handleWindowResize();
- window.addEventListener("resize", handleWindowResize);
-
- return () => {
- window.removeEventListener("resize", handleWindowResize);
- };
- }, []);
-
+const IndexPage: NextPage = () => {
return (
-
SQL Chat
-
-
+
SQL Chat - Chat-based SQL Client and Editor for the next decade
+
-
+
+
-
- layoutStore.toggleSidebar(e.target.checked)}
- />
-
- {/* Render sidebar after chatview to prevent z-index problem */}
+ SQL Chat
+
+
+
@@ -69,4 +43,4 @@ const ChatPage: NextPage = () => {
);
};
-export default ChatPage;
+export default IndexPage;
diff --git a/src/pages/privacy/index.tsx b/src/pages/privacy/index.tsx
new file mode 100644
index 00000000..67a8921b
--- /dev/null
+++ b/src/pages/privacy/index.tsx
@@ -0,0 +1,17 @@
+import { NextPage } from "next";
+import Head from "next/head";
+import MarkdownRenderer from "@/components/MarkdownRenderer";
+
+const PrivacyPage: NextPage = () => {
+ return (
+ <>
+
+ Privacy
+
+
+
+ >
+ );
+};
+
+export default PrivacyPage;
diff --git a/src/pages/setting/index.tsx b/src/pages/setting/index.tsx
new file mode 100644
index 00000000..e824b46a
--- /dev/null
+++ b/src/pages/setting/index.tsx
@@ -0,0 +1,182 @@
+import { NextPage } from "next";
+import Head from "next/head";
+import { useRouter } from "next/router";
+import { Fragment, useState } from "react";
+import { useTranslation } from "react-i18next";
+import Link from "next/link";
+import { Dialog, Transition } from "@headlessui/react";
+import { ArrowUturnLeftIcon, Bars3Icon, Cog6ToothIcon, XMarkIcon, CreditCardIcon } from "@heroicons/react/24/outline";
+import SettingGeneralView from "../../components/SettingGeneralView";
+import StripeCheckPaymentBanner from "../../components/StripeCheckPaymentBanner";
+
+function classNames(...classes: string[]) {
+ return classes.filter(Boolean).join(" ");
+}
+
+const SettingPage: NextPage = () => {
+ const { t } = useTranslation();
+ const router = useRouter();
+ const [sidebarOpen, setSidebarOpen] = useState(false);
+
+ const navigation = [
+ {
+ name: t("common.back"),
+ href: "/",
+ icon: ArrowUturnLeftIcon,
+ current: false,
+ },
+ {
+ name: t("setting.general"),
+ href: "/setting",
+ icon: Cog6ToothIcon,
+ current: true,
+ },
+ ];
+
+ return (
+ <>
+
+ {t("setting.self")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ setSidebarOpen(false)}>
+ Close sidebar
+
+
+
+
+ {/* Sidebar component, swap this element with another sidebar if you like */}
+
+
+
+
+
+
+
+
+ {navigation.map((item) => (
+
+
+
+ {item.name}
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+ {/* Static sidebar for desktop */}
+
+ {/* Sidebar component, swap this element with another sidebar if you like */}
+
+
+
+
+
+
+
+
+ {navigation.map((item) => (
+
+
+
+ {item.name}
+
+
+ ))}
+
+
+
+
+
+
+
+
+ setSidebarOpen(true)}>
+ Open sidebar
+
+
+
+
+
+ {router.query.session_id && }
+
+
+
+
+
+ >
+ );
+};
+
+export default SettingPage;
diff --git a/src/pages/terms/index.tsx b/src/pages/terms/index.tsx
new file mode 100644
index 00000000..c3171d0a
--- /dev/null
+++ b/src/pages/terms/index.tsx
@@ -0,0 +1,17 @@
+import { NextPage } from "next";
+import Head from "next/head";
+import MarkdownRenderer from "@/components/MarkdownRenderer";
+
+const PrivacyPage: NextPage = () => {
+ return (
+ <>
+
+ Terms
+
+
+
+ >
+ );
+};
+
+export default PrivacyPage;
diff --git a/src/store/assistant.ts b/src/store/assistant.ts
index 0fc3028b..50580aed 100644
--- a/src/store/assistant.ts
+++ b/src/store/assistant.ts
@@ -1,30 +1,20 @@
import { first } from "lodash-es";
-import { Id, User } from "@/types";
+import { Assistant, Id } from "@/types";
+import * as customAssistantList from "../../assistants";
-// Assistant is a special user.
-export const assistantList: User[] = [
- {
- id: "sql-assistant",
- name: "SQL Chat",
- description: "🤖️ I'm an expert in SQL. I can answer your questions about databases and SQL.",
- avatar: "",
- },
-];
+export const SQLChatBotId = "sql-chat-bot";
+
+export const assistantList: Assistant[] = Object.keys(customAssistantList).map((name) => {
+ return {
+ ...((customAssistantList as any)[name].default as Assistant),
+ };
+});
export const getAssistantById = (id: Id) => {
- const user = assistantList.find((user) => user.id === id);
- return user || (first(assistantList) as User);
+ const assistant = assistantList.find((assistant) => assistant.id === id);
+ return assistant || (first(assistantList) as Assistant);
};
-// getPromptOfAssistant define the special prompt for each assistant.
-export const getPromptGeneratorOfAssistant = (assistant: User) => {
- const basicPrompt = `Please follow the instructions to answer the questions:
-1. Set the language to the markdown code block for each code block. For example, \`SELECT * FROM table\` is SQL.
-2. Please be careful to return only key information, and try not to make it too long.
-`;
- if (assistant.id === "sql-assistant") {
- return (schema: string) =>
- `This is my database schema"${schema}". You will see the tables and columns in the database. And please answer the following questions about the database.\n${basicPrompt}`;
- }
- return () => `\n${basicPrompt}`;
+export const getPromptGeneratorOfAssistant = (assistant: Assistant) => {
+ return assistant.getPrompt;
};
diff --git a/src/store/chat.ts b/src/store/chat.ts
deleted file mode 100644
index 54b838d8..00000000
--- a/src/store/chat.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import dayjs from "dayjs";
-import { create } from "zustand";
-import { persist } from "zustand/middleware";
-import { Chat, Id } from "@/types";
-import { generateUUID } from "@/utils";
-
-const getDefaultChat = (): Chat => {
- return {
- id: generateUUID(),
- assistantId: "sql-assistant",
- title: dayjs().format("LTS"),
- createdAt: Date.now(),
- };
-};
-
-interface ChatState {
- chatList: Chat[];
- currentChat?: Chat;
- getState: () => ChatState;
- createChat: (connectionId?: Id, databaseName?: string) => Chat;
- setCurrentChat: (chat: Chat | undefined) => void;
- getChatById: (chatId: Id) => Chat | undefined;
- updateChat: (chatId: Id, chat: Partial) => void;
- clearChat: (filter: (chat: Chat) => boolean) => void;
-}
-
-export const useChatStore = create()(
- persist(
- (set, get) => ({
- chatList: [],
- getState: () => get(),
- createChat: (connectionId?: Id, databaseName?: string) => {
- const chat: Chat = {
- ...getDefaultChat(),
- connectionId,
- databaseName,
- };
- set((state) => ({
- chatList: [...state.chatList, chat],
- currentChat: chat,
- }));
- return chat;
- },
- setCurrentChat: (chat: Chat | undefined) => set(() => ({ currentChat: chat })),
- getChatById: (chatId: Id) => {
- return get().chatList.find((item) => item.id === chatId);
- },
- updateChat: (chatId: Id, chat: Partial) => {
- set((state) => ({
- ...state,
- chatList: state.chatList.map((item) => (item.id === chatId ? { ...item, ...chat } : item)),
- }));
- },
- clearChat: (filter: (chat: Chat) => boolean) => {
- set((state) => ({
- ...state,
- chatList: state.chatList.filter(filter),
- }));
- },
- }),
- {
- name: "chat-storage",
- }
- )
-);
diff --git a/src/store/connection.ts b/src/store/connection.ts
index 2f9d25ba..0c22ad51 100644
--- a/src/store/connection.ts
+++ b/src/store/connection.ts
@@ -2,8 +2,8 @@ import axios from "axios";
import { uniqBy } from "lodash-es";
import { create } from "zustand";
import { persist } from "zustand/middleware";
-import { Connection, Database, Engine, ResponseObject, Table } from "@/types";
-import { generateUUID } from "@/utils";
+import { Connection, Database, Engine, ResponseObject, Schema } from "@/types";
+import { countTextTokens, generateUUID } from "@/utils";
interface ConnectionContext {
connection: Connection;
@@ -14,11 +14,11 @@ const samplePGConnection: Connection = {
id: "sample-pg",
title: "Sample PostgreSQL",
engineType: Engine.PostgreSQL,
- host: "db.aqbxmomjsyqbacfsujwd.supabase.co",
- port: "",
- username: "readonly_user",
- password: "bytebase-sqlchat",
- database: "employee",
+ host: "ep-throbbing-thunder-042250-pooler.us-west-2.aws.neon.tech",
+ port: "5432",
+ username: "sqlchat_readonly",
+ password: "U5rI8tJMiKWp",
+ database: "sample-employee",
};
interface ConnectionState {
@@ -28,7 +28,7 @@ interface ConnectionState {
createConnection: (connection: Connection) => Connection;
setCurrentConnectionCtx: (connectionCtx: ConnectionContext | undefined) => void;
getOrFetchDatabaseList: (connection: Connection, skipCache?: boolean) => Promise;
- getOrFetchDatabaseSchema: (database: Database) => Promise;
+ getOrFetchDatabaseSchema: (database: Database, skipCache?: boolean) => Promise;
getConnectionById: (connectionId: string) => Connection | undefined;
updateConnection: (connectionId: string, connection: Partial) => void;
clearConnection: (filter: (connection: Connection) => boolean) => void;
@@ -67,12 +67,13 @@ export const useConnectionStore = create()(
const { data } = await axios.post("/api/connection/db", {
connection,
});
+
const fetchedDatabaseList = data.map(
(dbName) =>
({
connectionId: connection.id,
name: dbName,
- tableList: {},
+ schemaList: [],
} as Database)
);
const databaseList = uniqBy(
@@ -85,21 +86,44 @@ export const useConnectionStore = create()(
}));
return databaseList.filter((database) => database.connectionId === connection.id);
},
- getOrFetchDatabaseSchema: async (database: Database) => {
+ getOrFetchDatabaseSchema: async (database: Database, skipCache = false) => {
const state = get();
+
+ if (!skipCache) {
+ const db = state.databaseList.find((db) => db.connectionId === database.connectionId && db.name === database.name);
+ if (db !== undefined && Array.isArray(db.schemaList) && db.schemaList.length !== 0) {
+ return db.schemaList;
+ }
+ }
+
const connection = state.connectionList.find((connection) => connection.id === database.connectionId);
if (!connection) {
return [];
}
- const { data: result } = await axios.post>("/api/connection/db_schema", {
+ const { data: result } = await axios.post>("/api/connection/db_schema", {
connection,
db: database.name,
});
+
if (result.message) {
throw result.message;
}
- return result.data;
+
+ const fetchedTableList: Schema[] = result.data;
+ fetchedTableList.forEach((schema) => {
+ schema.tables.forEach((table) => {
+ table.token = countTextTokens(table.structure);
+ });
+ });
+ set((state) => ({
+ ...state,
+ databaseList: state.databaseList.map((item) =>
+ item.connectionId === database.connectionId && item.name === database.name ? { ...item, schemaList: fetchedTableList } : item
+ ),
+ }));
+
+ return fetchedTableList;
},
getConnectionById: (connectionId: string) => {
return get().connectionList.find((connection) => connection.id === connectionId);
@@ -119,6 +143,16 @@ export const useConnectionStore = create()(
}),
{
name: "connection-storage",
+ version: 1,
+ migrate: (persistedState: any, version: number) => {
+ let state = persistedState as ConnectionState;
+ if (version === 0) {
+ console.info(`migrate from ${version} to 1`);
+ // to clear old data. it will make refetch new schema List
+ state.databaseList = [];
+ }
+ return state;
+ },
}
)
);
diff --git a/src/store/conversation.ts b/src/store/conversation.ts
new file mode 100644
index 00000000..59f782f2
--- /dev/null
+++ b/src/store/conversation.ts
@@ -0,0 +1,101 @@
+import dayjs from "dayjs";
+import { create } from "zustand";
+import { persist } from "zustand/middleware";
+import { Conversation, Id } from "@/types";
+import { generateUUID } from "@/utils";
+import { SQLChatBotId } from ".";
+
+const getDefaultConversation = (): Conversation => {
+ return {
+ id: generateUUID(),
+ assistantId: SQLChatBotId,
+ title: dayjs().format("LTS"),
+ createdAt: Date.now(),
+ };
+};
+
+interface ConversationState {
+ getState: () => ConversationState;
+ conversationList: Conversation[];
+ currentConversationId?: Id;
+ createConversation: (connectionId?: Id, databaseName?: string) => Conversation;
+ setCurrentConversationId: (conversationId: Id | undefined) => void;
+ getConversationById: (conversationId: Id | undefined) => Conversation | undefined;
+ updateConversation: (conversationId: Id, conversation: Partial) => void;
+ clearConversation: (filter: (conversation: Conversation) => boolean) => void;
+ updateSelectedTablesNameList: (selectedTableNameList: string[]) => void;
+ updateSelectedSchemaName: (selectedSchemaName: string) => void;
+}
+
+export const useConversationStore = create()(
+ persist(
+ (set, get) => ({
+ getState: () => get(),
+ conversationList: [],
+ createConversation: (connectionId?: Id, databaseName?: string) => {
+ const conversation: Conversation = {
+ ...getDefaultConversation(),
+ connectionId,
+ databaseName,
+ };
+ if (connectionId) {
+ conversation.assistantId = SQLChatBotId;
+ }
+ set((state: ConversationState) => ({
+ conversationList: [...state.conversationList, conversation],
+ currentConversationId: conversation.id,
+ }));
+ return conversation;
+ },
+ setCurrentConversationId: (conversation: Id | undefined) => set(() => ({ currentConversationId: conversation })),
+ getConversationById: (conversationId: Id | undefined) => {
+ return get().conversationList.find((item: Conversation) => item.id === conversationId);
+ },
+ updateConversation: (conversationId: Id, conversation: Partial) => {
+ set((state: ConversationState) => ({
+ ...state,
+ conversationList: state.conversationList.map((item: Conversation) =>
+ item.id === conversationId ? { ...item, ...conversation } : item
+ ),
+ }));
+ },
+ clearConversation: (filter: (conversation: Conversation) => boolean) => {
+ set((state: ConversationState) => ({
+ ...state,
+ conversationList: state.conversationList.filter(filter),
+ }));
+ },
+ updateSelectedTablesNameList: (selectedTableNameList: string[]) => {
+ const currentConversation = get().getConversationById(get().currentConversationId);
+ if (currentConversation) {
+ get().updateConversation(currentConversation.id, {
+ selectedTableNameList,
+ });
+ }
+ },
+ updateSelectedSchemaName: (selectedSchemaName: string) => {
+ const currentConversation = get().getConversationById(get().currentConversationId);
+ if (currentConversation) {
+ get().updateConversation(currentConversation.id, {
+ selectedSchemaName,
+ });
+ }
+ },
+ }),
+ {
+ name: "conversation-storage",
+ version: 1,
+ migrate: (persistedState: any, version: number) => {
+ let state = persistedState as ConversationState;
+ if (version === 0) {
+ for (const conversation of state.conversationList) {
+ conversation.assistantId = SQLChatBotId;
+ }
+ state.currentConversationId = undefined;
+ }
+
+ return state;
+ },
+ }
+ )
+);
diff --git a/src/store/index.ts b/src/store/index.ts
index e3cfd45b..3413a561 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -1,7 +1,8 @@
export * from "./user";
export * from "./assistant";
export * from "./connection";
-export * from "./chat";
+export * from "./conversation";
export * from "./message";
export * from "./layout";
export * from "./query";
+export * from "./setting";
diff --git a/src/store/layout.ts b/src/store/layout.ts
index 675905f4..52574ffc 100644
--- a/src/store/layout.ts
+++ b/src/store/layout.ts
@@ -4,16 +4,18 @@ import { create } from "zustand";
// reference: https://tailwindcss.com/docs/responsive-design
export enum ResponsiveWidth {
sm = 640,
- lg = 1024,
}
interface LayoutState {
showSidebar: boolean;
+ isMobileView: boolean;
toggleSidebar: (show?: boolean) => void;
+ setIsMobileView: (value: boolean) => void;
}
export const useLayoutStore = create()((set) => ({
showSidebar: true,
+ isMobileView: false,
toggleSidebar: (show) => {
if (isUndefined(show)) {
set((state) => ({
@@ -27,4 +29,10 @@ export const useLayoutStore = create()((set) => ({
}));
}
},
+ setIsMobileView: (value) => {
+ set((state) => ({
+ ...state,
+ isMobileView: value,
+ }));
+ },
}));
diff --git a/src/store/message.ts b/src/store/message.ts
index fbcaa080..666b18cc 100644
--- a/src/store/message.ts
+++ b/src/store/message.ts
@@ -7,6 +7,7 @@ interface MessageState {
getState: () => MessageState;
addMessage: (message: Message) => void;
updateMessage: (messageId: Id, message: Partial) => void;
+ updateStatement: (messageId: Id, originalStatement: string, replacementStatement: string) => void;
clearMessage: (filter: (message: Message) => boolean) => void;
}
@@ -22,6 +23,16 @@ export const useMessageStore = create()(
messageList: state.messageList.map((item) => (item.id === messageId ? { ...item, ...message } : item)),
}));
},
+ updateStatement: (messageId: Id, originalStatement: string, replacementStatement: string) => {
+ if (!originalStatement) return;
+ const newMessage = get().messageList.find((message) => message.id == messageId);
+ if (!newMessage) return;
+ newMessage.content = newMessage.content.replace(originalStatement, replacementStatement);
+ set((state) => ({
+ ...state,
+ messageList: state.messageList.map((item) => (item.id === messageId ? newMessage : item)),
+ }));
+ },
clearMessage: (filter: (message: Message) => boolean) => set((state) => ({ messageList: state.messageList.filter(filter) })),
}),
{
diff --git a/src/store/query.ts b/src/store/query.ts
index ac66270e..81cb7a99 100644
--- a/src/store/query.ts
+++ b/src/store/query.ts
@@ -1,31 +1,54 @@
+import { merge } from "lodash-es";
import { create } from "zustand";
-import { Connection, Database } from "@/types";
+import { persist } from "zustand/middleware";
+import { Connection, Database, Id, Timestamp } from "@/types";
interface ExecuteQueryContext {
connection: Connection;
database?: Database;
+ messageId?: Id;
statement: string;
}
+interface QueryHistory {
+ context: ExecuteQueryContext;
+ createdAt: Timestamp;
+}
+
interface QueryState {
- context?: ExecuteQueryContext;
showDrawer: boolean;
+ queryHistory: QueryHistory[];
+ context?: ExecuteQueryContext;
toggleDrawer: (show?: boolean) => void;
setContext: (context: ExecuteQueryContext | undefined) => void;
}
-export const useQueryStore = create()((set) => ({
- showDrawer: false,
- toggleDrawer: (show) => {
- set((state) => ({
- ...state,
- showDrawer: show ?? !state.showDrawer,
- }));
- },
- setContext: (context) => {
- set((state) => ({
- ...state,
- context,
- }));
- },
-}));
+export const useQueryStore = create()(
+ persist(
+ (set) => ({
+ showDrawer: false,
+ queryHistory: [],
+ toggleDrawer: (show) => {
+ set((state) => ({
+ ...state,
+ showDrawer: show ?? !state.showDrawer,
+ }));
+ },
+ setContext: (context) => {
+ set((state) => ({
+ ...state,
+ context,
+ }));
+ },
+ }),
+ {
+ name: "query-storage",
+ merge: (persistedState, currentState) => {
+ return {
+ ...merge(currentState, persistedState),
+ context: undefined,
+ };
+ },
+ }
+ )
+);
diff --git a/src/store/setting.ts b/src/store/setting.ts
new file mode 100644
index 00000000..b51abaac
--- /dev/null
+++ b/src/store/setting.ts
@@ -0,0 +1,61 @@
+import { merge } from "lodash-es";
+import { create } from "zustand";
+import { persist } from "zustand/middleware";
+import { Setting } from "@/types";
+
+const getDefaultSetting = (): Setting => {
+ return {
+ locale: "en",
+ theme: "system",
+ openAIApiConfig: {
+ key: "",
+ endpoint: "",
+ model: "gpt-3.5-turbo",
+ },
+ };
+};
+
+interface SettingState {
+ setting: Setting;
+ getState: () => SettingState;
+ setLocale: (locale: Setting["locale"]) => void;
+ setTheme: (theme: Setting["theme"]) => void;
+ setOpenAIApiConfig: (openAIApiConfig: Setting["openAIApiConfig"]) => void;
+}
+
+export const useSettingStore = create()(
+ persist(
+ (set, get) => ({
+ setting: getDefaultSetting(),
+ getState: () => get(),
+ setLocale: (locale: Setting["locale"]) => {
+ set({
+ setting: {
+ ...get().setting,
+ locale,
+ },
+ });
+ },
+ setTheme: (theme: Setting["theme"]) => {
+ set({
+ setting: {
+ ...get().setting,
+ theme,
+ },
+ });
+ },
+ setOpenAIApiConfig: (openAIApiConfig: Setting["openAIApiConfig"]) => {
+ set({
+ setting: {
+ ...get().setting,
+ openAIApiConfig,
+ },
+ });
+ },
+ }),
+ {
+ name: "setting-storage",
+ merge: (persistedState, currentState) => merge(currentState, persistedState),
+ }
+ )
+);
diff --git a/src/styles/data-table.css b/src/styles/data-table.css
index 91b7b045..48e02215 100644
--- a/src/styles/data-table.css
+++ b/src/styles/data-table.css
@@ -1,3 +1,14 @@
.rdt_Pagination {
- border-top: none !important;
+ @apply !border-t-0 dark:bg-zinc-800 dark:text-gray-300;
+}
+
+.rdt_Pagination button {
+ @apply dark:bg-zinc-800 dark:text-gray-300 dark:fill-gray-300;
+}
+
+.rdt_Table,
+.rdt_TableHead,
+.rdt_TableHeadRow,
+.rdt_TableRow {
+ @apply dark:bg-zinc-800 dark:text-gray-300;
}
diff --git a/src/styles/global.css b/src/styles/global.css
index 88040013..5d919ff4 100644
--- a/src/styles/global.css
+++ b/src/styles/global.css
@@ -3,6 +3,5 @@ body,
body > div:first-child,
div#__next,
div#__next > div {
- width: 100%;
- height: 100%;
+ @apply w-full h-full dark:text-gray-300;
}
diff --git a/src/styles/mui.css b/src/styles/mui.css
new file mode 100644
index 00000000..5681eab6
--- /dev/null
+++ b/src/styles/mui.css
@@ -0,0 +1,3 @@
+.MuiPaper-root {
+ @apply dark:bg-zinc-800;
+}
diff --git a/src/styles/tailwind.css b/src/styles/tailwind.css
index f336a04b..ac732086 100644
--- a/src/styles/tailwind.css
+++ b/src/styles/tailwind.css
@@ -13,3 +13,15 @@
display: none;
}
}
+
+.btn {
+ @apply flex flex-row justify-center items-center text-base px-3 py-2 rounded-lg border border-none outline-none bg-zinc-600 text-gray-200 hover:opacity-80 disabled:!opacity-60 disabled:cursor-not-allowed;
+}
+
+.btn-outline {
+ @apply border-none bg-transparent text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-zinc-800;
+}
+
+.btn-error {
+ @apply bg-red-100 text-red-600 border-red-600;
+}
diff --git a/src/types/assistant.ts b/src/types/assistant.ts
new file mode 100644
index 00000000..a31d90fa
--- /dev/null
+++ b/src/types/assistant.ts
@@ -0,0 +1,7 @@
+export interface Assistant {
+ id: string;
+ name: string;
+ description: string;
+ avatar: string;
+ getPrompt: (input?: string) => string;
+}
diff --git a/src/types/connection.ts b/src/types/connection.ts
index 2500c536..b7bb64c1 100644
--- a/src/types/connection.ts
+++ b/src/types/connection.ts
@@ -3,12 +3,19 @@ import { Id } from ".";
export enum Engine {
MySQL = "MYSQL",
PostgreSQL = "POSTGRESQL",
+ MSSQL = "MSSQL",
+ TiDB = "TiDB",
+ Snowflake = "SNOWFLAKE",
+ Hive = "HIVE",
+ OceanBase = "OCEANBASE",
}
-interface SSLOptions {
+export interface SSLOptions {
ca?: string;
cert?: string;
key?: string;
+ minVersion?: string;
+ rejectUnauthorized?: boolean;
}
export interface Connection {
@@ -21,5 +28,7 @@ export interface Connection {
password: string;
// database is only required for PostgreSQL.
database?: string;
+ // encrypt is only required for MSSQL.
+ encrypt?: boolean;
ssl?: SSLOptions;
}
diff --git a/src/types/connector.ts b/src/types/connector.ts
new file mode 100644
index 00000000..cead8e92
--- /dev/null
+++ b/src/types/connector.ts
@@ -0,0 +1,9 @@
+export type RawResult = {
+ [key: string]: any;
+};
+
+export interface ExecutionResult {
+ rawResult: RawResult[];
+ affectedRows?: number;
+ error?: string;
+}
diff --git a/src/types/chat.ts b/src/types/conversation.ts
similarity index 61%
rename from src/types/chat.ts
rename to src/types/conversation.ts
index 520949ea..b629c922 100644
--- a/src/types/chat.ts
+++ b/src/types/conversation.ts
@@ -1,9 +1,11 @@
import { Id, Timestamp } from ".";
-export interface Chat {
+export interface Conversation {
id: string;
connectionId?: Id;
databaseName?: string;
+ selectedTableNameList?: string[];
+ selectedSchemaName?: string;
assistantId: Id;
title: string;
createdAt: Timestamp;
diff --git a/src/types/database.ts b/src/types/database.ts
index 2d86fdb9..30b12612 100644
--- a/src/types/database.ts
+++ b/src/types/database.ts
@@ -1,9 +1,8 @@
import { Id } from ".";
-
export interface Database {
connectionId: Id;
name: string;
- tableList: Table[];
+ schemaList: Schema[];
}
export interface Table {
@@ -11,4 +10,9 @@ export interface Table {
// structure is a string of the table structure.
// It's mainly used for providing a chat context for the assistant.
structure: string;
+ token?: number;
+}
+export interface Schema {
+ name: string;
+ tables: Table[];
}
diff --git a/src/types/index.ts b/src/types/index.ts
index 99fcea97..bdeb2706 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -2,6 +2,11 @@ export * from "./common";
export * from "./user";
export * from "./connection";
export * from "./database";
-export * from "./chat";
+export * from "./conversation";
export * from "./message";
+export * from "./setting";
export * from "./api";
+export * from "./connector";
+export * from "./assistant";
+export * from "./quota";
+export * from "./subscription";
diff --git a/src/types/message.ts b/src/types/message.ts
index d9270868..c325f455 100644
--- a/src/types/message.ts
+++ b/src/types/message.ts
@@ -10,7 +10,7 @@ type MessageStatus = "LOADING" | "DONE" | "FAILED";
export interface Message {
id: Id;
- chatId: string;
+ conversationId: string;
creatorId: Id;
creatorRole: CreatorRole;
createdAt: Timestamp;
diff --git a/src/types/quota.ts b/src/types/quota.ts
new file mode 100644
index 00000000..c742d0bb
--- /dev/null
+++ b/src/types/quota.ts
@@ -0,0 +1,4 @@
+export interface Quota {
+ current: number;
+ limit: number;
+}
diff --git a/src/types/setting.ts b/src/types/setting.ts
new file mode 100644
index 00000000..886dbf26
--- /dev/null
+++ b/src/types/setting.ts
@@ -0,0 +1,15 @@
+export type Locale = "en" | "zh" | "zhHant" | "es" | "jp" | "de" | "th";
+
+export type Theme = "light" | "dark" | "system";
+
+export interface OpenAIApiConfig {
+ key: string;
+ endpoint: string;
+ model: string;
+}
+
+export interface Setting {
+ locale: Locale;
+ theme: Theme;
+ openAIApiConfig: OpenAIApiConfig;
+}
diff --git a/src/types/subscription.ts b/src/types/subscription.ts
new file mode 100644
index 00000000..f3bbdc10
--- /dev/null
+++ b/src/types/subscription.ts
@@ -0,0 +1,39 @@
+import { SubscriptionPlan } from "@prisma/client";
+
+export type PlanType = SubscriptionPlan | "GUEST" | "FREE";
+
+// Quota is by month
+export const PlanConfig: {
+ [key: string]: {
+ quota: number;
+ };
+} = {
+ GUEST: {
+ quota: 0,
+ },
+ FREE: {
+ quota: 20,
+ },
+ PRO: {
+ quota: 1000,
+ },
+};
+
+export interface Subscription {
+ id: string;
+ plan: PlanType;
+ quota: number;
+ startAt: number;
+ expireAt: number;
+ canceledAt?: number;
+}
+
+export interface Payment {
+ id: string;
+ email: string;
+ createdAt: number;
+ amount: number;
+ currency: string;
+ receipt: string;
+ description: string;
+}
diff --git a/src/utils/api-helpers.ts b/src/utils/api-helpers.ts
new file mode 100644
index 00000000..bd5537b5
--- /dev/null
+++ b/src/utils/api-helpers.ts
@@ -0,0 +1,36 @@
+export async function fetchGetJSON(url: string) {
+ try {
+ const data = await fetch(url).then((res) => res.json());
+ return data;
+ } catch (err) {
+ if (err instanceof Error) {
+ throw new Error(err.message);
+ }
+ throw err;
+ }
+}
+
+export async function fetchPostJSON(url: string, data?: {}) {
+ try {
+ // Default options are marked with *
+ const response = await fetch(url, {
+ method: "POST", // *GET, POST, PUT, DELETE, etc.
+ mode: "cors", // no-cors, *cors, same-origin
+ cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
+ credentials: "same-origin", // include, *same-origin, omit
+ headers: {
+ "Content-Type": "application/json",
+ // 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ redirect: "follow", // manual, *follow, error
+ referrerPolicy: "no-referrer", // no-referrer, *client
+ body: JSON.stringify(data || {}), // body data type must match "Content-Type" header
+ });
+ return await response.json(); // parses JSON response into native JavaScript objects
+ } catch (err) {
+ if (err instanceof Error) {
+ throw new Error(err.message);
+ }
+ throw err;
+ }
+}
diff --git a/src/utils/event-emitter.ts b/src/utils/event-emitter.ts
new file mode 100644
index 00000000..268fe3a3
--- /dev/null
+++ b/src/utils/event-emitter.ts
@@ -0,0 +1,37 @@
+export type EventType = "usage.update";
+
+type Callback = () => void;
+
+class EventEmitter {
+ private static instance: EventEmitter;
+ private events: { [eventName: string]: Callback[] } = {};
+
+ private constructor() {}
+
+ public static getInstance(): EventEmitter {
+ if (!EventEmitter.instance) {
+ EventEmitter.instance = new EventEmitter();
+ }
+ return EventEmitter.instance;
+ }
+
+ on(eventName: EventType, callback: Callback) {
+ if (!this.events[eventName]) {
+ this.events[eventName] = [];
+ }
+ this.events[eventName].push(callback);
+ }
+
+ emit(eventName: EventType) {
+ const callbacks = this.events[eventName];
+ if (callbacks) {
+ callbacks.forEach((callback) => callback());
+ }
+ }
+}
+
+const getEventEmitter = () => {
+ return EventEmitter.getInstance();
+};
+
+export default getEventEmitter;
diff --git a/src/utils/execution.ts b/src/utils/execution.ts
new file mode 100644
index 00000000..da5ab287
--- /dev/null
+++ b/src/utils/execution.ts
@@ -0,0 +1,12 @@
+import { ExecutionResult } from "@/types";
+
+export const getMessageFromExecutionResult = (result: ExecutionResult): string => {
+ if (result.error) {
+ return result.error;
+ }
+ // Only return the "rows affected" message if there are no raw results to display
+ if (result.affectedRows && (!result.rawResult || result.rawResult.length === 0)) {
+ return `${result.affectedRows} rows affected.`;
+ }
+ return "";
+};
diff --git a/src/utils/feature.ts b/src/utils/feature.ts
new file mode 100644
index 00000000..0ac417f7
--- /dev/null
+++ b/src/utils/feature.ts
@@ -0,0 +1,26 @@
+type FeatureType = "debug" | "account" | "payment" | "quota" | "collect";
+
+export const hasDatabase = () => {
+ return process.env.NEXT_PUBLIC_USE_DATABASE == "true";
+};
+
+const matrix: { [key: string]: { [feature: string]: boolean } } = {
+ development: {
+ debug: true,
+ account: hasDatabase(),
+ payment: hasDatabase(),
+ quota: hasDatabase(),
+ collect: hasDatabase(),
+ },
+ production: {
+ debug: false,
+ account: hasDatabase(),
+ payment: hasDatabase(),
+ quota: hasDatabase(),
+ collect: hasDatabase(),
+ },
+};
+
+export const hasFeature = (feature: FeatureType) => {
+ return matrix[process.env.NODE_ENV][feature];
+};
diff --git a/src/utils/get-stripejs.ts b/src/utils/get-stripejs.ts
new file mode 100644
index 00000000..ac3ae272
--- /dev/null
+++ b/src/utils/get-stripejs.ts
@@ -0,0 +1,14 @@
+/**
+ * This is a singleton to ensure we only instantiate Stripe once.
+ */
+import { Stripe, loadStripe } from "@stripe/stripe-js";
+
+let stripePromise: Promise;
+const getStripe = () => {
+ if (!stripePromise) {
+ stripePromise = loadStripe(process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY!);
+ }
+ return stripePromise;
+};
+
+export default getStripe;
diff --git a/src/utils/index.ts b/src/utils/index.ts
index 0a36f176..5886fcbf 100644
--- a/src/utils/index.ts
+++ b/src/utils/index.ts
@@ -1,3 +1,9 @@
export * from "./id";
export * from "./openai";
export * from "./sql";
+export * from "./execution";
+export * from "./model";
+export * from "./feature";
+export * from "./tidb";
+export * from "./misc";
+export * from "./plan";
diff --git a/src/utils/misc.ts b/src/utils/misc.ts
new file mode 100644
index 00000000..a753dfda
--- /dev/null
+++ b/src/utils/misc.ts
@@ -0,0 +1,22 @@
+export const getCurrencySymbol = (currencyCode: string): string => {
+ try {
+ return new Intl.NumberFormat("en-US", {
+ style: "currency",
+ currency: currencyCode,
+ })
+ .formatToParts(1)
+ .find((part) => part.type === "currency")!.value;
+ } catch (error) {
+ console.error(`Invalid currency code: ${currencyCode}`);
+ return "";
+ }
+};
+
+export const getDateString = (timeStamp = Date.now()): string => {
+ const dateOptions: Intl.DateTimeFormatOptions = {
+ year: "numeric",
+ month: "long",
+ day: "numeric",
+ };
+ return new Date(timeStamp).toLocaleDateString(undefined, dateOptions);
+};
diff --git a/src/utils/model.ts b/src/utils/model.ts
new file mode 100644
index 00000000..2541de72
--- /dev/null
+++ b/src/utils/model.ts
@@ -0,0 +1,55 @@
+const gpt35turbo = {
+ name: "gpt-3.5-turbo",
+ temperature: 0,
+ frequency_penalty: 0.0,
+ presence_penalty: 0.0,
+ max_token: 4000,
+ cost_per_call: 1,
+};
+
+const gpt4 = {
+ name: "gpt-4",
+ temperature: 0,
+ frequency_penalty: 0.0,
+ presence_penalty: 0.0,
+ max_token: 8000,
+ cost_per_call: 60,
+};
+
+const gpt4turbo = {
+ name: "gpt-4-turbo",
+ temperature: 0,
+ frequency_penalty: 0.0,
+ presence_penalty: 0.0,
+ max_token: 4000,
+ cost_per_call: 20,
+};
+
+const gpt4ho = {
+ name: "gpt-4o",
+ temperature: 0,
+ frequency_penalty: 0.0,
+ presence_penalty: 0.0,
+ max_token: 4000,
+ cost_per_call: 10,
+};
+
+const deepseekChat = {
+ name: "deepseek-chat",
+ temperature: 0,
+ frequency_penalty: 0.0,
+ presence_penalty: 0.0,
+ max_token: 12000,
+ cost_per_call: 1,
+};
+
+export const models = [gpt35turbo, gpt4, gpt4turbo, gpt4ho, deepseekChat];
+
+export const getModel = (name: string) => {
+ for (const model of models) {
+ if (model.name === name) {
+ return model;
+ }
+ }
+ return gpt35turbo;
+};
diff --git a/src/utils/openai.ts b/src/utils/openai.ts
index 70aeac3a..a152406d 100644
--- a/src/utils/openai.ts
+++ b/src/utils/openai.ts
@@ -1,4 +1,5 @@
import { encode } from "@nem035/gpt-3-encoder";
+import { Engine, Schema, Table } from "@/types";
// openAIApiKey is the API key for OpenAI API.
export const openAIApiKey = process.env.OPENAI_API_KEY;
@@ -6,6 +7,53 @@ export const openAIApiKey = process.env.OPENAI_API_KEY;
// openAIApiEndpoint is the API endpoint for OpenAI API. Defaults to https://api.openai.com.
export const openAIApiEndpoint = process.env.OPENAI_API_ENDPOINT || "https://api.openai.com";
+// openAIOrganization a header to specify which organization is used for an API request.
+export const openAIOrganization = process.env.OPENAI_ORGANIZATION;
+
export const countTextTokens = (text: string) => {
return encode(text).length;
};
+
+export function generateDbPromptFromContext(
+ promptGenerator: (engine: Engine | undefined, schema: string | undefined) => string,
+ engine: Engine,
+ schemaList: Schema[],
+ selectedSchemaName: string,
+ selectedTableNameList: string[],
+ maxToken: number,
+ userPrompt?: string
+): string {
+ // userPrompt is the message that user want to send to bot. When to look prompt in drawer, userPrompt is undefined.
+ let tokens = countTextTokens(userPrompt || "");
+
+ // Empty table name(such as []) denote all table. [] and `undefined` both are false in `if`
+ // The above comment is out of date. [] is true in `if` now. And no selected table should not denote all table now.
+ // Because in have Token custom number in connectionSidebar. If [] denote all table. the Token will be inconsistent.
+ const tableList: string[] = [];
+ const selectedSchema = schemaList.find((schema: Schema) => schema.name == (selectedSchemaName || ""));
+ if (selectedTableNameList) {
+ selectedTableNameList.forEach((tableName: string) => {
+ const table = selectedSchema?.tables.find((table: Table) => table.name == tableName);
+ tableList.push(table!.structure);
+ });
+ } else {
+ for (const table of selectedSchema?.tables || []) {
+ tableList.push(table!.structure);
+ }
+ }
+
+ let finalTableList = [];
+ if (tableList) {
+ for (const table of tableList) {
+ if (tokens < maxToken / 2) {
+ tokens += countTextTokens(table + "\n\n");
+ finalTableList.push(table);
+ }
+ }
+ }
+ return promptGenerator(engine, finalTableList.join("\n\n"));
+}
+
+export function allowSelfOpenAIKey() {
+ return process.env.NEXT_PUBLIC_ALLOW_SELF_OPENAI_KEY == "true";
+}
diff --git a/src/utils/plan.ts b/src/utils/plan.ts
new file mode 100644
index 00000000..83536774
--- /dev/null
+++ b/src/utils/plan.ts
@@ -0,0 +1,22 @@
+export const getPlanFromPriceId = (priceId: string) => {
+ switch (priceId) {
+ case process.env.NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_1_MONTH_SUBSCRIPTION:
+ return {
+ month: 1,
+ description: "Pro 1 Month (Early Bird)",
+ };
+ case process.env.NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_3_MONTH_SUBSCRIPTION:
+ return {
+ month: 1,
+ description: "Pro 3 Months (Early Bird)",
+ };
+ case process.env.NEXT_PUBLIC_STRIPE_PRICE_ID_PRO_1_YEAR_SUBSCRIPTION:
+ return {
+ month: 12,
+ description: "Pro 1 Year (Early Bird)",
+ };
+ default: {
+ throw Error(`Invalid price ID ${priceId}`);
+ }
+ }
+};
diff --git a/src/utils/tidb.ts b/src/utils/tidb.ts
new file mode 100644
index 00000000..2d4d18ec
--- /dev/null
+++ b/src/utils/tidb.ts
@@ -0,0 +1,16 @@
+import { Connection } from "@/types";
+import { Engine } from "@/types/connection";
+
+export const changeTiDBConnectionToMySQL = (connection: Connection) => {
+ if (connection.engineType === Engine.TiDB) {
+ return {
+ ...connection,
+ engineType: Engine.MySQL,
+ ssl: {
+ minVersion: "TLSv1.2",
+ rejectUnauthorized: true,
+ },
+ };
+ }
+ return connection;
+};
diff --git a/tailwind.config.js b/tailwind.config.js
index 5b9659da..fbb7a447 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -1,12 +1,14 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ["./src/pages/**/*.{js,ts,jsx,tsx}", "./src/components/**/*.{js,ts,jsx,tsx}"],
+ darkMode: "class",
theme: {
extend: {
zIndex: {
1: "1",
+ 100: "100",
},
},
},
- plugins: [require("@tailwindcss/typography"), require("daisyui")],
+ plugins: [require("@tailwindcss/typography"), require("tailwind-scrollbar-hide")],
};
diff --git a/tsconfig.json b/tsconfig.json
index 61c19abd..a62f1358 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -18,6 +18,6 @@
"@/*": ["./src/*"]
}
},
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "include": ["next-env.d.ts", "process.d.ts", "auth.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}