From 23a87a47db2f26990e64c2a508510df86a1efc13 Mon Sep 17 00:00:00 2001 From: friskyydev Date: Mon, 3 Aug 2026 20:49:30 -0400 Subject: [PATCH] feat: the companion can now actually send a night MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It could read the saved-variables file and had a client method for uploading. Nothing connected the two, and the window was a placeholder that said so. This is the part where it does the job. Setup is three questions asked once: who are you, which guild does this machine report for, where is the game. Every extra question here is a reason to close the app and go back to pasting a string, which already works. Once answered it collapses to a single line, because setup is not what an officer opens this thing to look at. It never sends on its own. The officer is the one who knows whether Tuesday's session on an alt was the guild's Naxx run or three people messing about in Deadmines, and nothing in the file distinguishes those. So it reports what it read and waits. "Review" runs a dry run against the real server path, so what is shown is what will happen rather than a second guess at it — and "Send" is disabled until a review has happened. Two things a night can be that need saying out loud. Older than two weeks: sending it rewrites the record for that date, which is sometimes the point and sometimes a five-month-old raid being overwritten. Not ended: the addon never closed the session, so anyone who joined later is missing, and the fix is /rf end in game rather than anything here. Rows nobody accounted for are labelled "nobody said". Not "absent". That is the accusation the addon refuses to make, and the UI does not get to make it on the addon's behalf. Settings persist as plain JSON — none of it is a secret, and the token still lives behind the OS credential store. The stored file path is not trusted on the next launch: it is re-discovered by scanning the install folder it came from, so the rule stays "nothing is read that discovery did not produce", with no exception for a string that happens to be written down. Writes go through a temp file and a rename, because the alternative is a Windows update killing the process mid-truncate and turning "forgot a preference" into a zero-byte settings file. The upload history is not a correctness mechanism — the server upserts, so a second send changes nothing. It is so the list stops asking. Every flush re-reads every session in the file, and an app that re-offers the same finished night at every launch teaches the officer to ignore the list, which is the one thing it must not do. The watcher's onEmpty callback existed and nothing was wired to it, so a clean read that found no session was silent. The UI could not tell "read it, nothing there" from "never read it" — one of which needs the officer to do something. It says which now. Two guards, both mutation-checked: The smoke test now asserts the window rendered text, not just that the bridge answers. A perfect bridge and a blank window is a real combination: an error thrown in App() leaves an empty root while every existing check passes. Rendering nothing makes it fail. And it refuses to run against a stale build. npm run build typechecks first, so a type error leaves out/ untouched and the smoke test then starts yesterday's build and reports success — a green result for code that does not compile. That is the same shape as the bug this test exists to catch. Found by accident while mutation-checking the render assertion, which is exactly how it would have been found later and at worse cost. Also: stop tracking tsbuildinfo. Co-Authored-By: Claude Opus 5 (1M context) --- .gitignore | 3 + scripts/smoke.cjs | 25 ++- src/main/api.ts | 21 +- src/main/index.ts | 171 ++++++++++++++- src/main/settings.test.ts | 137 ++++++++++++ src/main/settings.ts | 99 +++++++++ src/preload/index.ts | 28 ++- src/renderer/App.tsx | 201 ++++++++++++++--- src/renderer/components/NightCard.tsx | 265 +++++++++++++++++++++++ src/renderer/components/SetupPanel.tsx | 286 +++++++++++++++++++++++++ src/shared/contract.ts | 15 ++ src/shared/nightKey.ts | 21 ++ src/shared/types.ts | 38 ++++ tsconfig.node.tsbuildinfo | 1 - tsconfig.web.tsbuildinfo | 1 - 15 files changed, 1267 insertions(+), 45 deletions(-) create mode 100644 src/main/settings.test.ts create mode 100644 src/main/settings.ts create mode 100644 src/renderer/components/NightCard.tsx create mode 100644 src/renderer/components/SetupPanel.tsx create mode 100644 src/shared/nightKey.ts delete mode 100644 tsconfig.node.tsbuildinfo delete mode 100644 tsconfig.web.tsbuildinfo diff --git a/.gitignore b/.gitignore index cd61bd8..d08c173 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ dist/ .env .env.* !.env.example + +# tsc incremental caches — machine-local, and they churn on every build. +*.tsbuildinfo diff --git a/scripts/smoke.cjs b/scripts/smoke.cjs index 4a9baad..10d2d90 100644 --- a/scripts/smoke.cjs +++ b/scripts/smoke.cjs @@ -11,7 +11,7 @@ * would have drifted exactly the way the original bug did and reported success. */ const { spawn } = require('node:child_process'); -const { existsSync } = require('node:fs'); +const { existsSync, readdirSync, statSync } = require('node:fs'); const { join } = require('node:path'); const root = join(__dirname, '..'); @@ -22,6 +22,29 @@ if (!existsSync(entry)) { process.exit(1); } +/** + * Refuse to smoke-test yesterday's build. + * + * `npm run build` typechecks first, so a type error leaves `out/` untouched and this + * script then happily starts the previous build and reports success — a green smoke test + * for code that does not compile. That is the same shape as the bug this file exists to + * catch: every check passing while nothing has actually verified what would ship. + */ +const newestSource = newestMtime(join(root, 'src')); +if (newestSource > statSync(entry).mtimeMs) { + console.error('SMOKE FAIL: out/ is older than src/ — the build did not run, or it failed.'); + process.exit(1); +} + +function newestMtime(dir) { + let newest = 0; + for (const item of readdirSync(dir, { withFileTypes: true })) { + const path = join(dir, item.name); + newest = Math.max(newest, item.isDirectory() ? newestMtime(path) : statSync(path).mtimeMs); + } + return newest; +} + // eslint-disable-next-line @typescript-eslint/no-var-requires const electron = require('electron'); const binary = typeof electron === 'string' ? electron : String(electron); diff --git a/src/main/api.ts b/src/main/api.ts index 7b4cb45..f4ac373 100644 --- a/src/main/api.ts +++ b/src/main/api.ts @@ -1,15 +1,19 @@ import type { AttendanceUploadRequest, AttendanceUploadResult, + CompanionGuild, CompatResponse, } from '../shared/contract'; /** * Everything that leaves this machine goes through here. * - * Deliberately small: two calls, both against the public API as an authenticated user. - * If this file ever grows a third kind of request, that is worth a second look — the - * consent screen promises attendance rows, not a general-purpose channel. + * Deliberately small, and each call earns its place: find out if this build is still + * supported, trade a code for a token, hand the token back, ask which guilds this + * sign-in may write to, and upload one night. Nothing here reads a guild's data. + * + * Anything added is worth a second look — the consent screen promises attendance rows, + * not a general-purpose channel into the officer's account. */ const DEFAULT_BASE_URL = 'https://www.raidify.app'; @@ -78,6 +82,17 @@ export class ApiClient { await this.request('POST', '/api/v1/companion/sign-out', { signal }); } + /** + * Which guilds this sign-in may upload for. + * + * Filtered server-side by the same permission the upload checks, so anything this + * returns is safe to offer — the app never has to reason about permissions itself, and + * cannot get that reasoning subtly wrong on a raid night. + */ + async guilds(signal?: AbortSignal): Promise { + return this.request('GET', '/api/v1/companion/guilds', { signal }); + } + async uploadAttendance( guildId: string, body: AttendanceUploadRequest, diff --git a/src/main/index.ts b/src/main/index.ts index e49b3ad..48c4f52 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -5,9 +5,16 @@ import { buildAuthorizeUrl, createPkcePair, LoopbackReceiver } from './auth'; import { autoDetect, findSavedVariables } from './discovery'; import { canPersist, clearToken, loadToken, saveToken } from './secrets'; import { readNights } from './savedVariables'; -import type { ParsedNight, SavedVariablesCandidate } from '../shared/types'; +import { loadSettings, rememberUpload, saveSettings } from './settings'; +import { nightKey } from '../shared/nightKey'; +import type { ParsedNight, SavedVariablesCandidate, Settings } from '../shared/types'; import { SavedVariablesWatcher } from './watcher'; -import { evaluateCompat, type CompatVerdict } from '../shared/contract'; +import { + evaluateCompat, + type AttendanceUploadResult, + type CompanionGuild, + type CompatVerdict, +} from '../shared/contract'; /** * Main process. @@ -136,17 +143,19 @@ function createWindow(): void { } /** - * Assert the bridge exists and that IPC round-trips, then exit. + * Assert the bridge exists, that IPC round-trips, and that the window drew something. * * Checks a real `invoke` rather than just the presence of functions: a preload that * loads but whose handlers are missing looks identical from the renderer until something - * is called. + * is called. And it checks the rendered text, because a bridge can be perfect while the + * UI throws on mount — that combination is a blank window that packages and ships. */ async function runSmokeCheck(target: BrowserWindow): Promise { const expected = [ 'appInfo', 'checkCompat', 'authStatus', 'signOut', 'signIn', - 'detectInstalls', 'browseForInstall', 'readNights', 'watch', 'unwatch', - 'onNights', 'onWatchError', + 'detectInstalls', 'browseForInstall', 'readNights', 'watch', 'unwatch', 'resume', + 'getSettings', 'saveSettings', 'listGuilds', 'upload', + 'onNights', 'onEmptyRead', 'onWatchError', ]; try { @@ -158,6 +167,21 @@ async function runSmokeCheck(target: BrowserWindow): Promise { if (missing.length) return { ok: false, reason: 'missing: ' + missing.join(', ') }; const info = await bridge.appInfo(); if (!info || typeof info.version !== 'string') return { ok: false, reason: 'appInfo did not round-trip' }; + + // A working bridge and a blank window is a real combination: a thrown error in + // App() leaves an empty root and every check above still passes. Poll rather + // than sample once — first paint can beat the first render by a frame. + const deadline = Date.now() + 5000; + let text = ''; + while (Date.now() < deadline) { + text = document.body.innerText || ''; + if (text.includes('Raidify Companion')) break; + await new Promise((r) => setTimeout(r, 100)); + } + if (!text.includes('Raidify Companion')) { + return { ok: false, reason: 'the window rendered nothing (body: ' + JSON.stringify(text.slice(0, 120)) + ')' }; + } + return { ok: true, version: info.version }; })()`, ); @@ -168,7 +192,7 @@ async function runSmokeCheck(target: BrowserWindow): Promise { return; } - console.log(`SMOKE OK: bridge exposes ${expected.length} calls, appInfo returned v${report.version}`); + console.log(`SMOKE OK: bridge exposes ${expected.length} calls, appInfo returned v${report.version}, and the window rendered.`); app.exit(0); } catch (error) { console.error(`SMOKE FAIL: ${error instanceof Error ? error.message : String(error)}`); @@ -283,6 +307,29 @@ function remember(candidates: SavedVariablesCandidate[]): SavedVariablesCandidat return candidates; } +/** + * Re-earn the stored path, rather than trusting it. + * + * The remembered file is only usable once this process has found it again the same way it + * found it originally — by scanning the install folder it came from. That keeps one rule + * with no exceptions: nothing is read that discovery did not produce. A settings file + * carried over from another machine, or edited by hand, gets no privileges from having + * been written down. + */ +async function restoreDiscovered(): Promise { + const { savedVariablesPath, installPath } = loadSettings(); + if (!savedVariablesPath || !installPath) return null; + + try { + const candidates = remember(await findSavedVariables(installPath)); + return candidates.some((c) => c.path === savedVariablesPath) ? savedVariablesPath : null; + } catch { + // The drive is gone, or the folder moved. Not an error worth a dialog on launch — + // the officer will be asked to point at it again. + return null; + } +} + function requireDiscovered(path: unknown): string { if (typeof path !== 'string' || !path) throw new Error('No saved-variables path supplied.'); if (!discovered.has(path)) { @@ -303,13 +350,22 @@ ipcMain.handle('wow:read', (_event, path: unknown): Promise => */ ipcMain.handle('wow:watch', async (_event, rawPath: unknown) => { const path = requireDiscovered(rawPath); + await startWatching(path); + return { watching: true, path }; +}); +async function startWatching(path: string): Promise { watcher?.stop(); watcher = new SavedVariablesWatcher( { path }, { onNights: (nights) => emit('wow:nights', nights), onError: (error) => emit('wow:error', { message: error.message }), + // A clean read that found nothing is news. Without this the UI cannot tell "we read + // the file and there are no raid sessions in it" from "we have never read it", and + // the officer stares at the same empty panel in both cases — one of which needs + // them to do something and one of which does not. + onEmpty: () => emit('wow:empty', { at: new Date().toISOString() }), }, ); watcher.start(); @@ -317,8 +373,7 @@ ipcMain.handle('wow:watch', async (_event, rawPath: unknown) => { // Read once immediately: the interesting flush may already have happened while the // app was closed, and a companion that only notices future raids is half a companion. await watcher.readNow(); - return { watching: true, path }; -}); +} ipcMain.handle('wow:unwatch', () => { watcher?.stop(); @@ -326,6 +381,104 @@ ipcMain.handle('wow:unwatch', () => { return { watching: false }; }); +// ── settings, the guild, and sending ──────────────────────────────────────────── + +ipcMain.handle('settings:get', (): Settings => loadSettings()); + +/** + * Pick up where the last launch left off. + * + * One call rather than three, because the renderer should not be able to get the order + * wrong: re-discover the remembered file, and start watching it if that is what the + * officer asked for. A null path means the setup question needs asking again. + */ +ipcMain.handle('wow:resume', async (): Promise<{ path: string | null; watching: boolean }> => { + const path = await restoreDiscovered(); + if (!path) return { path: null, watching: false }; + if (!loadSettings().autoWatch) return { path, watching: false }; + + await startWatching(path); + return { path, watching: true }; +}); + +/** + * Save the setup answers. + * + * Only the three the UI is allowed to set. The upload history is written by the upload + * itself — letting the renderer edit it would mean a UI bug could mark an unsent night as + * sent, which is the one lie this app must never tell. + */ +ipcMain.handle('settings:set', (_event, patch: unknown): Settings => { + const input = (patch ?? {}) as Partial; + const next: Partial = {}; + + if (typeof input.guildId === 'string' || input.guildId === null) next.guildId = input.guildId; + if (typeof input.guildName === 'string' || input.guildName === null) { + next.guildName = input.guildName; + } + if (typeof input.autoWatch === 'boolean') next.autoWatch = input.autoWatch; + if (input.savedVariablesPath === null) { + next.savedVariablesPath = null; + next.installPath = null; + } else if (input.savedVariablesPath !== undefined) { + // Same rule as reading: a path we did not discover ourselves is not a path we store + // and then hand to a file read on the next launch. + next.savedVariablesPath = requireDiscovered(input.savedVariablesPath); + next.installPath = typeof input.installPath === 'string' ? input.installPath : null; + } + + return saveSettings(next); +}); + +ipcMain.handle('guild:list', (): Promise => api.guilds()); + +/** + * Send one night. + * + * `dryRun` runs the identical server path and writes nothing, so the preview the officer + * approves is the work that then happens — not a second implementation of it that can + * disagree. A dry run is never recorded as an upload. + */ +ipcMain.handle( + 'attendance:upload', + async (_event, request: unknown): Promise => { + const { night, dryRun } = (request ?? {}) as { night?: ParsedNight; dryRun?: boolean }; + if (!night) throw new Error('No night to upload.'); + + const { guildId } = loadSettings(); + if (!guildId) throw new Error('Choose which guild this machine reports for first.'); + + const result = await api.uploadAttendance(guildId, { + rows: night.rows, + // Dates cross IPC as strings; the API wants strings anyway. Normalising here rather + // than in the renderer keeps the one place that talks to the server the one place + // that has to know the wire shape. + startedAt: asIso(night.startedAt), + endedAt: asIso(night.endedAt), + raidIdHint: night.raidIdHint, + clientVersion: CLIENT_VERSION, + dryRun: dryRun === true, + }); + + if (!dryRun) { + rememberUpload({ + key: nightKey(night.characterKey, night.startedAt), + uploadedAt: new Date().toISOString(), + raidTitle: result.raidTitle ?? night.raidTitle, + recorded: result.recorded, + updated: result.updated, + }); + } + + return result; + }, +); + +function asIso(value: Date | string | null): string | null { + if (value === null) return null; + return value instanceof Date ? value.toISOString() : value; +} + // ── lifecycle ─────────────────────────────────────────────────────────────────── // One officer, one companion. A second copy watching the same file would upload the diff --git a/src/main/settings.test.ts b/src/main/settings.test.ts new file mode 100644 index 0000000..ae39eac --- /dev/null +++ b/src/main/settings.test.ts @@ -0,0 +1,137 @@ +import { mkdtempSync, readdirSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +// Settings live under `app.getPath('userData')`, which only exists inside a running +// Electron process. Pointing it at a temp folder is the whole mock. +const userData = mkdtempSync(join(tmpdir(), 'raidify-settings-')); +vi.mock('electron', () => ({ app: { getPath: () => userData } })); + +const { loadSettings, saveSettings, rememberUpload, resetSettingsCache } = await import( + './settings' +); +const { nightKey } = await import('../shared/nightKey'); + +const FILE = join(userData, 'settings.json'); + +beforeEach(() => { + resetSettingsCache(); + writeFileSync(FILE, '{}', 'utf8'); + resetSettingsCache(); +}); + +describe('the setup answers', () => { + it('survives a restart', () => { + saveSettings({ guildId: 'g-1', guildName: 'Nerf Inc', autoWatch: false }); + + resetSettingsCache(); + + const reloaded = loadSettings(); + expect(reloaded.guildId).toBe('g-1'); + expect(reloaded.guildName).toBe('Nerf Inc'); + expect(reloaded.autoWatch).toBe(false); + }); + + /** + * A settings file that cannot be parsed must cost the officer a setup screen, not a + * launch. This app's job is to be running when the raid ends. + */ + it('falls back to defaults rather than failing to start', () => { + writeFileSync(FILE, '{ this is not json', 'utf8'); + resetSettingsCache(); + + const loaded = loadSettings(); + expect(loaded.guildId).toBeNull(); + expect(loaded.uploaded).toEqual([]); + }); + + /** + * The type is a claim about what we wrote, not about what is on disk. A hand-edited + * file with the wrong shape must not reach the code that treats these as a path or an + * array. + */ + it('refuses values of the wrong type', () => { + writeFileSync( + FILE, + JSON.stringify({ guildId: 42, savedVariablesPath: { nope: true }, uploaded: 'lots' }), + 'utf8', + ); + resetSettingsCache(); + + const loaded = loadSettings(); + expect(loaded.guildId).toBeNull(); + expect(loaded.savedVariablesPath).toBeNull(); + expect(loaded.uploaded).toEqual([]); + }); + + it('leaves no temporary file behind', () => { + saveSettings({ guildId: 'g-2' }); + + expect(readdirSync(userData).filter((f) => f.endsWith('.tmp'))).toEqual([]); + }); +}); + +describe('the record of what has been sent', () => { + const entry = (key: string) => ({ + key, + uploadedAt: new Date().toISOString(), + raidTitle: 'Naxx', + recorded: 40, + updated: 0, + }); + + /** + * Re-sending a night is a correction, not a second night. Two history rows for one + * session would show the officer a duplicate of something that only happened once. + */ + it('replaces an earlier send of the same night', () => { + rememberUpload(entry('Toon - Nightslayer|2026-08-01T19:00:00.000Z')); + rememberUpload({ + ...entry('Toon - Nightslayer|2026-08-01T19:00:00.000Z'), + recorded: 0, + updated: 3, + }); + + const { uploaded } = loadSettings(); + expect(uploaded).toHaveLength(1); + expect(uploaded[0]?.updated).toBe(3); + }); + + it('keeps a bounded history', () => { + for (let i = 0; i < 260; i++) rememberUpload(entry(`night-${i}`)); + + const { uploaded } = loadSettings(); + expect(uploaded).toHaveLength(200); + // Oldest dropped, newest kept — a history that trims the wrong end is worse than none. + expect(uploaded.at(-1)?.key).toBe('night-259'); + expect(uploaded.some((u) => u.key === 'night-0')).toBe(false); + }); +}); + +/** + * The main process writes this key from a Date; the renderer computes it again from + * whatever survived IPC. If those two disagree by so much as a format, every night + * already sent is offered again forever — which is precisely the nagging the history + * exists to stop. + */ +describe('the night key', () => { + it('is the same whether the time arrives as a Date or a string', () => { + const when = new Date('2026-08-01T19:04:33.000Z'); + + expect(nightKey('Toon - Nightslayer', when)).toBe( + nightKey('Toon - Nightslayer', when.toISOString()), + ); + }); + + it('distinguishes two characters on the same night', () => { + const when = new Date('2026-08-01T19:04:33.000Z'); + + expect(nightKey('Toon - Nightslayer', when)).not.toBe(nightKey('Alt - Nightslayer', when)); + }); + + it('does not collapse every unknown time into a match', () => { + // Two sessions with no start time are still two sessions on different characters. + expect(nightKey('Toon - Nightslayer', null)).not.toBe(nightKey('Alt - Nightslayer', null)); + }); +}); diff --git a/src/main/settings.ts b/src/main/settings.ts new file mode 100644 index 0000000..ebbec96 --- /dev/null +++ b/src/main/settings.ts @@ -0,0 +1,99 @@ +import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { app } from 'electron'; +import type { Settings, UploadedNight } from '../shared/types'; + +/** + * What the officer told us once and should never be asked again. + * + * Plain JSON, deliberately: none of it is a secret. The token lives in `secrets.ts` + * behind the OS credential store; this file holds a guild id, a folder path and a list of + * nights already sent — all of it readable from the officer's own screen anyway. + * + * The setup questions are asked once. An app that forgets which guild it reports for + * every time it launches is an app the officer stops launching. + * + * The shapes live in `shared/types` because the UI renders them; this file is only the + * reading and writing. + */ + +/** Beyond this, the history is scrollback nobody reads and a file that only grows. */ +const MAX_HISTORY = 200; + +const DEFAULTS: Settings = { + guildId: null, + guildName: null, + savedVariablesPath: null, + installPath: null, + autoWatch: true, + uploaded: [], +}; + +const FILE = (): string => join(app.getPath('userData'), 'settings.json'); + +let cache: Settings | null = null; + +export function loadSettings(): Settings { + if (cache) return cache; + + const path = FILE(); + if (!existsSync(path)) { + cache = { ...DEFAULTS }; + return cache; + } + + try { + const parsed = JSON.parse(readFileSync(path, 'utf8')) as Partial; + cache = { + ...DEFAULTS, + ...parsed, + // A hand-edited or half-written file must not take the app down on launch. Every + // field is re-checked rather than trusted, because the type above is a claim about + // what we wrote, not about what is on disk. + guildId: typeof parsed.guildId === 'string' ? parsed.guildId : null, + guildName: typeof parsed.guildName === 'string' ? parsed.guildName : null, + savedVariablesPath: + typeof parsed.savedVariablesPath === 'string' ? parsed.savedVariablesPath : null, + installPath: typeof parsed.installPath === 'string' ? parsed.installPath : null, + autoWatch: typeof parsed.autoWatch === 'boolean' ? parsed.autoWatch : true, + uploaded: Array.isArray(parsed.uploaded) + ? parsed.uploaded.filter((u): u is UploadedNight => typeof u?.key === 'string') + : [], + }; + } catch { + // Corrupt settings are not worth a dialog. Fall back to defaults and let the officer + // answer the setup questions again — annoying, and survivable. + cache = { ...DEFAULTS }; + } + + return cache; +} + +export function saveSettings(next: Partial): Settings { + const merged = { ...loadSettings(), ...next }; + merged.uploaded = merged.uploaded.slice(-MAX_HISTORY); + cache = merged; + + const path = FILE(); + mkdirSync(dirname(path), { recursive: true }); + + // Write-then-rename: the alternative is truncating the real file and then losing power + // (or being killed by a Windows update) before the content lands, which turns "forgot a + // preference" into "settings file is now zero bytes". + const temporary = `${path}.tmp`; + writeFileSync(temporary, JSON.stringify(merged, null, 2), 'utf8'); + renameSync(temporary, path); + + return merged; +} + +/** Record a night as sent. Replaces any earlier entry for the same night. */ +export function rememberUpload(entry: UploadedNight): Settings { + const rest = loadSettings().uploaded.filter((u) => u.key !== entry.key); + return saveSettings({ uploaded: [...rest, entry] }); +} + +/** Test seam. The cache is process-wide and would otherwise leak between cases. */ +export function resetSettingsCache(): void { + cache = null; +} diff --git a/src/preload/index.ts b/src/preload/index.ts index 562a4ae..039ebf6 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -1,6 +1,10 @@ import { contextBridge, ipcRenderer } from 'electron'; -import type { ParsedNight, SavedVariablesCandidate } from '../shared/types'; -import type { CompatVerdict } from '../shared/contract'; +import type { ParsedNight, SavedVariablesCandidate, Settings } from '../shared/types'; +import type { + AttendanceUploadResult, + CompanionGuild, + CompatVerdict, +} from '../shared/contract'; /** * The only way the UI can reach anything real. @@ -25,6 +29,19 @@ const bridge = { watch: (path: string): Promise<{ watching: boolean; path: string }> => ipcRenderer.invoke('wow:watch', path), unwatch: (): Promise<{ watching: boolean }> => ipcRenderer.invoke('wow:unwatch'), + /** Re-find the remembered file and, if asked for, start watching it. */ + resume: (): Promise<{ path: string | null; watching: boolean }> => + ipcRenderer.invoke('wow:resume'), + + getSettings: (): Promise => ipcRenderer.invoke('settings:get'), + saveSettings: (patch: Partial): Promise => + ipcRenderer.invoke('settings:set', patch), + + listGuilds: (): Promise => ipcRenderer.invoke('guild:list'), + + /** `dryRun` previews on the real server path and writes nothing. */ + upload: (night: ParsedNight, dryRun: boolean): Promise => + ipcRenderer.invoke('attendance:upload', { night, dryRun }), /** Fires whenever a flush produced a readable night. Returns an unsubscribe. */ onNights: (handler: (nights: ParsedNight[]) => void): (() => void) => { @@ -33,6 +50,13 @@ const bridge = { return () => ipcRenderer.removeListener('wow:nights', listener); }, + /** The file read cleanly and held no raid session. Fires instead of `onNights`. */ + onEmptyRead: (handler: (info: { at: string }) => void): (() => void) => { + const listener = (_event: unknown, info: { at: string }) => handler(info); + ipcRenderer.on('wow:empty', listener); + return () => ipcRenderer.removeListener('wow:empty', listener); + }, + onWatchError: (handler: (error: { message: string }) => void): (() => void) => { const listener = (_event: unknown, error: { message: string }) => handler(error); ipcRenderer.on('wow:error', listener); diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 4820304..33fc1e2 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -1,5 +1,9 @@ -import { useEffect, useState } from 'react'; -import type { CompatVerdict } from '../shared/contract'; +import { useCallback, useEffect, useState } from 'react'; +import type { CompanionGuild, CompatVerdict } from '../shared/contract'; +import type { ParsedNight, SavedVariablesCandidate, Settings } from '../shared/types'; +import { nightKey } from '../shared/nightKey'; +import { NightCard } from './components/NightCard'; +import { SetupPanel } from './components/SetupPanel'; import { StatusBanner } from './components/StatusBanner'; interface AppInfo { @@ -11,24 +15,86 @@ interface AppInfo { /** * The shell. * - * v0's UI is a real deliverable rather than a tray menu, so the frame it will grow into - * is here from the start: a status line the officer can read at a glance, and room below - * it for setup and upload history. What is not here yet is marked as such — an empty - * panel that pretends to work is worse than one that says what it is waiting for. + * Answer three setup questions once, then this window has one job: show the raid nights + * sitting in the saved-variables file and let the officer send one. It never sends on its + * own — see NightCard for why. */ export function App() { const [info, setInfo] = useState(null); const [compat, setCompat] = useState(null); const [signedIn, setSignedIn] = useState(false); + const [settings, setSettings] = useState(null); + const [guilds, setGuilds] = useState(null); + const [installs, setInstalls] = useState(null); + const [watchingPath, setWatchingPath] = useState(null); + const [nights, setNights] = useState([]); + const [watchError, setWatchError] = useState(null); + /** When the file was last read and found to hold no raid session. */ + const [lastEmptyRead, setLastEmptyRead] = useState(null); + + // The guild list needs a working sign-in, and sign-in state changes at runtime. Keeping + // the fetch in one place stops it being fired twice by two callers that both mean "we + // are signed in now". + const loadGuilds = useCallback(async () => { + try { + setGuilds(await window.companion.listGuilds()); + } catch { + // Offline, or the token expired. The banner already says the server is unreachable; + // a second error here would be the same news twice. + setGuilds([]); + } + }, []); useEffect(() => { void (async () => { setInfo(await window.companion.appInfo()); - setSignedIn((await window.companion.authStatus()).signedIn); + setSettings(await window.companion.getSettings()); + + const auth = await window.companion.authStatus(); + setSignedIn(auth.signedIn); + setCompat(await window.companion.checkCompat()); + + if (auth.signedIn) { + void loadGuilds(); + // Pick the file back up from last launch, and watch it again if that is what the + // officer asked for. + setWatchingPath((await window.companion.resume()).path); + } })(); + }, [loadGuilds]); + + // Subscribed once, for the life of the window. A flush landing while the officer reads + // is the normal case — they alt-tab out of the game and the file arrives. + useEffect(() => { + const stopNights = window.companion.onNights((incoming) => { + setNights(incoming); + setLastEmptyRead(null); + setWatchError(null); + }); + const stopEmpty = window.companion.onEmptyRead((info) => { + // A later read finding nothing means the file was rewritten without a session in + // it, so the nights we were showing are gone too. Saying so beats leaving stale + // cards on screen that no longer exist on disk. + setNights([]); + setLastEmptyRead(info.at); + setWatchError(null); + }); + const stopErrors = window.companion.onWatchError((error) => setWatchError(error.message)); + return () => { + stopNights(); + stopEmpty(); + stopErrors(); + }; }, []); + const sent = new Map((settings?.uploaded ?? []).map((u) => [u.key, u])); + + // Newest first: the night just finished is the one the officer opened the app for. + const ordered = [...nights].sort((a, b) => time(b.startedAt) - time(a.startedAt)); + + const uploadsBlocked = compat !== null && compat.kind !== 'ok'; + return (
@@ -46,31 +112,110 @@ export function App() {
-
-

Setup

-
    -
  1. {signedIn ? '✓ Signed in' : '1 · Sign in to Raidify'}
  2. -
  3. 2 · Choose which guild this machine reports for
  4. -
  5. 3 · Point at your World of Warcraft folder
  6. -
-

- Not wired up yet — sign-in, guild picker and folder picker land next. -

- {info && !info.canRememberSignIn && ( -

- This system has no secure credential store, so a sign-in cannot be remembered - between launches. -

- )} -
+ { + await window.companion.signIn(); + setSignedIn(true); + await loadGuilds(); + }} + onSignOut={async () => { + await window.companion.signOut(); + setSignedIn(false); + setGuilds(null); + }} + onChooseGuild={async (guild) => { + setSettings( + await window.companion.saveSettings({ guildId: guild.id, guildName: guild.name }), + ); + }} + onDetect={async () => setInstalls(await window.companion.detectInstalls())} + onBrowse={async () => setInstalls(await window.companion.browseForInstall())} + onChooseInstall={async (candidate) => { + setSettings( + await window.companion.saveSettings({ + savedVariablesPath: candidate.path, + installPath: candidate.installPath, + }), + ); + setWatchingPath((await window.companion.watch(candidate.path)).path); + }} + /> -
-

Recent uploads

-

- Nothing yet. Finished raid nights will appear here with what was sent. + {watchError && ( +

+ Could not read the saved-variables file: {watchError}

+ )} + +
+

Raid nights

+ + {!watchingPath ? ( + Finish setup and your raid nights will appear here. + ) : ordered.length === 0 ? ( + + {lastEmptyRead ? ( + <> + Read your saved-variables file at{' '} + {new Date(lastEmptyRead).toLocaleTimeString()} and found no raid session in + it. Start one in game with /rf start, and + it will appear here after you log out or type{' '} + /reload. + + ) : ( + <> + Nothing yet. A raid night shows up here once you have logged out or typed{' '} + /reload — the game holds the file in + memory until then, so it is not missing, just not written yet. + + )} + + ) : uploadsBlocked ? ( + + {ordered.length} night{ordered.length === 1 ? '' : 's'} ready, held until Raidify + is accepting uploads again. Nothing is lost. + + ) : ( + ordered.map((night) => { + const key = nightKey(night.characterKey, night.startedAt); + return ( + { + const result = await window.companion.upload(target, dryRun); + // The main process is what recorded the send; re-read rather than guess + // at what it wrote, so the "Sent" mark and the file cannot disagree. + if (!dryRun) setSettings(await window.companion.getSettings()); + return result; + }} + /> + ); + }) + )}
); } + +function Empty({ children }: { children: React.ReactNode }) { + return ( +

+ {children} +

+ ); +} + +function time(value: Date | string | null): number { + if (!value) return 0; + const ms = (value instanceof Date ? value : new Date(value)).getTime(); + return Number.isNaN(ms) ? 0 : ms; +} diff --git a/src/renderer/components/NightCard.tsx b/src/renderer/components/NightCard.tsx new file mode 100644 index 0000000..cf8492a --- /dev/null +++ b/src/renderer/components/NightCard.tsx @@ -0,0 +1,265 @@ +import { useState } from 'react'; +import { AttendanceBucket, type AttendanceUploadResult } from '../../shared/contract'; +import type { ParsedNight, UploadedNight } from '../../shared/types'; + +/** + * One raid night, and the decision to send it. + * + * Never sends on its own. The officer is the one who knows whether Tuesday's session on + * an alt was the guild's Naxx run or three people messing about in Deadmines, and this + * app has no way to tell those apart — so it reports what it read and waits. + * + * "Review" runs a dry run against the real server path, so what is shown is what will + * happen rather than a second guess at it. + */ +export function NightCard({ + night, + alreadySent, + onUpload, +}: { + night: ParsedNight; + alreadySent: UploadedNight | undefined; + onUpload: (night: ParsedNight, dryRun: boolean) => Promise; +}) { + const [preview, setPreview] = useState(null); + const [sent, setSent] = useState(null); + const [busy, setBusy] = useState<'review' | 'send' | null>(null); + const [error, setError] = useState(null); + + const counts = summarise(night); + + async function run(dryRun: boolean) { + setBusy(dryRun ? 'review' : 'send'); + setError(null); + try { + const result = await onUpload(night, dryRun); + if (dryRun) setPreview(result); + else setSent(result); + } catch (caught) { + setError(caught instanceof Error ? caught.message : String(caught)); + } finally { + setBusy(null); + } + } + + return ( +
+
+
+

+ {night.raidTitle ?? 'Raid night'}{' '} + · {night.characterKey} +

+

+ {describeWhen(night)} · {counts.total} raiders +

+
+ +
+ {night.stale && Old night} + {!night.finished && Still running} + {alreadySent && Sent} +
+
+ +
    + + + {/* Named plainly. These are people nobody accounted for, and calling them absent + here is exactly the accusation the addon refuses to make. */} + +
+ + {night.stale && ( + + This night is more than two weeks old. Sending it now rewrites the record for that + date — fine if you meant to, worth a second look if you did not. + + )} + + {!night.finished && ( + + The addon has not ended this session. Send it and anyone who joins later will be + missing. Type /rf end in game first if the raid + is over. + + )} + + {alreadySent && !sent && ( + + Sent {relative(alreadySent.uploadedAt)}. Sending again corrects the record rather + than duplicating it. + + )} + + {error && {error}} + + {sent ? ( + + {describeResult(sent)} + {sent.unmatchedRaiders.length > 0 && ( + + )} + + ) : ( + <> + {preview && ( + + {describeResult(preview, true)} + {preview.warnings.map((w) => ( + + {w} + + ))} + {preview.unmatchedRaiders.length > 0 && ( + + )} + + )} + +
+ + + {/* Deliberately gated on a review. The officer sees what a send does before + one happens — and because the preview runs the same server path, seeing it + is not a promise about the send, it is the send with the write turned off. */} + +
+ + )} +
+ ); +} + +function UnmatchedList({ names }: { names: string[] }) { + return ( + + No Raidify account matched: {names.join(', ')}. They are not counted either way — + linking their character on the website fixes it for next time. + + ); +} + +function describeResult(result: AttendanceUploadResult, preview = false): string { + const verb = preview ? 'would be' : 'were'; + const parts: string[] = []; + if (result.recorded) parts.push(`${result.recorded} ${verb} recorded`); + if (result.updated) parts.push(`${result.updated} ${verb} corrected`); + if (result.unchanged) parts.push(`${result.unchanged} already matched`); + + const where = result.raidTitle + ? `“${result.raidTitle}”` + : 'a night not on the schedule, which will be recorded on its own'; + + return parts.length === 0 + ? `Nothing to change against ${where}.` + : `${parts.join(', ')} against ${where}.`; +} + +interface Counts { + total: number; + attended: number; + benched: number; + unresolved: number; +} + +function summarise(night: ParsedNight): Counts { + const counts: Counts = { total: night.rows.length, attended: 0, benched: 0, unresolved: 0 }; + + for (const row of night.rows) { + switch (row.bucket) { + case AttendanceBucket.Present: + case AttendanceBucket.Late: + case AttendanceBucket.LeftEarly: + counts.attended++; + break; + case AttendanceBucket.Benched: + counts.benched++; + break; + default: + counts.unresolved++; + } + } + + return counts; +} + +function describeWhen(night: ParsedNight): string { + if (!night.startedAt) return 'Time unknown'; + + const started = new Date(night.startedAt); + const date = started.toLocaleDateString(undefined, { + weekday: 'short', + day: 'numeric', + month: 'short', + }); + const from = started.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' }); + if (!night.endedAt) return `${date}, from ${from}`; + + const ended = new Date(night.endedAt); + const to = ended.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' }); + return `${date}, ${from}–${to}`; +} + +function relative(iso: string): string { + const then = new Date(iso).getTime(); + const minutes = Math.round((Date.now() - then) / 60_000); + if (minutes < 1) return 'just now'; + if (minutes < 60) return `${minutes} min ago`; + const hours = Math.round(minutes / 60); + if (hours < 24) return `${hours}h ago`; + return new Date(iso).toLocaleDateString(); +} + +function Count({ label, value, muted }: { label: string; value: number; muted?: boolean }) { + if (value === 0) return null; + return ( +
  • + {value} {label} +
  • + ); +} + +const TONES = { + success: 'var(--success)', + warning: 'var(--warning)', + error: 'var(--error)', + muted: 'var(--muted)', +} as const; + +function Note({ tone, children }: { tone: keyof typeof TONES; children: React.ReactNode }) { + return ( +

    + {children} +

    + ); +} + +function Tag({ tone, children }: { tone: keyof typeof TONES; children: React.ReactNode }) { + return ( + + {children} + + ); +} diff --git a/src/renderer/components/SetupPanel.tsx b/src/renderer/components/SetupPanel.tsx new file mode 100644 index 0000000..89752f2 --- /dev/null +++ b/src/renderer/components/SetupPanel.tsx @@ -0,0 +1,286 @@ +import { useState } from 'react'; +import type { CompanionGuild } from '../../shared/contract'; +import type { SavedVariablesCandidate, Settings } from '../../shared/types'; + +/** + * The three questions, asked once. + * + * Who are you, which guild does this machine report for, and where is the game. Nothing + * else — every extra question here is a reason to close the app and go back to pasting a + * string, which already works. + * + * Collapses to a single line once answered, because setup is not what the officer opens + * this app to look at. + */ +export function SetupPanel({ + settings, + signedIn, + canRememberSignIn, + guilds, + installs, + watchingPath, + onSignIn, + onSignOut, + onChooseGuild, + onDetect, + onBrowse, + onChooseInstall, +}: { + settings: Settings | null; + signedIn: boolean; + canRememberSignIn: boolean; + guilds: CompanionGuild[] | null; + installs: SavedVariablesCandidate[] | null; + watchingPath: string | null; + onSignIn: () => Promise; + onSignOut: () => Promise; + onChooseGuild: (guild: CompanionGuild) => Promise; + onDetect: () => Promise; + onBrowse: () => Promise; + onChooseInstall: (candidate: SavedVariablesCandidate) => Promise; +}) { + const [busy, setBusy] = useState(null); + const [error, setError] = useState(null); + + const guildChosen = Boolean(settings?.guildId); + const fileChosen = Boolean(watchingPath); + const done = signedIn && guildChosen && fileChosen; + + const [expanded, setExpanded] = useState(false); + + async function attempt(name: string, action: () => Promise) { + setBusy(name); + setError(null); + try { + await action(); + } catch (caught) { + setError(caught instanceof Error ? caught.message : String(caught)); + } finally { + setBusy(null); + } + } + + // Answered and working: one line, and a way back in. Anything more is a permanent + // reminder of a job that is finished. + if (done && !expanded) { + return ( +
    +

    + Watching for {settings?.guildName} ·{' '} + {shortPath(watchingPath)} +

    + +
    + ); + } + + return ( +
    +
    +

    Setup

    + {done && ( + + )} +
    + +
      + + {signedIn ? ( + + ) : ( + <> + void attempt('signin', onSignIn)} + /> +

      + Opens your browser. If you are already signed in to Raidify there, it is one + click and nothing to type. +

      + {!canRememberSignIn && ( +

      + This system has no secure credential store, so the sign-in cannot be + remembered between launches. +

      + )} + + )} +
      + + + {!signedIn ? ( +

      Sign in first.

      + ) : guilds === null ? ( +

      Loading your guilds…

      + ) : guilds.length === 0 ? ( +

      + None of your guilds let you manage raids, so there is nothing this machine can + report for. An officer can grant that on the guild's settings page. +

      + ) : ( +
      + {guilds.map((guild) => ( + + ))} +
      + )} +
      + + +
      + void attempt('detect', onDetect)} + /> + void attempt('browse', onBrowse)} + quiet + /> +
      + + {installs !== null && installs.length === 0 && ( +

      + No Raidify saved-variables file found. That file only appears after the addon + has run at least once and you have logged out or typed{' '} + /reload — the game keeps it in memory until + then. +

      + )} + + {installs !== null && installs.length > 0 && ( +
        + {installs.map((candidate) => ( +
      • + +
      • + ))} +
      + )} +
      +
    + + {error &&

    {error}

    } +
    + ); +} + +function Step({ + index, + title, + complete, + children, +}: { + index: number; + title: string; + complete: boolean; + children: React.ReactNode; +}) { + return ( +
  • +

    + + {complete ? '✓' : index} + + {title} +

    +
    {children}
    +
  • + ); +} + +function Action({ + label, + busy, + disabled, + onClick, + quiet, +}: { + label: string; + busy: boolean; + disabled: boolean; + onClick: () => void; + quiet?: boolean; +}) { + return ( + + ); +} + +/** The middle of a saved-variables path is folder names nobody reads. */ +function shortPath(path: string | null): string { + if (!path) return ''; + const parts = path.split(/[\\/]/); + return parts.slice(-4).join('/'); +} diff --git a/src/shared/contract.ts b/src/shared/contract.ts index 217b87a..a1157af 100644 --- a/src/shared/contract.ts +++ b/src/shared/contract.ts @@ -91,6 +91,21 @@ export interface AttendanceUploadResult { warnings: string[]; } +/** + * A guild this machine may report attendance for. + * + * The saved-variables file says which characters raided; it never says under whose + * banner. So the officer picks once, from the guilds the server says they can already + * manage raids in. + */ +export interface CompanionGuild { + id: string; + name: string; + slug: string; + gameVersion: number; + avatarUrl: string | null; +} + export interface CompatResponse { minimumClientVersion: string; latestClientVersion: string; diff --git a/src/shared/nightKey.ts b/src/shared/nightKey.ts new file mode 100644 index 0000000..fa47eb4 --- /dev/null +++ b/src/shared/nightKey.ts @@ -0,0 +1,21 @@ +/** + * Identify a night without waiting for the server to name it. + * + * The upload result carries the server's own `eventKey`, but that only exists after a + * successful send and says nothing about the local session that produced it. This is + * computed from what is in the saved-variables file, so a night can be recognised — and + * matched against what has already been sent — before it is ever uploaded. + * + * Lives in `shared` because both sides need the same answer: the main process writes the + * key into the upload history, and the renderer looks nights up by it. Two + * implementations that drift by a millisecond would quietly re-offer every sent night. + */ +export function nightKey(characterKey: string, startedAt: Date | string | null): string { + const at = + startedAt === null + ? 'unknown' + : startedAt instanceof Date + ? startedAt.toISOString() + : new Date(startedAt).toISOString(); + return `${characterKey}|${at}`; +} diff --git a/src/shared/types.ts b/src/shared/types.ts index 25f5856..90f7fcd 100644 --- a/src/shared/types.ts +++ b/src/shared/types.ts @@ -47,3 +47,41 @@ export interface ParsedNight { rows: AttendanceRow[]; } + +export interface Settings { + /** Which guild this machine reports for. Null until setup is done. */ + guildId: string | null; + guildName: string | null; + /** The `RaidifyDB.lua` we watch. */ + savedVariablesPath: string | null; + /** + * The `World of Warcraft` folder it was found under. + * + * Stored so the path can be re-discovered on the next launch rather than trusted. A + * path is only ever read after this app has found it itself; a string sitting in a JSON + * file is not that, and the difference matters for a value that becomes a file read and + * a Lua evaluation. + */ + installPath: string | null; + /** Start watching as soon as the app opens, rather than waiting to be told. */ + autoWatch: boolean; + /** + * Nights already sent from this machine, newest last. + * + * Not a correctness mechanism — the server upserts, so a second send of the same night + * changes nothing. This is so the list stops asking. Every flush of the saved-variables + * file re-reads every session in it, and an app that offers the same finished night at + * every launch until the officer manually clears it teaches them to ignore the list, + * which is the one thing it must not do. + */ + uploaded: UploadedNight[]; +} + +export interface UploadedNight { + /** `characterKey|startedAt` — see `nightKey`. */ + key: string; + uploadedAt: string; + raidTitle: string | null; + recorded: number; + updated: number; +} diff --git a/tsconfig.node.tsbuildinfo b/tsconfig.node.tsbuildinfo deleted file mode 100644 index 5707cd0..0000000 --- a/tsconfig.node.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"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.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.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.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.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/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/web-globals/streams.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/vite/types/hmrpayload.d.ts","./node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","./node_modules/vite/types/customevent.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/hot.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/vite/node_modules/esbuild/lib/main.d.ts","./node_modules/vite/types/internal/terseroptions.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/csspreprocessoroptions.d.ts","./node_modules/lightningcss/node/ast.d.ts","./node_modules/lightningcss/node/targets.d.ts","./node_modules/lightningcss/node/index.d.ts","./node_modules/vite/types/internal/lightningcssoptions.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/electron-vite/dist/index.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","./node_modules/@tailwindcss/vite/dist/index.d.mts","./electron.vite.config.ts","./src/shared/contract.ts","./src/main/api.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/runner/dist/tasks.d-cksck4of.d.ts","./node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","./node_modules/@vitest/utils/dist/diff.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.bkdhh7zx.d.ts","./node_modules/vitest/dist/chunks/worker.d.cugipz9v.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.buron0i0.d.ts","./node_modules/vitest/dist/chunks/worker.d.uzwscv9x.d.ts","./node_modules/@vitest/spy/dist/index.d.ts","./node_modules/@vitest/expect/dist/index.d.ts","./node_modules/vitest/dist/chunks/global.d.mamajcmj.d.ts","./node_modules/vitest/dist/chunks/vite.d.bnoppc46.d.ts","./node_modules/vitest/dist/chunks/mocker.d.be_2ls6u.d.ts","./node_modules/vitest/dist/chunks/suite.d.fvehnv49.d.ts","./node_modules/expect-type/dist/utils.d.ts","./node_modules/expect-type/dist/overloads.d.ts","./node_modules/expect-type/dist/branding.d.ts","./node_modules/expect-type/dist/messages.d.ts","./node_modules/expect-type/dist/index.d.ts","./node_modules/vitest/dist/index.d.ts","./src/main/auth.ts","./src/main/auth.test.ts","./src/main/build.test.ts","./src/shared/types.ts","./src/main/discovery.ts","./src/main/discovery.test.ts","./node_modules/electron/electron.d.ts","./src/main/secrets.ts","./node_modules/wasmoon/dist/types.d.ts","./node_modules/wasmoon/dist/decoration.d.ts","./node_modules/wasmoon/dist/pointer.d.ts","./node_modules/wasmoon/dist/multireturn.d.ts","./node_modules/@types/emscripten/index.d.ts","./node_modules/wasmoon/dist/luawasm.d.ts","./node_modules/wasmoon/dist/thread.d.ts","./node_modules/wasmoon/dist/type-extension.d.ts","./node_modules/wasmoon/dist/global.d.ts","./node_modules/wasmoon/dist/engine.d.ts","./node_modules/wasmoon/dist/factory.d.ts","./node_modules/wasmoon/dist/raw-result.d.ts","./node_modules/wasmoon/dist/type-extensions/function.d.ts","./node_modules/wasmoon/dist/type-extensions/userdata.d.ts","./node_modules/wasmoon/dist/type-extensions/proxy.d.ts","./node_modules/wasmoon/dist/index.d.ts","./src/main/lua.ts","./src/main/savedvariables.ts","./src/main/watcher.ts","./src/main/index.ts","./src/main/lua.test.ts","./src/main/savedvariables.test.ts","./src/main/watcher.test.ts","./src/preload/index.ts","./src/shared/contract.test.ts","./node_modules/electron-vite/node.d.ts"],"fileIdsList":[[67,116,133,134,138,205,212,213],[67,116,133,134,206],[67,116,133,134],[67,116,133,134,204,258],[67,116,133,134,206,207,208,209,210],[67,116,133,134,206,208],[67,116,133,134,244,245],[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,108,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,109,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,108,116,133,134],[67,108,116,127,129,133,134,139,148,151,159,161,162,164],[67,116,133,134,148,165],[67,116,133,134,204,211,258],[67,116,133,134,221,222,225,255],[67,116,133,134,231,232],[67,116,133,134,222,223,225,226,227],[67,116,133,134,222],[67,116,133,134,222,223,225],[67,116,133,134,222,223],[67,116,133,134,238],[67,116,133,134,217,238,239],[67,116,133,134,217,238],[67,116,133,134,217,224],[67,116,133,134,218],[67,116,133,134,217,218,219,221],[67,116,133,134,217],[67,116,133,134,164],[67,116,127,128,133,134,166],[67,116,133,134,261,262],[67,116,133,134,261,262,263,264],[67,116,133,134,261,263],[67,116,133,134,261],[67,116,133,134,198,199],[67,116,133,134,192],[67,116,133,134,190,192],[67,116,133,134,181,189,190,191,193,195],[67,116,133,134,179],[67,116,133,134,182,187,192,195],[67,116,133,134,178,195],[67,116,133,134,182,183,186,187,188,195],[67,116,133,134,182,183,184,186,187,195],[67,116,133,134,179,180,181,182,183,187,188,189,191,192,193,195],[67,116,133,134,195],[67,116,133,134,177,179,180,181,182,183,184,186,187,188,189,190,191,192,193,194],[67,116,133,134,177,195],[67,116,133,134,182,184,185,187,188,195],[67,116,133,134,186,195],[67,116,133,134,187,188,192,195],[67,116,133,134,180,190],[67,116,133,134,171,203,204],[67,116,133,134,170,171],[67,116,133,134,220],[67,80,84,116,133,134,159],[67,80,116,133,134,148,159],[67,75,116,133,134],[67,77,80,116,133,134,156,159],[67,116,133,134,136,156],[67,116,133,134,166],[67,75,116,133,134,166],[67,77,80,116,133,134,136,159],[67,72,73,76,79,116,127,133,134,148,159],[67,80,87,116,133,134],[67,72,78,116,133,134],[67,80,101,102,116,133,134],[67,76,80,116,133,134,151,159,166],[67,101,116,133,134,166],[67,74,75,116,133,134,166],[67,80,116,133,134],[67,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,102,103,104,105,106,107,116,133,134],[67,80,95,116,133,134],[67,80,87,88,116,133,134],[67,78,80,88,89,116,133,134],[67,79,116,133,134],[67,72,75,80,116,133,134],[67,80,84,88,89,116,133,134],[67,84,116,133,134],[67,78,80,83,116,133,134,159],[67,72,77,80,87,116,133,134],[67,116,133,134,148],[67,75,80,101,116,133,134,164,166],[67,116,133,134,235,236],[67,116,133,134,235],[67,116,133,134,167],[67,116,127,128,130,131,132,133,134,136,148,156,159,165,166,167,168,169,171,172,174,175,176,196,197,201,202,203,204],[67,116,133,134,167,168,169,173],[67,116,133,134,169],[67,116,133,134,200],[67,116,133,134,171,204],[67,116,133,134,228,247,248,257],[67,116,133,134,217,225,228,240,241,257],[67,116,133,134,250],[67,116,133,134,229],[67,116,133,134,217,228,230,240,249,256,257],[67,116,133,134,233],[67,116,119,128,133,134,148,204,217,222,225,228,230,233,234,237,240,242,243,246,249,251,252,257,258],[67,116,133,134,228,247,248,249,257],[67,116,133,134,204,253,258],[67,116,133,134,228,230,237,240,242,257],[67,116,133,134,164,243],[67,116,119,128,133,134,148,164,204,217,222,225,228,229,230,233,234,237,240,241,242,243,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,265],[67,116,133,134,280,283],[67,116,133,134,275,280,284],[67,116,133,134,275,280,281,282],[67,116,133,134,275,276,278,280,281,282,283,284,285,286,287,288,289],[67,116,133,134,275,279],[67,116,133,134,275,277,278,280,282],[67,116,133,134,275,276,281,283],[67,116,133,134,276,282,283],[67,116,133,134,215],[67,116,121,133,134,266,267],[67,116,121,130,133,134,136],[67,116,128,133,134,138,266],[67,116,129,133,134,137,138,266,271],[67,116,129,133,134,138,270],[67,116,133,134,138,215,216,267,270,271,273,274,292,293],[67,116,133,134,266,291],[67,116,133,134,290],[67,116,129,133,134,137,138,215,266,292],[67,116,129,133,134,215,270,291],[67,116,128,133,134,138,273],[67,116,129,133,134,137,138,266,270,293],[67,116,128,133,134,138,270,292],[67,116,133,134,215,270,273],[67,116,133,134,215,266]],"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":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","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":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"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":"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":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","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":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","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":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","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":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"21944c138a48dc23382cb6558b1d4498908faad2104ba7ff390ba8b27c06f3c0","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"3cc8a3d123b6b232d48d34b51b785f9da8d193f5b5817fa521fcd2f3b9315c55","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"354a7f8e1287d9d6b7561bc97fdd8cbc2f7c1dd79e4cb37b942e8a5cfaff1085","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fd8a5aefd8c3feb3936ca66f5aa89dff7bf6e6537b4158dbd0f6e0d65ed3b9e","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"41c41c6e90133bb2a14f7561f29944771886e5535945b2b372e2f6ed6987746e","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"cbb1c5ba5dbabe42c19ca31b83e48fec95895484fe1d1a8fb649b69ea224c5b8","impliedFormat":99},{"version":"748aaddcaf36dd6d2cd08d9b4a8fdf621da41cb61dc4536d17104a23a7c12f6d","impliedFormat":99},{"version":"69d4b61c408556b97b796782a1110f7e01a03ed80f31741f2c59b722185830ed","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"e6ca59368dce5a594dcde9bbb6ae640d668fa6c28c31639dd2a75b731bb036a2","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"26e0ffceb2198feb1ef460d5d14111c69ad07d44c5a67fd4bfeb74c969aa9afb","impliedFormat":99},{"version":"7757c6ca7a8ad1992401c6aff33633d6a088515be5a39d7ee188b35bfc8e5f8e","impliedFormat":99},{"version":"74aa037dad474c179b196dac3d2fe6cd888c76a6f9bef61fe0cd1d1b29f5253b","signature":"2f40f5b066ae0e8b25ce0405683930c93e1e124727d34b596d337e65248258c3"},{"version":"27782810b38397b600edb57c3bdc051112e96cd6827a19db811dd0b2f50d9ffb","signature":"cb66ac77b7643fc7621e51502aa52e0fb41f9ad7cc1520c1e479bff39cede458"},"87ce0193181489d3b05863bce1fe67b6f97de9582c184884d8771bdb941f422c",{"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":"45cec9a1ba6549060552eead8959d47226048e0b71c7d0702ae58b7e16a28912","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","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":"5e91172586d1be7d1508d1a40c8bf76161f6f4179d1c25158a20599f9fb26a66","impliedFormat":99},{"version":"09d215b379a93f8cbb6caf9e9f5d7b4d48042295ee697e7e4771288c7917a21e","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":"ab80d2cb170a92c61ca8c822d0db0fc50eb15c7c6cf1a24cb01852a5a15a7db8","impliedFormat":99},{"version":"d689a82dec12ec02e1c558870a50f71000e06f173151fcdff0458c587dbf016f","impliedFormat":99},{"version":"04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab","impliedFormat":99},{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true,"impliedFormat":99},{"version":"e58c0b5226aff07b63be6ac6e1bec9d55bc3d2bda3b11b9b68cccea8c24ae839","affectsGlobalScope":true,"impliedFormat":99},{"version":"210955af8573671abebb6e1391d134d82fbcff130aa68922ea1e839f8f48a0ad","impliedFormat":99},{"version":"5a88655bf852c8cc007d6bc874ab61d1d63fba97063020458177173c454e9b4a","impliedFormat":99},{"version":"7e4dfae2da12ec71ffd9f55f4641a6e05610ce0d6784838659490e259e4eb13c","impliedFormat":99},{"version":"dd51e53752b310bd20c9b1a87bbf12b1fe2be7fe40f505b43199496481096275","impliedFormat":1},{"version":"a87be4662442b3feeffc331ecafe6b36cafd08727e2d7f2425a5099577e7fd18","impliedFormat":1},{"version":"cd4cd9220a1ba793bc935e76d8e5481c110a90d9868ae7866a182ee71cdb6abb","impliedFormat":1},{"version":"0a7fb8619b10bc05fd933ca9ac1c8b2ab2220be7a57b57565c3ac158595494ef","impliedFormat":1},{"version":"c4a5f91feb9c5a6b2a91089d959c38391b79a961db3b9cc73b8877d57ad7dcdc","impliedFormat":1},{"version":"c371ea3efec17691f019bca670c161bee2f4787b1f464bdbbb10c4117bf0a55d","impliedFormat":99},{"version":"3d6c12a64a91aafada7be14c9ce6ba42d81a416d030ff2224c6e6aaad1fd216c","signature":"1041ca778fc4c03f71ec8b0756cb19006841caa9a58e258d943491554e4e91a0"},{"version":"9de3597b361a403f88bdf2fb37b9efbb0980c7b1306cc162d40d9da23ac3199c","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"765ac742802ad54467aaa9ac195c1a8c37423268c4510c49ca3dbb996a49cb65","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"e0f449551af1460ae3a14271a6c7f21fd65ee4e971c5efdb06899dad1d4cb358","054f3449b0ae601fbcede01aa08eec75adcd99fbfbcdcc521c315b005243486a","8f42701c075126cfd6acaaa1e24267347f137ef68394fb95f63e6765369453b9",{"version":"fd1ad4bc25754908cf632e000cd33b9d07bda1186138da356cb86080ff77907b","affectsGlobalScope":true,"impliedFormat":1},"afe95dbac9ec76ef6ccdc1e49e27a2cf2d6fb45be4157d15e2aa410b469228c1",{"version":"5774dc7b673738a81d276fdfdabf02ca00f3c69625c3fce28fe350bfbfd832c7","impliedFormat":1},{"version":"0a2ec3038c02e503becf32004fc530b0c8253029ae81e58b99c12ea357a741af","impliedFormat":1},{"version":"d12c384f77a0068f905553c1e0909bb695c7b886b36b835e4814c13006b068ed","impliedFormat":1},{"version":"22fdcdc3bc62ea2332d1718edc280ded20f0f6db0f5e373902f5b064255e56e7","impliedFormat":1},{"version":"fa4546e9b67dbdcc0fa8d8653c6b89d49b9e7b637b3340bea78107ca161595fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"4cf563dbe6e06bd3e25cdd9703f6b1a598dadd9521c2a9b920c3deb099791102","impliedFormat":1},{"version":"2eb4886cfdafc874eee62f035f539e96e4266585df2f9e1b53899d0aea5a400c","impliedFormat":1},{"version":"ff9d8cc4cb5cd25bdb10f736c3e2f020e4bdeff6a4f925dfb1b32bc7a8158b01","impliedFormat":1},{"version":"50c7627d6af095a4ce3a7dfbf09da66e73fbf290e8a733b185be286ed995db6f","impliedFormat":1},{"version":"1054a323c08990b18beb381e660a3e472bf2cf8a28f186cc0cbb11f6182145f4","impliedFormat":1},{"version":"b88ec8a7c61774277e986c734ff9645ab3f1020a3e007ad7c213b69efdb3f271","impliedFormat":1},{"version":"e497a81668e120e1a268de5f76b7b266a08c4d6f36c241807070030c14184518","impliedFormat":1},{"version":"6f13fdecf8125af9fc5b0bb0539b0badf73d186839c0409ac4f55bad0eaa1a30","impliedFormat":1},{"version":"d1fbdf791d574cdc3977f6ee10dcc0ea98e18045a90fae04e87308e9debacd2a","impliedFormat":1},{"version":"a84173e4a93081489ec5c9620cdcf5b726ec7e2d2d1908331d96f5640f7728b4","impliedFormat":1},{"version":"7d4677a7ac2bfe23efa58592c9425b213ba0b75e5054e12c1ddb19f4da82a013","impliedFormat":1},{"version":"6cb9eab75670069da10088e9012f1252b7b5b6528399b5912230462fa077da0a","signature":"d6a6ac8e49e89d97cfc150deb1cfcb3cf3fd391fa28ba525eab7d9d00a6bc045"},{"version":"80a5f9601b9d767b2a8e5d097366865a867a6b0af96e6323eca4b834bde07eb7","signature":"5f1fa41d6fa05390d3f43b693f2f3ba4d188fb78110e4bcb1f615be29c2e0eb9"},"7d57b8e4f9c4fe7e166120ce291a7688c0420faef71855e8871f5f9da7143ccf","94efb9f9732fda401108df4a681738738086a4b2fcbdc1dddb0a37b2df856de1",{"version":"b476269a25a46ff5dc107570debfff7a2e6e2dd2b7e5b9cbab140b301d3106a5","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"5a1d6a4c5fe8c4c3cc7fa9fd1b27a0379983b2b33f4d70db6e2c73f74dcd7a78","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"36096fabce4aa683638b964c7a897d2cddc7399ee6667b276514215dd3bb10c6","0269a531b0c72dc08838d9e685d1318a5b51acae9493f9b6f641364eb058de82","d7f2e7791ef6f004b15f941a825e94191e58b35a0e1687d73d64f011c94ddcdf",{"version":"e88d11b7857417c0603995c77eb188fade5ca64dd5550cd7bd08c9f61c29df5b","affectsGlobalScope":true,"impliedFormat":99}],"root":[[214,216],[267,272],274,[291,299]],"options":{"composite":true,"esModuleInterop":true,"module":99,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[214,1],[208,2],[206,3],[213,4],[211,5],[207,2],[209,6],[210,2],[246,7],[244,3],[279,3],[170,3],[113,8],[114,8],[115,9],[67,10],[116,11],[117,12],[118,13],[62,3],[65,14],[63,3],[64,3],[119,15],[120,16],[121,17],[122,18],[123,19],[124,20],[125,20],[126,21],[127,22],[128,23],[129,24],[68,3],[66,3],[130,25],[131,26],[132,27],[166,28],[133,29],[134,3],[135,30],[136,31],[137,32],[138,33],[139,34],[140,35],[141,36],[142,37],[143,38],[144,38],[145,39],[146,3],[147,40],[148,41],[150,42],[149,43],[151,44],[152,45],[153,46],[154,47],[155,48],[156,49],[157,50],[158,51],[159,52],[160,53],[161,54],[162,55],[163,56],[69,3],[70,3],[71,3],[109,57],[110,3],[111,3],[112,44],[164,58],[165,59],[212,60],[256,61],[233,62],[231,3],[232,3],[217,3],[228,63],[223,64],[226,65],[247,66],[238,3],[241,67],[240,68],[252,68],[239,69],[255,3],[225,70],[227,70],[219,71],[222,72],[234,71],[224,73],[218,3],[245,3],[205,4],[300,74],[273,75],[263,76],[265,77],[264,78],[262,79],[261,3],[198,3],[200,80],[199,3],[193,81],[191,82],[192,83],[180,84],[181,82],[188,85],[179,86],[184,87],[194,3],[185,88],[190,89],[196,90],[195,91],[178,92],[186,93],[187,94],[182,95],[189,81],[183,96],[172,97],[171,98],[177,3],[248,3],[220,3],[221,99],[60,3],[61,3],[12,3],[11,3],[2,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[19,3],[20,3],[3,3],[21,3],[22,3],[4,3],[23,3],[27,3],[24,3],[25,3],[26,3],[28,3],[29,3],[30,3],[5,3],[31,3],[32,3],[33,3],[34,3],[6,3],[38,3],[35,3],[36,3],[37,3],[39,3],[7,3],[40,3],[45,3],[46,3],[41,3],[42,3],[43,3],[44,3],[8,3],[50,3],[47,3],[48,3],[49,3],[51,3],[9,3],[52,3],[53,3],[54,3],[56,3],[55,3],[57,3],[58,3],[10,3],[59,3],[1,3],[87,100],[97,101],[86,100],[107,102],[78,103],[77,104],[106,105],[100,106],[105,107],[80,108],[94,109],[79,110],[103,111],[75,112],[74,105],[104,113],[76,114],[81,115],[82,3],[85,115],[72,3],[108,116],[98,117],[89,118],[90,119],[92,120],[88,121],[91,122],[101,105],[83,123],[84,124],[93,125],[73,126],[96,117],[95,115],[99,3],[102,127],[250,128],[236,129],[237,128],[235,3],[168,130],[204,131],[174,132],[175,3],[169,130],[167,3],[173,133],[202,3],[197,3],[201,134],[176,3],[203,135],[249,136],[242,137],[251,138],[230,139],[257,140],[259,141],[253,142],[260,143],[258,144],[243,145],[254,146],[266,147],[229,3],[276,3],[284,148],[285,149],[283,150],[290,151],[280,152],[278,3],[277,3],[286,3],[281,153],[282,154],[287,155],[289,155],[288,155],[275,3],[216,156],[268,157],[267,158],[269,159],[272,160],[271,161],[294,162],[295,163],[291,164],[296,165],[292,166],[274,167],[297,168],[293,169],[298,170],[299,171],[215,3],[270,156]],"affectedFilesPendingEmit":[[214,17],[216,17],[268,17],[267,17],[269,17],[272,17],[271,17],[294,17],[295,17],[291,17],[296,17],[292,17],[274,17],[297,17],[293,17],[298,17],[299,17],[215,17],[270,17]],"emitSignatures":[214,215,216,267,268,269,270,271,272,274,291,292,293,294,295,296,297,298,299],"version":"5.9.3"} \ No newline at end of file diff --git a/tsconfig.web.tsbuildinfo b/tsconfig.web.tsbuildinfo deleted file mode 100644 index 31883f3..0000000 --- a/tsconfig.web.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"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.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.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.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.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/jsx-runtime.d.ts","./src/shared/contract.ts","./src/renderer/components/statusbanner.tsx","./src/renderer/app.tsx","./node_modules/@types/react-dom/client.d.ts","./src/renderer/main.tsx","./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/runner/dist/tasks.d-cksck4of.d.ts","./node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","./node_modules/@vitest/utils/dist/diff.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/@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/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/web-globals/streams.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/vite/types/hmrpayload.d.ts","./node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","./node_modules/vite/types/customevent.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/hot.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/vite/node_modules/esbuild/lib/main.d.ts","./node_modules/vite/types/internal/terseroptions.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/csspreprocessoroptions.d.ts","./node_modules/lightningcss/node/ast.d.ts","./node_modules/lightningcss/node/targets.d.ts","./node_modules/lightningcss/node/index.d.ts","./node_modules/vite/types/internal/lightningcssoptions.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/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.bkdhh7zx.d.ts","./node_modules/vitest/dist/chunks/worker.d.cugipz9v.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.buron0i0.d.ts","./node_modules/vitest/dist/chunks/worker.d.uzwscv9x.d.ts","./node_modules/@vitest/spy/dist/index.d.ts","./node_modules/@vitest/expect/dist/index.d.ts","./node_modules/vitest/dist/chunks/global.d.mamajcmj.d.ts","./node_modules/vitest/dist/chunks/vite.d.bnoppc46.d.ts","./node_modules/vitest/dist/chunks/mocker.d.be_2ls6u.d.ts","./node_modules/vitest/dist/chunks/suite.d.fvehnv49.d.ts","./node_modules/expect-type/dist/utils.d.ts","./node_modules/expect-type/dist/overloads.d.ts","./node_modules/expect-type/dist/branding.d.ts","./node_modules/expect-type/dist/messages.d.ts","./node_modules/expect-type/dist/index.d.ts","./node_modules/vitest/dist/index.d.ts","./src/shared/contract.test.ts","./src/shared/types.ts","./node_modules/electron/electron.d.ts","./src/preload/index.ts","./src/preload/index.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/keyv/src/index.d.ts","./node_modules/@types/http-cache-semantics/index.d.ts","./node_modules/@types/responselike/index.d.ts","./node_modules/@types/cacheable-request/index.d.ts","./node_modules/@types/ms/index.d.ts","./node_modules/@types/debug/index.d.ts","./node_modules/@types/emscripten/index.d.ts","./node_modules/@types/fs-extra/index.d.ts","./node_modules/@types/keyv/index.d.ts","./node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[92,141,158,159,271],[92,141,158,159],[92,141,158,159,271,272,273,274,275],[92,141,158,159,271,273],[92,141,152,155,158,159,184,191,277,278,279],[92,141,158,159,243,244],[92,141,158,159,281],[92,141,153,158,159,191],[92,141,152,158,159,191],[92,138,139,141,158,159],[92,140,141,158,159],[141,158,159],[92,141,146,158,159,176],[92,141,142,147,152,158,159,161,173,184],[92,141,142,143,152,158,159,161],[87,88,89,92,141,158,159],[92,141,144,158,159,185],[92,141,145,146,153,158,159,162],[92,141,146,158,159,173,181],[92,141,147,149,152,158,159,161],[92,140,141,148,158,159],[92,141,149,150,158,159],[92,141,151,152,158,159],[92,140,141,152,158,159],[92,141,152,153,154,158,159,173,184],[92,141,152,153,154,158,159,168,173,176],[92,133,141,149,152,155,158,159,161,173,184],[92,141,152,153,155,156,158,159,161,173,181,184],[92,141,155,157,158,159,173,181,184],[90,91,92,93,94,95,96,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,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190],[92,141,152,158,159],[92,141,158,159,160,184],[92,141,149,152,158,159,161,173],[92,141,158,159,162],[92,141,158,159,163],[92,140,141,158,159,164],[92,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,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190],[92,141,158,159,166],[92,141,158,159,167],[92,141,152,158,159,168,169],[92,141,158,159,168,170,185,187],[92,141,153,158,159],[92,141,152,158,159,173,174,176],[92,141,158,159,175,176],[92,141,158,159,173,174],[92,141,158,159,176],[92,141,158,159,177],[92,138,141,158,159,173,178,184],[92,141,152,158,159,179,180],[92,141,158,159,179,180],[92,141,146,158,159,161,173,181],[92,141,158,159,182],[92,141,158,159,161,183],[92,141,155,158,159,167,184],[92,141,146,158,159,185],[92,141,158,159,173,186],[92,141,158,159,160,187],[92,141,158,159,188],[92,133,141,158,159],[92,133,141,152,154,158,159,164,173,176,184,186,187,189],[92,141,158,159,173,190],[66,92,141,158,159],[64,65,92,141,158,159],[92,141,155,158,159,173,191],[77,78,81,92,141,158,159,254],[92,141,158,159,230,231],[78,79,81,82,83,92,141,158,159],[78,92,141,158,159],[78,79,81,92,141,158,159],[78,79,92,141,158,159],[92,141,158,159,237],[73,92,141,158,159,237,238],[73,92,141,158,159,237],[73,80,92,141,158,159],[74,92,141,158,159],[73,74,75,77,92,141,158,159],[73,92,141,158,159],[92,141,152,153,158,159,191],[92,141,158,159,260,261],[92,141,158,159,260,261,262,263],[92,141,158,159,260,262],[92,141,158,159,260],[92,141,158,159,223,224],[92,141,158,159,217],[92,141,158,159,215,217],[92,141,158,159,206,214,215,216,218,220],[92,141,158,159,204],[92,141,158,159,207,212,217,220],[92,141,158,159,203,220],[92,141,158,159,207,208,211,212,213,220],[92,141,158,159,207,208,209,211,212,220],[92,141,158,159,204,205,206,207,208,212,213,214,216,217,218,220],[92,141,158,159,220],[92,141,158,159,202,204,205,206,207,208,209,211,212,213,214,215,216,217,218,219],[92,141,158,159,202,220],[92,141,158,159,207,209,210,212,213,220],[92,141,158,159,211,220],[92,141,158,159,212,213,217,220],[92,141,158,159,205,215],[92,141,158,159,196,228,229],[92,141,158,159,195,196],[76,92,141,158,159],[92,105,109,141,158,159,184],[92,105,141,158,159,173,184],[92,100,141,158,159],[92,102,105,141,158,159,181,184],[92,141,158,159,161,181],[92,141,158,159,191],[92,100,141,158,159,191],[92,102,105,141,158,159,161,184],[92,97,98,101,104,141,152,158,159,173,184],[92,105,112,141,158,159],[92,97,103,141,158,159],[92,105,126,127,141,158,159],[92,101,105,141,158,159,176,184,191],[92,126,141,158,159,191],[92,99,100,141,158,159,191],[92,105,141,158,159],[92,99,100,101,102,103,104,105,106,107,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,127,128,129,130,131,132,141,158,159],[92,105,120,141,158,159],[92,105,112,113,141,158,159],[92,103,105,113,114,141,158,159],[92,104,141,158,159],[92,97,100,105,141,158,159],[92,105,109,113,114,141,158,159],[92,109,141,158,159],[92,103,105,108,141,158,159,184],[92,97,102,105,112,141,158,159],[92,141,158,159,173],[92,100,105,126,141,158,159,189,191],[92,141,158,159,234,235],[92,141,158,159,234],[92,141,158,159,192],[92,141,152,153,155,156,157,158,159,161,173,181,184,190,191,192,193,194,196,197,199,200,201,221,222,226,227,228,229],[92,141,158,159,192,193,194,198],[92,141,158,159,194],[92,141,158,159,225],[92,141,158,159,196,229],[84,92,141,158,159,246,247,256],[73,81,84,92,141,158,159,239,240,256],[92,141,158,159,249],[85,92,141,158,159],[73,84,86,92,141,158,159,239,248,255,256],[92,141,158,159,232],[73,78,81,84,86,92,141,144,153,158,159,173,229,232,233,236,239,241,242,245,248,250,251,256,257],[84,92,141,158,159,246,247,248,256],[92,141,158,159,229,252,257],[84,86,92,141,158,159,236,239,241,256],[92,141,158,159,189,242],[73,78,81,84,85,86,92,141,144,153,158,159,173,189,229,232,233,236,239,240,241,242,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,264],[92,141,158,159,269],[67,68,92,141,158,159,267,268],[66,67,68,69,92,141,158,159],[67,68,92,141,158,159],[66,67,70,71,92,141,158,159],[67,68,92,141,158,159,265],[67,92,141,158,159]],"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":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","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":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"814d5c7384f3ca276e9dc4bcfde5545801a3ea0bfae09916b3336774e662fd1b","impliedFormat":1},{"version":"b838d4c72740eb0afd284bf7575b74c624b105eff2e8c7b4aeead57e7ac320ff","impliedFormat":1},{"version":"27782810b38397b600edb57c3bdc051112e96cd6827a19db811dd0b2f50d9ffb","signature":"cb66ac77b7643fc7621e51502aa52e0fb41f9ad7cc1520c1e479bff39cede458"},"e982f051cb8c670d5003b3ee275208c23e265ca033ebb46ed440fc6e51128d2d","bf60b52139b5759de18ca395da1e14328db64cf798a258a39dad7bfb68418f22",{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},"dcddb45c70a767d8fbd5562f2e35fc4e54556b4e116476b9560ebb19c9312ad8",{"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":"45cec9a1ba6549060552eead8959d47226048e0b71c7d0702ae58b7e16a28912","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"13918e2b81c4288695f9b1f3dcc2468caf0f848d5c1f3dc00071c619d34ff63a","impliedFormat":99},{"version":"6907b09850f86610e7a528348c15484c1e1c09a18a9c1e98861399dfe4b18b46","impliedFormat":99},{"version":"12deea8eaa7a4fc1a2908e67da99831e5c5a6b46ad4f4f948fd4759314ea2b80","impliedFormat":99},{"version":"f0a8b376568a18f9a4976ecb0855187672b16b96c4df1c183a7e52dc1b5d98e8","impliedFormat":99},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"092944a8c05f9b96579161e88c6f211d5304a76bd2c47f8d4c30053269146bc8","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":"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":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","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":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","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":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","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":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"21944c138a48dc23382cb6558b1d4498908faad2104ba7ff390ba8b27c06f3c0","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"3cc8a3d123b6b232d48d34b51b785f9da8d193f5b5817fa521fcd2f3b9315c55","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"354a7f8e1287d9d6b7561bc97fdd8cbc2f7c1dd79e4cb37b942e8a5cfaff1085","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fd8a5aefd8c3feb3936ca66f5aa89dff7bf6e6537b4158dbd0f6e0d65ed3b9e","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"41c41c6e90133bb2a14f7561f29944771886e5535945b2b372e2f6ed6987746e","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"cbb1c5ba5dbabe42c19ca31b83e48fec95895484fe1d1a8fb649b69ea224c5b8","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":"5e91172586d1be7d1508d1a40c8bf76161f6f4179d1c25158a20599f9fb26a66","impliedFormat":99},{"version":"09d215b379a93f8cbb6caf9e9f5d7b4d48042295ee697e7e4771288c7917a21e","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":"ab80d2cb170a92c61ca8c822d0db0fc50eb15c7c6cf1a24cb01852a5a15a7db8","impliedFormat":99},{"version":"d689a82dec12ec02e1c558870a50f71000e06f173151fcdff0458c587dbf016f","impliedFormat":99},{"version":"04471dc55f802c29791cc75edda8c4dd2a121f71c2401059da61eff83099e8ab","impliedFormat":99},{"version":"120a80aa556732f684db3ed61aeff1d6671e1655bd6cba0aa88b22b88ac9a6b1","affectsGlobalScope":true,"impliedFormat":99},{"version":"e58c0b5226aff07b63be6ac6e1bec9d55bc3d2bda3b11b9b68cccea8c24ae839","affectsGlobalScope":true,"impliedFormat":99},{"version":"210955af8573671abebb6e1391d134d82fbcff130aa68922ea1e839f8f48a0ad","impliedFormat":99},{"version":"5a88655bf852c8cc007d6bc874ab61d1d63fba97063020458177173c454e9b4a","impliedFormat":99},{"version":"7e4dfae2da12ec71ffd9f55f4641a6e05610ce0d6784838659490e259e4eb13c","impliedFormat":99},{"version":"dd51e53752b310bd20c9b1a87bbf12b1fe2be7fe40f505b43199496481096275","impliedFormat":1},{"version":"a87be4662442b3feeffc331ecafe6b36cafd08727e2d7f2425a5099577e7fd18","impliedFormat":1},{"version":"cd4cd9220a1ba793bc935e76d8e5481c110a90d9868ae7866a182ee71cdb6abb","impliedFormat":1},{"version":"0a7fb8619b10bc05fd933ca9ac1c8b2ab2220be7a57b57565c3ac158595494ef","impliedFormat":1},{"version":"c4a5f91feb9c5a6b2a91089d959c38391b79a961db3b9cc73b8877d57ad7dcdc","impliedFormat":1},{"version":"c371ea3efec17691f019bca670c161bee2f4787b1f464bdbbb10c4117bf0a55d","impliedFormat":99},"d7f2e7791ef6f004b15f941a825e94191e58b35a0e1687d73d64f011c94ddcdf","e0f449551af1460ae3a14271a6c7f21fd65ee4e971c5efdb06899dad1d4cb358",{"version":"fd1ad4bc25754908cf632e000cd33b9d07bda1186138da356cb86080ff77907b","affectsGlobalScope":true,"impliedFormat":1},"0269a531b0c72dc08838d9e685d1318a5b51acae9493f9b6f641364eb058de82",{"version":"5606f19e18d64726492389381a66ac9d5c71b3ee1adc3acb9fca9a3153b0eb54","affectsGlobalScope":true},{"version":"69d4b61c408556b97b796782a1110f7e01a03ed80f31741f2c59b722185830ed","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"e6ca59368dce5a594dcde9bbb6ae640d668fa6c28c31639dd2a75b731bb036a2","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"42baf4ca38c38deaf411ea73f37bc39ff56c6e5c761a968b64ac1b25c92b5cd8","impliedFormat":1},{"version":"4f6ae308c5f2901f2988c817e1511520619e9025b9b12cc7cce2ab2e6ffed78a","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"f992cd6cc0bcbaa4e6c810468c90f2d8595f8c6c3cf050c806397d3de8585562","impliedFormat":1},{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","impliedFormat":1},{"version":"89e326922cadcc2331d7e851011cf9f0456a681aaf3c95b48b81f8d80e8cdfba","impliedFormat":1},{"version":"fa4546e9b67dbdcc0fa8d8653c6b89d49b9e7b637b3340bea78107ca161595fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ed19da84b7dbf00952ad0b98ce5c194f1903bcf7c94d8103e8e0d63b271543ae","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1}],"root":[[68,70],72,266,267,270],"options":{"composite":true,"esModuleInterop":true,"jsx":4,"module":99,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[273,1],[271,2],[276,3],[272,1],[274,4],[275,1],[280,5],[245,6],[282,7],[243,2],[283,2],[195,2],[284,8],[278,2],[285,9],[281,2],[138,10],[139,10],[140,11],[92,12],[141,13],[142,14],[143,15],[87,2],[90,16],[88,2],[89,2],[144,17],[145,18],[146,19],[147,20],[148,21],[149,22],[150,22],[151,23],[152,24],[153,25],[154,26],[93,2],[91,2],[155,27],[156,28],[157,29],[191,30],[158,31],[159,2],[160,32],[161,33],[162,34],[163,35],[164,36],[165,37],[166,38],[167,39],[168,40],[169,40],[170,41],[171,2],[172,42],[173,43],[175,44],[174,45],[176,46],[177,47],[178,48],[179,49],[180,50],[181,51],[182,52],[183,53],[184,54],[185,55],[186,56],[187,57],[188,58],[94,2],[95,2],[96,2],[134,59],[135,2],[136,2],[137,46],[189,60],[190,61],[71,62],[286,62],[64,2],[66,63],[67,62],[279,64],[255,65],[232,66],[230,2],[231,2],[73,2],[84,67],[79,68],[82,69],[246,70],[237,2],[240,71],[239,72],[251,72],[238,73],[254,2],[81,74],[83,74],[75,75],[78,76],[233,75],[80,77],[74,2],[244,2],[65,2],[268,78],[262,79],[264,80],[263,81],[261,82],[260,2],[277,31],[223,2],[225,83],[224,2],[218,84],[216,85],[217,86],[205,87],[206,85],[213,88],[204,89],[209,90],[219,2],[210,91],[215,92],[221,93],[220,94],[203,95],[211,96],[212,97],[207,98],[214,84],[208,99],[197,100],[196,101],[202,2],[247,2],[76,2],[77,102],[62,2],[63,2],[11,2],[12,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[23,2],[24,2],[4,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[5,2],[33,2],[34,2],[35,2],[36,2],[6,2],[40,2],[37,2],[38,2],[39,2],[41,2],[7,2],[42,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[8,2],[52,2],[49,2],[50,2],[51,2],[53,2],[9,2],[54,2],[55,2],[56,2],[58,2],[57,2],[59,2],[60,2],[10,2],[61,2],[1,2],[112,103],[122,104],[111,103],[132,105],[103,106],[102,107],[131,108],[125,109],[130,110],[105,111],[119,112],[104,113],[128,114],[100,115],[99,108],[129,116],[101,117],[106,118],[107,2],[110,118],[97,2],[133,119],[123,120],[114,121],[115,122],[117,123],[113,124],[116,125],[126,108],[108,126],[109,127],[118,128],[98,129],[121,120],[120,118],[124,2],[127,130],[249,131],[235,132],[236,131],[234,2],[193,133],[229,134],[199,135],[200,2],[194,133],[192,2],[198,136],[227,2],[222,2],[226,137],[201,2],[228,138],[248,139],[241,140],[250,141],[86,142],[256,143],[258,144],[252,145],[259,146],[257,147],[242,148],[253,149],[265,150],[85,2],[270,151],[269,152],[70,153],[69,154],[72,155],[266,156],[68,157],[267,154]],"affectedFilesPendingEmit":[[269,17],[70,17],[69,17],[72,17],[266,17],[68,17],[267,17]],"emitSignatures":[68,69,70,72,266,267,269],"version":"5.9.3"} \ No newline at end of file