paracosm 0.8.489 → 0.8.496

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -652,6 +652,23 @@ bun src/index.ts
652
652
  PARACOSM_OUTPUT_DIR=./artifacts/run-001 bun src/index.ts
653
653
  ```
654
654
 
655
+ ## Storage backend
656
+
657
+ Paracosm persists run history (the Library tab) and replayable session blobs (the Load menu) through [`@framers/sql-storage-adapter`](https://github.com/framersai/sql-storage-adapter), the open-source SQL abstraction maintained by Frame.dev. The same code paths run unchanged against SQLite (default), Postgres, sql.js, and IndexedDB; switching backends is one env var.
658
+
659
+ ```bash
660
+ # Default: better-sqlite3 against ./data/runs.db + ./data/sessions.db
661
+ paracosm dashboard
662
+
663
+ # Postgres in production (Library + sessions persist to your existing cluster)
664
+ STORAGE_ADAPTER=postgres DATABASE_URL=postgres://user:pass@host/db paracosm dashboard
665
+
666
+ # Pure-WASM SQLite fallback when the native module isn't available
667
+ STORAGE_ADAPTER=sqljs paracosm dashboard
668
+ ```
669
+
670
+ Run-history schema (`runs` table) and session schema (`sessions` table) are bootstrapped idempotently on first boot. Legacy v0.7 databases auto-migrate the `leader_*` columns to `actor_*` in place via `ALTER TABLE RENAME COLUMN`; no manual step needed.
671
+
655
672
  ## Seed Enrichment & Citation Flow
656
673
 
657
674
  Pass real-world source material into the compiler and Paracosm grounds the scenario in citations that flow all the way through to department reports.
package/dist/cli/init.js CHANGED
@@ -26,7 +26,7 @@ const USAGE = `paracosm init [dir] --domain <text|url> [--mode <m>] [--actors <n
26
26
  dir output directory (default: ./paracosm-app)
27
27
  --domain required: seed text describing the scenario, OR a URL
28
28
  --mode turn-loop | batch-trajectory | batch-point (default: turn-loop)
29
- --actors number of HEXACO leaders, 2-6 (default: 3)
29
+ --actors number of HEXACO actors, 2-6 (default: 3)
30
30
  --name project name, default: derived from --domain
31
31
  --force overwrite non-empty target dir
32
32
 
package/dist/cli/run.js CHANGED
File without changes
package/dist/cli/serve.js CHANGED
File without changes
@@ -0,0 +1,9 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { RunHistoryStore } from './run-history-store.js';
3
+ import type { ParacosmServerMode } from './server-mode.js';
4
+ export interface LibraryImportDeps {
5
+ runHistoryStore: RunHistoryStore;
6
+ sourceMode: ParacosmServerMode;
7
+ }
8
+ export declare function handleLibraryImport(_req: IncomingMessage, res: ServerResponse, body: unknown, deps: LibraryImportDeps): Promise<void>;
9
+ //# sourceMappingURL=library-import-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library-import-route.d.ts","sourceRoot":"","sources":["../../../src/cli/server/library-import-route.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAO3D,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAmEf"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * POST /api/v1/library/import — accepts a RunArtifact (single) or array
3
+ * of RunArtifacts (bundle) from a Studio drop and inserts the enriched
4
+ * RunRecord(s) into the active run-history store. Lets users persist
5
+ * artifacts that originated outside this server (Studio JSON drops,
6
+ * shared exports, replay clones).
7
+ *
8
+ * @module paracosm/cli/server/library-import-route
9
+ */
10
+ import { randomUUID } from 'node:crypto';
11
+ import { z } from 'zod';
12
+ import { RunArtifactSchema } from '../../engine/schema/artifact.js';
13
+ import { createRunRecord, hashActorConfig } from './run-record.js';
14
+ import { enrichRunRecordFromArtifact } from './enrich-run-record.js';
15
+ const MAX_BUNDLE_SIZE = 50;
16
+ const SingleBodySchema = z.object({ artifact: z.unknown() });
17
+ const BundleBodySchema = z.object({ artifacts: z.array(z.unknown()).min(1).max(MAX_BUNDLE_SIZE) });
18
+ export async function handleLibraryImport(_req, res, body, deps) {
19
+ // Detect single vs bundle by which key is present.
20
+ const isBundle = !!(body && typeof body === 'object' && 'artifacts' in body);
21
+ const isSingle = !!(body && typeof body === 'object' && 'artifact' in body);
22
+ if (!isBundle && !isSingle) {
23
+ res.writeHead(400, { 'Content-Type': 'application/json' });
24
+ res.end(JSON.stringify({ error: 'Body must contain `artifact` (single) or `artifacts` (bundle)' }));
25
+ return;
26
+ }
27
+ if (isBundle) {
28
+ const parsed = BundleBodySchema.safeParse(body);
29
+ if (!parsed.success) {
30
+ res.writeHead(400, { 'Content-Type': 'application/json' });
31
+ res.end(JSON.stringify({ error: 'Invalid bundle', issues: parsed.error.issues.slice(0, 3) }));
32
+ return;
33
+ }
34
+ const artifacts = [];
35
+ for (let i = 0; i < parsed.data.artifacts.length; i += 1) {
36
+ const a = RunArtifactSchema.safeParse(parsed.data.artifacts[i]);
37
+ if (!a.success) {
38
+ res.writeHead(400, { 'Content-Type': 'application/json' });
39
+ res.end(JSON.stringify({
40
+ error: `Bundle item ${i} is not a valid RunArtifact`,
41
+ issues: a.error.issues.slice(0, 3),
42
+ }));
43
+ return;
44
+ }
45
+ // Use the raw input (not the Zod-stripped result) so non-schema
46
+ // top-level fields (`leader`, `cost`) survive into the enrich
47
+ // pass. Zod strips by default; the schema acts only as a gate.
48
+ artifacts.push(parsed.data.artifacts[i]);
49
+ }
50
+ const bundleId = `bundle_${randomUUID()}`;
51
+ const result = { runIds: [], alreadyExisted: [] };
52
+ for (const artifact of artifacts) {
53
+ const inserted = await insertOne(artifact, bundleId, deps);
54
+ result.runIds.push(inserted.runId);
55
+ result.alreadyExisted.push(inserted.alreadyExisted);
56
+ }
57
+ res.writeHead(201, { 'Content-Type': 'application/json' });
58
+ res.end(JSON.stringify({ bundleId, ...result }));
59
+ return;
60
+ }
61
+ // Single
62
+ const parsed = SingleBodySchema.safeParse(body);
63
+ if (!parsed.success) {
64
+ res.writeHead(400, { 'Content-Type': 'application/json' });
65
+ res.end(JSON.stringify({ error: 'Invalid artifact body', issues: parsed.error.issues.slice(0, 3) }));
66
+ return;
67
+ }
68
+ const a = RunArtifactSchema.safeParse(parsed.data.artifact);
69
+ if (!a.success) {
70
+ res.writeHead(400, { 'Content-Type': 'application/json' });
71
+ res.end(JSON.stringify({
72
+ error: 'Not a valid RunArtifact',
73
+ issues: a.error.issues.slice(0, 3),
74
+ }));
75
+ return;
76
+ }
77
+ // Same Zod-strip avoidance as the bundle path: forward the raw input
78
+ // so `leader` / `cost` survive into enrichRunRecordFromArtifact.
79
+ const inserted = await insertOne(parsed.data.artifact, undefined, deps);
80
+ res.writeHead(201, { 'Content-Type': 'application/json' });
81
+ res.end(JSON.stringify(inserted));
82
+ }
83
+ async function insertOne(artifact, bundleId, deps) {
84
+ // The artifact's metadata.runId is the source of truth — preserves
85
+ // identity across re-imports so duplicate drops collapse to a single
86
+ // Library row.
87
+ const importedRunId = artifact.metadata.runId;
88
+ const existing = await deps.runHistoryStore.getRun(importedRunId);
89
+ if (existing) {
90
+ return { runId: importedRunId, alreadyExisted: true };
91
+ }
92
+ const baseInput = {
93
+ scenarioId: artifact.metadata.scenario.id,
94
+ scenarioVersion: artifact.metadata.scenario.version ?? '1.0.0',
95
+ actorConfigHash: hashActorConfig({
96
+ runId: importedRunId,
97
+ scenario: artifact.metadata.scenario,
98
+ }),
99
+ economicsProfile: 'imported',
100
+ sourceMode: deps.sourceMode,
101
+ createdBy: 'user',
102
+ };
103
+ if (bundleId)
104
+ baseInput.bundleId = bundleId;
105
+ // Build a record carrying the imported runId rather than a fresh
106
+ // randomUUID — the artifact's identity comes with it.
107
+ const base = {
108
+ ...createRunRecord(baseInput),
109
+ runId: importedRunId,
110
+ };
111
+ const enriched = enrichRunRecordFromArtifact(base, artifact);
112
+ await deps.runHistoryStore.insertRun(enriched);
113
+ return { runId: importedRunId, alreadyExisted: false };
114
+ }
115
+ //# sourceMappingURL=library-import-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library-import-route.js","sourceRoot":"","sources":["../../../src/cli/server/library-import-route.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,12 @@ export interface RunHistoryStore {
35
35
  countRuns?(filters?: Pick<ListRunsFilters, 'mode' | 'sourceMode' | 'scenarioId' | 'actorConfigHash' | 'q'>): Promise<number>;
36
36
  aggregateStats?(filters?: Pick<ListRunsFilters, 'mode' | 'sourceMode' | 'scenarioId' | 'actorConfigHash'>): Promise<RunsAggregate>;
37
37
  recordReplayResult?(runId: string, matches: boolean): Promise<void>;
38
+ /**
39
+ * Destructive: delete every row in the runs table. Used by the
40
+ * `/admin/data/wipe` endpoint and CLI `paracosm wipe-data` for
41
+ * one-shot cleanups. Returns the count of deleted rows.
42
+ */
43
+ wipeAll?(): Promise<number>;
38
44
  }
39
45
  export declare function createNoopRunHistoryStore(): RunHistoryStore;
40
46
  //# sourceMappingURL=run-history-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-history-store.d.ts","sourceRoot":"","sources":["../../../src/cli/server/run-history-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B;oDACgD;IAChD,IAAI,CAAC,EAAE,WAAW,GAAG,kBAAkB,GAAG,aAAa,CAAC;IACxD;;wEAEoE;IACpE,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACjD;;4EAEwE;IACxE,kBAAkB,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5D,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7H,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACnI,kBAAkB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AAED,wBAAgB,yBAAyB,IAAI,eAAe,CAY3D"}
1
+ {"version":3,"file":"run-history-store.d.ts","sourceRoot":"","sources":["../../../src/cli/server/run-history-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B;oDACgD;IAChD,IAAI,CAAC,EAAE,WAAW,GAAG,kBAAkB,GAAG,aAAa,CAAC;IACxD;;wEAEoE;IACpE,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACjD;;4EAEwE;IACxE,kBAAkB,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5D,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7H,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACnI,kBAAkB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE;;;;OAIG;IACH,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED,wBAAgB,yBAAyB,IAAI,eAAe,CAa3D"}
@@ -9,6 +9,7 @@ export function createNoopRunHistoryStore() {
9
9
  return { totalRuns: 0, totalCostUSD: 0, totalDurationMs: 0, replaysAttempted: 0, replaysMatched: 0 };
10
10
  },
11
11
  async recordReplayResult() { },
12
+ async wipeAll() { return 0; },
12
13
  };
13
14
  }
14
15
  //# sourceMappingURL=run-history-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-history-store.js","sourceRoot":"","sources":["../../../src/cli/server/run-history-store.ts"],"names":[],"mappings":"AA0CA,MAAM,UAAU,yBAAyB;IACvC,OAAO;QACL,KAAK,CAAC,SAAS,KAAI,CAAC;QACpB,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,kBAAkB,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;QACzC,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,cAAc;YAClB,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QACvG,CAAC;QACD,KAAK,CAAC,kBAAkB,KAAI,CAAC;KAC9B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"run-history-store.js","sourceRoot":"","sources":["../../../src/cli/server/run-history-store.ts"],"names":[],"mappings":"AAgDA,MAAM,UAAU,yBAAyB;IACvC,OAAO;QACL,KAAK,CAAC,SAAS,KAAI,CAAC;QACpB,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,kBAAkB,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;QACzC,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,cAAc;YAClB,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QACvG,CAAC;QACD,KAAK,CAAC,kBAAkB,KAAI,CAAC;QAC7B,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;KAC9B,CAAC;AACJ,CAAC"}
@@ -1,6 +1,39 @@
1
+ /**
2
+ * SQL-backed implementation of {@link RunHistoryStore}, built on
3
+ * `@framers/sql-storage-adapter` so the same code works on SQLite,
4
+ * Postgres, sql.js, and IndexedDB without touching call sites. The
5
+ * default adapter is better-sqlite3 (or sql.js fallback when the
6
+ * native module isn't installable). Set `STORAGE_ADAPTER=postgres`
7
+ * with `DATABASE_URL` to switch backends; the resolver inside
8
+ * sql-storage-adapter handles the rest.
9
+ *
10
+ * Single `runs` table with composite per-filter indexes. Run records
11
+ * are tiny (~200 bytes); 100K rows fits in 20 MB. No retention cap;
12
+ * add `PARACOSM_RUN_HISTORY_MAX_ROWS` env var if traffic ever warrants it.
13
+ *
14
+ * @module paracosm/cli/server/sqlite-run-history-store
15
+ */
16
+ import { type DatabaseOptions } from '@framers/sql-storage-adapter';
1
17
  import type { RunHistoryStore } from './run-history-store.js';
2
18
  export interface SqliteRunHistoryStoreOptions {
19
+ /**
20
+ * SQLite database path. Used when the resolver picks better-sqlite3
21
+ * or sql.js. Ignored when STORAGE_ADAPTER selects a remote backend
22
+ * such as Postgres (DATABASE_URL takes precedence there).
23
+ */
3
24
  dbPath: string;
25
+ /**
26
+ * Optional override forwarded to `createDatabase`. Tests use this to
27
+ * pin `type: 'memory'` for hermetic isolation; production code
28
+ * leaves it undefined and lets the env-driven resolver pick.
29
+ */
30
+ databaseOptions?: DatabaseOptions;
4
31
  }
32
+ /**
33
+ * Build an SQL-backed run history store. Returns a sync handle whose
34
+ * methods are async; the underlying adapter is opened lazily on first
35
+ * call so this factory plugs into the existing sync `createMarsServer`
36
+ * boot path without forcing every caller to become async.
37
+ */
5
38
  export declare function createSqliteRunHistoryStore(options: SqliteRunHistoryStoreOptions): RunHistoryStore;
6
39
  //# sourceMappingURL=sqlite-run-history-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-run-history-store.d.ts","sourceRoot":"","sources":["../../../src/cli/server/sqlite-run-history-store.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAmB,eAAe,EAAiB,MAAM,wBAAwB,CAAC;AAE9F,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAC;CAChB;AAkGD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,4BAA4B,GAAG,eAAe,CAkLlG"}
1
+ {"version":3,"file":"sqlite-run-history-store.d.ts","sourceRoot":"","sources":["../../../src/cli/server/sqlite-run-history-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAuC,KAAK,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAIzG,OAAO,KAAK,EAAmB,eAAe,EAAiB,MAAM,wBAAwB,CAAC;AAE9F,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAuPD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,4BAA4B,GAAG,eAAe,CA4GlG"}