From aeadb80fdbe2dcbfd34d77e2b3163bc61fb505c2 Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 23 Mar 2026 00:16:50 -0500 Subject: [PATCH] m3 --- Dockerfile | 3 +- UNRAID.md | 10 +++- client/src/App.tsx | 81 ++++++++++++++++++++++++++++-- client/src/api/player.ts | 33 ++++++++++++ client/src/components/Hud.tsx | 4 ++ client/src/game/GameShell.tsx | 10 ++-- client/src/game/matterScene.ts | 28 ++++++++--- client/src/game/types.ts | 2 + client/tsconfig.node.tsbuildinfo | 2 +- client/vite.config.js | 6 ++- client/vite.config.ts | 6 ++- compose.yml | 5 ++ package-lock.json | 11 ++++ server/package.json | 2 +- server/src/routes/missions.ts | 7 ++- server/src/routes/player.ts | 7 ++- server/src/server.test.ts | 35 +++++++++++-- server/src/services/database.ts | 23 +++++++++ server/src/services/missions.ts | 75 ++++++++++++++++----------- server/src/services/persistence.ts | 11 ++++ server/src/services/playerStore.ts | 71 +++++++++++++++++++++----- server/src/services/schema.ts | 45 +++++++++++++++++ 22 files changed, 402 insertions(+), 75 deletions(-) create mode 100644 client/src/api/player.ts create mode 100644 server/src/services/database.ts create mode 100644 server/src/services/persistence.ts create mode 100644 server/src/services/schema.ts diff --git a/Dockerfile b/Dockerfile index e652e2d..69f83de 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,6 +13,7 @@ RUN npm run build FROM node:20-alpine WORKDIR /app ENV NODE_ENV=production +ENV DATABASE_PATH=/data/stellar.sqlite COPY package.json package-lock.json ./ COPY server/package.json server/package.json @@ -22,5 +23,5 @@ COPY --from=builder /app/server/dist ./server/dist COPY --from=builder /app/client/dist ./client/dist EXPOSE 3000 +VOLUME ["/data"] CMD ["node", "server/dist/server.js"] - diff --git a/UNRAID.md b/UNRAID.md index 066d914..5b8827b 100644 --- a/UNRAID.md +++ b/UNRAID.md @@ -37,6 +37,8 @@ docker run -d \ -p 8080:3000 \ -e PORT=3000 \ -e LOG_LEVEL=info \ + -e DATABASE_PATH=/data/stellar.sqlite \ + -v /mnt/user/appdata/stellar:/data \ stellar:local ``` @@ -69,6 +71,8 @@ docker run -d \ -p 8080:3000 \ -e PORT=3000 \ -e LOG_LEVEL=info \ + -e DATABASE_PATH=/data/stellar.sqlite \ + -v /mnt/user/appdata/stellar:/data \ /stellar: ``` @@ -107,6 +111,8 @@ docker run -d \ -p 8080:3000 \ -e PORT=3000 \ -e LOG_LEVEL=info \ + -e DATABASE_PATH=/data/stellar.sqlite \ + -v /mnt/user/appdata/stellar:/data \ stellar:local ``` @@ -120,7 +126,7 @@ docker compose up -d --build ## Notes -- There is no persistent SQLite mount yet because M3 persistence has not been implemented. -- When SQLite is added, bind-mount a host path such as `/mnt/user/appdata/stellar/data` into the container. +- SQLite persistence now defaults to `/data/stellar.sqlite` in containers. +- The examples above bind `/mnt/user/appdata/stellar` into `/data` so profile data survives container recreation. - If Unraid already uses port `8080`, change the host-side port mapping and browse to that port instead. - Logs are written to container stdout/stderr and can be viewed from the Unraid Docker UI or with `docker logs stellar`. diff --git a/client/src/App.tsx b/client/src/App.tsx index 25a6291..a84a63f 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -1,10 +1,74 @@ -import { useState } from "react"; +import { useEffect, useRef, useState } from "react"; +import { fetchPlayerProfile, savePlayerProfile, type PlayerProfile } from "./api/player"; import { Hud } from "./components/Hud"; import { GameShell } from "./game/GameShell"; import { defaultGameState, type GameState } from "./game/types"; export default function App() { const [gameState, setGameState] = useState(defaultGameState); + const [profile, setProfile] = useState(null); + const [loadError, setLoadError] = useState(null); + const hasLoaded = useRef(false); + + useEffect(() => { + let cancelled = false; + + fetchPlayerProfile() + .then((nextProfile) => { + if (cancelled) { + return; + } + + setProfile(nextProfile); + }) + .catch((error: Error) => { + if (cancelled) { + return; + } + + setLoadError(error.message); + setProfile({ + id: "local-player", + mass: defaultGameState.mass, + xp: defaultGameState.xp, + evolutions: [] + }); + }); + + return () => { + cancelled = true; + }; + }, []); + + useEffect(() => { + if (!profile) { + return; + } + + if (!hasLoaded.current) { + hasLoaded.current = true; + return; + } + + const timeoutId = window.setTimeout(() => { + void savePlayerProfile({ + mass: gameState.mass, + xp: gameState.xp, + evolutions: profile.evolutions + }).catch(() => undefined); + }, 750); + + return () => { + window.clearTimeout(timeoutId); + }; + }, [gameState.mass, gameState.xp, profile]); + + const initialProfile: PlayerProfile = profile ?? { + id: "local-player", + mass: defaultGameState.mass, + xp: defaultGameState.xp, + evolutions: [] + }; return (
@@ -17,12 +81,23 @@ export default function App() {
- M1 loop: drag the singularity, consume dust, and grow your event horizon. + M3 persistence: profile state now reloads through the API-backed SQLite store.
+ {loadError ? ( +
+ Profile load fell back to local defaults: {loadError} +
+ ) : null} +
- +
diff --git a/client/src/api/player.ts b/client/src/api/player.ts new file mode 100644 index 0000000..acf889b --- /dev/null +++ b/client/src/api/player.ts @@ -0,0 +1,33 @@ +export interface PlayerProfile { + id: string; + mass: number; + xp: number; + evolutions: string[]; +} + +export async function fetchPlayerProfile() { + const response = await fetch("/api/player"); + + if (!response.ok) { + throw new Error(`Failed to load player profile: ${response.status}`); + } + + return (await response.json()) as PlayerProfile; +} + +export async function savePlayerProfile(profile: Pick) { + const response = await fetch("/api/player", { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(profile) + }); + + if (!response.ok) { + throw new Error(`Failed to save player profile: ${response.status}`); + } + + return (await response.json()) as PlayerProfile; +} + diff --git a/client/src/components/Hud.tsx b/client/src/components/Hud.tsx index 4b80d31..ddfd13a 100644 --- a/client/src/components/Hud.tsx +++ b/client/src/components/Hud.tsx @@ -27,6 +27,10 @@ export function Hud({ gameState }: HudProps) {
Tier
{gameState.tier}
+
+
XP
+
{gameState.xp}
+
Pull Radius
{gameState.pullRadius.toFixed(0)}m
diff --git a/client/src/game/GameShell.tsx b/client/src/game/GameShell.tsx index 61cd6b9..38b67af 100644 --- a/client/src/game/GameShell.tsx +++ b/client/src/game/GameShell.tsx @@ -1,13 +1,15 @@ import { useEffect, useRef } from "react"; import { initMatterScene } from "./matterScene"; import { type GameState } from "./types"; +import { type PlayerProfile } from "../api/player"; interface GameShellProps { gameState: GameState; onStateChange: (state: GameState) => void; + initialProfile: PlayerProfile; } -export function GameShell({ gameState, onStateChange }: GameShellProps) { +export function GameShell({ gameState, onStateChange, initialProfile }: GameShellProps) { const canvasRef = useRef(null); useEffect(() => { @@ -17,8 +19,8 @@ export function GameShell({ gameState, onStateChange }: GameShellProps) { return; } - return initMatterScene(canvas, onStateChange); - }, [onStateChange]); + return initMatterScene(canvas, onStateChange, initialProfile); + }, [initialProfile, onStateChange]); return (
@@ -28,7 +30,7 @@ export function GameShell({ gameState, onStateChange }: GameShellProps) { {gameState.tier}
- Drag inside the black hole to steer. Dust caught inside the event horizon increases mass and radius. + Drag inside the black hole to steer. Profile progress now loads from and saves to the API-backed SQLite store.
); diff --git a/client/src/game/matterScene.ts b/client/src/game/matterScene.ts index 3a47e73..af02b91 100644 --- a/client/src/game/matterScene.ts +++ b/client/src/game/matterScene.ts @@ -8,12 +8,11 @@ import { type Body as MatterBody, type IEventCollision } from "matter-js"; +import { type PlayerProfile } from "../api/player"; import { getCurrentPreyTier, getNextUnlock, getTierForMass, getUnlockedKinds } from "./progression"; import { CELESTIAL_OBJECTS, type CelestialKind, type CelestialObjectDefinition } from "./spaceObjects"; import { defaultGameState, type GameState } from "./types"; -const STARTING_MASS = defaultGameState.mass; -const STARTING_RADIUS = defaultGameState.radius; const EMIT_INTERVAL_MS = 900; interface CelestialBody extends MatterBody { @@ -22,7 +21,11 @@ interface CelestialBody extends MatterBody { }; } -export function initMatterScene(canvas: HTMLCanvasElement, onStateChange: (state: GameState) => void) { +export function initMatterScene( + canvas: HTMLCanvasElement, + onStateChange: (state: GameState) => void, + initialProfile: Pick +) { const context = canvas.getContext("2d"); if (!context) { @@ -32,7 +35,9 @@ export function initMatterScene(canvas: HTMLCanvasElement, onStateChange: (state const engine = Engine.create({ gravity: { x: 0, y: 0 } }); - const blackHole = Bodies.circle(0, 0, STARTING_RADIUS, { + const startingMass = Math.max(defaultGameState.mass, initialProfile.mass); + const startingRadius = defaultGameState.radius + Math.sqrt(startingMass - defaultGameState.mass) * 2.6; + const blackHole = Bodies.circle(0, 0, defaultGameState.radius, { isStatic: true, isSensor: true, frictionAir: 0, @@ -46,8 +51,9 @@ export function initMatterScene(canvas: HTMLCanvasElement, onStateChange: (state const pointer = { x: 0, y: 0 }; const worldSize = { width: 0, height: 0 }; - let mass = STARTING_MASS; - let radius = STARTING_RADIUS; + let mass = startingMass; + let xp = initialProfile.xp; + let radius = startingRadius; let dragging = false; let animationFrame = 0; let lastTimestamp = 0; @@ -55,13 +61,15 @@ export function initMatterScene(canvas: HTMLCanvasElement, onStateChange: (state let consumedObjects = 0; let lastEmit = 0; + Body.scale(blackHole, startingRadius / defaultGameState.radius, startingRadius / defaultGameState.radius); World.add(engine.world, blackHole); const clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value)); const getPullRadius = () => radius * 3.1; - const getRadiusForMass = (nextMass: number) => STARTING_RADIUS + Math.sqrt(nextMass - STARTING_MASS) * 2.6; + const getRadiusForMass = (nextMass: number) => + defaultGameState.radius + Math.sqrt(nextMass - defaultGameState.mass) * 2.6; const getObjectDef = (kind: CelestialKind) => CELESTIAL_OBJECTS.find((objectDef) => objectDef.kind === kind) as CelestialObjectDefinition; @@ -72,6 +80,7 @@ export function initMatterScene(canvas: HTMLCanvasElement, onStateChange: (state const emitState = () => { onStateChange({ mass, + xp, radius, pullRadius: getPullRadius(), tier: getTierForMass(mass), @@ -192,7 +201,9 @@ export function initMatterScene(canvas: HTMLCanvasElement, onStateChange: (state World.remove(engine.world, body); consumedObjects += 1; - mass += getObjectDef(body.plugin.celestialKind as CelestialKind).rewardMass; + const rewardMass = getObjectDef(body.plugin.celestialKind as CelestialKind).rewardMass; + mass += rewardMass; + xp += rewardMass; syncHoleScale(getRadiusForMass(mass)); emitState(); @@ -384,6 +395,7 @@ export function initMatterScene(canvas: HTMLCanvasElement, onStateChange: (state animationFrame = window.requestAnimationFrame(tick); }; + mass = startingMass; resizeCanvas(); topOffField(); emitState(); diff --git a/client/src/game/types.ts b/client/src/game/types.ts index 4b6af9f..100b3e7 100644 --- a/client/src/game/types.ts +++ b/client/src/game/types.ts @@ -2,6 +2,7 @@ import { getTierForMass } from "./progression"; export interface GameState { mass: number; + xp: number; radius: number; pullRadius: number; tier: string; @@ -14,6 +15,7 @@ export interface GameState { export const defaultGameState: GameState = { mass: 12, + xp: 0, radius: 24, pullRadius: 74.4, tier: getTierForMass(12), diff --git a/client/tsconfig.node.tsbuildinfo b/client/tsconfig.node.tsbuildinfo index 4ffb075..8374cee 100644 --- a/client/tsconfig.node.tsbuildinfo +++ b/client/tsconfig.node.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../node_modules/typescript/lib/lib.scripthost.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/typescript/lib/lib.es2020.full.d.ts","../node_modules/@vitest/spy/dist/index.d.ts","../node_modules/@vitest/pretty-format/dist/index.d.ts","../node_modules/@vitest/utils/dist/types.d.ts","../node_modules/@vitest/utils/dist/helpers.d.ts","../node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts","../node_modules/tinyrainbow/dist/node.d.ts","../node_modules/@vitest/utils/dist/index.d.ts","../node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","../node_modules/@vitest/utils/dist/diff.d.ts","../node_modules/@vitest/expect/dist/index.d.ts","../node_modules/@types/node/compatibility/disposable.d.ts","../node_modules/@types/node/compatibility/indexable.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/compatibility/index.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/web-globals/abortcontroller.d.ts","../node_modules/@types/node/web-globals/domexception.d.ts","../node_modules/@types/node/web-globals/events.d.ts","../node_modules/buffer/index.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/web-globals/fetch.d.ts","../node_modules/@types/node/web-globals/navigator.d.ts","../node_modules/@types/node/web-globals/storage.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/inspector.generated.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/estree/index.d.ts","../node_modules/rollup/dist/rollup.d.ts","../node_modules/rollup/dist/parseast.d.ts","../node_modules/vite/types/hmrpayload.d.ts","../node_modules/vite/types/customevent.d.ts","../node_modules/vite/types/hot.d.ts","../node_modules/vite/dist/node/modulerunnertransport.d-dj_me5sf.d.ts","../node_modules/vite/dist/node/module-runner.d.ts","../node_modules/vite/node_modules/esbuild/lib/main.d.ts","../node_modules/source-map-js/source-map.d.ts","../node_modules/postcss/lib/previous-map.d.ts","../node_modules/postcss/lib/input.d.ts","../node_modules/postcss/lib/css-syntax-error.d.ts","../node_modules/postcss/lib/declaration.d.ts","../node_modules/postcss/lib/root.d.ts","../node_modules/postcss/lib/warning.d.ts","../node_modules/postcss/lib/lazy-result.d.ts","../node_modules/postcss/lib/no-work-result.d.ts","../node_modules/postcss/lib/processor.d.ts","../node_modules/postcss/lib/result.d.ts","../node_modules/postcss/lib/document.d.ts","../node_modules/postcss/lib/rule.d.ts","../node_modules/postcss/lib/node.d.ts","../node_modules/postcss/lib/comment.d.ts","../node_modules/postcss/lib/container.d.ts","../node_modules/postcss/lib/at-rule.d.ts","../node_modules/postcss/lib/list.d.ts","../node_modules/postcss/lib/postcss.d.ts","../node_modules/postcss/lib/postcss.d.mts","../node_modules/vite/types/internal/lightningcssoptions.d.ts","../node_modules/vite/types/internal/csspreprocessoroptions.d.ts","../node_modules/vite/types/importglob.d.ts","../node_modules/vite/types/metadata.d.ts","../node_modules/vite/dist/node/index.d.ts","../node_modules/@vitest/runner/dist/tasks.d-cksck4of.d.ts","../node_modules/@vitest/runner/dist/types.d.ts","../node_modules/@vitest/utils/dist/error.d.ts","../node_modules/@vitest/runner/dist/index.d.ts","../node_modules/vitest/optional-types.d.ts","../node_modules/vitest/dist/chunks/environment.d.cl3nlxbe.d.ts","../node_modules/@vitest/mocker/dist/registry.d-d765pazg.d.ts","../node_modules/@vitest/mocker/dist/types.d-d_arzrdy.d.ts","../node_modules/@vitest/mocker/dist/index.d.ts","../node_modules/@vitest/utils/dist/source-map.d.ts","../node_modules/vite-node/dist/trace-mapping.d-dlvdeqop.d.ts","../node_modules/vite-node/dist/index.d-dgmxd2u7.d.ts","../node_modules/vite-node/dist/index.d.ts","../node_modules/@vitest/snapshot/dist/environment.d-dhdq1csl.d.ts","../node_modules/@vitest/snapshot/dist/rawsnapshot.d-lfsmjfud.d.ts","../node_modules/@vitest/snapshot/dist/index.d.ts","../node_modules/@vitest/snapshot/dist/environment.d.ts","../node_modules/vitest/dist/chunks/config.d.d2roskhv.d.ts","../node_modules/vitest/dist/chunks/worker.d.1gmbbd7g.d.ts","../node_modules/@types/deep-eql/index.d.ts","../node_modules/assertion-error/index.d.ts","../node_modules/@types/chai/index.d.ts","../node_modules/@vitest/runner/dist/utils.d.ts","../node_modules/tinybench/dist/index.d.ts","../node_modules/vitest/dist/chunks/benchmark.d.bwvbvtda.d.ts","../node_modules/vite-node/dist/client.d.ts","../node_modules/vitest/dist/chunks/coverage.d.s9rmnxie.d.ts","../node_modules/@vitest/snapshot/dist/manager.d.ts","../node_modules/vitest/dist/chunks/reporters.d.bflkqcl6.d.ts","../node_modules/vitest/dist/chunks/vite.d.cmlllifp.d.ts","../node_modules/vitest/dist/config.d.ts","../node_modules/vitest/config.d.ts","../node_modules/@babel/types/lib/index.d.ts","../node_modules/@types/babel__generator/index.d.ts","../node_modules/@babel/parser/typings/babel-parser.d.ts","../node_modules/@types/babel__template/index.d.ts","../node_modules/@types/babel__traverse/index.d.ts","../node_modules/@types/babel__core/index.d.ts","../node_modules/@vitejs/plugin-react/dist/index.d.ts","./vite.config.ts","../node_modules/tailwindcss/types/generated/corepluginlist.d.ts","../node_modules/tailwindcss/types/generated/colors.d.ts","../node_modules/tailwindcss/types/config.d.ts","../node_modules/tailwindcss/types/index.d.ts","./tailwind.config.ts","../node_modules/@types/aria-query/index.d.ts","../node_modules/@types/connect/index.d.ts","../node_modules/@types/body-parser/index.d.ts","../node_modules/@types/cors/index.d.ts","../node_modules/@types/send/index.d.ts","../node_modules/@types/qs/index.d.ts","../node_modules/@types/range-parser/index.d.ts","../node_modules/@types/express-serve-static-core/index.d.ts","../node_modules/@types/http-errors/index.d.ts","../node_modules/@types/serve-static/index.d.ts","../node_modules/@types/express/index.d.ts","../node_modules/@types/prop-types/index.d.ts","../node_modules/@types/react/global.d.ts","../node_modules/csstype/index.d.ts","../node_modules/@types/react/index.d.ts","../node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[67,116,133,134,244],[67,116,133,134,232,239],[67,116,133,134,233],[67,116,133,134],[67,116,133,134,233,234,235,236,237],[67,116,133,134,233,235],[67,116,130,133,134,166,247],[67,116,133,134,220,221],[67,116,130,133,134,166],[67,116,127,130,133,134,166,250,251,252],[67,116,133,134,248,253,255],[67,113,114,116,133,134],[67,115,116,133,134],[116,133,134],[67,116,121,133,134,151],[67,116,117,122,127,133,134,136,148,159],[67,116,117,118,127,133,134,136],[62,63,64,67,116,133,134],[67,116,119,133,134,160],[67,116,120,121,128,133,134,137],[67,116,121,133,134,148,156],[67,116,122,124,127,133,134,136],[67,115,116,123,133,134],[67,116,124,125,133,134],[67,116,126,127,133,134],[67,115,116,127,133,134],[67,116,127,128,129,133,134,148,159],[67,116,127,128,129,133,134,143,148,151],[67,109,116,124,127,130,133,134,136,148,159],[67,116,127,128,130,131,133,134,136,148,156,159],[67,116,130,132,133,134,148,156,159],[65,66,67,68,69,70,71,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],[67,116,127,133,134],[67,116,133,134,135,159],[67,116,124,127,133,134,136,148],[67,116,133,134,137],[67,116,133,134,138],[67,115,116,133,134,139],[67,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],[67,116,133,134,141],[67,116,133,134,142],[67,116,127,133,134,143,144],[67,116,133,134,143,145,160,162],[67,116,128,133,134],[67,116,127,133,134,148,149,151],[67,116,133,134,150,151],[67,116,133,134,148,149],[67,116,133,134,151],[67,116,133,134,152],[67,113,116,133,134,148,153,159],[67,116,127,133,134,154,155],[67,116,133,134,154,155],[67,116,121,133,134,136,148,156],[67,116,133,134,157],[67,116,133,134,136,158],[67,116,130,133,134,142,159],[67,116,121,133,134,160],[67,116,133,134,148,161],[67,116,133,134,135,162],[67,116,133,134,163],[67,109,116,133,134],[67,109,116,127,129,133,134,139,148,151,159,161,162,164],[67,116,133,134,148,165],[67,116,133,134,260],[67,116,133,134,257,258,259],[67,116,128,133,134,148,166],[67,116,130,133,134,166,254],[67,116,133,134,200,230,238],[52,57,58,60,67,116,133,134],[67,116,133,134,207,208],[58,60,67,116,133,134,201,202,203],[58,67,116,133,134],[58,60,67,116,133,134,201],[58,67,116,133,134,201],[67,116,133,134,214],[53,67,116,133,134,214,215],[53,67,116,133,134,214],[53,59,67,116,133,134],[54,67,116,133,134],[53,54,55,57,67,116,133,134],[53,67,116,133,134],[67,116,133,134,191],[67,116,133,134,189,191],[67,116,133,134,180,188,189,190,192,194],[67,116,133,134,178],[67,116,133,134,181,186,191,194],[67,116,133,134,177,194],[67,116,133,134,181,182,185,186,187,194],[67,116,133,134,181,182,183,185,186,194],[67,116,133,134,178,179,180,181,182,186,187,188,190,191,192,194],[67,116,133,134,194],[67,116,133,134,176,178,179,180,181,182,183,185,186,187,188,189,190,191,192,193],[67,116,133,134,176,194],[67,116,133,134,181,183,184,186,187,194],[67,116,133,134,185,194],[67,116,133,134,186,187,191,194],[67,116,133,134,179,189],[67,116,133,134,168,199,200],[67,116,133,134,167,168],[67,116,133,134,241,242],[67,116,133,134,195,243],[56,67,116,133,134],[67,81,85,116,133,134,159],[67,81,116,133,134,148,159],[67,76,116,133,134],[67,78,81,116,133,134,156,159],[67,116,133,134,136,156],[67,116,133,134,166],[67,76,116,133,134,166],[67,78,81,116,133,134,136,159],[67,73,74,77,80,116,127,133,134,148,159],[67,81,88,116,133,134],[67,73,79,116,133,134],[67,81,102,103,116,133,134],[67,77,81,116,133,134,151,159,166],[67,102,116,133,134,166],[67,75,76,116,133,134,166],[67,81,116,133,134],[67,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,103,104,105,106,107,108,116,133,134],[67,81,96,116,133,134],[67,81,88,89,116,133,134],[67,79,81,89,90,116,133,134],[67,80,116,133,134],[67,73,76,81,116,133,134],[67,81,85,89,90,116,133,134],[67,85,116,133,134],[67,79,81,84,116,133,134,159],[67,73,78,81,88,116,133,134],[67,116,133,134,148],[67,76,81,102,116,133,134,164,166],[67,116,133,134,211,212],[67,116,133,134,211],[67,116,127,128,130,131,132,133,134,136,148,156,159,165,166,168,169,170,171,173,174,175,195,196,197,198,199,200],[67,116,133,134,170,171,172,173],[67,116,133,134,170],[67,116,133,134,171],[67,116,133,134,168,200],[61,67,116,133,134,231],[67,116,133,134,204,223,224],[53,60,67,116,133,134,204,216,217],[67,116,133,134,226],[67,116,133,134,205],[53,58,60,67,116,119,128,133,134,148,200,204,206,209,210,213,216,218,219,222,225,227,228,230],[67,116,133,134,200,229,230],[67,116,133,134,204,206,213,216,218],[53,58,60,67,116,119,128,133,134,148,200,204,205,206,209,210,213,216,217,218,219,222,223,224,225,226,227,228,229,230]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab","impliedFormat":99},{"version":"5c54a34e3d91727f7ae840bfe4d5d1c9a2f93c54cb7b6063d06ee4a6c3322656","impliedFormat":99},{"version":"db4da53b03596668cf6cc9484834e5de3833b9e7e64620cf08399fe069cd398d","impliedFormat":99},{"version":"ac7c28f153820c10850457994db1462d8c8e462f253b828ad942a979f726f2f9","impliedFormat":99},{"version":"f9b028d3c3891dd817e24d53102132b8f696269309605e6ed4f0db2c113bbd82","impliedFormat":99},{"version":"fb7c8d90e52e2884509166f96f3d591020c7b7977ab473b746954b0c8d100960","impliedFormat":99},{"version":"0bff51d6ed0c9093f6955b9d8258ce152ddb273359d50a897d8baabcb34de2c4","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","impliedFormat":99},{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true,"impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"035d0934d304483f07148427a5bd5b98ac265dae914a6b49749fe23fbd893ec7","impliedFormat":99},{"version":"e2ed5b81cbed3a511b21a18ab2539e79ac1f4bc1d1d28f8d35d8104caa3b429f","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"7965dc3c7648e2a7a586d11781cabb43d4859920716bc2fdc523da912b06570d","impliedFormat":1},{"version":"90c2bd9a3e72fe08b8fa5982e78cb8dc855a1157b26e11e37a793283c52bf64b","impliedFormat":1},{"version":"a8122fe390a2a987079e06c573b1471296114677923c1c094c24a53ddd7344a2","impliedFormat":1},{"version":"70c2cb19c0c42061a39351156653aa0cf5ba1ecdc8a07424dd38e3a1f1e3c7f4","impliedFormat":1},{"version":"a8fb10fd8c7bc7d9b8f546d4d186d1027f8a9002a639bec689b5000dab68e35c","impliedFormat":1},{"version":"c9b467ea59b86bd27714a879b9ad43c16f186012a26d0f7110b1322025ceaa83","impliedFormat":1},{"version":"57ea19c2e6ba094d8087c721bac30ff1c681081dbd8b167ac068590ef633e7a5","impliedFormat":1},{"version":"cba81ec9ae7bc31a4dc56f33c054131e037649d6b9a2cfa245124c67e23e4721","impliedFormat":1},{"version":"ad193f61ba708e01218496f093c23626aa3808c296844a99189be7108a9c8343","impliedFormat":1},{"version":"a0544b3c8b70b2f319a99ea380b55ab5394ede9188cdee452a5d0ce264f258b2","impliedFormat":1},{"version":"8c654c17c334c7c168c1c36e5336896dc2c892de940886c1639bebd9fc7b9be4","impliedFormat":1},{"version":"6a4da742485d5c2eb6bcb322ae96993999ffecbd5660b0219a5f5678d8225bb0","impliedFormat":1},{"version":"c65ca21d7002bdb431f9ab3c7a6e765a489aa5196e7e0ef00aed55b1294df599","impliedFormat":1},{"version":"c8fc655c2c4bafc155ceee01c84ab3d6c03192ced5d3f2de82e20f3d1bd7f9fa","impliedFormat":1},{"version":"be5a7ff3b47f7e553565e9483bdcadb0ca2040ac9e5ec7b81c7e115a81059882","impliedFormat":1},{"version":"1a93f36ecdb60a95e3a3621b561763e2952da81962fae217ab5441ac1d77ffc5","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"7870becb94cbc11d2d01b77c4422589adcba4d8e59f726246d40cd0d129784d8","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","impliedFormat":1},{"version":"f70b8328a15ca1d10b1436b691e134a49bc30dcf3183a69bfaa7ba77e1b78ecd","impliedFormat":1},{"version":"683b035f752e318d02e303894e767a1ac16ac4493baa2b593195d7976e6b7310","impliedFormat":99},{"version":"45cec9a1ba6549060552eead8959d47226048e0b71c7d0702ae58b7e16a28912","impliedFormat":99},{"version":"6907b09850f86610e7a528348c15484c1e1c09a18a9c1e98861399dfe4b18b46","impliedFormat":99},{"version":"12deea8eaa7a4fc1a2908e67da99831e5c5a6b46ad4f4f948fd4759314ea2b80","impliedFormat":99},{"version":"f0a8b376568a18f9a4976ecb0855187672b16b96c4df1c183a7e52dc1b5d98e8","impliedFormat":99},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"092944a8c05f9b96579161e88c6f211d5304a76bd2c47f8d4c30053269146bc8","impliedFormat":99},{"version":"b34b5f6b506abb206b1ea73c6a332b9ee9c8c98be0f6d17cdbda9430ecc1efab","impliedFormat":99},{"version":"75d4c746c3d16af0df61e7b0afe9606475a23335d9f34fcc525d388c21e9058b","impliedFormat":99},{"version":"fa959bf357232201c32566f45d97e70538c75a093c940af594865d12f31d4912","impliedFormat":99},{"version":"d2c52abd76259fc39a30dfae70a2e5ce77fd23144457a7ff1b64b03de6e3aec7","impliedFormat":99},{"version":"e6233e1c976265e85aa8ad76c3881febe6264cb06ae3136f0257e1eab4a6cc5a","impliedFormat":99},{"version":"f73e2335e568014e279927321770da6fe26facd4ac96cdc22a56687f1ecbb58e","impliedFormat":99},{"version":"317878f156f976d487e21fd1d58ad0461ee0a09185d5b0a43eedf2a56eb7e4ea","impliedFormat":99},{"version":"324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","impliedFormat":99},{"version":"9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","impliedFormat":99},{"version":"d6ee22aba183d5fc0c7b8617f77ee82ecadc2c14359cc51271c135e23f6ed51f","impliedFormat":99},{"version":"49747416f08b3ba50500a215e7a55d75268b84e31e896a40313c8053e8dec908","impliedFormat":99},{"version":"81e634f1c5e1ca309e7e3dc69e2732eea932ef07b8b34517d452e5a3e9a36fa3","impliedFormat":99},{"version":"34f39f75f2b5aa9c84a9f8157abbf8322e6831430e402badeaf58dd284f9b9a6","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"891694d3694abd66f0b8872997b85fd8e52bc51632ce0f8128c96962b443189f","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"971a2c327ff166c770c5fb35699575ba2d13bba1f6d2757309c9be4b30036c8e","impliedFormat":99},{"version":"4f45e8effab83434a78d17123b01124259fbd1e335732135c213955d85222234","impliedFormat":99},{"version":"7bd51996fb7717941cbe094b05adc0d80b9503b350a77b789bbb0fc786f28053","impliedFormat":99},{"version":"b62006bbc815fe8190c7aee262aad6bff993e3f9ade70d7057dfceab6de79d2f","impliedFormat":99},{"version":"13497c0d73306e27f70634c424cd2f3b472187164f36140b504b3756b0ff476d","impliedFormat":99},{"version":"a23a08b626aa4d4a1924957bd8c4d38a7ffc032e21407bbd2c97413e1d8c3dbd","impliedFormat":99},{"version":"c320fe76361c53cad266b46986aac4e68d644acda1629f64be29c95534463d28","impliedFormat":99},{"version":"7bbff6783e96c691a41a7cf12dd5486b8166a01b0c57d071dbcfca55c9525ec4","impliedFormat":99},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"26e0ffceb2198feb1ef460d5d14111c69ad07d44c5a67fd4bfeb74c969aa9afb","impliedFormat":99},{"version":"06bbf5a1996f1d5848abc5724e422837be85c8243fa881e93f6e6e24f7bb2392","signature":"4b96dd19fd2949d28ce80e913412b0026dc421e5bf6c31d87c7b5eb11b5753b4"},{"version":"b558c9a18ea4e6e4157124465c3ef1063e64640da139e67be5edb22f534f2f08","impliedFormat":1},{"version":"01374379f82be05d25c08d2f30779fa4a4c41895a18b93b33f14aeef51768692","impliedFormat":1},{"version":"b0dee183d4e65cf938242efaf3d833c6b645afb35039d058496965014f158141","impliedFormat":1},{"version":"c0bbbf84d3fbd85dd60d040c81e8964cc00e38124a52e9c5dcdedf45fea3f213","impliedFormat":1},{"version":"9812efe7f78efe7edc40a1d8d5171f97b8c7e7fc5083f5ba393325f8168ab9b0","signature":"e537341dbfef3ce4bc5cd00e86432a39c37c506024426607edb6aafde4833403"},{"version":"ae77d81a5541a8abb938a0efedf9ac4bea36fb3a24cc28cfa11c598863aba571","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"d34aa8df2d0b18fb56b1d772ff9b3c7aea7256cf0d692f969be6e1d27b74d660","impliedFormat":1},{"version":"f4db16820c99b6db923ab18af5fecb02331d785c4c2a8a88373a0cfc08256589","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"6823ccc7b5b77bbf898d878dbcad18aa45e0fa96bdd0abd0de98d514845d9ed9","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"168d88e14e0d81fe170e0dadd38ae9d217476c11435ea640ddb9b7382bdb6c1f","impliedFormat":1},{"version":"8e04cf0688e0d921111659c2b55851957017148fa7b977b02727477d155b3c47","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"035312d4945d13efa134ae482f6dc56a1a9346f7ac3be7ccbad5741058ce87f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1}],"root":[240,245],"options":{"allowSyntheticDefaultImports":true,"composite":true,"module":99,"target":7},"referencedMap":[[245,1],[240,2],[235,3],[233,4],[246,4],[238,5],[234,3],[236,6],[237,3],[248,7],[222,8],[247,9],[249,9],[220,4],[167,4],[253,10],[256,11],[254,4],[113,12],[114,12],[115,13],[67,14],[116,15],[117,16],[118,17],[62,4],[65,18],[63,4],[64,4],[119,19],[120,20],[121,21],[122,22],[123,23],[124,24],[125,24],[126,25],[127,26],[128,27],[129,28],[68,4],[66,4],[130,29],[131,30],[132,31],[166,32],[133,33],[134,4],[135,34],[136,35],[137,36],[138,37],[139,38],[140,39],[141,40],[142,41],[143,42],[144,42],[145,43],[146,4],[147,44],[148,45],[150,46],[149,47],[151,48],[152,49],[153,50],[154,51],[155,52],[156,53],[157,54],[158,55],[159,56],[160,57],[161,58],[162,59],[163,60],[69,4],[70,4],[71,4],[110,61],[111,4],[112,4],[164,62],[165,63],[257,4],[251,4],[252,4],[261,64],[258,4],[260,65],[250,66],[255,67],[239,68],[61,69],[209,70],[207,4],[208,4],[53,4],[204,71],[201,72],[202,73],[223,74],[214,4],[217,75],[216,76],[228,76],[215,77],[52,4],[60,78],[203,78],[55,79],[58,80],[210,79],[59,81],[54,4],[221,4],[72,4],[259,4],[192,82],[190,83],[191,84],[179,85],[180,83],[187,86],[178,87],[183,88],[193,4],[184,89],[189,90],[195,91],[194,92],[177,93],[185,94],[186,95],[181,96],[188,82],[182,97],[169,98],[168,99],[176,4],[243,100],[242,4],[241,4],[244,101],[224,4],[56,4],[57,102],[49,4],[50,4],[10,4],[8,4],[9,4],[14,4],[13,4],[2,4],[15,4],[16,4],[17,4],[18,4],[19,4],[20,4],[21,4],[22,4],[3,4],[23,4],[24,4],[4,4],[25,4],[29,4],[26,4],[27,4],[28,4],[30,4],[31,4],[32,4],[5,4],[33,4],[34,4],[35,4],[36,4],[6,4],[40,4],[37,4],[38,4],[39,4],[41,4],[7,4],[42,4],[51,4],[47,4],[48,4],[43,4],[44,4],[45,4],[46,4],[1,4],[12,4],[11,4],[88,103],[98,104],[87,103],[108,105],[79,106],[78,107],[107,108],[101,109],[106,110],[81,111],[95,112],[80,113],[104,114],[76,115],[75,108],[105,116],[77,117],[82,118],[83,4],[86,118],[73,4],[109,119],[99,120],[90,121],[91,122],[93,123],[89,124],[92,125],[102,108],[84,126],[85,127],[94,128],[74,129],[97,120],[96,118],[100,4],[103,130],[226,131],[212,132],[213,131],[211,4],[200,133],[174,134],[173,135],[175,4],[171,135],[170,4],[172,136],[198,4],[197,4],[196,4],[199,137],[232,138],[225,139],[218,140],[227,141],[206,142],[229,143],[230,144],[219,145],[231,146],[205,4]],"latestChangedDtsFile":"./vite.config.d.ts","version":"5.9.3"} \ No newline at end of file +{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../node_modules/typescript/lib/lib.scripthost.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/typescript/lib/lib.es2020.full.d.ts","../node_modules/@vitest/spy/dist/index.d.ts","../node_modules/@vitest/pretty-format/dist/index.d.ts","../node_modules/@vitest/utils/dist/types.d.ts","../node_modules/@vitest/utils/dist/helpers.d.ts","../node_modules/tinyrainbow/dist/index-8b61d5bc.d.ts","../node_modules/tinyrainbow/dist/node.d.ts","../node_modules/@vitest/utils/dist/index.d.ts","../node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","../node_modules/@vitest/utils/dist/diff.d.ts","../node_modules/@vitest/expect/dist/index.d.ts","../node_modules/@types/node/compatibility/disposable.d.ts","../node_modules/@types/node/compatibility/indexable.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/compatibility/index.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/web-globals/abortcontroller.d.ts","../node_modules/@types/node/web-globals/domexception.d.ts","../node_modules/@types/node/web-globals/events.d.ts","../node_modules/buffer/index.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/web-globals/fetch.d.ts","../node_modules/@types/node/web-globals/navigator.d.ts","../node_modules/@types/node/web-globals/storage.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/inspector.generated.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/estree/index.d.ts","../node_modules/rollup/dist/rollup.d.ts","../node_modules/rollup/dist/parseast.d.ts","../node_modules/vite/types/hmrpayload.d.ts","../node_modules/vite/types/customevent.d.ts","../node_modules/vite/types/hot.d.ts","../node_modules/vite/dist/node/modulerunnertransport.d-dj_me5sf.d.ts","../node_modules/vite/dist/node/module-runner.d.ts","../node_modules/vite/node_modules/esbuild/lib/main.d.ts","../node_modules/source-map-js/source-map.d.ts","../node_modules/postcss/lib/previous-map.d.ts","../node_modules/postcss/lib/input.d.ts","../node_modules/postcss/lib/css-syntax-error.d.ts","../node_modules/postcss/lib/declaration.d.ts","../node_modules/postcss/lib/root.d.ts","../node_modules/postcss/lib/warning.d.ts","../node_modules/postcss/lib/lazy-result.d.ts","../node_modules/postcss/lib/no-work-result.d.ts","../node_modules/postcss/lib/processor.d.ts","../node_modules/postcss/lib/result.d.ts","../node_modules/postcss/lib/document.d.ts","../node_modules/postcss/lib/rule.d.ts","../node_modules/postcss/lib/node.d.ts","../node_modules/postcss/lib/comment.d.ts","../node_modules/postcss/lib/container.d.ts","../node_modules/postcss/lib/at-rule.d.ts","../node_modules/postcss/lib/list.d.ts","../node_modules/postcss/lib/postcss.d.ts","../node_modules/postcss/lib/postcss.d.mts","../node_modules/vite/types/internal/lightningcssoptions.d.ts","../node_modules/vite/types/internal/csspreprocessoroptions.d.ts","../node_modules/vite/types/importglob.d.ts","../node_modules/vite/types/metadata.d.ts","../node_modules/vite/dist/node/index.d.ts","../node_modules/@vitest/runner/dist/tasks.d-cksck4of.d.ts","../node_modules/@vitest/runner/dist/types.d.ts","../node_modules/@vitest/utils/dist/error.d.ts","../node_modules/@vitest/runner/dist/index.d.ts","../node_modules/vitest/optional-types.d.ts","../node_modules/vitest/dist/chunks/environment.d.cl3nlxbe.d.ts","../node_modules/@vitest/mocker/dist/registry.d-d765pazg.d.ts","../node_modules/@vitest/mocker/dist/types.d-d_arzrdy.d.ts","../node_modules/@vitest/mocker/dist/index.d.ts","../node_modules/@vitest/utils/dist/source-map.d.ts","../node_modules/vite-node/dist/trace-mapping.d-dlvdeqop.d.ts","../node_modules/vite-node/dist/index.d-dgmxd2u7.d.ts","../node_modules/vite-node/dist/index.d.ts","../node_modules/@vitest/snapshot/dist/environment.d-dhdq1csl.d.ts","../node_modules/@vitest/snapshot/dist/rawsnapshot.d-lfsmjfud.d.ts","../node_modules/@vitest/snapshot/dist/index.d.ts","../node_modules/@vitest/snapshot/dist/environment.d.ts","../node_modules/vitest/dist/chunks/config.d.d2roskhv.d.ts","../node_modules/vitest/dist/chunks/worker.d.1gmbbd7g.d.ts","../node_modules/@types/deep-eql/index.d.ts","../node_modules/assertion-error/index.d.ts","../node_modules/@types/chai/index.d.ts","../node_modules/@vitest/runner/dist/utils.d.ts","../node_modules/tinybench/dist/index.d.ts","../node_modules/vitest/dist/chunks/benchmark.d.bwvbvtda.d.ts","../node_modules/vite-node/dist/client.d.ts","../node_modules/vitest/dist/chunks/coverage.d.s9rmnxie.d.ts","../node_modules/@vitest/snapshot/dist/manager.d.ts","../node_modules/vitest/dist/chunks/reporters.d.bflkqcl6.d.ts","../node_modules/vitest/dist/chunks/vite.d.cmlllifp.d.ts","../node_modules/vitest/dist/config.d.ts","../node_modules/vitest/config.d.ts","../node_modules/@babel/types/lib/index.d.ts","../node_modules/@types/babel__generator/index.d.ts","../node_modules/@babel/parser/typings/babel-parser.d.ts","../node_modules/@types/babel__template/index.d.ts","../node_modules/@types/babel__traverse/index.d.ts","../node_modules/@types/babel__core/index.d.ts","../node_modules/@vitejs/plugin-react/dist/index.d.ts","./vite.config.ts","../node_modules/tailwindcss/types/generated/corepluginlist.d.ts","../node_modules/tailwindcss/types/generated/colors.d.ts","../node_modules/tailwindcss/types/config.d.ts","../node_modules/tailwindcss/types/index.d.ts","./tailwind.config.ts","../node_modules/@types/aria-query/index.d.ts","../node_modules/@types/connect/index.d.ts","../node_modules/@types/body-parser/index.d.ts","../node_modules/@types/cors/index.d.ts","../node_modules/@types/send/index.d.ts","../node_modules/@types/qs/index.d.ts","../node_modules/@types/range-parser/index.d.ts","../node_modules/@types/express-serve-static-core/index.d.ts","../node_modules/@types/http-errors/index.d.ts","../node_modules/@types/serve-static/index.d.ts","../node_modules/@types/express/index.d.ts","../node_modules/@types/matter-js/index.d.ts","../node_modules/@types/prop-types/index.d.ts","../node_modules/@types/react/global.d.ts","../node_modules/csstype/index.d.ts","../node_modules/@types/react/index.d.ts","../node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[67,116,133,134,244],[67,116,133,134,232,239],[67,116,133,134,233],[67,116,133,134],[67,116,133,134,233,234,235,236,237],[67,116,133,134,233,235],[67,116,130,133,134,166,247],[67,116,133,134,220,221],[67,116,130,133,134,166],[67,116,127,130,133,134,166,250,251,252],[67,116,133,134,248,253,255],[67,113,114,116,133,134],[67,115,116,133,134],[116,133,134],[67,116,121,133,134,151],[67,116,117,122,127,133,134,136,148,159],[67,116,117,118,127,133,134,136],[62,63,64,67,116,133,134],[67,116,119,133,134,160],[67,116,120,121,128,133,134,137],[67,116,121,133,134,148,156],[67,116,122,124,127,133,134,136],[67,115,116,123,133,134],[67,116,124,125,133,134],[67,116,126,127,133,134],[67,115,116,127,133,134],[67,116,127,128,129,133,134,148,159],[67,116,127,128,129,133,134,143,148,151],[67,109,116,124,127,130,133,134,136,148,159],[67,116,127,128,130,131,133,134,136,148,156,159],[67,116,130,132,133,134,148,156,159],[65,66,67,68,69,70,71,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],[67,116,127,133,134],[67,116,133,134,135,159],[67,116,124,127,133,134,136,148],[67,116,133,134,137],[67,116,133,134,138],[67,115,116,133,134,139],[67,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],[67,116,133,134,141],[67,116,133,134,142],[67,116,127,133,134,143,144],[67,116,133,134,143,145,160,162],[67,116,128,133,134],[67,116,127,133,134,148,149,151],[67,116,133,134,150,151],[67,116,133,134,148,149],[67,116,133,134,151],[67,116,133,134,152],[67,113,116,133,134,148,153,159],[67,116,127,133,134,154,155],[67,116,133,134,154,155],[67,116,121,133,134,136,148,156],[67,116,133,134,157],[67,116,133,134,136,158],[67,116,130,133,134,142,159],[67,116,121,133,134,160],[67,116,133,134,148,161],[67,116,133,134,135,162],[67,116,133,134,163],[67,109,116,133,134],[67,109,116,127,129,133,134,139,148,151,159,161,162,164],[67,116,133,134,148,165],[67,116,133,134,261],[67,116,133,134,258,259,260],[67,116,128,133,134,148,166],[67,116,130,133,134,166,254],[67,116,133,134,200,230,238],[52,57,58,60,67,116,133,134],[67,116,133,134,207,208],[58,60,67,116,133,134,201,202,203],[58,67,116,133,134],[58,60,67,116,133,134,201],[58,67,116,133,134,201],[67,116,133,134,214],[53,67,116,133,134,214,215],[53,67,116,133,134,214],[53,59,67,116,133,134],[54,67,116,133,134],[53,54,55,57,67,116,133,134],[53,67,116,133,134],[67,116,133,134,191],[67,116,133,134,189,191],[67,116,133,134,180,188,189,190,192,194],[67,116,133,134,178],[67,116,133,134,181,186,191,194],[67,116,133,134,177,194],[67,116,133,134,181,182,185,186,187,194],[67,116,133,134,181,182,183,185,186,194],[67,116,133,134,178,179,180,181,182,186,187,188,190,191,192,194],[67,116,133,134,194],[67,116,133,134,176,178,179,180,181,182,183,185,186,187,188,189,190,191,192,193],[67,116,133,134,176,194],[67,116,133,134,181,183,184,186,187,194],[67,116,133,134,185,194],[67,116,133,134,186,187,191,194],[67,116,133,134,179,189],[67,116,133,134,168,199,200],[67,116,133,134,167,168],[67,116,133,134,241,242],[67,116,133,134,195,243],[56,67,116,133,134],[67,81,85,116,133,134,159],[67,81,116,133,134,148,159],[67,76,116,133,134],[67,78,81,116,133,134,156,159],[67,116,133,134,136,156],[67,116,133,134,166],[67,76,116,133,134,166],[67,78,81,116,133,134,136,159],[67,73,74,77,80,116,127,133,134,148,159],[67,81,88,116,133,134],[67,73,79,116,133,134],[67,81,102,103,116,133,134],[67,77,81,116,133,134,151,159,166],[67,102,116,133,134,166],[67,75,76,116,133,134,166],[67,81,116,133,134],[67,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,103,104,105,106,107,108,116,133,134],[67,81,96,116,133,134],[67,81,88,89,116,133,134],[67,79,81,89,90,116,133,134],[67,80,116,133,134],[67,73,76,81,116,133,134],[67,81,85,89,90,116,133,134],[67,85,116,133,134],[67,79,81,84,116,133,134,159],[67,73,78,81,88,116,133,134],[67,116,133,134,148],[67,76,81,102,116,133,134,164,166],[67,116,133,134,211,212],[67,116,133,134,211],[67,116,127,128,130,131,132,133,134,136,148,156,159,165,166,168,169,170,171,173,174,175,195,196,197,198,199,200],[67,116,133,134,170,171,172,173],[67,116,133,134,170],[67,116,133,134,171],[67,116,133,134,168,200],[61,67,116,133,134,231],[67,116,133,134,204,223,224],[53,60,67,116,133,134,204,216,217],[67,116,133,134,226],[67,116,133,134,205],[53,58,60,67,116,119,128,133,134,148,200,204,206,209,210,213,216,218,219,222,225,227,228,230],[67,116,133,134,200,229,230],[67,116,133,134,204,206,213,216,218],[53,58,60,67,116,119,128,133,134,148,200,204,205,206,209,210,213,216,217,218,219,222,223,224,225,226,227,228,229,230]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab","impliedFormat":99},{"version":"5c54a34e3d91727f7ae840bfe4d5d1c9a2f93c54cb7b6063d06ee4a6c3322656","impliedFormat":99},{"version":"db4da53b03596668cf6cc9484834e5de3833b9e7e64620cf08399fe069cd398d","impliedFormat":99},{"version":"ac7c28f153820c10850457994db1462d8c8e462f253b828ad942a979f726f2f9","impliedFormat":99},{"version":"f9b028d3c3891dd817e24d53102132b8f696269309605e6ed4f0db2c113bbd82","impliedFormat":99},{"version":"fb7c8d90e52e2884509166f96f3d591020c7b7977ab473b746954b0c8d100960","impliedFormat":99},{"version":"0bff51d6ed0c9093f6955b9d8258ce152ddb273359d50a897d8baabcb34de2c4","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","impliedFormat":99},{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true,"impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"035d0934d304483f07148427a5bd5b98ac265dae914a6b49749fe23fbd893ec7","impliedFormat":99},{"version":"e2ed5b81cbed3a511b21a18ab2539e79ac1f4bc1d1d28f8d35d8104caa3b429f","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"7965dc3c7648e2a7a586d11781cabb43d4859920716bc2fdc523da912b06570d","impliedFormat":1},{"version":"90c2bd9a3e72fe08b8fa5982e78cb8dc855a1157b26e11e37a793283c52bf64b","impliedFormat":1},{"version":"a8122fe390a2a987079e06c573b1471296114677923c1c094c24a53ddd7344a2","impliedFormat":1},{"version":"70c2cb19c0c42061a39351156653aa0cf5ba1ecdc8a07424dd38e3a1f1e3c7f4","impliedFormat":1},{"version":"a8fb10fd8c7bc7d9b8f546d4d186d1027f8a9002a639bec689b5000dab68e35c","impliedFormat":1},{"version":"c9b467ea59b86bd27714a879b9ad43c16f186012a26d0f7110b1322025ceaa83","impliedFormat":1},{"version":"57ea19c2e6ba094d8087c721bac30ff1c681081dbd8b167ac068590ef633e7a5","impliedFormat":1},{"version":"cba81ec9ae7bc31a4dc56f33c054131e037649d6b9a2cfa245124c67e23e4721","impliedFormat":1},{"version":"ad193f61ba708e01218496f093c23626aa3808c296844a99189be7108a9c8343","impliedFormat":1},{"version":"a0544b3c8b70b2f319a99ea380b55ab5394ede9188cdee452a5d0ce264f258b2","impliedFormat":1},{"version":"8c654c17c334c7c168c1c36e5336896dc2c892de940886c1639bebd9fc7b9be4","impliedFormat":1},{"version":"6a4da742485d5c2eb6bcb322ae96993999ffecbd5660b0219a5f5678d8225bb0","impliedFormat":1},{"version":"c65ca21d7002bdb431f9ab3c7a6e765a489aa5196e7e0ef00aed55b1294df599","impliedFormat":1},{"version":"c8fc655c2c4bafc155ceee01c84ab3d6c03192ced5d3f2de82e20f3d1bd7f9fa","impliedFormat":1},{"version":"be5a7ff3b47f7e553565e9483bdcadb0ca2040ac9e5ec7b81c7e115a81059882","impliedFormat":1},{"version":"1a93f36ecdb60a95e3a3621b561763e2952da81962fae217ab5441ac1d77ffc5","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"7870becb94cbc11d2d01b77c4422589adcba4d8e59f726246d40cd0d129784d8","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","impliedFormat":1},{"version":"f70b8328a15ca1d10b1436b691e134a49bc30dcf3183a69bfaa7ba77e1b78ecd","impliedFormat":1},{"version":"683b035f752e318d02e303894e767a1ac16ac4493baa2b593195d7976e6b7310","impliedFormat":99},{"version":"45cec9a1ba6549060552eead8959d47226048e0b71c7d0702ae58b7e16a28912","impliedFormat":99},{"version":"6907b09850f86610e7a528348c15484c1e1c09a18a9c1e98861399dfe4b18b46","impliedFormat":99},{"version":"12deea8eaa7a4fc1a2908e67da99831e5c5a6b46ad4f4f948fd4759314ea2b80","impliedFormat":99},{"version":"f0a8b376568a18f9a4976ecb0855187672b16b96c4df1c183a7e52dc1b5d98e8","impliedFormat":99},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"092944a8c05f9b96579161e88c6f211d5304a76bd2c47f8d4c30053269146bc8","impliedFormat":99},{"version":"b34b5f6b506abb206b1ea73c6a332b9ee9c8c98be0f6d17cdbda9430ecc1efab","impliedFormat":99},{"version":"75d4c746c3d16af0df61e7b0afe9606475a23335d9f34fcc525d388c21e9058b","impliedFormat":99},{"version":"fa959bf357232201c32566f45d97e70538c75a093c940af594865d12f31d4912","impliedFormat":99},{"version":"d2c52abd76259fc39a30dfae70a2e5ce77fd23144457a7ff1b64b03de6e3aec7","impliedFormat":99},{"version":"e6233e1c976265e85aa8ad76c3881febe6264cb06ae3136f0257e1eab4a6cc5a","impliedFormat":99},{"version":"f73e2335e568014e279927321770da6fe26facd4ac96cdc22a56687f1ecbb58e","impliedFormat":99},{"version":"317878f156f976d487e21fd1d58ad0461ee0a09185d5b0a43eedf2a56eb7e4ea","impliedFormat":99},{"version":"324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","impliedFormat":99},{"version":"9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","impliedFormat":99},{"version":"d6ee22aba183d5fc0c7b8617f77ee82ecadc2c14359cc51271c135e23f6ed51f","impliedFormat":99},{"version":"49747416f08b3ba50500a215e7a55d75268b84e31e896a40313c8053e8dec908","impliedFormat":99},{"version":"81e634f1c5e1ca309e7e3dc69e2732eea932ef07b8b34517d452e5a3e9a36fa3","impliedFormat":99},{"version":"34f39f75f2b5aa9c84a9f8157abbf8322e6831430e402badeaf58dd284f9b9a6","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"891694d3694abd66f0b8872997b85fd8e52bc51632ce0f8128c96962b443189f","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"971a2c327ff166c770c5fb35699575ba2d13bba1f6d2757309c9be4b30036c8e","impliedFormat":99},{"version":"4f45e8effab83434a78d17123b01124259fbd1e335732135c213955d85222234","impliedFormat":99},{"version":"7bd51996fb7717941cbe094b05adc0d80b9503b350a77b789bbb0fc786f28053","impliedFormat":99},{"version":"b62006bbc815fe8190c7aee262aad6bff993e3f9ade70d7057dfceab6de79d2f","impliedFormat":99},{"version":"13497c0d73306e27f70634c424cd2f3b472187164f36140b504b3756b0ff476d","impliedFormat":99},{"version":"a23a08b626aa4d4a1924957bd8c4d38a7ffc032e21407bbd2c97413e1d8c3dbd","impliedFormat":99},{"version":"c320fe76361c53cad266b46986aac4e68d644acda1629f64be29c95534463d28","impliedFormat":99},{"version":"7bbff6783e96c691a41a7cf12dd5486b8166a01b0c57d071dbcfca55c9525ec4","impliedFormat":99},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"26e0ffceb2198feb1ef460d5d14111c69ad07d44c5a67fd4bfeb74c969aa9afb","impliedFormat":99},{"version":"7ab87010c84a405e3ae5b24c7300b7544a30a886bd1805957ebe76d1af8285e1","signature":"4b96dd19fd2949d28ce80e913412b0026dc421e5bf6c31d87c7b5eb11b5753b4"},{"version":"b558c9a18ea4e6e4157124465c3ef1063e64640da139e67be5edb22f534f2f08","impliedFormat":1},{"version":"01374379f82be05d25c08d2f30779fa4a4c41895a18b93b33f14aeef51768692","impliedFormat":1},{"version":"b0dee183d4e65cf938242efaf3d833c6b645afb35039d058496965014f158141","impliedFormat":1},{"version":"c0bbbf84d3fbd85dd60d040c81e8964cc00e38124a52e9c5dcdedf45fea3f213","impliedFormat":1},{"version":"9812efe7f78efe7edc40a1d8d5171f97b8c7e7fc5083f5ba393325f8168ab9b0","signature":"e537341dbfef3ce4bc5cd00e86432a39c37c506024426607edb6aafde4833403"},{"version":"ae77d81a5541a8abb938a0efedf9ac4bea36fb3a24cc28cfa11c598863aba571","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"d34aa8df2d0b18fb56b1d772ff9b3c7aea7256cf0d692f969be6e1d27b74d660","impliedFormat":1},{"version":"f4db16820c99b6db923ab18af5fecb02331d785c4c2a8a88373a0cfc08256589","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"6823ccc7b5b77bbf898d878dbcad18aa45e0fa96bdd0abd0de98d514845d9ed9","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"168d88e14e0d81fe170e0dadd38ae9d217476c11435ea640ddb9b7382bdb6c1f","impliedFormat":1},{"version":"8e04cf0688e0d921111659c2b55851957017148fa7b977b02727477d155b3c47","impliedFormat":1},{"version":"c6ea99df2e1346fe021994138ff80bdfc4483f36e1eebd26f0af7f4c58e19678","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"035312d4945d13efa134ae482f6dc56a1a9346f7ac3be7ccbad5741058ce87f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1}],"root":[240,245],"options":{"allowSyntheticDefaultImports":true,"composite":true,"module":99,"target":7},"referencedMap":[[245,1],[240,2],[235,3],[233,4],[246,4],[238,5],[234,3],[236,6],[237,3],[248,7],[222,8],[247,9],[249,9],[220,4],[167,4],[253,10],[256,11],[254,4],[257,4],[113,12],[114,12],[115,13],[67,14],[116,15],[117,16],[118,17],[62,4],[65,18],[63,4],[64,4],[119,19],[120,20],[121,21],[122,22],[123,23],[124,24],[125,24],[126,25],[127,26],[128,27],[129,28],[68,4],[66,4],[130,29],[131,30],[132,31],[166,32],[133,33],[134,4],[135,34],[136,35],[137,36],[138,37],[139,38],[140,39],[141,40],[142,41],[143,42],[144,42],[145,43],[146,4],[147,44],[148,45],[150,46],[149,47],[151,48],[152,49],[153,50],[154,51],[155,52],[156,53],[157,54],[158,55],[159,56],[160,57],[161,58],[162,59],[163,60],[69,4],[70,4],[71,4],[110,61],[111,4],[112,4],[164,62],[165,63],[258,4],[251,4],[252,4],[262,64],[259,4],[261,65],[250,66],[255,67],[239,68],[61,69],[209,70],[207,4],[208,4],[53,4],[204,71],[201,72],[202,73],[223,74],[214,4],[217,75],[216,76],[228,76],[215,77],[52,4],[60,78],[203,78],[55,79],[58,80],[210,79],[59,81],[54,4],[221,4],[72,4],[260,4],[192,82],[190,83],[191,84],[179,85],[180,83],[187,86],[178,87],[183,88],[193,4],[184,89],[189,90],[195,91],[194,92],[177,93],[185,94],[186,95],[181,96],[188,82],[182,97],[169,98],[168,99],[176,4],[243,100],[242,4],[241,4],[244,101],[224,4],[56,4],[57,102],[49,4],[50,4],[10,4],[8,4],[9,4],[14,4],[13,4],[2,4],[15,4],[16,4],[17,4],[18,4],[19,4],[20,4],[21,4],[22,4],[3,4],[23,4],[24,4],[4,4],[25,4],[29,4],[26,4],[27,4],[28,4],[30,4],[31,4],[32,4],[5,4],[33,4],[34,4],[35,4],[36,4],[6,4],[40,4],[37,4],[38,4],[39,4],[41,4],[7,4],[42,4],[51,4],[47,4],[48,4],[43,4],[44,4],[45,4],[46,4],[1,4],[12,4],[11,4],[88,103],[98,104],[87,103],[108,105],[79,106],[78,107],[107,108],[101,109],[106,110],[81,111],[95,112],[80,113],[104,114],[76,115],[75,108],[105,116],[77,117],[82,118],[83,4],[86,118],[73,4],[109,119],[99,120],[90,121],[91,122],[93,123],[89,124],[92,125],[102,108],[84,126],[85,127],[94,128],[74,129],[97,120],[96,118],[100,4],[103,130],[226,131],[212,132],[213,131],[211,4],[200,133],[174,134],[173,135],[175,4],[171,135],[170,4],[172,136],[198,4],[197,4],[196,4],[199,137],[232,138],[225,139],[218,140],[227,141],[206,142],[229,143],[230,144],[219,145],[231,146],[205,4]],"latestChangedDtsFile":"./vite.config.d.ts","version":"5.9.3"} \ No newline at end of file diff --git a/client/vite.config.js b/client/vite.config.js index 6a17e53..10404d5 100644 --- a/client/vite.config.js +++ b/client/vite.config.js @@ -3,7 +3,11 @@ import react from "@vitejs/plugin-react"; export default defineConfig({ plugins: [react()], server: { - port: 5173 + port: 5173, + proxy: { + "/api": "http://localhost:3000", + "/healthz": "http://localhost:3000" + } }, test: { environment: "jsdom", diff --git a/client/vite.config.ts b/client/vite.config.ts index 7d74f7e..6dfdb01 100644 --- a/client/vite.config.ts +++ b/client/vite.config.ts @@ -4,7 +4,11 @@ import react from "@vitejs/plugin-react"; export default defineConfig({ plugins: [react()], server: { - port: 5173 + port: 5173, + proxy: { + "/api": "http://localhost:3000", + "/healthz": "http://localhost:3000" + } }, test: { environment: "jsdom", diff --git a/compose.yml b/compose.yml index a2f2fcf..22cbcbf 100644 --- a/compose.yml +++ b/compose.yml @@ -6,11 +6,16 @@ services: environment: PORT: "3000" LOG_LEVEL: info + DATABASE_PATH: /data/stellar.sqlite ports: - "8080:3000" + volumes: + - stellar-data:/data healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000/healthz"] interval: 10s timeout: 5s retries: 5 +volumes: + stellar-data: diff --git a/package-lock.json b/package-lock.json index da4774b..6004aaa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1526,6 +1526,16 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.13", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", + "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -6363,6 +6373,7 @@ "pino-http": "^10.4.0" }, "devDependencies": { + "@types/better-sqlite3": "^7.6.13", "@types/cors": "^2.8.17", "@types/express": "^5.0.1", "@types/node": "^22.13.11", diff --git a/server/package.json b/server/package.json index f0855c1..cf3b00e 100644 --- a/server/package.json +++ b/server/package.json @@ -18,6 +18,7 @@ "pino-http": "^10.4.0" }, "devDependencies": { + "@types/better-sqlite3": "^7.6.13", "@types/cors": "^2.8.17", "@types/express": "^5.0.1", "@types/node": "^22.13.11", @@ -26,4 +27,3 @@ "vitest": "^3.0.8" } } - diff --git a/server/src/routes/missions.ts b/server/src/routes/missions.ts index 8da505e..e074351 100644 --- a/server/src/routes/missions.ts +++ b/server/src/routes/missions.ts @@ -1,14 +1,14 @@ import { Router } from "express"; -import { completeMission, listMissions } from "../services/missions.js"; +import { missionStore } from "../services/persistence.js"; export const missionsRouter = Router(); missionsRouter.get("/", (_request, response) => { - response.json(listMissions()); + response.json(missionStore.listMissions()); }); missionsRouter.post("/:id/complete", (request, response) => { - const mission = completeMission(request.params.id); + const mission = missionStore.completeMission(request.params.id); if (!mission) { response.status(404).json({ error: "Mission not found" }); @@ -17,4 +17,3 @@ missionsRouter.post("/:id/complete", (request, response) => { response.json({ rewardXp: mission.rewardXp, mission }); }); - diff --git a/server/src/routes/player.ts b/server/src/routes/player.ts index e4b0aa1..73b6554 100644 --- a/server/src/routes/player.ts +++ b/server/src/routes/player.ts @@ -1,14 +1,13 @@ import { Router } from "express"; -import { getPlayerProfile, savePlayerProfile } from "../services/playerStore.js"; +import { playerStore } from "../services/persistence.js"; export const playerRouter = Router(); playerRouter.get("/", (_request, response) => { - response.json(getPlayerProfile()); + response.json(playerStore.getProfile()); }); playerRouter.post("/", (request, response) => { - const profile = savePlayerProfile(request.body ?? {}); + const profile = playerStore.saveProfile(request.body ?? {}); response.status(200).json(profile); }); - diff --git a/server/src/server.test.ts b/server/src/server.test.ts index 3abe9b6..f9be474 100644 --- a/server/src/server.test.ts +++ b/server/src/server.test.ts @@ -1,13 +1,38 @@ import { describe, expect, it } from "vitest"; -import { completeMission, listMissions } from "./services/missions.js"; +import { createDatabase } from "./services/database.js"; +import { createMissionStore } from "./services/missions.js"; +import { createPlayerStore } from "./services/playerStore.js"; +import { initializeSchema } from "./services/schema.js"; -describe("missions service", () => { +describe("persistence services", () => { it("lists seed missions", () => { - expect(listMissions().length).toBeGreaterThan(0); + const database = createDatabase(":memory:"); + initializeSchema(database); + const missionStore = createMissionStore(database); + + expect(missionStore.listMissions().length).toBeGreaterThan(0); }); it("completes a mission by id", () => { - expect(completeMission("first-growth")?.completed).toBe(true); + const database = createDatabase(":memory:"); + initializeSchema(database); + const missionStore = createMissionStore(database); + + expect(missionStore.completeMission("first-growth")?.completed).toBe(true); + }); + + it("persists player profile updates", () => { + const database = createDatabase(":memory:"); + initializeSchema(database); + const playerStore = createPlayerStore(database); + + playerStore.saveProfile({ mass: 42, xp: 21, evolutions: ["swift-vortex"] }); + + expect(playerStore.getProfile()).toEqual({ + id: "local-player", + mass: 42, + xp: 21, + evolutions: ["swift-vortex"] + }); }); }); - diff --git a/server/src/services/database.ts b/server/src/services/database.ts new file mode 100644 index 0000000..b805b80 --- /dev/null +++ b/server/src/services/database.ts @@ -0,0 +1,23 @@ +import Database from "better-sqlite3"; +import { mkdirSync } from "node:fs"; +import path from "node:path"; + +export function resolveDatabasePath() { + if (process.env.DATABASE_PATH) { + return process.env.DATABASE_PATH; + } + + if (process.env.NODE_ENV === "production") { + return "/data/stellar.sqlite"; + } + + return path.resolve(process.cwd(), "server/data/stellar.sqlite"); +} + +export function createDatabase(databasePath = resolveDatabasePath()) { + if (databasePath !== ":memory:") { + mkdirSync(path.dirname(databasePath), { recursive: true }); + } + + return new Database(databasePath); +} diff --git a/server/src/services/missions.ts b/server/src/services/missions.ts index 1459c63..34ae1b7 100644 --- a/server/src/services/missions.ts +++ b/server/src/services/missions.ts @@ -1,3 +1,5 @@ +import type Database from "better-sqlite3"; + export interface Mission { id: string; title: string; @@ -6,35 +8,52 @@ export interface Mission { completed: boolean; } -const missions: Mission[] = [ - { - id: "first-growth", - title: "First Growth", - description: "Reach a stable absorber prototype.", - rewardXp: 50, - completed: false - }, - { - id: "field-test", - title: "Field Test", - description: "Prepare the first sandbox sector.", - rewardXp: 100, - completed: false - } -]; - -export function listMissions() { - return missions; +interface MissionRow { + id: string; + title: string; + description: string; + reward_xp: number; + completed: number; } -export function completeMission(id: string) { - const mission = missions.find((entry) => entry.id === id); - - if (!mission) { - return null; - } - - mission.completed = true; - return mission; +function toMission(row: MissionRow): Mission { + return { + id: row.id, + title: row.title, + description: row.description, + rewardXp: row.reward_xp, + completed: row.completed === 1 + }; +} + +export function createMissionStore(database: Database.Database) { + const listStatement = database.prepare(` + SELECT id, title, description, reward_xp, completed + FROM missions + ORDER BY reward_xp ASC, id ASC + `); + const getStatement = database.prepare(` + SELECT id, title, description, reward_xp, completed + FROM missions + WHERE id = ? + `); + const completeStatement = database.prepare("UPDATE missions SET completed = 1 WHERE id = ?"); + + return { + listMissions() { + return (listStatement.all() as MissionRow[]).map(toMission); + }, + + completeMission(id: string) { + const row = getStatement.get(id) as MissionRow | undefined; + + if (!row) { + return null; + } + + completeStatement.run(id); + return toMission({ ...row, completed: 1 }); + } + }; } diff --git a/server/src/services/persistence.ts b/server/src/services/persistence.ts new file mode 100644 index 0000000..617247d --- /dev/null +++ b/server/src/services/persistence.ts @@ -0,0 +1,11 @@ +import { createDatabase } from "./database.js"; +import { createMissionStore } from "./missions.js"; +import { createPlayerStore } from "./playerStore.js"; +import { initializeSchema } from "./schema.js"; + +const database = createDatabase(); +initializeSchema(database); + +export const playerStore = createPlayerStore(database); +export const missionStore = createMissionStore(database); + diff --git a/server/src/services/playerStore.ts b/server/src/services/playerStore.ts index d386381..e85cae4 100644 --- a/server/src/services/playerStore.ts +++ b/server/src/services/playerStore.ts @@ -1,3 +1,5 @@ +import type Database from "better-sqlite3"; + export interface PlayerProfile { id: string; mass: number; @@ -5,26 +7,71 @@ export interface PlayerProfile { evolutions: string[]; } -const defaultProfile: PlayerProfile = { +export const defaultProfile: PlayerProfile = { id: "local-player", mass: 12, xp: 0, evolutions: [] }; -let profile = { ...defaultProfile }; - -export function getPlayerProfile() { - return profile; +interface PlayerRow { + id: string; + mass: number; + xp: number; + evolutions: string; } -export function savePlayerProfile(nextProfile: Partial) { - profile = { - ...profile, - ...nextProfile, - evolutions: nextProfile.evolutions ?? profile.evolutions +function toProfile(row: PlayerRow): PlayerProfile { + return { + id: row.id, + mass: row.mass, + xp: row.xp, + evolutions: JSON.parse(row.evolutions) as string[] + }; +} + +export function createPlayerStore(database: Database.Database) { + const selectProfile = database.prepare("SELECT id, mass, xp, evolutions FROM player_profiles WHERE id = ?"); + const insertProfile = database.prepare(` + INSERT INTO player_profiles (id, mass, xp, evolutions) + VALUES (@id, @mass, @xp, @evolutions) + ON CONFLICT(id) DO UPDATE SET + mass = excluded.mass, + xp = excluded.xp, + evolutions = excluded.evolutions + `); + + return { + getProfile(id = defaultProfile.id) { + const row = selectProfile.get(id) as PlayerRow | undefined; + + if (!row) { + insertProfile.run({ + ...defaultProfile, + evolutions: JSON.stringify(defaultProfile.evolutions) + }); + return { ...defaultProfile }; + } + + return toProfile(row); + }, + + saveProfile(nextProfile: Partial & { id?: string }) { + const current = this.getProfile(nextProfile.id ?? defaultProfile.id); + const profile: PlayerProfile = { + ...current, + ...nextProfile, + id: nextProfile.id ?? current.id, + evolutions: nextProfile.evolutions ?? current.evolutions + }; + + insertProfile.run({ + ...profile, + evolutions: JSON.stringify(profile.evolutions) + }); + + return profile; + } }; - - return profile; } diff --git a/server/src/services/schema.ts b/server/src/services/schema.ts new file mode 100644 index 0000000..6a8171f --- /dev/null +++ b/server/src/services/schema.ts @@ -0,0 +1,45 @@ +import type Database from "better-sqlite3"; + +const seedMissions = [ + { + id: "first-growth", + title: "First Growth", + description: "Reach a stable absorber prototype.", + rewardXp: 50 + }, + { + id: "field-test", + title: "Field Test", + description: "Prepare the first sandbox sector.", + rewardXp: 100 + } +]; + +export function initializeSchema(database: Database.Database) { + database.exec(` + CREATE TABLE IF NOT EXISTS player_profiles ( + id TEXT PRIMARY KEY, + mass REAL NOT NULL, + xp INTEGER NOT NULL, + evolutions TEXT NOT NULL DEFAULT '[]' + ); + + CREATE TABLE IF NOT EXISTS missions ( + id TEXT PRIMARY KEY, + title TEXT NOT NULL, + description TEXT NOT NULL, + reward_xp INTEGER NOT NULL, + completed INTEGER NOT NULL DEFAULT 0 + ); + `); + + const insertMission = database.prepare(` + INSERT OR IGNORE INTO missions (id, title, description, reward_xp, completed) + VALUES (@id, @title, @description, @rewardXp, 0) + `); + + for (const mission of seedMissions) { + insertMission.run(mission); + } +} +