From 5c573f57bc13c0bde3f61f611b70c33104e54784 Mon Sep 17 00:00:00 2001 From: sdairs Date: Wed, 21 Oct 2026 17:58:06 +0100 Subject: [PATCH] Add Habit Tracker example: Next.js, Drizzle ORM and ClickHouse Managed Postgres A Next.js 16 habit tracker (Server Components, Server Actions, Click UI) using Drizzle ORM with node-postgres on ClickHouse Managed Postgres, provisioned with clickhousectl. A (habit_id, day) primary key and INSERT ... ON CONFLICT DO NOTHING keep one check-in per habit per day under retries and concurrency; streaks use a gaps-and-islands query. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/habit-tracker.yml | 35 + README.md | 1 + applications/habit-tracker/.env.example | 8 + applications/habit-tracker/.gitignore | 9 + applications/habit-tracker/README.md | 326 ++ .../habit-tracker/docs/screenshot.png | Bin 0 -> 36811 bytes applications/habit-tracker/drizzle.config.ts | 22 + .../habit-tracker/drizzle/0000_init.sql | 26 + .../drizzle/meta/0000_snapshot.json | 204 + .../habit-tracker/drizzle/meta/_journal.json | 13 + applications/habit-tracker/next.config.ts | 7 + applications/habit-tracker/package-lock.json | 4518 +++++++++++++++++ applications/habit-tracker/package.json | 37 + applications/habit-tracker/sql/01_roles.sql | 20 + applications/habit-tracker/sql/02_grants.sql | 12 + applications/habit-tracker/sql/03_seed.sql | 30 + applications/habit-tracker/sql/99_cleanup.sql | 10 + applications/habit-tracker/src/app/actions.ts | 42 + .../habit-tracker/src/app/globals.css | 38 + .../src/app/habits/[id]/page.tsx | 55 + applications/habit-tracker/src/app/layout.tsx | 25 + applications/habit-tracker/src/app/page.tsx | 84 + .../habit-tracker/src/app/providers.tsx | 7 + .../src/components/add-habit-form.tsx | 27 + .../habit-tracker/src/components/app-link.tsx | 20 + .../src/components/check-in-box.tsx | 36 + applications/habit-tracker/src/db.ts | 61 + applications/habit-tracker/src/lib/dates.ts | 35 + applications/habit-tracker/src/lib/habits.ts | 180 + .../habit-tracker/src/lib/validation.ts | 26 + applications/habit-tracker/src/schema.ts | 55 + .../tests/integration/habits.test.ts | 152 + .../habit-tracker/tests/unit/dates.test.ts | 60 + .../habit-tracker/tests/unit/db.test.ts | 32 + applications/habit-tracker/tsconfig.json | 21 + 35 files changed, 6234 insertions(+) create mode 100644 .github/workflows/habit-tracker.yml create mode 100644 applications/habit-tracker/.env.example create mode 100644 applications/habit-tracker/.gitignore create mode 100644 applications/habit-tracker/README.md create mode 100644 applications/habit-tracker/docs/screenshot.png create mode 100644 applications/habit-tracker/drizzle.config.ts create mode 100644 applications/habit-tracker/drizzle/0000_init.sql create mode 100644 applications/habit-tracker/drizzle/meta/0000_snapshot.json create mode 100644 applications/habit-tracker/drizzle/meta/_journal.json create mode 100644 applications/habit-tracker/next.config.ts create mode 100644 applications/habit-tracker/package-lock.json create mode 100644 applications/habit-tracker/package.json create mode 100644 applications/habit-tracker/sql/01_roles.sql create mode 100644 applications/habit-tracker/sql/02_grants.sql create mode 100644 applications/habit-tracker/sql/03_seed.sql create mode 100644 applications/habit-tracker/sql/99_cleanup.sql create mode 100644 applications/habit-tracker/src/app/actions.ts create mode 100644 applications/habit-tracker/src/app/globals.css create mode 100644 applications/habit-tracker/src/app/habits/[id]/page.tsx create mode 100644 applications/habit-tracker/src/app/layout.tsx create mode 100644 applications/habit-tracker/src/app/page.tsx create mode 100644 applications/habit-tracker/src/app/providers.tsx create mode 100644 applications/habit-tracker/src/components/add-habit-form.tsx create mode 100644 applications/habit-tracker/src/components/app-link.tsx create mode 100644 applications/habit-tracker/src/components/check-in-box.tsx create mode 100644 applications/habit-tracker/src/db.ts create mode 100644 applications/habit-tracker/src/lib/dates.ts create mode 100644 applications/habit-tracker/src/lib/habits.ts create mode 100644 applications/habit-tracker/src/lib/validation.ts create mode 100644 applications/habit-tracker/src/schema.ts create mode 100644 applications/habit-tracker/tests/integration/habits.test.ts create mode 100644 applications/habit-tracker/tests/unit/dates.test.ts create mode 100644 applications/habit-tracker/tests/unit/db.test.ts create mode 100644 applications/habit-tracker/tsconfig.json diff --git a/.github/workflows/habit-tracker.yml b/.github/workflows/habit-tracker.yml new file mode 100644 index 00000000..1b42fd0a --- /dev/null +++ b/.github/workflows/habit-tracker.yml @@ -0,0 +1,35 @@ +name: Habit Tracker checks + +on: + pull_request: + paths: + - 'applications/habit-tracker/**' + - '.github/workflows/habit-tracker.yml' + push: + branches: [main] + paths: + - 'applications/habit-tracker/**' + - '.github/workflows/habit-tracker.yml' + workflow_dispatch: + +permissions: + contents: read + +jobs: + check: + runs-on: ubuntu-latest + defaults: + run: + working-directory: applications/habit-tracker + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: 24.22.1 + cache: npm + cache-dependency-path: applications/habit-tracker/package-lock.json + - run: npm ci --ignore-scripts + - run: npm test + - run: npm run build + +# Integration tests need a Postgres database; see the README. diff --git a/README.md b/README.md index 194e903e..84935e59 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ ClickHouse ships official client libraries for [C# / .NET](https://clickhouse.co - [Shortwave link shortener](./applications/shortwave/README.md): Build and deploy a link shortener using ClickHouse Managed Postgres for application data, ClickPipes for metadata sync, and ClickHouse for click analytics. - [Feature Request Board](./applications/feature-request-board/README.md): Build a Next.js and Prisma board with Clerk sign-in, request ownership, and one vote per user on ClickHouse Managed Postgres. - [Workshop Booking API](./applications/workshop-booking/README.md): Build a FastAPI and SQLAlchemy application on ClickHouse Managed Postgres with transactional seat allocation, cancellation, and safe retries. +- [Habit Tracker](./applications/habit-tracker/README.md): Build a Next.js and Drizzle ORM habit tracker on ClickHouse Managed Postgres with one check-in per habit per day and streaks computed in SQL. - [Postgres-to-ClickHouse data modeling](./postgresql-clickhouse-data-modeling/README.md): Replicate a tiny fixture from PostgreSQL to ClickHouse with PeerDB, then verify inserts, updates, and deletes. Follow the separate ClickHouse Managed Postgres and ClickPipes walkthrough for ClickHouse Cloud; a larger Stack Overflow import is optional. ### ClickStack: logs, metrics, traces, and session replay diff --git a/applications/habit-tracker/.env.example b/applications/habit-tracker/.env.example new file mode 100644 index 00000000..fb62c6ee --- /dev/null +++ b/applications/habit-tracker/.env.example @@ -0,0 +1,8 @@ +# Runtime connection as the least-privilege app role. No query parameters: +# TLS is configured from PGSSLROOTCERT in src/db.ts. +DATABASE_URL=postgres://habit_tracker_app:REPLACE_ME@REPLACE_HOST:5432/postgres +# CA certificate from `clickhousectl cloud postgres certs get`. Leave unset for +# local Postgres without TLS. +PGSSLROOTCERT=/absolute/path/to/.deployment/ca.pem +# "Today" is computed in this IANA time zone. Defaults to UTC. +APP_TIME_ZONE=UTC diff --git a/applications/habit-tracker/.gitignore b/applications/habit-tracker/.gitignore new file mode 100644 index 00000000..d5f71e82 --- /dev/null +++ b/applications/habit-tracker/.gitignore @@ -0,0 +1,9 @@ +node_modules/ +.next/ +next-env.d.ts +*.tsbuildinfo +.env* +!.env.example +.deployment/ +.clickhouse/ +.DS_Store diff --git a/applications/habit-tracker/README.md b/applications/habit-tracker/README.md new file mode 100644 index 00000000..1651090e --- /dev/null +++ b/applications/habit-tracker/README.md @@ -0,0 +1,326 @@ +# Habit Tracker: daily check-ins and streaks with Next.js, Drizzle ORM, and ClickHouse Managed Postgres + +A habit tracker built with Next.js 16 (App Router, Server Components and Server Actions), Drizzle ORM, node-postgres (`pg`) and Click UI, backed by ClickHouse Managed Postgres and provisioned with `clickhousectl`. You tick a day to check in and see your current streak. Postgres guarantees one check-in per habit per day, even under double clicks, retries and concurrent requests, and it computes streaks with a gaps-and-islands window query. + +**[Start a ClickHouse Cloud free trial with $300 in credits](https://clickhouse.com/cloud)** to run this example on ClickHouse Managed Postgres. + +![Habit Tracker screenshot](docs/screenshot.png) + +Read the walkthrough: [Build a habit tracker with Next.js, Drizzle ORM, and ClickHouse Managed Postgres](https://clickhouse.com/resources/engineering/build-habit-tracker-nextjs-drizzle-postgres) + +[ClickHouse Cloud](https://clickhouse.com/cloud) is a managed data platform. It runs [ClickHouse Managed Postgres](https://clickhouse.com/cloud/postgres) for transactional application data and ClickHouse for real-time analytics, managed together with one CLI, [`clickhousectl`](https://clickhouse.com/docs/concepts/features/interfaces/cli). + +## Stack + +| Layer | Choice | +| --- | --- | +| Framework | Next.js 16.4.2 (App Router, Server Components, Server Actions) | +| Runtime | Node.js 24.x | +| Database | ClickHouse Managed Postgres (PostgreSQL 18) | +| Database access | Drizzle ORM 0.45.4 with node-postgres (`pg`) 8.23.1 | +| Migrations | drizzle-kit 0.31.11 | +| Validation | Zod 4.6.7 | +| UI | Click UI (`@clickhouse/click-ui`) 0.15.0, dark theme | +| Provisioning | `clickhousectl` 0.5.0 | + +## How it works + +```mermaid +flowchart LR + Browser --> App[Next.js app: Server Components + Server Actions] -->|Drizzle + pg, verified TLS, app role| PG[(ClickHouse Managed Postgres)] +``` + +| User action | Server code | SQL | +| --- | --- | --- | +| Open the habit list | `src/app/page.tsx` → `listHabits` | `SELECT` habits, last 7 days of `check_ins`, streak window query | +| Add a habit | `createHabitAction` → `createHabit` | `INSERT INTO habits … RETURNING id` | +| Tick or untick a day | `setCheckInAction` → `setCheckIn` | `INSERT … SELECT … ON CONFLICT DO NOTHING` or `DELETE` | +| Archive a habit | `archiveHabitAction` → `archiveHabit` | `UPDATE habits SET archived_at = now()` | +| Open one habit | `src/app/habits/[id]/page.tsx` → `habitHistory` | `generate_series` of 91 days `LEFT JOIN check_ins` | + +Server Actions live in [`src/app/actions.ts`](src/app/actions.ts) and validate input with Zod. The data functions in [`src/lib/habits.ts`](src/lib/habits.ts) take the database as a parameter, so the integration tests call them directly. + +**The one check-in per day rule.** `check_ins` has the primary key `(habit_id, day)` ([`src/schema.ts`](src/schema.ts#L54)), so Postgres holds at most one row per habit per day whatever the application does. The checkbox sends the state it should end up in (`done: true` or `done: false`), so a repeated request repeats the same write and can't undo the first one. Checking a day is a single `INSERT … SELECT … ON CONFLICT DO NOTHING` ([`src/lib/habits.ts`](src/lib/habits.ts#L38)). The `SELECT` only returns a row for an active habit owned by the user, and the conflict clause turns a duplicate into a no-op. + +```ts +await db + .insert(checkIns) + .select( + db + .select({ + habitId: habits.id, + day: sql`${day}::date`.as("day"), + createdAt: sql`now()`.as("created_at"), + }) + .from(habits) + .where(ownedActiveHabit(userId, habitId)), + ) + .onConflictDoNothing(); +``` + +**Streaks in SQL.** [`streaks()`](src/lib/habits.ts#L85) uses the gaps-and-islands pattern. Within one habit, `day - row_number()` gives the same value for every day in an unbroken run, so grouping by it yields each run's length and last day. A run is the current streak if it ends today or yesterday. + +```ts +sql` +with islands as ( + select c.habit_id, c.day, + c.day - (row_number() over (partition by c.habit_id order by c.day))::int as island + from ${checkIns} c + join ${habits} h on h.id = c.habit_id + where h.user_id = ${userId} and h.archived_at is null +), +runs as ( + select habit_id, max(day) as last_day, count(*)::int as length + from islands + group by habit_id, island +) +select habit_id, + coalesce(max(length) filter (where last_day >= ${today}::date - 1), 0)::int as current, + max(length)::int as longest +from runs +group by habit_id +` +``` + +## Connect Next.js and Drizzle to ClickHouse Managed Postgres + +[`src/db.ts`](src/db.ts) is the only place a connection pool is created: + +```ts +import { readFileSync } from "node:fs"; +import { drizzle } from "drizzle-orm/node-postgres"; +import { Pool, type PoolConfig } from "pg"; +import * as schema from "./schema"; + +export function poolConfig( + env: Record = process.env, +): PoolConfig { + const connectionString = env.DATABASE_URL; + if (!connectionString) + throw new Error("Set DATABASE_URL (see .env.example)."); + // pg lets URL parameters such as sslmode replace the ssl object below, so keep + // TLS settings out of the URL. + if (new URL(connectionString).search) { + throw new Error( + "DATABASE_URL must not have query parameters; set PGSSLROOTCERT for TLS.", + ); + } + return { + connectionString, + ssl: tlsOptions(connectionString, env.PGSSLROOTCERT), + max: 5, + connectionTimeoutMillis: 5_000, + idleTimeoutMillis: 30_000, + statement_timeout: 5_000, + application_name: "habit-tracker", + }; +} + +// ClickHouse Managed Postgres: verify the server certificate and hostname +// against the service CA from `clickhousectl cloud postgres certs get`. +// Everything else in this file is plain Postgres. +export function tlsOptions( + connectionString: string, + caPath: string | undefined, +) { + if (caPath) + return { ca: readFileSync(caPath, "utf8"), rejectUnauthorized: true }; + // Local Postgres from `clickhousectl local postgres` has no TLS. Anything + // else must have a CA, so a missing variable can't silently disable TLS. + if (LOCAL_HOSTS.has(new URL(connectionString).hostname)) return false; + throw new Error("Set PGSSLROOTCERT to the CA file for a remote database."); +} + +const LOCAL_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]"]); + +export function createDb( + env: Record = process.env, +) { + return drizzle({ client: new Pool(poolConfig(env)), schema }); +} + +export type Db = ReturnType; + +// One pool per server process. The global survives Next.js hot reloads in dev. +const globalForDb = globalThis as unknown as { habitTrackerDb?: Db }; + +export function getDb(): Db { + globalForDb.habitTrackerDb ??= createDb(); + return globalForDb.habitTrackerDb; +} +``` + +- **TLS:** `ca` plus `rejectUnauthorized: true` checks both the certificate chain and the hostname, which is the same as `sslmode=verify-full`. Keep `sslmode` out of `DATABASE_URL`, because `pg` lets URL parameters override the `ssl` object. Without `PGSSLROOTCERT`, only a local host is allowed, so a missing variable fails fast and never falls back to an unencrypted connection. +- **Pool:** five connections per server process, created lazily on first use and kept on `globalThis` so that `next dev` hot reloads don't open new pools. +- **Timeouts:** a 5-second connect timeout and a 5-second `statement_timeout` sent at connect time. The app role also has `lock_timeout` and `idle_in_transaction_session_timeout` set in [`sql/01_roles.sql`](sql/01_roles.sql). +- **drizzle-kit** opens its own connection, so [`drizzle.config.ts`](drizzle.config.ts) reads the same `DATABASE_URL` and `PGSSLROOTCERT` and reuses `tlsOptions()`. drizzle-kit also loads `.env` if it exists. +- **Click UI** components run as Client Components. They can be rendered from Server Components, except that a function such as `next/link` can't be passed as a prop across that boundary. [`src/components/app-link.tsx`](src/components/app-link.tsx) pairs Click UI's `Link` with `next/link` on the client side. + +## Prerequisites + +- Node.js 24, `psql` 15 or later, `jq`, `openssl` +- A ClickHouse Cloud account and an API key with permission to create services + +```bash +npm ci +``` + +## Set up ClickHouse Managed Postgres with clickhousectl + +```bash +# 1. Install the CLI and sign in (an API key is required to create services) +curl -fsSL https://clickhouse.com/cli | sh +export PATH="$HOME/.local/bin:$PATH" +clickhousectl cloud auth login --api-key "$CLICKHOUSE_CLOUD_API_KEY" --api-secret "$CLICKHOUSE_CLOUD_API_SECRET" +clickhousectl cloud org list + +# 2. Choose where the database runs +umask 077 && mkdir -p .deployment +export CH_ORG_ID="" +export PG_REGION="us-east-1" PG_SIZE="m6gd.large" + +# 3. Create ClickHouse Managed Postgres (save the one-time credentials) +clickhousectl cloud postgres create \ + --org-id "$CH_ORG_ID" --name habit-tracker \ + --provider aws --region "$PG_REGION" --size "$PG_SIZE" \ + --pg-version 18 --ha-type none --tag project=habit-tracker \ + --json > .deployment/postgres-create.json +export PG_SERVICE_ID="$(jq -er '.id' .deployment/postgres-create.json)" + +# 4. Wait until it is running, then download the CA certificate +clickhousectl cloud postgres get "$PG_SERVICE_ID" --org-id "$CH_ORG_ID" --json | jq '{state, hostname}' +clickhousectl cloud postgres certs get "$PG_SERVICE_ID" --org-id "$CH_ORG_ID" --output .deployment/ca.pem +``` + +Repeat the `get` command until `state` is `running`. Then point `psql` at the service as the admin user: + +```bash +export PGHOST="$(clickhousectl cloud postgres get "$PG_SERVICE_ID" --org-id "$CH_ORG_ID" --json | jq -er '.hostname')" +export PGPORT=5432 PGDATABASE=postgres PGUSER=postgres +export PGPASSWORD="$(jq -er '.password' .deployment/postgres-create.json)" +export PGSSLMODE=verify-full PGSSLROOTCERT="$PWD/.deployment/ca.pem" +psql -c 'select version()' +``` + +## Create the schema + +```bash +export MIGRATOR_PASSWORD="$(openssl rand -hex 24)" APP_PASSWORD="$(openssl rand -hex 24)" +printf 'MIGRATOR_PASSWORD=%s\nAPP_PASSWORD=%s\n' "$MIGRATOR_PASSWORD" "$APP_PASSWORD" > .deployment/passwords.env + +psql -X -v ON_ERROR_STOP=1 -f sql/01_roles.sql # as postgres (admin) +DATABASE_URL="postgres://habit_tracker_migrator:$MIGRATOR_PASSWORD@$PGHOST:$PGPORT/postgres" npm run db:migrate +psql -X -v ON_ERROR_STOP=1 -f sql/02_grants.sql +psql -X -v ON_ERROR_STOP=1 -f sql/03_seed.sql +``` + +| File | Runs as | What it does | +| --- | --- | --- | +| [`sql/01_roles.sql`](sql/01_roles.sql) | admin | Creates `habit_tracker_migrator` (may create schemas) and `habit_tracker_app` (runtime). Passwords come from the environment via `\getenv`. | +| [`drizzle/`](drizzle) | migrator | `npm run db:migrate` runs `drizzle-kit migrate`. It creates the `habit_tracker` schema and tables, and drizzle-kit records history in its own `drizzle` schema. Regenerate after editing `src/schema.ts` with `npm run db:generate`. | +| [`sql/02_grants.sql`](sql/02_grants.sql) | admin | Gives the app role `SELECT`/`INSERT` on habits, `UPDATE (archived_at)` only, and `SELECT`/`INSERT`/`DELETE` on check-ins. No DDL. | +| [`sql/03_seed.sql`](sql/03_seed.sql) | admin | Adds the demo user and three habits with 90 days of check-ins. Safe to re-run. | + +## Run the app + +The app connects as the least-privilege app role, never as admin: + +```bash +cat > .env <xj5qp|YpvFGbgF>b~2eB*80Om@m&B?;rR^{F#>kNv|fkO5syB>%u@tkL#DnRFJQZXyktb z3d=f6=0<0bn4 zMwX%f|8)Pa*}JBqw2{Dot9Dl}csFNF=CzGw0)iD|QnC?S^oVqz{cSJbG39tJ=zw(fc-*w|J7W49=!U{t zWm>6){63{rsvD>9r>9RPvLcwG6?4Y_6}Z=cr%jh#u0%1l^GtejY!0MVIH!cyaJ(71 z<3(Vw^&U$z!$5N}5-jm5&>`hMXXW*EZ)+sj9V1JswwpZ%+?uUFh-)D z)3&u=k%^N|MM>nWYV-HB?f07XrJgSLPsZfWUXzx>1x>mdnkyw7 zcGP4|GK>wkDVrrqqYsLB*NYU|VWx|o%_-F&u;~FIAq8!Uu(MX2+{LSTkM>5@rG%rT z79vfVSg$0H-U4M;t}mh*cRQJ}{;_6$+0NtYd3Mnin!1K3nADg)l)C1quB5coUf^A| z{itA%ZG$mp(4-l*#Kh-j=F!#{ehka+SdrAdP9^?x3x!XcrN}#e=YgQ>?eby-F>V+x zTMi7Au7>56D5Rh?%@H~mYoF_r@xL}luSIE6eCbM^j+z}}i1C@vd$U(h^CS6rRf->) zuOnM^MTZ#c?)VWiq+y_j{e?3odRMBvXUwTPJs)I4*`@|wH!C&!4na(JbM&huHhIHrrX@X(I>8`+uhU_Pb&Zj|=$w zAad$`P<}z2~ zC+VYMQ0msJtW|@67cbMtS;K+MSqxLAtjyo_lN+n$rK|*BAWVtFDN;Jse^^;?R{u=J z#j=MgGZH#6_HXs8DvGUr>nBH}yR8)kr&>b=98Z=Sa6>v@zp1MnhOg6`cTVHct1Qz) z1loz{x`?*i1J+&4iRUB!!qC zc)^q=rf(EfO)7&PA<+8i%EXECao@dgFtE^|fm4lu-ETD1`S9+WZtb|6bbcu|p0pyQ zhs($+5VeAzU^AV#bpEo^1p3wz7;nY&CN(bRq?S8N)kst`X`S=~iz1nAdTZIPy$?B$ zbl(md1?GhCOEW#>+JAc2Cz|$ytqcpJ#;94(5xRgihq$Gf)JUqYJ3gjRqT3tU55M6) zEJ4`*H4ZAwX4&mNC90D!HwL`C6XWVCu zE(ysGvtleN_sWt^2Yo9z*-vd$>_Xc4WrsghPj+iK+?dG(=S9891c{E%z1H~~Ck~X- zZP2!IVWM~Z@LQELZtcQAQ`kKrs~|xKs5Rh~k6&nBq5BmKab>aHz6YJTe%!3U(tuIo z-e|TipK$0)QRd2$&!WAf`fzV&KO7{@oL^^mrO5sx#9YM6!0r`)w8(RT9T^mt&OsNV zwo>NcUnAh+xP6(ziOFhC)*=OxrI(#qjPbFxDMsS9C0#4meG2mSKaF0BZ2gFIBW34L zykm2^rtKsI!#sGtanYr&|E4;lRpa~mDmKENt(M^-&V&(TCEAVstpUX(} z)`l@er7kzfr*1_-6ol;*F-!Y|wl3AX@$OT?2~DZCPeb1^+~{PZe+BWrD~7q}W4=KU zIx0D3mFG3xtKZJwR`MT}W$`CS&4cy!vsiXkdfvkzeKp-btJ%@f^XpLRZMvbGOg$Gn z{QJB4&8PlGT@C`ZZI?GrrAcQur_)(}{V+sFv$E@aNWJu>_l0Bi#GfxW+`)GW1=)x- z$6cQELXQZRlh-$Op1J*v8pk&(Y6QOh`YlQhtOpubz_BGxKGa(e%%9fcuXi}J9PEcW zND$?|JmIx1Kq)?c1<)-BPN+DVmQEBUCPlGbW|gflC|LDt%&>l~7a`_3mGn)`440)N z_rnWEI{e{#aJp6BYlcu|*-;Kq1kMqiWA5lT_-OqcEEM>A+mFMgz3>*^)1~;$#bRo1 zUZVFm>P)HjUJp08BL9`rvHGqvTw(!hUm<+k3%24<1)Lf}oo&v->$|S5A8w_h&W?}c z{`lA;S#vxets7fYDjS|?d6)v8>&F0qd{aVhK4wKP|2Djo+z#ZXbJ;yC;xQFpEl2N02>rb)Xd!Flp#T#21= z(J3_+;e#HC&%(pkD^>D^v20vU~P_B}xcR{1et!fYK?f*O`iU@9>|2MjujB(CyXFB};*nLXO#7;;e zVo^D{z(#Y}bx(rcH=k8+JruBE_pK!{$z4qr$Nm-KY>+Bxsz*tRo0rAef(6-Z>cZl8 zWZnG470Hz(OI8Yq#1-7%58VekBsZI_z)d=+(Gn>tS)z@zfR`R`n0gOOyRRr7Kc9g}hNZIDAX zj%nO!#c>Vbel!P_xSCsZY&)&zi+r~J7BaB-=&-3HjmDkk5KPOg-*5yh5bSN9Oj}8r zSCbl&EQAOu%sc08HlBHab$gixuM)ONuZuh8M8cN5!Mc_vuLOqPhMg^TAgg+a?J@U9 zE4@z$KJG^)rc9S<$6AoOJw^#$TSIgJ$X%KrzWbm0uA7P(fd+0j0hXnjJ(1{*X7W1mcz8JDKi2+Jr1*T{ z)Pg-YxVR(-<5+k5@$uVK^&&Ah^R!hHA{|tPWR}X`bc*m>Jb#=6h$~rO$+J}`#CQfmC=X()w4Ac1io!w^*rxa;7?`F%9QCCrT!;z>K5nk%R6SX9*h(_w&?o1uorsq*rml zjfkpo7Sqsf;yya{$7-GM!|Q4f7!qC*TF}ddDdhY2`lIr6bIXWuJ)fa(Z zK5HPRV!>JM`y+vnJwWODH@TSya&rx=i-s)5Cz$$?{4dthHK%`TStEWee_MAN*haWY z+5eH;|E`ycH{Bik2-?Z9nH1h0tU15?)TdIc!E+FqiftGe7}enwavTKOwRvMAEihik zmwi;CUO0=LQGxyAVk<0I|rO%e)!qBJWu6nlFM9`fIx|cocJCZN=9|&N@3wQlWm>yfqXN210uXSTX|LSj`vi-H5Yp}>!Xmz% z&ehzpoCe$X+jE@(c3(Xf`^2Tffh08}q8w)=W z;OC`AT|V3EuxMDFQkQ~TNN{UtEznR3>X z*z>(*;Q4Ihed<8@r%XNSG7GVZYd2T?(7CM$8nz9m}W1bNdx(+*Q zF;g4ya(7&1ZwqyQ;RByG$-UVCnurS`8h3YxVNbkCbGj!Apy!|SbbHeEi`-r;3vuP><()8YmF*7=sxCtMEE5d+n9M;qltJHp6UAJsGSgskuJ+goi+h?71A0 z@@cw0lgLi(;36#^XqwF4YRB3R+(O}k)XvMeb6%(ENGb+a`D|{GqhRQS^DG0YSl$P6 zw-R2xecr}D>kT){J47&sUw{ezl9az{uH>@wN)o86oD3@FavBs=mmH1{hxr9z(AKL3 zfuKY_!kTI!N#H3quGKgqF)705%-3t410pX%9pXxekqv87brec};)%P9qec^x!S37@ zMblpN%u=pdE?rt20hMzBgOlaih5Pwh@z5LXcV0d|wM{PA{3TPQD^@rL?)+A%A8b?K zU{C!=>ncW4EM3UF7jt>M%keWYKpfOf!=ilB{X;G%v8Y@DKTzT0@vG9I={~fh$z6i91eAQ$w!L=VvO0tyT(q zWFX^JjVbI?SMx%^Zj^leaZ*Gm;FYibICWpChINqPV>irLudfZ^`zK<{8EvgRHR@dUwZRE2B&*pc=9@%es9SQ{PQBRN-PEQ8u-t~TdmArMw4 zU2JDhIU7T1Z~alT4xDqyR;X47GA2C1I+5BjzS4#`9!Nh51S`vWH8#AMf}oHF{n&Dral3vT>uFaX3s& z0t{mv?;G8KuqsP_MYbOgquNeGn1)$uthU>-he`1=I+KG8z zZiI`_K8Kw-4Sk7fc|TLRnyTzCz$WH@?+p;Z_TIW}@a16sZ+Na&L6-DFJjBzVq4 zNv;qiry$D=#MebRNaR-FMoG+Al38%^3^ISeBStL;E3nV_(qSoe@uc`{u7#H&hXV8G zODfCcD?&F73ILY{fN&f#&?@oDUijXYxHI2XWf5 zdqrxTbUGYxzmkP^#U+Z9b^{+YGQVY{yEtk*&x_Tc9KAxVuzRcg8IS&I!=_?#3GF>l zFq@Oi6!dxUcyj^ z{kISt-!A;3+jBR}y|UI+>^zVnW?X_!v7tOUoQjxc};YowKkyjlshRX z@Y^5xDt{s##=_4BrcElzzjOT{%ek%rcE>Ml<}VtttxCOltYL0-&Gx$i#zgYb?X;q9 z>ahpTUe~hPGNV~gr;e(L7y!_>2)_^-6@j0FT^<*;h37o^WDnU8bH6+U2nwZi5xeA)!(D(%lIrZG(5Z zZ>^pfPH!xHkCVG&2CDpsX*_E=y7^IH)TV)26voD1N7r|uCc{cU_izZ0BqNy}UlhCa3HX6DFtPMgLv!}hC2VLq;~0bf@NRI@ zJB(X%G1PJz*<8_T8^pJM!tU50Z=<8*xO8kc`n3Z|yHfbfKC}!>`F1nx+|U&^W>MQ} zCtI@p)5P;JP*Z!cxGiuw>jwP99YcRGx7yx%&F5cief+imwcmbG$?puy6=nn-T;j&O zEh?eRkGA0M#NwdB^!<053$I${R!@Rze?AGU^YKb3U{U`t9>&YRsrpeoD&mC?K&k}U zQM)(s`a7sQ>@Fg+No%@oF2_aRKAU;t_l>U#F$l9?zFP}BGQn-s!Kz=N50eDJ==E6Kts zGWY2j7#vj4DUfxQD@Gphqe~_$;RS;B)2AzsHzOaHOLU;@(m6Pb4fvT5q+^(I0IIkR zWr2(AKhOoS8Q0;2#rHCkdAE*6y8G|cu#cD(j2#7imGhu>TQ

c~-hV7L=d~asFGf zo58ZC-%j@P%e{%;=g4l}7Rw55dI%^~vV1((rcpuYZrv<2k^fPjBk!TBYxsfQvCh42 z(~d?vDn256jRh=D}9@B-SgX6-DDw*nT*z$+YcLg6hcJ5+@#rQf(`H4rZt0Ni_ zM!7dPhq-gJ_+A!*e~%>`ciUNPnup6*N2Vwxl>CuJejj1^Ww-J@Mt0NF00{&*Sr> z&R#Zoa~-X73XEo&t`t`~ZHi<6C{ZJc zd(<0whMf{w;qEI}KtDRW8*6M#T`Ey;R>#-lMOUS@8k!;--P?dwNiO<_e5Vp#XDr!0 zAq*f&nnKevmhqz53W+bN(nqD$)<6%ZD++Mm)dnkXD@~CKn>>%6jAFn2isG`Jrk}^$ zhX!x4QB0G2%Vl#6?I=OLbq;AVY4u9m$kmx^v+8h^KY}D#++WKUn27Nv6d3jd=;%gx zH!%*c^YtPwg8(b&S--liJXcoIQMCr5D3g!m{%1Sg-Xo2x*YLO#*wfN3bv9F>U_w>c zKKx7faVKwC)op5>Bo`I2<-9|x?Z>w0>JGFf4dTuk5Zt;bE*;!l7AM>Ni) zw92Tj;;JAg#h0<-Jm0(TeQuWmf#n#yW>!aW;BGe!yk{d(F_ z6}|?mw^+XtRDB8T7Ffwf^xWh{k|BZPKUmIEe)ymkcqqQt+P;b35UASjo45UTx>(bP zlx}oiDNbBQ?|uh{?i&-si|wf!96pnsA)q7zy3vmR863Cum^@Pr6WLVw7jj4e0;|*D zXLHCOiND?zBeHwqD$XOEQJ<29)0sIh9p5~6N`R>IclNFl_)~8@K?JM%x?11$WP=|bx~l`FRBCATwX0m5ORzFh z6++LbPw(c9v$r07Zw93Ho53PVA>^r=9KSpbAm7PXgz(pY{sSKWA5U)QO-_+_{lB_^ z|8J+^y?6Er-xH-7O0&6o8h(bx$yimH+{SgEJ;Czbi}S`t9oVA|6%IZwUf#~FGJc(%T7UYa(gMMlgDZZaLW zZMMu19Qy%_^Q5ND;`USP?T(6?O&`>LA5IqRxy{c3cG5`0O`+7nrHL%w4zE-DE^V`y zmr-uX*wjgjE<4{}$OH7xPeYmnK7v_FwwQXfcHDC9bK&VOm|)Al-PZ#Y|d zAgik>FXxha3FdRibh5)54sqR5?cqZFx5gLY%=#2gKNkNUTHRXdQ@g!cnD@$UK+@p| zzql}B8)6MB*?PMZ2MU7FvQw`_uQz{&1*)IksNS_l4?byK*+4cMO70DXMUPFSAFT14 z`ATh;(;4uxc=0tBjF?6-tLUHfi=GQC_hyOLVaNf3E+C@CZl>Pmoa_+G73cT?dDa#l zqM2Gz#FvY;z)%+a_6e)ie@QUOi!574R~TE7zVrIavw7;q)n`1FPwUFZYCf)qBk?~@ ztF|Pvu>-YP#CI#M=4%7;i$zp;J^etw+{)r=c>8Nt9(?XWI+o7bY8xG!kW{i6@a(1X z>iXkHQpgG`@^D*KP06s_M=8>5m9Hp%_uovP6F5|OS-^k# zP2MZ>V}3MA%vXPMH~$)C=$PL0{J$m)oxT${RU{^eooIQ*bmz~rcaN1NMqY62@qIbw zlbhdG#?yg{+@cgi=qLl#kI;f=-xYj4>p|bj8QMnFDsaAG3I=2+OVE(-fPamk70)X#fvGk03C6 zzw?x`SgZ|qCgZpo#Ijj*w2UUK-fBt(Ssu{?7 ztVTS`z(|*!PM7qdR|NyQ!z|+CMdFK0X07v}!Fzsv-&gu+Oyt#IU3!B7yW7tnjSU}f zk5wdnp6bz9&eIV?T8tVmVeNOE7g@$gd67gSB~3On>YoqM@l-uB3?6Cu6>}a^iejt>#58SFiCQPHy4*r3x_U7fXmeBm1LlJ7-_-9V^_i>oo9QH1S4n!ae{Cs z{9{FZywNfUe8JY~dMqnHKxDo5hTQz2c=>tx^s|2{QAsiSUsW{Gkxj(EkN@v4P`XMX z{=Za6c~es4N_u+Igvw{=isJXRZ~iuojutP}Eol9S$mJ+r<|;DGJ3mqky5w4PP*ney zso#BXs~^Zjf`h4(rED)!2ThKDicBQGQ25tH3~@JLQ0eK-^Dgh;l)p`Dkw|V@%5}A0 z>u((ecsLsj&t-8Ujw6?aA4}>olGdyRF6yslm>^McTmANrg&|PV}NJJGwX#f4zCvve)a^9$2PzyOZ_}(YX8wwrIUY2z&x`xPfM(JK0 z*&1H5M$Q#fQ@aK$b}4w@UuxJ_l07bn8;y3gB>(I(O+L`%J6X>EkL$y#??xkFv4?er zDra{_!fKDE<0s!|cf(ypY|T%qZ5d|6hP8J_du9OE8r%@O+vGWCCdmq3=%uGlw}_+f zCbIyi@7eU)$hhyI8^Mlwzz_$)Iu^JyZNpr4O4w7pKDzXaa6RSTwv+9zxsh?^{F}$K z5)q1`nKU5^#-7!e4p<@`YI`Fa&zGpRj^(<0*nlRbyV1s#rL}X|b`e!mXGqnnl&L72 zJoMqkdZy!ZDEy6D(K#mL+w+%rg-w~4LA-M9f`ptE+S<)&Pbav<`de35x#X&>Tfu9E zeH>gRm=UCRAm7<`)!`3bQZK)U7e|2X3`aCP7Ne1{#XAjF?862%SEJD;Eq8oE+aGEj zVwQ;Qg^(%P_kk@wC;PVTlXbDnh(j9O;}0_*xm-sM-ryWoqV@+Z_GGLNQkYiREM>BS zzuB1&D%o1ra_&|eJh~zsJowVd$a1kts#w4Feu^L0l;stJHci%h8IOQ z{z}D-mT5}k`M`(1Z3ELMGIZ-oVW8IQfnAxhDT?^N6?_O>*S~s);i7&cIH=8Rv11kq zTn#AikHYGA)>^j7E{`9lwM!_?PKG-fp)zs}PLVijTkKYjl_(ayqzp@f#cxxKuIYpg zAEU6dB%@D7c3;RjlFTAJa`@CwRZN>lyDkFBDtmdKG0UYW9;?{vL)`vuI+V?ueYRCW zoV-?*@bG6)P^=#QH%9ggpM%_>fY{#lOIfAL68dFOHn!gtps#anD7!(bi%L+$5pCwq zhjk;odiynZ@7FKYw;nV#C007!9z}H7uu~d__XQwa_sws2Y^Tp$c8^DsV3||1Ow5^{ z2MUrF5(&vT8>gE)1blu;Tv#?1?d*QIq*+ zk+`xoxV$~x=*bT|jKRtm6vP}h;J`$8-6>JX=GrWPo|jkpSA(mp;-?k^+tnS9b4K&d z{;05pTcGfl(Fj?0g3Ibt@@MNsy`9m>?`U}k`C-pC`d`)+Q$heJSa*8hUHFDsoGMHb zS1nhdYCSn}S0n#&`A3%nO3<&E$0wGZyU#OTzO@x@3m)Khz#sj^6l{s4g^U1&@`>CT z?mnxUo7Mcz-WCliHn5Yw)u}?Ij+tYl6AtITLn{wCt$*oGi}I~4=P$2l;ee@jiC(iK z4>+;BqKGLpeAFq=wPOOqol_YxnR}7C|NV)qBx-cJ`e{>j0v_z!{n}lK$ehuwaURZ= z9c}nE1Dj^tUygsIw-TjY!#%^zH3R#c0j-owjHx$oe;5e2ba&?`V2!8^G7oqZsvT!s z3w>^;6&TdC&o?CgG;X;B=;98L|5hIOuycAin5*89vCboW+vmmn8RaT7`X`djeEfU< zhfWhT-w6hp7=P$YntZ-LkH&4&nM9TlODbgsXXc7K&}EwWnq2uS>Mg-PlbDRaNi=5Q zf^E}AM$hi~h5WB{V+-l!lxCsL4QprLq-pp`RlMDT)rHayuFe?5X#<+IZ)ICeb;4=a z23@H)j)+OeiVM^H(tho~@i(mUQE=BN@3j0|&rk`A$rP<;2-o_e_FvUv_Qe=M*(i6f zGQx|ks+#KCo6L}6y}j&_XOIc>Q|4pIF;G&81TAH2G5}K|Wlwa~vUI6_XXfb88uX|) zT%pRPRS^VFs0ATP5B9T?k+w|G7?z|M2!fao`xW~QWIZD(scEj<6aR`xxhk7QfLh5{ zgVLpxZQDUA;xCnE?X8ny)$>^559aP0(j?{`wa4cTTSNJivcd8iB5C1wQl$$5$Fz4k zqhQ5-+Po=)itxchsoS!3a3Rr%e*>eMmRH{;{f)BHpG%61k7vMUYy1E>kqT`S;z2gq zFlo&H(99%>vm@UeYB95FV*u$t&~Nhg)cb@=L~z~JWOu6#QiudpC>!L z*<;G?R~3l&rF8;VLiL!jy(!oe@>(*K4Zta$^E)&12|F7nI{g-PuFuQ7T*~pAh>a;k zuk4_*!MvD}A0mtRLzY83R@$T0pg?CTp{OG+*}0USNrXOX!lCtevc2D@vc6D#eYant z-B?#YB5Q+6WM|d+i%f?--@Ojt9=j*9xuU~% zcTqCz+n`OQX=LfwOJBK@??yj+KBAPR`5@ge{F`gPB2Qjj?{CG;Elk$XDfKr(Wlpj{ z-AA2hQ%SFP1?mklER!qIosPnst9IlgMB(y^T<}r@;VNXO#)?HQ+TRSnjjDztdzO}D zuZ<^vHc1<_Nw_gXcsCFz2kPUHdfS@SdshEA=Hv8ed6rwya^Zle*0;;;qbvnku^G8* z#{D^zN*a+F4W=1KMfx*_%OEBXn#$&eI`x7U+2WlVd1z4UQ$rt<8M>_msrm$ap-ZE( zlm$tEe3xRe$VBttuq_zsd~JTK<#=4ew;BL8#4tM+aHb)QIkkbW;rqz9_Onmz%6FsQ z7htVxwtVB1hE(#MA~y_a7Qo|yTwC8oR<$q=#~z2D<90mH<%n_WAGiOta`e27q$j75^+riA!GzLfpw zr&`Vp&RN2P4?8a%m6=3OyLye`ZVd0q94Wh*JFNtFTL01e_#Oy8g2{KOhz6{++U`S z$ISH?99y+ZBziqhz6J?`gS27T*`cCXPUrGc<1E4*p~PX8*w$b}$hWbW6bM>6Ahv+x zUHSUQsYA%YhGrhEp6^LwXihS?ZPPyG?l>N;`_yUf71?F>pQgHC2-%9($d;fCeSiq{ zYN59tcbwNb1d@wf^n?3+j;m>QbP8Y)iPY}PQIsLCayqzq^6il^c7e^4ZR6tB-SPk2 zn)SfC+f}M5kz(x3U!Ch_hON<|F|!I;d%KS7;42!+a<0~GuEmF*NVmtUp*N;rQig*>#;{10Av8kZxhD zOy-v~r}bhjDto`G&I}Vm?uX=X#k4(JP9`~!QuMykc%-JSZ({9u_OB^yXIxw=;$YLj zBI&o{Y<+R#eom+`OV?Zk$=vF-)v~UDEp>#NNEsoeD{5bCu5G*x>C{h(`pDKn_J*67Ldg2l ziO$nAeC6q2G7?(rCt(zqT;_z2>?7tKln&}& zJAc~j&EK+UD;XT(NS(+D$jEhe-@-{KO?N3vo47Z}m9=o!fyOackd(+)cQ5Cm^E%Ju zGA5<>dm9j(tSnLqnAADj062)#nfXWIjgOoBegiS+tCDbHnI}7lVK(^B2RgPOt)GdI z21yT_irA9WQrg5aUc|%65CKB!%^E`EC-Y`M2~jI(#d=?p zx94c-_|D=`CVL_1t#QpC@o=Pqjc;|hHmWzZwgLL_yWCBaDD$6bBDHxHAOBKu<}E_c ztX+wPA=pffThU`Vu}?u$U+ggvF>g0meu_wM{51N9Qb&85;bV9>3x1O)Z9^g-U(Zo# zdZ9}^pOJCO8c|XII@@WH+?pd@H8Ax}Gqc$Y1#s~+kD%wbCY^w5Mfb>m`FgnhADN3+ z$jvYRm%3F(3=HC1(8+or$9mM{+tXKBx6YG_Wb9SNlB+B)Bn3=b^qJ#bPYv?jpqxZLdrdSLK7Kva%q{X@Q zVUJHC@7tHY7~HsUvR#Z^?8p0_Q2Y*?K?BGUo?+49ekM2l#sw{Qm5S>+a&q3hdbXpA z!t?N!Q{Y^&^D^7ESN1QE=(&%kVzFvU#VztIb5-Pg5cy8N3@nal{u}-OojU(Z4FA91 z<)n6r0rH_1FI6 z?Ei^S{9nHRZ-n1}`sWb;6OPxc6m!oML-CbwILW1qhU9Ni)ZF20QRqGYc$mAB9reLB zo!z%|WiyX(e2X0P3D^wu@JlEBQ$&U@gm^Fd!Gx?5`tCPkpx>FO05oI z#G};Bzc_ut2DpD&TRM%%mj0^)>B*~wddE=O=haS%il|S5q7IFF_&!|Yy1j_#hSoiD z$lj$z-t6q|pQkOSi(0~5DzWqT<*%{z$Cr!DI&pW1tvukc>~K;wIXiE*48cPa+1Oj$ z2Km9`4a5zJ!HLT!;c%FZ%lVYIvtw_i&F9NJ^dS)$*_t{3Z~;RV>BMZbNo+>3mST(V zRbmws(8XGlXF{4|&%*PI_Xr%Q(%})MN#5fdc)1Gj)j8=9li}mZaA`*Sc>Mm~-3Sev#6L6D;9o(Mm}@&Uca;vyA@xT|0lt5?Sn3Z^0`X9$#-|A zcD|Uf9ZcKWfm@bD^d(uKe!2C^YY?n!2dtp=PA><6hQF*hw22{6%TJ`zPRhw4ozOjz1z8Q~Ggb;)QU<0}6leze1}r zN$J7o3tsqJ9c!=+#U7NpJ=V{p{I<RD6mt|8*YMrp&aZ|whkR%Bo z)MFY^x<%a0fD_i%2m+VCHj33tP;iLVxVYmGCdl*tB-kCy=5jE^H1fsV`FV1y$T|l~ z+&R^0ZR8g5kw~+qt&pOUeDl=pUZQLUF|$VTB=wzXjPVm8iBLtwuV2+trA5Tx%Si-^U?szJ{-*B%#UDfQWzTo$MMeJ$&1+L8*ON_Y$|i^{2Plgw*Q`T-uqRUD!UC?H!%VJmCUwc?V!|AVsGh6 zRn0x-EqvJgrL!-mxy)=&XC81_JAIxb5dVShu`yCa_91{ng5#+1&3sIeJz-ft(?*F+ zX#UIBuM7yN^HdUBHxPP?ZLQU89IfRlEThZTrE92EzrVd<`TR=P+}inkRe(5-cQPij z-eXewt{*)1I&ZIO#4nB9+cEbF{rQMrcyB4iSaBd{ShjPh))v_Jw7?E^eP7abjDUX5 z@0%N!Al+4lmzme@4P+~kPK6#SNvBi~jh?=W)%Z%*7vID$6dihU%Og!&*wV&TSa_w$ zP4(r{&41i1`Dd#4h|9gohnt6*z-URJa`jl#;4Za<7@F z<`EYM!bb*9kyj_bXkVKapfqV$8(%JB@o3a(XntcN$PyAo*X0=_MDG0{H~x@4j+tXm zqDUgGrL9nCe4}>nCkS8iK!;#czICU5waf1BbFDA3tS8hk*WY%N1vGr`M{g$_w}y<~ z$-Gh!^(G3^*!N_%%NS|@Hzne3H2xtw;9x88A@Dh^pTwa?_tf}(H=buR*7q5+@&!-> z>09@i~n!{Ee<%rO7ZOk=v_k@EqMvhCbv)k(-PC z&)zwkUlxiv^Q9V}d<`pOSh1$HxlYX}Hj-jbMXBD!wGwg1stMK-bi+s!&nvU;Nm{c> zwwj**S*FUBHX;!orrPs8329aPm6|lu)Y(M0(NjsglC#3yPR%Ht z`*MhIg8Dj)7zu-C_AOxtY=__(W| zPl=yW21;4iml^v>VZ}RdiSw&^VT*1hSmn`YX&Th(!EO*+hXK%y(Iro$Yv#n-w@;HUqN2Efy6N{~|UPgBg3r z;&VkMl?^hP6i#dlPmqu-v3s5r*qOwiqkYYtS=hI5^PkB*557b}=SAl3_~_H@w*FJA z!tzhNt2aW*Wi^_AM#};pNS-DRK6A!y_Ghh#x_^ckBpczehn3)!t7;F3Q(J?Ewx!;y zG*$AzR>jpd9pq&Eheb~H-dIJ+^JQhpGm4UU}~ zDLSQ00?^urV(a#>OG`6n0fZMQtA~=lX9}}x+Cz9Ndp9j&H?E#B zZqf?-*EJQ(`scF0Waxj{Bgp*fc$Zz#G`czJjVuT*@#hdTT#Nt*YLXoqdfyS?@o3Jh zT9t7r*6LD>fX&?I{cYgU?&)Tf1w&7x^Yq_U#(9Jp84VRlA~~or;S$I=L2R94XA&W1 zS)t$f<(nRFr@gvI;b%gF#k^0N>R`E}8_mtXE>qYAksX1A>(K4GYBPwROYu56mE)gu zZJ&j7GB9^miN{PO*bn}u8VLFySise5F9W40=CW(4C~TDfHRM~6sZ#4d_QWgs*$x^T z5~!oWuS}96#YZ+911_s~QljSj{YuSS?FSKwfOUy5lX^MB<;`2kj}BMV$RR;p6k~Gg z(9gQ9MYis7wnC%xNzkT%F;lkoCz^V~Y%-MKboAkazuHmLxU^xZdC-3U@k;o@mngCk z)&d%qdbfY2V^LmXS*m}me!Uf5F$wuz;@zvzFK@Qb-$?cY_URH)DL!Tt<;Rzrl0TC( zPK#v>mON1S85skYIBEFdpTVt=#olhmuT$@zHL5be^7#HNR9`QbdHk-u2tQuM8_8 zeNd%L7NPE{u$1H1vHonQ0s>WRVu|l#Z;EFGdEOqlxmt0ch3;~;LcFcpof9CP9qK2O1gjAnXa0AliCmb3 zmypkH25xC4c@i3aLe`q4RrMo9-5ArFm$m8~kX60+`eklwH-?H8 zLh37vfw2i{pRbW~sT?|&k`?Z-JX-5XcJP*r?TxS2p)8N#o$(+UIs2XXmt^%ZiwalE zL)Tdd)$IN8I}1CvoI`crlTM0#$ymL(d1u|5Vio=RWeA80Z08obJyCTQ;7!FsbZ_3Y zfIlQi-=(LRc{npwDR`42mkNl|)h*DWh@eBQ-6{uRVkM4i2_{;-)L$uCi%+Swxn27!)GlL#1l1=^P$CI|2 zkI9I?Rx2TIH1mp`reh;n`z3hulwPPQyQoxWtP7mArX>Uf{E$~GMz~9nh2-=jTxD-M z!>sET3lQ8KK>l|Zk6`|zbQ>c9;VC;G-RIl+0r8A4eK+j2%=)`iYw9DvD3Qa%AcbkT z7pYeUb*c~wgV~vHgTX)L$WhS!lj(aa_0bIHYir}CO1*LQ0%l(!hC*)$cOC=$ns@l7 zK385QJ8a}`I0_1tm~O7Q?ZlAJQ{au{rJI}j>``@sAb8iE2Oht=EkC{uKb9UI@HZ^{JeM z1mpV5tbvS$_pFgB9iLxF`E886`G`(p%cD=z&JXCdE|B=zN8%<5ad}I<;m^NM?kc)` zApq6vP;))ns>ehB`)JL%aiWC6_0Rah3dItpo z3B5~~5_<0~ppODd5hq3wx2Wv%tT`}@}3>)1c`aqRhz zKn8P;Ip-MTKJV+kMxbboJ?g8H5yBi2q-j;^=TmDSmAC8?@X>yH?EA%0oDTY0yU}vg zCa#o_j&?tm%p8?O%Y}K;Tkd%H{mi>`KSM?0@Oy0_AqrSN>t;SietKP^L`RpxZMo$; zo@6+@qF$J-Zk6)ovyu=*qapo$pSX zCu{J>u1hC@+sw^%6#qnpJOU%iwx>0-4z&Ri`Q0ftuI$L~df-k?`H zfc9MgEx3*LMSKXS$aBm=@_3Xju$)DSYV(vnc*^T%Rck+8-qDPh*0TCNqm>^Bji`OW zJGLJ$#=Qwd_PxP-j#i^7#BHo?Sx$d{Q*5eVn!#eHY?&R`$jX zFkC9;Ug?jD{AeKL);m&04(ctNq=q#F0lWmgF!mf!*P`C)D#9Q4};rs;Zr&V%{g z9F`IV!-Kt+ZwYs%eM%ne275g`=e@Cq*bi-Hr$flKtNY@mB~ zi|_Ar-X})XDzTD*>FDUJRa8>Ml!GpR!*Rd;si~y?Ae#Z}FVM&dahTfyGpr_8Mr37W zQHPiOLt~wtavJLD3~M(n(J==H2UiJdt#8u*ROc*vUlmNwL7=6*5Qw~qx502LgLxRN z8f;RO`{+>#JNq3Xp*E#F&B-ZfiA~hrjzG%7jVIC!Kc!VpY^)O#>*}>NTZJ)F>E%eU zTvn-8?R#0`QjiQJ3jv46A$&`N^?f1j@5@6NiRlNg5PW3%b;D{x^c6@VK7dUq(=*dS zq>*MXL zr)O)4{&eA6O|SF$(){1dJzsXZ4Dcw2>U!s85x!#M0o~@@3V$`rMpu#@H}rs!f43~L zzzv$ifPmDEmoFP5_Fabn5fw>oV^F>o5qH_X>=IX_jXKq=MUi~GBq(P5w~HSof&M3w znm-vxCj^qSLd`r^9u~e&k;t!Gi#1^L-n&oN*LggCK&az+T_wI6sl5-^M98&y9=o-^ zI;oT1bFAB+EE~JwzEovqF$w<&T5WmLZSg~T$*6hKP65MXN#po!Xml;8b}w3%f7tc) zdm42EyXnRP)vvUF^u8|Pb-@}6T38l&mCb~hUE9%F%Ar9#TL@6uwb3_R5NmvpxUYC* zk^Wj9hN#-P1s49`H_&+smF_5(*(DPm?a8hzEM(6ZWd{7S;(@xy){VzjGW|QLot%}{ z(omoFKrzX(PP^5;&22Dyx{>wZB*SC{Wy*xD+tiEPCj$xU)3cjGB`e;dmYFeuZJzNw zWk(O^Vg-ld`aa-# zB6(hXz5D0&usDcBfP=RM0*0+~R0-YI>CSqh_h}O6A(|ZJ7RATI(|3|}V_R6PKEL~d zBCWxt-X>DaZ|LWoI2Hp%blEYp!{`N0jbMEg!sai(=SQgb%vvO9P&6GU0o?Bu5PMU< zka-&Gz1uKg-K`)UR7vct)c)z_pi1JjuYO1CxWF@&h!R?+oSXJ1eae;*MJJ-Z0en+j zrFd6ao&8*Xk~Pfza$AKSwlW*%u7wDYXVKJtWL>lC?%t9pE7CAm6WZZn)L_zk8urvS z&V%-jzId)GCB)0qdhmH`a6tT!fv3YI4~?0yh5eov{vx6U-xo%Mn~+;q!?#?DO|3S) z3QaK$JL{whSV7v9s?3K@@95J%GxhQQ$pUbiq@Y3RXat9=`=pCUU*fobf7n`g^-W~Y z-BJ(hoSbxnk{Ub?JG|p7h_1+gwHWHdk}1JX{;@RsD29Hj_`c`5$m!HunG1uH2u%qL z*Xq9Y?nh})sNH~wJ%Rdv;}by8Sv;#-DF4vJsY3I-Gq3Vk5V}H%_E>`at;Xv}JT z#s6r+KEDzlElYSexfh{;_{hEH%jvf9rVk0!eO_ia+9s7 z5Q%7nCb@?@d3HGKrPi$9b#_xVt<>^pQ~OT5-&l9V6J1Khd<|XP`eH7b?6fW*FiT(L zyk&N_O4eku(gWBnU0kyRrowPPmx|3?;E^f&@J{V6n&6x%mBZ z1*Km?l;>eDUVD;uEdz6O*x7^SrvP0vJv->UfZ~lq`L9n)-g}&^Z-+W{|6yCBChTC%OnfXj zm?W_h)a@?(5}YL5Am^1stI`;4dRNfQrSP;RcD18&(gK>ZBwwxx_}MiI+tTKw(=&`1735R>!d~1wuF3o z?x|kWD@=$S6q}+7n*kpLqa!=b5|jkLKDkmVq*GEFUvj`&<~w|_k&?Zlq74HN4}ywn zz(Uv2Rh0<}s{-v=yy~M!C0X0oMGRcr>jmKyW@CMW%L-dzxYW3KMIXbj^E!Sw_0Uma z?x7D_qj1zzBLjI=>VzTH7=H8l@&a#!gL1`uR=kAqi`)?F`)a$lvZHnidGahm^9t9Z z?bGtc8VgEm57O`WhJ^g4e}u6eX4t+aa^a~+bQ2s`Xs4^5?4PoT=Ml?NZjJ_WX6dkUS5P{SE3Raj!#P| zuDf?STwriqcWnQ_OB|@;S|tSa+E1BQ7AZD<8hAVfTFeM)%T?EAO0>(4(HfWO*|^(! zc;hyFbS0@1X(5nc?_-IEZGG7pWy2~8z)|M;i8DwGUJFP&LHJuBqr^uBs~@fm zCRTKXI#wJDL60h#m?&6#LUyi&UpGkc**^@bex|ZGD}QGcUuAutE~NiQyKb}+J*l`R zSmt>ygJWaeUSmj%UaEsnXG-|cQbK+Y6I|Wy4I^|Xe_4q-ZEHoix;uux8pCpb%9-(w zqGmh_0(v7guQ;1oAYWiOpW_Y}0aeH(Ig&!rjvI5N`gqpnleE-`2-n`Q!KJ$=14BL1ILLIT?6V=$ zQbp;%)@N#2xecfHUg%_4(R!$S6rZcOl*4H>QK-f1%)H&hbfyiuNPCZ;xhWtsEn(aB zlZI%fqzc`H&x^2nF0o!`&(i(_GaPGybsu53k?%=W1ZDC>jn9`A$Gst*)~Gwu1HF&N z_gJmb%cQPj^}E>t9i7xeTwV1$sXj0XK26Bj!T4ZFT&C)Brf$}-jjch#^D^y3dl$P* z4`8w%f^>^R@QCw>^e^P%iJT%sdm=yt1Ms<=KgRGimm{Pjsr zmS;sWqVkrD)XzmRrTb7E*mqv35o1L$F!<@~bez7QGxEET>sFXmwxjc=;Wd5tP`WDXOc zC(qSDzucQ@n)+&h?7A7Vjc+&+k;-my%C%Y))QeN7+^6>lfDh^n4o1ag0GG zX_?mJvf?-e%$FWTlrU%c$GOw%l-~`l2*lK>`L6}#Qut^%*OyI6CKZ*&-zWdcQY8bCL)wu|5|*>^hVaUu&Ws<{zBxa7pCa76r^DW~t3-_8k0SN= zGn4Q(x^#7o%M=5;)4#$2VGVjQhvV>|v0m2P(Zz`*Y#h61QqP2M`r%2y!Q4BErx(6F z#ak>$(5PR}ir8sPU-H$#Vy$UBUWj(?TE!xqQ@iNN@N44rL4vM#T}e{Q*N}UrxKv8*vJ2Va64{8f4|KB${o2{@eCOuyMDIyi z3)B_Sq2YYdAiki4@e5xs0l~EF$41aeG+(ME^Oa}0&!#$7Qc?auwE*3{tbQs#pAG@f zDJ6_WH;?bzw!=UJw=T_U%euaMSZn;FBHn2=Z>y?d-`l+K=0wYWqW5>{=Y>F+;tYl> zwl@~Ixb=(6LWUMLH&@&6J0Ryf2|{TcfeNMAe1f4x*gYB%{c2P#Q>KiTP{NKK&$$o8)u`b?DQ_GaHx-~#nfj6G&nd%5Gl`QjgeLWp z!VKMrL6U@l%jlzK-a1l9mgF|CUVY^GF4kEWrpo_1>-YyPwXERuCnp(`_kB zynw=1#6;JXv>K8sT*o!@S$^SL>#Ma0vHhCMsnAVy2J({R@&0FbTPKZLEi%}RI#nvu zAlXDu77N4Ltx~EQN4}-GSUg8pi2(Q8NR(OnN?^?CNVVtoB;z92T=Q&Zhf5 z!%t-Nhw7PVw4}2ec?CH8Kaqrogoj_7-|HZtCQ9wOWOcK;f3PCJ*VO-ryR38iMF754 z{)n%l9(5`qCA8osBr-QYuu|B+ZeigD?}HdFi5HV2D`JH*A7ww-tchb5Hlm%jpEozQ zlw`-|(OK%3-0w3l0Vn6i37jH^GwH%Qr&22e+=uvedVS>H<|EqM)@TD9{s8l@PyG8Fw zeSHh!^LU;sylJehKnexHYL3vSG1?VzkHW*uU(7S_xWat253=+AC7n{yPR zTH~?WMSLC2prI1Q0-pzP=fNGxCCd}ntz&m=5+w~HPUX-HOkoBj1c`rD!Y{R8O0-O7 zPVfos5=L|`?hob+gSf4|s%ZZ0c5Qq>YzDxaf} zVzF-A=p+J&YLPS|t>tURJlg@A zJy}6L|EpS)#a5FsNszM@kaF-?HNvx%p6H? zw2hN?x>JEB0>SSY2XY&d_qj~qB17^ENJSNuAHOPU8J-!MXjPh6j&bcKD)BHTCgz;lol|bWJ;RBeq9QKNa~sD&em$!eD(}m( zno(0z)2_}AB;Wt!g38|Bhh5Q~{M5z)fbCKi7|>LC=*!E$ugvK`z5aJwpE4B}b`}{H z6#(r@@ZY`z{{dMQyG$^UoXU4y11MMgH`&eCk6wuY z-n-}51SCNJ6I=fOE70oWe@3g};)(wTT8+y13#|s-_@AIv*aZSBkv|?TkOPOfmnrwG@*Qc5@470xKSXqXB*YnPX;3dFJ+_ zmUp)L$oGNCE^T_)_uDh`{&B#2lz8?3o2|Yl7>Y}wMa@+4=Far3bKd6Sg03t2?=uV{PPgjry3J^ z0n1_&km9mo8GZF$zqdz&_t?Y5jzwq$LwtAl5OMjMELsU3f!S3 zT8rlXbTlx_Vfvz@yI$@xt$8O1UCX&4cPoQtvg;6g^_w#d5STQQ=NY3ls55%os99)z z7cJh471r==%+!&Z+^uVFJ_$}iEgxN*WyfgG&^i%@f%~XUP1nN*jD5(nc-l~U(T@W( zAJts@?Lk08`^8>@318)9guON5U4h}fJinB)(=Y92&|=A!?>=s2Us4_JR!Vw)EhcKr z?mV(8-guEOF^4!SouBEMczR7?d|!C_npVku-sP#c1M~@0B%JUx5;a4|!$B*koZ`yk z2QfN2Ulp9op!>yAuYLM8Kd>w``a4f8KbgS|wPci6&ibHs3_BZ6F(pmM`0;>dag!$q zT>6Z>O#L~o9VK#UpoXqY3!1O!X{tmtZs0#vudbCMNacn^{PsMpOiu-uIQ7s5bR(02 zZM6l3k>kCbv9 z-wN#xw#@m4SMP+&HG}i6hN&Cx9A<(CS*9@6+$XK`xD_&Na79ES!?-xvBIivG+6b+c zgt${fQ)_%jYej6#Z^Ycso(~7===+gPAtb;q*#lvDd#Ha~2x%e%xlX}{jZah`Q$c-f!nt@~Msrx6^;n~T;I8Emzl z@}l188}dCb)%^_RQaW7FG4|g~^_2A}UQ5opy0RZv5*yHHb2w~_O4xZ8uXlT+cN#D$ zt)gv0lMhC6HJ)`%6B7Pt^%tB!2`orLogS*^EXUFV`Gx_sqB2c-D*o)G`lhw~TCq$9LvoxnNc#AA5-pH-O~Eoe zG>=+2HzK)=*+kpm<@XWCYQHmC&0S`#{s>a}ju09r(q4HIv9bjW^C*f$nq^-0bTO&H1D?NjJ5d zA>f5KKY>{`sMm?eQYoY3Q&J5xx)G?A(yJt}rDHZYhiIRVTAWvrir|~C%ItZG%>z+d z@%9>?ypQ;AGp86}LPMwyhrZOqjqilc%Jo%sk~M|jzk&F#vqhSjfz@+ho_vZUBOvb->>tC58-FJ3H=3(c4&O{rh;!2 zL0LS!KtnmpAHPZ9ChC?IY>5>#^U3tIykF-v_@tq!JlrSIS~xMYMcjOF6Yn9h(D1Gzc%nzZ zvcAU02=57mt4Yxw@)wdSkC=4PLM7>+-2msS*C2!^IR&LL-_89Vs!okfxJ$W0Y{@&K z8*|dz^?%Py9fq}9Lq6Jh78d}YxJ8M`jd`Tva$w+7@p{5U0S==kkA*3eehnlw&&Z!y zl4J47sk{bmjl(-#>tplR=|=t%UCoGFRq0wUbOLN~O$|K3lbnhCIwFcxzIzr)P5u|i zmA)HBO4vLP13|RXyDY%ERfcUhBe;{AAC)Db(B6f17SW^Go;U+mI>ppR9+Y{-sA6_L zRk59bnRaZK@bX{>Q#V#Ka(`$=8G;^5F(nQ!0+&{%ai>*RKFi>!H1^AMp6O|)!G?9j zz-~~kX}8}Dd-&yI@AI`+q7DQfFTokbySW+E3v^()rh3a^!GbKYxr(b-+VY!tL*A*% ze37l_!XQpt_3u`aGe`H1ZB@oyc|kk&bq_18(Bv!ZY&`~<`B0&+5qj&5+sRkP9?-Yjr%6PrL8~L`OW8Tp(nu*S z4RKLQtRKEaO87V*F9do6kB9MH*xB4x#dj~Xeqjri2_DxVh$hQuBmALI6>Q~9)H~T z1ck(cb=t=kJ!aw})i$`}Me`;pA?559K4O|%*qPz5M~&i^N*@N@mbSfvbXbn3e-929 zZ8{!4K3gj>3}W&P%1u+NUe)MNI{AvSULJy~9t|!aV{c$x|6V7M{S~PUIG@GVkjKn8`%!cNNmX%SD>P znQ}FTki*N&+vy8}M5$4Zp^KGHN+sNCI$mlp3H$`FquKr^Et7>N+GOjd{?DKDF#&Al zI`{9LjG$H28{~SHnq6WgJ|5|1c*Oc)JG}-(Ob>7smfe{pma>kbrDv5p4%M!46c^ox z|5{KfWHpw1tn&^;ni&NwreM3L;LRKu=RU`KmddGW0)mybR(hU+r%jP69-`YP139yD z&0C|dHHx*+@lk>hkVq$y*W>5rb||s=dzSIlKS~08HcPry-V&X)ep}X=Sp&VmX$IvU z_(yUF982ux+R_%lqRqxS+ejMlnVQ4M_{`8d3(PX8(3_SeoUHXB1IvtNh;j9ytU8HU zUYg;?2?SJCb$qFW7E{C%Wpu&n9uRg?zhhlCPpNK~c3!<=t5W3Q!Jhwh%!|)(+Q-Rm z`IdjrEUcTguDeEIf$e;8gBNK;_8g zwBueUME~nJ+*$AJ+crkLkK=)m(AP7+k6C2k`F24zw|LUwb#ie+Hws@t2!-fdky?GX z{Rg{?4L#90f#sv_-A=K3p#6UXqNcw7FA#MHgvz`gZi4e5*g7{#eLYg4?8uXUC5)t$ zg|;YhWx|2oAbIxW;9zL1aLzYL0TkB3W3Ty=t5t?eNj-{5bIBoSTRMg9ZP)Q(3{*a7 zgLMwR%*j{y7(zZSMa0!+>ka|{DZfR`P?8H6AFrC{csk%EP4~uCA09`UKRYH#J6}A2 z7n6`sg?k)WvU2hM0ajnKazttSNldXg!nh~di|dc?DOqg?n>Hlh@ul)(*j+=Dh@yu0 zqSJN!USd?&&k-sS#5eX{29HwbpDX|!8Wt~6=Z;ZTVeMMFv+U|%;X@*=IDR2A1q`#q zs3oV6a2(pyjizs{P%jK?ttaJ5JRXo!po0zs?(Dg5_D``QLNiO+71o95+ypgNr{6CsJ#U#U0yHhh+FcXH{NtH|2e|M7aWaFPH15+U8`^j9aj zsV=NXu=N7THSZ$X#u~T7S(4P%Od;27n|Cvd(&Kyc$=qurxTH;RAA9CP>HC1xX16cK zX7|Qp&%7piCdeGfW#*-ZG=t*PB5{-Nbt#Lb>^fFy!tu4W-E&MD$gTE{uYx%AT}m43 ztKngJ_7@>weVA2f!hvkkNaGa0YF})XLznE}N9*;l@KC-V(ix^^W>Sk(#Gm>e6H>ei zGOb`P;(|ibef#mQmwwn)XYK}8)4v|22{jat0QFO@opF|ruW$@%)W9|RQ396eT{G|o zTSfh`P7d~3?0h5?e<25#kDV!EyE5mDGe-95fN@ieIT4{tP2H%?3El_8{NZ311 zjperAF}oB^x-CeN##-AB&fRQ$JGHb1l_b!lkwTJFB! zsjeUW9usv@hcm0c#>d;bS8*}F-(ce~b8=cJKjVcR((K>Yv)2#19=#e{ z9#v>wiwmBZc=r6A>_0>x{{(2SEU#hCJijjJoa`=6*x#^l)OXr!$;9Na3>wJH(A?`S zl)=a$3V3yjF>Yv&`N#J0lJ2d3Y6|LT0L)&eaLK+NexKAv`B*3X7%9B&Gb@W7p_gWC zKHQDM;bPjOv+v^22jl4n&7+FVOq^#5LoH)sVZ!!=E*JF8gjc3c~-*{XL?z;;yt zNi1e+d7~8W$Gx9a4~%NE$UMF;(2<8{{uQ790>Kq;%F}CGinj3ECj1THeXu9pez~-V zN%RQ^;GYK&7^h1=)`Q(dYZxyD~ zoYBtn@U&gyB%fn{zjK`+k?hxoP_-~S*gT;fc@uFBj@E&iM375R5Qf;Ws(oLUbf;^a zO~x7mG0`1e+(Mcr5Lp5B_&-(DKv}qQNVq|l8e@+zlb{DeDNR*i)?Sb%>Q74hOQ-oN zNJHIpb93{yXOIQT4-5taT3Wteh}KGoB6PI78{xejdp%HnqA9a6darMMeB6|k;vZRZ zL&Nd+t~o#!+8kgD6ze-^cp!>0GoOuVSO;AGyDe4qY*)NnqMW2gk&yP<}&;7V=2L`g7cePW-!4trc0`T7b`AdR-yUkw|{M;S)FG`)5^Ro@U z2P7nb%i;1|h8jp~Rsd2n4h92-@^uXj1_Ym#eyNII1uJ>{{^{(klF4xN8!Y;G=tm6a8^ zF}#*wKR>_o8}rMvw|0JFauP0l_y~5LghXXgu1^&N0wIyed&Eanl)#Ui?x`4D>m8!3^74KZ$}ml}+HNrmyU0PY zou`o#54%Q?Nb$$_LICHDeMduWZHtOz@#a!`Y=J9@j;@iBHcU5f5S7Wd`W;|7=%m{~ zA7}N!=~T8_;d< zl*5)oLV-S`mxRH{1;$5XIrL*;FkN;EK(Z_T&&Zda1b|Q_ZF-Uk_Q;BB-_VubN76;M zk;Iz9{tcBXJ(zUvO8arN4TrnXyD+uU5jfI&;ZV0Z5u8lw=m@w^ zUbF)Wipk%@7Z$M-IfdVMM)5@7CnhGeK!aswheS!`fp6bJEGGP-=0nH{sQ|Rjk)QhQ*_vH z>MG?56LpGare?losTIRcS-|wiGFvrq8D)VARt`3{ZmVoYQG!F@wd#FImX=Yk6tUk_ zYY9_=Vavo%?(@nrOH>v^B9?`GueyUELC@EPmJeG`BS{-v)C!9OE zh=Kl|_e-w}uYm6C9CX(Ua$cpQE$836wz~%Tu|B+U0;6#rc<+7 zhA?#Z=X>T}g<49#xz1Tc?RBt0f=yiJ6btih`$)`K*_qRr)YR!`G7`wl^NqgoaC=lv zFbB5wB1J+{X;anjhIK^Dm6M$;k~L3>iI0XfYbP(uB{G*>w6lDyTxuXRS5`_uUJgg{ zy!Bks#4kHuRVj#yledSS-EXt2mOMP@h-N|ipBNT?zMt{y>0qOy3y-;O*sS~9jYa8n z$X#-EWOF%!hJ@|+3~4``<1vkC$VRPB4l4fi?8I92`L1Ml3ToZkW6XEGVS7px%N*Wx z#>u4u#Yi?B;x&>Dmc1{Nq#T@`q}5C<6d%c{B<+2u7%g}sU92C(_Ic~J(rb|0w_B~R z6EvnKbMN2vl=z|^*r8-pYSDccqO|KK1bj)r#?jbVp(~glTL(;sF<}0edJ%bLvkQy*L6WH{5GzSnZA3Ap zF}*dBKRs?jO6~`3CWGK^&hNCL z=lUfuIBx{uwEsgsIGPjxXkhZzVgWzp8h1Sd2SCUA@~`j0(gk5tEG?>AGiC)@lT;G( zx$lEhB^#2^9Vn9TgUmc#N;1! zwMuiVR1QWO!s}v^j%FZOe)=r_Lab*fMG7QGIab8df=d(v+I2`9PCAR}u2_AeLcF|` zus0WHTsY!VSn0F3S02UK?7zDyY1zOVkTG98a=}pV#Rpo@mffB7{iq=;=V3$Y?np-1 zeSG_s7Xp4e=pGWvsy5^A8-DSjdl_2zrf_I5+l2J;o*E}e?GBX`-3+Dx{yk1 zGowUN`&`iGWT#Ih2?-sawN|X{+fV<6CF5`CSO2fFre=t9R7m+y{8#^mbp%k#|VK0 z#e0a`2TLYdf(6I=hv`nup}IA-6mg2~Hr!exS&|jXB}VRg&+voHm+FTsP{g6zF6Awz zO{c%rfE!yZBy96iKBc$Vm5*wIR@)KL$yQ1H=v*~O{b#2~;PMuKwei(!}}ARu`l z|Lm!z%C8|FYY?#UDKw{T=8-Ez0|HT(ou6!3o@hQbx)6C^FL`Wtng~H+p1nHiyE0*T zv0G6%VKh5RLk_!__$-uw&P1eg`1^g@(T?s483Zv0IKm>8J=)9X&`U&_PBg~5@OwQ( zQ(Jqe{F`ic1T|>}SQlnho}jL6Ps!bCc5|Ub#?GR`m6i=YYF@pVEUbeh#9EdpMswb^ zW7ZhFsUraAX6yc*v}-dLHE*5&)z{V|hsV-hg*&)Io9V?^Z@j9$UV0zJ7?(tUtrKoG z+*;NQi445qSzvla*5%rTPmzxUufGa{uo;SP*T_-0C-P)^t<^yQugNFy!-B#k5}j4u zK>3c1rbr`XIFn9-CK#EbJj$%V8peH;9xht0m<~6h*Ic7d3;8`fC%igwRsXG3I3;FN z)r3b_Gg6)OdvWNWdfmWqCLg01)x|2aYcFRLMNE~|VynBC3ia%&jS~8mEkgGi zZ>AJf*l-pNU+@x9id%GkFwG0Z(Ad`0j@`tOh<{G_QOq^uo+y)+W2CzPe8r$jIJ|mTG{DCo^mL z15Ae5`o4y2VqO5|E5d_rwKttTV7aU!M?ss@me;0j8@nc17cd#JUX2?7wUU-wzN4mw zj7u<~*rATf`ZZHKn1dIscqZLAbaQcka8SM?O#rWvyQv53fQYsBVwK)P;8T9qA#jD# zhwy=7o-u|anfH^tSjDm2uf4tgyaLApbI1AF?qm7O*9fef&X)m+OshY_M*Zo+?5ADl zs@4uP;IHP(1;~dDCg-jzBvZcDf_?#oy=R^4xLZ-;Cy$%rZ^GV)%&JHM<2j2MoSxUT z-;r50@U9q6{Wu4lg%#GvI=|%ZWR(vLY0=bj|BW3v8WOjfjq;cQS1iHDZ9vdk_QPz9 zS;WJzyG=l6LbK>nsTx;5pJJy^Z;jU}+;}~%^K*Dy=bN90tgWpLD+RIxW21Mq4Ly?% z6C{OWhg!`I>B9M0#CJ#?H##Jo*{kW{e;GqzNK4(Dwv*%S$ed!+cQh*5CPW#VEK<6> zaZ<+JsCW4tW5EX@Y<^Uddul@*nai132CZKvW~lD0(Su4oPyLJ3pNzPuN#$hj5F#-6 zxmSxW%g{T}7NRJiKe#J}V!HwW;_>hPk$5tFJ5PP2B-VfqpAf#BExFsNB}>Xi5FP<2 zhNz8X@LM|=C4WrYp{Bc`APwrWp8a(1(sM(qrQvSX6qx(o(*BO?FwFo6o3~Oh$=iwh zDiBN9!6!LfF~!SJ9XR9$TF>7f$@@cmTd)`6DfleE=Y5@ImM||59A$#Q0}e!5N2nq7 zK<=WE!rf&Hr$(y+vfFAl`r6J@5dPeo60g(EBh>bEW@<10&seY9x9Z`aD{|3rl!d3~ zeyu}AMJF*N?(&Y`<7@@<9_jrWHu0EvD1KrcsZ5KkuKaO&Ph?Nguj_$1 zIhH7r*>2?=CR$R@{iO%Qt0L_4I!1Wn$S?K{=oB%Reg?4;$vT*3{^Z)Nt!$nN(T9At zIJ4y6e;?C^21*{+kez%U>CVxrNhmM3!^f`$iR@JiWECmi-tXw#r6FZf*UpMh(y_8; z*0Q?ETXX3nArRPwf6>NI_DpZ>Eaktp+be8P843+%u3k5DLQ9+;wC&OBHgkX*9tLiz z23`@PT_{om$`-5PeBdg}uFb-N?B@_T#c3?Gh87R~1(NxV1?)c*lEEbe%%8-79(Js!JyOBC3+U^|^38cN zuf8io`!X+?zUh1>>~G|s|G7#O+_?TtXu(A(^Ay%~rEGH}oBg$DG#Meg(U>U2GjgZO zYw=|N+0nI$3yJ5^nztM)2Zy_7Njpt=R9MwCORU>nk=Zw)WFP-XX&)x+JS9^!C$Rb35Pnhm9+YqZW69qxY;W+~FtCw@%6& z&Tbvud83rsIwjAIYtIm09V%)xRVE#jmL}*HTT`48#DF7mNkqLbzeMiT3Gsvw0^DA zN6#tu{(4h_V+a@BM1ouW8-pNB31=t!I|Vm4MSa=bC*$&#IgR40m!_=?Y>rnJGlqQy z*9S_X_xp_RM2Kt`mSgj#F$yO}10UdUcur2vpbh!oq*WVL!04*|pOV(mD%<@n)&RvW zQ!)Bi9Wz74$xjKM7# z_LCzN-RY#)7xPNTS34uez@T+P>J%~+A@GQY@MqqyP%+8-=~SpUgYHDBo;f@LuLE)_4~*- zKtVSE41sUf24?2|IM_5ZGBTQ)vf<)_Nu_OUsLJa`Sv@KqDD0VW0#1~Tqbfz*R~zUX z>OX+kgf8U;`V|kjRGQty_%ngKe+q1=*Ia)Z%s!ES-wu?DhSe$ooe&j8 z`scs-qphd%3Ft+vOn)2!!2t2UzX8mXWEc!~O%3omC3r=nxmch1+p964@Ltu@<4D)j zbIk;h(7vL1Xs9^0DsX|I3a}0Mghr=`7ibp%UAPzw@YPo$`7xY~S)pAOmI{C(mm2zr zU_ciFX;0v_Y-nfz&NqjJixFr&x2U|F2QkTPs0faW0ZhNb0smKrw{Bn5^n7IT=eEQE zCp7(qp@ByK|94aQ`HlaG8UHtY_kYU{`RAGZpWkZdf77h_|DD}=5B$FeBW93T(4A`eCVsTmf=iMeRqx`H`>gDhM0~TXa`Tzg` literal 0 HcmV?d00001 diff --git a/applications/habit-tracker/drizzle.config.ts b/applications/habit-tracker/drizzle.config.ts new file mode 100644 index 00000000..52922dbb --- /dev/null +++ b/applications/habit-tracker/drizzle.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "drizzle-kit"; +import { tlsOptions } from "./src/db"; + +// drizzle-kit opens its own connection, so it needs the same TLS settings as src/db.ts. +const url = new URL( + process.env.DATABASE_URL ?? "postgres://localhost:5432/postgres", +); + +export default defineConfig({ + dialect: "postgresql", + schema: "./src/schema.ts", + out: "./drizzle", + schemaFilter: ["habit_tracker"], + dbCredentials: { + host: url.hostname, + port: Number(url.port || 5432), + user: decodeURIComponent(url.username), + password: decodeURIComponent(url.password), + database: url.pathname.slice(1) || "postgres", + ssl: tlsOptions(url.href, process.env.PGSSLROOTCERT), + }, +}); diff --git a/applications/habit-tracker/drizzle/0000_init.sql b/applications/habit-tracker/drizzle/0000_init.sql new file mode 100644 index 00000000..9e8675bb --- /dev/null +++ b/applications/habit-tracker/drizzle/0000_init.sql @@ -0,0 +1,26 @@ +CREATE SCHEMA "habit_tracker"; +--> statement-breakpoint +CREATE TABLE "habit_tracker"."check_ins" ( + "habit_id" integer NOT NULL, + "day" date NOT NULL, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT "check_ins_habit_id_day_pk" PRIMARY KEY("habit_id","day") +); +--> statement-breakpoint +CREATE TABLE "habit_tracker"."habits" ( + "id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "habit_tracker"."habits_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1), + "user_id" integer NOT NULL, + "name" text NOT NULL, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "archived_at" timestamp with time zone, + CONSTRAINT "habits_name_length" CHECK (char_length("habit_tracker"."habits"."name") between 1 and 60) +); +--> statement-breakpoint +CREATE TABLE "habit_tracker"."users" ( + "id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "habit_tracker"."users_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1), + "name" text NOT NULL +); +--> statement-breakpoint +ALTER TABLE "habit_tracker"."check_ins" ADD CONSTRAINT "check_ins_habit_id_habits_id_fk" FOREIGN KEY ("habit_id") REFERENCES "habit_tracker"."habits"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "habit_tracker"."habits" ADD CONSTRAINT "habits_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "habit_tracker"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +CREATE INDEX "habits_active_by_user" ON "habit_tracker"."habits" USING btree ("user_id") WHERE "habit_tracker"."habits"."archived_at" is null; \ No newline at end of file diff --git a/applications/habit-tracker/drizzle/meta/0000_snapshot.json b/applications/habit-tracker/drizzle/meta/0000_snapshot.json new file mode 100644 index 00000000..c4fd611a --- /dev/null +++ b/applications/habit-tracker/drizzle/meta/0000_snapshot.json @@ -0,0 +1,204 @@ +{ + "id": "47862eeb-58a6-48bd-8151-6b46655f4082", + "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", + "tables": { + "habit_tracker.check_ins": { + "name": "check_ins", + "schema": "habit_tracker", + "columns": { + "habit_id": { + "name": "habit_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "day": { + "name": "day", + "type": "date", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "check_ins_habit_id_habits_id_fk": { + "name": "check_ins_habit_id_habits_id_fk", + "tableFrom": "check_ins", + "tableTo": "habits", + "schemaTo": "habit_tracker", + "columnsFrom": [ + "habit_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "check_ins_habit_id_day_pk": { + "name": "check_ins_habit_id_day_pk", + "columns": [ + "habit_id", + "day" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "habit_tracker.habits": { + "name": "habits", + "schema": "habit_tracker", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "habits_id_seq", + "schema": "habit_tracker", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "habits_active_by_user": { + "name": "habits_active_by_user", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "where": "\"habit_tracker\".\"habits\".\"archived_at\" is null", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "habits_user_id_users_id_fk": { + "name": "habits_user_id_users_id_fk", + "tableFrom": "habits", + "tableTo": "users", + "schemaTo": "habit_tracker", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "habits_name_length": { + "name": "habits_name_length", + "value": "char_length(\"habit_tracker\".\"habits\".\"name\") between 1 and 60" + } + }, + "isRLSEnabled": false + }, + "habit_tracker.users": { + "name": "users", + "schema": "habit_tracker", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "identity": { + "type": "always", + "name": "users_id_seq", + "schema": "habit_tracker", + "increment": "1", + "startWith": "1", + "minValue": "1", + "maxValue": "2147483647", + "cache": "1", + "cycle": false + } + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": { + "habit_tracker": "habit_tracker" + }, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/applications/habit-tracker/drizzle/meta/_journal.json b/applications/habit-tracker/drizzle/meta/_journal.json new file mode 100644 index 00000000..e86322ac --- /dev/null +++ b/applications/habit-tracker/drizzle/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1792587155318, + "tag": "0000_init", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/applications/habit-tracker/next.config.ts b/applications/habit-tracker/next.config.ts new file mode 100644 index 00000000..766cd0e3 --- /dev/null +++ b/applications/habit-tracker/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const config: NextConfig = { + poweredByHeader: false, +}; + +export default config; diff --git a/applications/habit-tracker/package-lock.json b/applications/habit-tracker/package-lock.json new file mode 100644 index 00000000..b2f29a73 --- /dev/null +++ b/applications/habit-tracker/package-lock.json @@ -0,0 +1,4518 @@ +{ + "name": "habit-tracker", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "habit-tracker", + "version": "1.0.0", + "dependencies": { + "@clickhouse/click-ui": "0.15.0", + "drizzle-orm": "0.45.4", + "next": "16.4.2", + "pg": "8.23.1", + "react": "19.3.1", + "react-dom": "19.3.1", + "zod": "4.6.7" + }, + "devDependencies": { + "@types/node": "24.19.2", + "@types/pg": "8.23.1", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", + "drizzle-kit": "0.31.11", + "tsx": "4.23.15", + "typescript": "5.9.3" + }, + "engines": { + "node": ">=24.0.0 <25" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.10.tgz", + "integrity": "sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@clickhouse/click-ui": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@clickhouse/click-ui/-/click-ui-0.15.0.tgz", + "integrity": "sha512-JJGfC9oqcUrby6yyklr5iCeCaUqViWV4t9vNocny2Vi06YDmZjU31a6AikoEnR9ZjQtw2t9wGbXLpnT1Ck32jA==", + "license": "Apache-2.0", + "dependencies": { + "@h6s/calendar": "2.2.0", + "@radix-ui/react-accordion": "1.2.20", + "@radix-ui/react-avatar": "1.2.6", + "@radix-ui/react-checkbox": "1.3.11", + "@radix-ui/react-context-menu": "2.3.7", + "@radix-ui/react-dialog": "1.1.23", + "@radix-ui/react-dropdown-menu": "2.1.24", + "@radix-ui/react-hover-card": "1.1.23", + "@radix-ui/react-popover": "1.1.23", + "@radix-ui/react-radio-group": "1.4.7", + "@radix-ui/react-separator": "1.1.15", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-switch": "1.3.7", + "@radix-ui/react-tabs": "1.1.21", + "@radix-ui/react-toast": "1.2.23", + "@radix-ui/react-tooltip": "1.2.16", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "dayjs": "^1.11.19", + "lodash-es": "^4.17.23", + "react-sortablejs": "^6.1.4", + "react-syntax-highlighter": "^16.1.0", + "react-virtualized-auto-sizer": "^1.0.20", + "react-window": "^1.8.9", + "sortablejs": "^1.15.0" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "dayjs": "^1.11.19", + "react": "^18.3.1 || ^19.0.0", + "react-dom": "^18.3.1 || ^19.0.0" + } + }, + "node_modules/@drizzle-team/brocli": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", + "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", + "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", + "deprecated": "Merged into tsx: https://tsx.hirok.io", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", + "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", + "deprecated": "Merged into tsx: https://tsx.hirok.io", + "dev": true, + "license": "MIT", + "dependencies": { + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.8.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@h6s/calendar": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@h6s/calendar/-/calendar-2.2.0.tgz", + "integrity": "sha512-o1fb4RlMWDRIOiMEX65vN5qDTiD/OyC++EkJzmoz9l1vUOkN89gTE+wNE83XZBi3hbYqMV3CNhgKf51n/0hcBw==", + "peerDependencies": { + "react": ">= 18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.5.tgz", + "integrity": "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.5.tgz", + "integrity": "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.5.tgz", + "integrity": "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.4.tgz", + "integrity": "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.4.tgz", + "integrity": "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.4.tgz", + "integrity": "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.4.tgz", + "integrity": "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.4.tgz", + "integrity": "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.4.tgz", + "integrity": "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.4.tgz", + "integrity": "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.4.tgz", + "integrity": "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.4.tgz", + "integrity": "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.4.tgz", + "integrity": "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.5.tgz", + "integrity": "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.5.tgz", + "integrity": "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.5.tgz", + "integrity": "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.5.tgz", + "integrity": "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.5.tgz", + "integrity": "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.5.tgz", + "integrity": "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.5.tgz", + "integrity": "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.5.tgz", + "integrity": "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.5.tgz", + "integrity": "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.5.tgz", + "integrity": "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.5.tgz", + "integrity": "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.5.tgz", + "integrity": "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.5.tgz", + "integrity": "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@next/env": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.4.2.tgz", + "integrity": "sha512-nTUTFH7G5/J/fmpkjVLegOkqyKOP0CEsJcMsyO4UCYeN1su+YMW/MfaSErnJskL7XM+UDK6aTvslxsRCyya/sA==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.4.2.tgz", + "integrity": "sha512-ONkhFvZNFWlsEHOM/81AtxdyuJP2KRYKYR0JxPwvcu1AuPMMMgcL+wW2luldJvMtZwKtUxoSkCychW5wIeoYSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.4.2.tgz", + "integrity": "sha512-luPCMbOsCoaF+kXJEUjmjmOZg1lC3BflhmUu+ZmW4tBu2vW/4AXak8JBFvePizGkxVmNiAw/r9ra+6UviCWtWQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.4.2.tgz", + "integrity": "sha512-xhwFTAncJyaCNy5KqKKuKaIIdCy1/1ZV1s5S1G0hhT7wGMkDTlfJ6aQbfRFnIG/s3/kDrxQ8aycVe+c5QnP8ow==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.4.2.tgz", + "integrity": "sha512-T1PNmfbPcxr5ndtWUL/3wQtLXsz808lq6sc2GrNT5k2oquF7UyqZddHSuAewHVsWsGXe6nsl9HoN1YNriVjuSg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.4.2.tgz", + "integrity": "sha512-N9cDUOCGtkJG5PNKDFZUF3xXndrJJcpLp121uAGjIGvO/U2p9tfdNOM9htj7+5f72l0m8rMw/cvYacUJBQoudg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.4.2.tgz", + "integrity": "sha512-yY2uh1YhX6ufuYy2FCbw1dqblbhI57GLYAJfCkqD9auTv6pLrH67Uccjc3QMKBeCYAG6lkgu08ExmX1bbjejjQ==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.4.2.tgz", + "integrity": "sha512-j/ArWRIHpMMB6wYLMhr2puTguBt70lNU/Cmjl9p6dTDE8DGknYJMP9PdwPk2dqpCNL/KIX9yfngDvIesxJPmsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.4.2.tgz", + "integrity": "sha512-AA4edyWHDko3NCSo0x6GomsdgFb0oR1J3MXU1b5xt6FRFg4AucrMPW3S0hCe/9onU0O1BbpGQBsqo1r0Gneu1g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.20.tgz", + "integrity": "sha512-jDhG9FvAEnlhnjrsINbNXcUa4G+L1KqSkJSunkbKEzFRcAb52jvM0PjPxPRvhe1HNc5F5yc0yzzWeeqlH4yBIg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collapsible": "1.1.20", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", + "integrity": "sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.6.tgz", + "integrity": "sha512-4ULOTJ/mqy2hT9GlWa/MFHxHSvH3nJzHnZM1waNsc5Bonv7i70aNenghXmD97S6OJ81ekXONGGt4nT1r0PfEdA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.11.tgz", + "integrity": "sha512-Gnptr9pDDQxD3hgq2dtPbtrp/c2qH1mBwIzw3X/ivrMb2e1t0jMTi606fVEqFPaQR1ggXIVQWKj3P2WW9v7zGQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.20.tgz", + "integrity": "sha512-mcGesGplBnzN2sbvJETzpCNfSMyPnb29q1GRLU+Ib7bJrpIG2ywmRoh2V5VbA2uNvKikKUlVbAPks7JDjz4A8Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", + "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", + "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.7.tgz", + "integrity": "sha512-CtXP35dxaB5T3zXSd+E3uHe/QpXcpYnZmxp6OaIbfthtfW4wyb77M23BG+bwIJDtsMwEP/YssdsmNyZu7jhWew==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", + "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", + "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", + "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-effect-event": "0.0.5" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.24.tgz", + "integrity": "sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", + "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", + "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.23.tgz", + "integrity": "sha512-H8qONfZd3ltrU3+jHCIgITbWo6e1iTKvP9DHdrvYbX48ooRM5FjEDTn16AMwdfuOGkWdZEhpl3PLL/Wk/AnHDQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", + "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.24.tgz", + "integrity": "sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.23.tgz", + "integrity": "sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", + "integrity": "sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-rect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/rect": "1.1.3" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", + "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", + "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.3.3" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.7.tgz", + "integrity": "sha512-cgYFEkntCxppHZgtSZ+7vh0wbZQ+IC7PPMw8DSnRG27B6kDd32/Zw0OJt7dGDigCoprMuWHjg2PvUn3PYvPFoQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz", + "integrity": "sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.15.tgz", + "integrity": "sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.7.tgz", + "integrity": "sha512-48tB/4dn2UVLBCYhTu9AuR63IHl73l/qLbLgxd86noTUor4/K4LFDAcYjK+isP5313qxaFpjPVogE7+Y0/V3Kw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.21.tgz", + "integrity": "sha512-UKxJlZid7FVtsk/WTxj4i4uSEgj2Au+KBbS7SQyTlzMhhn+86Cz3tISZdTa87bfEfcuvZezf2ZsxD4xuEKtkog==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.23.tgz", + "integrity": "sha512-ofhyAsYaocRGOs/n0XWdUOSVzEAG6BfrMVM8z0c0kLEWY38w/0WuMFPTJP/HVaZPYkMvHZoKIIhNcjbTCBILPg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.16.tgz", + "integrity": "sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", + "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", + "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", + "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", + "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", + "integrity": "sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", + "integrity": "sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "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 + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "24.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.19.2.tgz", + "integrity": "sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/pg": { + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.23.1.tgz", + "integrity": "sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.3.0" + } + }, + "node_modules/@types/sortablejs": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.9.tgz", + "integrity": "sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.30", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.30.tgz", + "integrity": "sha512-YJs6Pz17RMNv8HoyKREtCY38E3BV1nPkWVmIb+XN1uHC1Vqt3KZCH/uJH9ZKRoiKb/icZ6tvehyee6RZNbFfRA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001818", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001818.tgz", + "integrity": "sha512-XJbgo4adscw7R4MZU4/qVFkoMyPaNUAWmdNY4o/k9x7fFwmv4frIlndI9lWuaxviW9ObiZel9LuncnQPn6hQ5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==", + "license": "MIT" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.23", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/drizzle-kit": { + "version": "0.31.11", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.11.tgz", + "integrity": "sha512-YCYqxTLIB2OCqf6w9/Vef13baBVbwQIPcbT4Y56AfO6B9ajZhDhD8Jkveg/hJvT/iuMloKD/IYYkyMMNhr7Kqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@drizzle-team/brocli": "^0.10.2", + "@esbuild-kit/esm-loader": "^2.5.5", + "esbuild": "^0.25.4", + "tsx": "^4.21.0" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-orm": { + "version": "0.45.4", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.4.tgz", + "integrity": "sha512-NiM1YZpJ2UxyeE67DpDDZ+Tsw4YLX3trSlkNT7Tm9eKoUNb1LvaAaQzXgYQsWs+AQ9TUmmwMmBOCXuqqxUWKKQ==", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@netlify/db": ">=0.4.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1.13", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@upstash/redis": ">=1.34.7", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "gel": ">=2", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@libsql/client-wasm": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@netlify/db": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "gel": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz", + "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", + "license": "CC0-1.0" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/next/-/next-16.4.2.tgz", + "integrity": "sha512-r+oBJojfefUjOiWkBhXgLS+igxX/7BWyK59uHnyOyplMSLtBZ+QLP3okrdYTbrfrbrmNTVWLBPaHDX9KRaIt3w==", + "license": "MIT", + "dependencies": { + "@next/env": "16.4.2", + "@swc/helpers": "0.5.23", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.5.23", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.4.2", + "@next/swc-darwin-x64": "16.4.2", + "@next/swc-linux-arm64-gnu": "16.4.2", + "@next/swc-linux-arm64-musl": "16.4.2", + "@next/swc-linux-x64-gnu": "16.4.2", + "@next/swc-linux-x64-musl": "16.4.2", + "@next/swc-win32-arm64-msvc": "16.4.2", + "@next/swc-win32-x64-msvc": "16.4.2", + "sharp": "^0.35.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.23.1.tgz", + "integrity": "sha512-aL96AHANtWjPLDOLqnhx+ngp9+UK7ETEU8VJrDCGvsSSi/mGLcWYsS6Herg7lmaBJe4uwrfqsa7gTEFaSizDoQ==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.14.1", + "pg-pool": "^3.14.0", + "pg-protocol": "^1.16.1", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.4.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.1.tgz", + "integrity": "sha512-6PQbsFWZcp9EmJEwy5cGQ2La+AMWpP46lgbb8X+U/XsHIUweYDNCpeuKck5RxL2MdVFi7krbbEi5nX4Zh7JhrQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.1.tgz", + "integrity": "sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", + "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.1.tgz", + "integrity": "sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react": { + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz", + "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.1.tgz", + "integrity": "sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.28.0" + }, + "peerDependencies": { + "react": "^19.3.1" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-sortablejs": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/react-sortablejs/-/react-sortablejs-6.1.4.tgz", + "integrity": "sha512-fc7cBosfhnbh53Mbm6a45W+F735jwZ1UFIYSrIqcO/gRIFoDyZeMtgKlpV4DdyQfbCzdh5LoALLTDRxhMpTyXQ==", + "license": "MIT", + "dependencies": { + "classnames": "2.3.1", + "tiny-invariant": "1.2.0" + }, + "peerDependencies": { + "@types/sortablejs": "1", + "react": ">=16.9.0", + "react-dom": ">=16.9.0", + "sortablejs": "1" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-syntax-highlighter": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.2.tgz", + "integrity": "sha512-4dM0+mYtfnhgwYWAvFx56fgyjIYk2yFopfiICFvMDhRfeSGRNd+ngFALdPD9q7llyGAmiE6pzOSOwI8Lf9ca1w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^5.0.0" + }, + "engines": { + "node": ">= 16.20.2" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.26.tgz", + "integrity": "sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A==", + "license": "MIT", + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-window": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz", + "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/refractor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-5.0.0.tgz", + "integrity": "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/prismjs": "^1.0.0", + "hastscript": "^9.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.5.tgz", + "integrity": "sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.5", + "@img/sharp-darwin-x64": "0.35.5", + "@img/sharp-freebsd-wasm32": "0.35.5", + "@img/sharp-libvips-darwin-arm64": "1.3.4", + "@img/sharp-libvips-darwin-x64": "1.3.4", + "@img/sharp-libvips-linux-arm": "1.3.4", + "@img/sharp-libvips-linux-arm64": "1.3.4", + "@img/sharp-libvips-linux-ppc64": "1.3.4", + "@img/sharp-libvips-linux-riscv64": "1.3.4", + "@img/sharp-libvips-linux-s390x": "1.3.4", + "@img/sharp-libvips-linux-x64": "1.3.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4", + "@img/sharp-libvips-linuxmusl-x64": "1.3.4", + "@img/sharp-linux-arm": "0.35.5", + "@img/sharp-linux-arm64": "0.35.5", + "@img/sharp-linux-ppc64": "0.35.5", + "@img/sharp-linux-riscv64": "0.35.5", + "@img/sharp-linux-s390x": "0.35.5", + "@img/sharp-linux-x64": "0.35.5", + "@img/sharp-linuxmusl-arm64": "0.35.5", + "@img/sharp-linuxmusl-x64": "0.35.5", + "@img/sharp-webcontainers-wasm32": "0.35.5", + "@img/sharp-win32-arm64": "0.35.5", + "@img/sharp-win32-ia32": "0.35.5", + "@img/sharp-win32-x64": "0.35.5" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/sortablejs": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.7.tgz", + "integrity": "sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tiny-invariant": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", + "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.23.15", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz", + "integrity": "sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/zod": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz", + "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/applications/habit-tracker/package.json b/applications/habit-tracker/package.json new file mode 100644 index 00000000..cd69e63c --- /dev/null +++ b/applications/habit-tracker/package.json @@ -0,0 +1,37 @@ +{ + "name": "habit-tracker", + "version": "1.0.0", + "private": true, + "type": "module", + "engines": { + "node": ">=24.0.0 <25" + }, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "typecheck": "next typegen && tsc --noEmit", + "test": "next typegen && tsc --noEmit && node --import tsx --test tests/unit/*.test.ts", + "test:integration": "node --env-file-if-exists=.env --import tsx --test tests/integration/*.test.ts", + "db:generate": "drizzle-kit generate", + "db:migrate": "drizzle-kit migrate" + }, + "dependencies": { + "@clickhouse/click-ui": "0.15.0", + "drizzle-orm": "0.45.4", + "next": "16.4.2", + "pg": "8.23.1", + "react": "19.3.1", + "react-dom": "19.3.1", + "zod": "4.6.7" + }, + "devDependencies": { + "@types/node": "24.19.2", + "@types/pg": "8.23.1", + "@types/react": "19.3.0", + "@types/react-dom": "19.3.0", + "drizzle-kit": "0.31.11", + "tsx": "4.23.15", + "typescript": "5.9.3" + } +} diff --git a/applications/habit-tracker/sql/01_roles.sql b/applications/habit-tracker/sql/01_roles.sql new file mode 100644 index 00000000..37708c8e --- /dev/null +++ b/applications/habit-tracker/sql/01_roles.sql @@ -0,0 +1,20 @@ +-- Run once as the admin user (postgres). Passwords come from the environment, +-- so they never appear in this file or in shell history. +\set ON_ERROR_STOP on +\getenv migrator_password MIGRATOR_PASSWORD +\getenv app_password APP_PASSWORD + +BEGIN; + +-- habit_tracker_migrator runs drizzle-kit migrations and owns everything they +-- create: the habit_tracker schema and drizzle-kit's own "drizzle" schema. +CREATE ROLE habit_tracker_migrator LOGIN PASSWORD :'migrator_password'; +GRANT CREATE ON DATABASE :"DBNAME" TO habit_tracker_migrator; +-- habit_tracker_app is the runtime role: DML on the app's tables only (sql/02_grants.sql). +CREATE ROLE habit_tracker_app LOGIN PASSWORD :'app_password'; + +ALTER ROLE habit_tracker_app SET search_path = habit_tracker; +ALTER ROLE habit_tracker_app SET lock_timeout = '2s'; +ALTER ROLE habit_tracker_app SET idle_in_transaction_session_timeout = '10s'; + +COMMIT; diff --git a/applications/habit-tracker/sql/02_grants.sql b/applications/habit-tracker/sql/02_grants.sql new file mode 100644 index 00000000..93b622cc --- /dev/null +++ b/applications/habit-tracker/sql/02_grants.sql @@ -0,0 +1,12 @@ +-- Run as the admin user after `npm run db:migrate`. +\set ON_ERROR_STOP on +BEGIN; + +GRANT USAGE ON SCHEMA habit_tracker TO habit_tracker_app; +GRANT SELECT ON habit_tracker.users TO habit_tracker_app; +GRANT SELECT, INSERT ON habit_tracker.habits TO habit_tracker_app; +GRANT UPDATE (archived_at) ON habit_tracker.habits TO habit_tracker_app; +GRANT SELECT, INSERT, DELETE ON habit_tracker.check_ins TO habit_tracker_app; +-- No access to the drizzle schema (migration history) and no DDL. + +COMMIT; diff --git a/applications/habit-tracker/sql/03_seed.sql b/applications/habit-tracker/sql/03_seed.sql new file mode 100644 index 00000000..51ded3c6 --- /dev/null +++ b/applications/habit-tracker/sql/03_seed.sql @@ -0,0 +1,30 @@ +-- Run as the admin user. Creates the demo user and three habits with a few +-- weeks of check-ins. Safe to re-run. +\set ON_ERROR_STOP on +BEGIN; + +INSERT INTO habit_tracker.users (id, name) OVERRIDING SYSTEM VALUE +VALUES (1, 'Demo user') +ON CONFLICT (id) DO NOTHING; + +INSERT INTO habit_tracker.habits (id, user_id, name, created_at) OVERRIDING SYSTEM VALUE +VALUES + (1, 1, 'Read for 20 minutes', now() - interval '90 days'), + (2, 1, 'Walk 8,000 steps', now() - interval '90 days'), + (3, 1, 'No phone after 10pm', now() - interval '30 days') +ON CONFLICT (id) DO NOTHING; +SELECT setval(pg_get_serial_sequence('habit_tracker.habits', 'id'), (SELECT max(id) FROM habit_tracker.habits)); +SELECT setval(pg_get_serial_sequence('habit_tracker.users', 'id'), (SELECT max(id) FROM habit_tracker.users)); + +-- A deterministic pattern: habit 1 has a current streak, habit 2 misses some +-- days, habit 3 was missed yesterday and today. +INSERT INTO habit_tracker.check_ins (habit_id, day) +SELECT h.id, d::date +FROM habit_tracker.habits h +CROSS JOIN generate_series(current_date - 89, current_date, interval '1 day') d +WHERE (h.id = 1 AND (d::date > current_date - 12 OR extract(dow FROM d) <> 0)) + OR (h.id = 2 AND (d::date - (current_date - 89)) % 3 <> 0) + OR (h.id = 3 AND d::date BETWEEN current_date - 29 AND current_date - 2 AND extract(dow FROM d) NOT IN (5, 6)) +ON CONFLICT DO NOTHING; + +COMMIT; diff --git a/applications/habit-tracker/sql/99_cleanup.sql b/applications/habit-tracker/sql/99_cleanup.sql new file mode 100644 index 00000000..616d3711 --- /dev/null +++ b/applications/habit-tracker/sql/99_cleanup.sql @@ -0,0 +1,10 @@ +-- DESTRUCTIVE: run as the admin user to remove this example's schemas and roles. +\set ON_ERROR_STOP on +BEGIN; +-- habit_tracker holds the app's tables; drizzle holds drizzle-kit's migration history. +DROP SCHEMA IF EXISTS habit_tracker, drizzle CASCADE; +-- Removes anything else the roles own and revokes their privileges, such as CREATE on the database. +DROP OWNED BY habit_tracker_app, habit_tracker_migrator; +DROP ROLE habit_tracker_app; +DROP ROLE habit_tracker_migrator; +COMMIT; diff --git a/applications/habit-tracker/src/app/actions.ts b/applications/habit-tracker/src/app/actions.ts new file mode 100644 index 00000000..5f44e4b6 --- /dev/null +++ b/applications/habit-tracker/src/app/actions.ts @@ -0,0 +1,42 @@ +"use server"; + +import { revalidatePath } from "next/cache"; +import { getDb } from "@/db"; +import { appTimeZone, todayIn } from "@/lib/dates"; +import { + archiveHabit, + createHabit, + DEMO_USER_ID, + setCheckIn, +} from "@/lib/habits"; +import { checkInInput, habitId, habitName } from "@/lib/validation"; + +export type FormState = { error?: string }; + +export async function createHabitAction( + _prev: FormState, + formData: FormData, +): Promise { + const name = habitName.safeParse(formData.get("name")); + if (!name.success) return { error: name.error.issues[0].message }; + await createHabit(getDb(), DEMO_USER_ID, name.data); + revalidatePath("/"); + return {}; +} + +export async function archiveHabitAction(formData: FormData) { + const id = habitId.parse(formData.get("habitId")); + await archiveHabit(getDb(), DEMO_USER_ID, id); + revalidatePath("/"); +} + +export async function setCheckInAction(input: { + habitId: number; + day: string; + done: boolean; +}) { + const today = todayIn(appTimeZone()); + const { habitId, day, done } = checkInInput(today).parse(input); + await setCheckIn(getDb(), DEMO_USER_ID, habitId, day, done); + revalidatePath("/"); +} diff --git a/applications/habit-tracker/src/app/globals.css b/applications/habit-tracker/src/app/globals.css new file mode 100644 index 00000000..047584ad --- /dev/null +++ b/applications/habit-tracker/src/app/globals.css @@ -0,0 +1,38 @@ +body { + margin: 0; + background: var(--click-global-color-background-default, #151515); + font-family: + "Inter", + system-ui, + -apple-system, + "Segoe UI", + sans-serif; +} + +main { + max-width: 880px; + margin: 0 auto; + padding: 48px 24px; +} + +.days { + display: flex; + gap: 12px; +} + +.heatmap { + display: grid; + grid-template-rows: repeat(7, 14px); + grid-auto-flow: column; + grid-auto-columns: 14px; + gap: 4px; +} + +.heatmap span { + border-radius: 2px; + background: var(--click-global-color-stroke-default, #414141); +} + +.heatmap span[data-done="true"] { + background: #faff69; +} diff --git a/applications/habit-tracker/src/app/habits/[id]/page.tsx b/applications/habit-tracker/src/app/habits/[id]/page.tsx new file mode 100644 index 00000000..9b80981b --- /dev/null +++ b/applications/habit-tracker/src/app/habits/[id]/page.tsx @@ -0,0 +1,55 @@ +import { BigStat, Container, Text, Title } from "@clickhouse/click-ui"; +import { notFound } from "next/navigation"; +import { connection } from "next/server"; +import { AppLink } from "@/components/app-link"; +import { getDb } from "@/db"; +import { appTimeZone, todayIn } from "@/lib/dates"; +import { DEMO_USER_ID, habitHistory } from "@/lib/habits"; +import { habitId } from "@/lib/validation"; + +const HISTORY_DAYS = 91; // 13 full weeks + +export default async function HabitPage({ params }: PageProps<"/habits/[id]">) { + await connection(); + const id = habitId.safeParse((await params).id); + if (!id.success) notFound(); + const today = todayIn(appTimeZone()); + const habit = await habitHistory( + getDb(), + DEMO_USER_ID, + id.data, + today, + HISTORY_DAYS, + ); + if (!habit) notFound(); + const total = habit.days.filter((d) => d.done).length; + + return ( + + ← All habits + + {habit.name} + + + + + + +

+ {habit.days.map((d) => ( + + ))} +
+ + Each square is one day, oldest first, one column per week. + + + ); +} diff --git a/applications/habit-tracker/src/app/layout.tsx b/applications/habit-tracker/src/app/layout.tsx new file mode 100644 index 00000000..4b8f558b --- /dev/null +++ b/applications/habit-tracker/src/app/layout.tsx @@ -0,0 +1,25 @@ +import type { Metadata } from "next"; +import { Providers } from "./providers"; +import "./globals.css"; + +export const metadata: Metadata = { + title: "Habit Tracker", + description: + "A Next.js and Drizzle ORM habit tracker on ClickHouse Managed Postgres.", +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + +
{children}
+
+ + + ); +} diff --git a/applications/habit-tracker/src/app/page.tsx b/applications/habit-tracker/src/app/page.tsx new file mode 100644 index 00000000..c280a617 --- /dev/null +++ b/applications/habit-tracker/src/app/page.tsx @@ -0,0 +1,84 @@ +import { + Badge, + Button, + Container, + Table, + Text, + Title, +} from "@clickhouse/click-ui"; +import { connection } from "next/server"; +import { AddHabitForm } from "@/components/add-habit-form"; +import { AppLink } from "@/components/app-link"; +import { CheckInBox } from "@/components/check-in-box"; +import { getDb } from "@/db"; +import { appTimeZone, lastDays, todayIn, dayLabel } from "@/lib/dates"; +import { DEMO_USER_ID, listHabits } from "@/lib/habits"; +import { EDITABLE_DAYS } from "@/lib/validation"; +import { archiveHabitAction } from "./actions"; + +export default async function HabitsPage() { + await connection(); // render per request: "today" and check-ins change + const timeZone = appTimeZone(); + const today = todayIn(timeZone); + const week = lastDays(today, EDITABLE_DAYS); + const habits = await listHabits(getDb(), DEMO_USER_ID, today, week[0]); + + return ( + + + + Habit Tracker + + + Today is {today} ({timeZone}). Tick a day to check in. + + + + ({ label: dayLabel(day), width: "56px" })), + { label: "Streak", width: "96px" }, + { label: "", width: "104px" }, + ]} + rows={habits.map((habit) => ({ + id: habit.id, + items: [ + { + label: ( + {habit.name} + ), + }, + ...week.map((day) => ({ + label: ( + + ), + })), + { + label: ( + 0 ? "success" : "neutral"} + /> + ), + }, + { + label: ( +
+ +