@pattern-js/runtime-node 0.2.0
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/LICENSE +21 -0
- package/README.md +70 -0
- package/dist/bin/pattern.d.ts +20 -0
- package/dist/bin/pattern.d.ts.map +1 -0
- package/dist/bin/pattern.js +365 -0
- package/dist/bin/pattern.js.map +1 -0
- package/dist/cli.d.ts +21 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +75 -0
- package/dist/cli.js.map +1 -0
- package/dist/filesystem.d.ts +38 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +59 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/http.d.ts +94 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +799 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/load/generator.d.ts +19 -0
- package/dist/load/generator.d.ts.map +1 -0
- package/dist/load/generator.js +94 -0
- package/dist/load/generator.js.map +1 -0
- package/dist/load/index.d.ts +43 -0
- package/dist/load/index.d.ts.map +1 -0
- package/dist/load/index.js +87 -0
- package/dist/load/index.js.map +1 -0
- package/dist/load/recorder.d.ts +36 -0
- package/dist/load/recorder.d.ts.map +1 -0
- package/dist/load/recorder.js +106 -0
- package/dist/load/recorder.js.map +1 -0
- package/dist/load/report.d.ts +28 -0
- package/dist/load/report.d.ts.map +1 -0
- package/dist/load/report.js +84 -0
- package/dist/load/report.js.map +1 -0
- package/dist/load/types.d.ts +85 -0
- package/dist/load/types.d.ts.map +1 -0
- package/dist/load/types.js +51 -0
- package/dist/load/types.js.map +1 -0
- package/dist/mods.d.ts +23 -0
- package/dist/mods.d.ts.map +1 -0
- package/dist/mods.js +48 -0
- package/dist/mods.js.map +1 -0
- package/dist/project.d.ts +94 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +168 -0
- package/dist/project.js.map +1 -0
- package/dist/schedule.d.ts +33 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +132 -0
- package/dist/schedule.js.map +1 -0
- package/dist/trace/index.d.ts +32 -0
- package/dist/trace/index.d.ts.map +1 -0
- package/dist/trace/index.js +48 -0
- package/dist/trace/index.js.map +1 -0
- package/dist/trace/memory.d.ts +83 -0
- package/dist/trace/memory.d.ts.map +1 -0
- package/dist/trace/memory.js +260 -0
- package/dist/trace/memory.js.map +1 -0
- package/dist/trace/sqlite.d.ts +80 -0
- package/dist/trace/sqlite.d.ts.map +1 -0
- package/dist/trace/sqlite.js +344 -0
- package/dist/trace/sqlite.js.map +1 -0
- package/dist/worker/entry.d.ts +16 -0
- package/dist/worker/entry.d.ts.map +1 -0
- package/dist/worker/entry.js +135 -0
- package/dist/worker/entry.js.map +1 -0
- package/dist/worker-pool.d.ts +49 -0
- package/dist/worker-pool.d.ts.map +1 -0
- package/dist/worker-pool.js +203 -0
- package/dist/worker-pool.js.map +1 -0
- package/dist/ws-registry.d.ts +39 -0
- package/dist/ws-registry.d.ts.map +1 -0
- package/dist/ws-registry.js +99 -0
- package/dist/ws-registry.js.map +1 -0
- package/dist/ws.d.ts +72 -0
- package/dist/ws.d.ts.map +1 -0
- package/dist/ws.js +236 -0
- package/dist/ws.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pattern-js/runtime-node — storage layer (admin-spec P1/§3), backed by **flystorage**.
|
|
3
|
+
*
|
|
4
|
+
* `boundary.http.app` serves static assets and the admin's `WorkflowStore`
|
|
5
|
+
* persists workflow JSON — both over flystorage's `FileStorage`, the universal
|
|
6
|
+
* interface across adapters. Today we ship local-fs and in-memory; swapping in
|
|
7
|
+
* S3 / GCS / Azure later is a one-line adapter change with no consumer edits.
|
|
8
|
+
*
|
|
9
|
+
* Filesystems are registered on the engine as a named service (a
|
|
10
|
+
* `FilesystemRegistry` under the `"filesystems"` service key) so the HTTP host
|
|
11
|
+
* and any mod (the admin) resolve them by name and share one instance.
|
|
12
|
+
*/
|
|
13
|
+
import { FileStorage } from "@flystorage/file-storage";
|
|
14
|
+
import type { Engine } from "@pattern-js/core";
|
|
15
|
+
export { FileStorage } from "@flystorage/file-storage";
|
|
16
|
+
export type { StatEntry, FileInfo } from "@flystorage/file-storage";
|
|
17
|
+
/** The storage handle consumers depend on (flystorage's `FileStorage`). */
|
|
18
|
+
export type Filesystem = FileStorage;
|
|
19
|
+
/** A `FileStorage` rooted at a local directory (local-fs adapter). */
|
|
20
|
+
export declare function localFs(rootDir: string): FileStorage;
|
|
21
|
+
/** An ephemeral in-memory `FileStorage` (tests, placeholder assets). */
|
|
22
|
+
export declare function memoryFs(): FileStorage;
|
|
23
|
+
/** Coerce a `Filesystem | string` (dir path) into a `FileStorage`. */
|
|
24
|
+
export declare function toFilesystem(fs: FileStorage | string): FileStorage;
|
|
25
|
+
/** A named collection of filesystems shared via the engine's service bag. */
|
|
26
|
+
export declare class FilesystemRegistry {
|
|
27
|
+
private map;
|
|
28
|
+
set(name: string, fs: FileStorage): void;
|
|
29
|
+
get(name: string): FileStorage | undefined;
|
|
30
|
+
names(): string[];
|
|
31
|
+
}
|
|
32
|
+
/** The service key the filesystem registry is registered under. */
|
|
33
|
+
export declare const FILESYSTEMS_SERVICE = "filesystems";
|
|
34
|
+
/** Get (or lazily create + register) the engine's filesystem registry. */
|
|
35
|
+
export declare function filesystems(engine: Engine): FilesystemRegistry;
|
|
36
|
+
/** Register a named filesystem on the engine (shared by the app boundary + mods). */
|
|
37
|
+
export declare function provideFilesystem(engine: Engine, name: string, fs: FileStorage): void;
|
|
38
|
+
//# sourceMappingURL=filesystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../src/filesystem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpE,2EAA2E;AAC3E,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC;AAErC,sEAAsE;AACtE,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAEpD;AAED,wEAAwE;AACxE,wBAAgB,QAAQ,IAAI,WAAW,CAEtC;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,EAAE,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,CAElE;AAID,6EAA6E;AAC7E,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,GAAG,CAAkC;IAC7C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI;IAGxC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAG1C,KAAK,IAAI,MAAM,EAAE;CAGlB;AAED,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAO9D;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,CAErF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pattern-js/runtime-node — storage layer (admin-spec P1/§3), backed by **flystorage**.
|
|
3
|
+
*
|
|
4
|
+
* `boundary.http.app` serves static assets and the admin's `WorkflowStore`
|
|
5
|
+
* persists workflow JSON — both over flystorage's `FileStorage`, the universal
|
|
6
|
+
* interface across adapters. Today we ship local-fs and in-memory; swapping in
|
|
7
|
+
* S3 / GCS / Azure later is a one-line adapter change with no consumer edits.
|
|
8
|
+
*
|
|
9
|
+
* Filesystems are registered on the engine as a named service (a
|
|
10
|
+
* `FilesystemRegistry` under the `"filesystems"` service key) so the HTTP host
|
|
11
|
+
* and any mod (the admin) resolve them by name and share one instance.
|
|
12
|
+
*/
|
|
13
|
+
import { resolve } from "node:path";
|
|
14
|
+
import { FileStorage } from "@flystorage/file-storage";
|
|
15
|
+
import { LocalStorageAdapter } from "@flystorage/local-fs";
|
|
16
|
+
import { InMemoryStorageAdapter } from "@flystorage/in-memory";
|
|
17
|
+
export { FileStorage } from "@flystorage/file-storage";
|
|
18
|
+
/** A `FileStorage` rooted at a local directory (local-fs adapter). */
|
|
19
|
+
export function localFs(rootDir) {
|
|
20
|
+
return new FileStorage(new LocalStorageAdapter(resolve(rootDir)));
|
|
21
|
+
}
|
|
22
|
+
/** An ephemeral in-memory `FileStorage` (tests, placeholder assets). */
|
|
23
|
+
export function memoryFs() {
|
|
24
|
+
return new FileStorage(new InMemoryStorageAdapter());
|
|
25
|
+
}
|
|
26
|
+
/** Coerce a `Filesystem | string` (dir path) into a `FileStorage`. */
|
|
27
|
+
export function toFilesystem(fs) {
|
|
28
|
+
return typeof fs === "string" ? localFs(fs) : fs;
|
|
29
|
+
}
|
|
30
|
+
// ── Engine service registry ──
|
|
31
|
+
/** A named collection of filesystems shared via the engine's service bag. */
|
|
32
|
+
export class FilesystemRegistry {
|
|
33
|
+
map = new Map();
|
|
34
|
+
set(name, fs) {
|
|
35
|
+
this.map.set(name, fs);
|
|
36
|
+
}
|
|
37
|
+
get(name) {
|
|
38
|
+
return this.map.get(name);
|
|
39
|
+
}
|
|
40
|
+
names() {
|
|
41
|
+
return [...this.map.keys()];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** The service key the filesystem registry is registered under. */
|
|
45
|
+
export const FILESYSTEMS_SERVICE = "filesystems";
|
|
46
|
+
/** Get (or lazily create + register) the engine's filesystem registry. */
|
|
47
|
+
export function filesystems(engine) {
|
|
48
|
+
let reg = engine.service(FILESYSTEMS_SERVICE);
|
|
49
|
+
if (!reg) {
|
|
50
|
+
reg = new FilesystemRegistry();
|
|
51
|
+
engine.provideService(FILESYSTEMS_SERVICE, reg);
|
|
52
|
+
}
|
|
53
|
+
return reg;
|
|
54
|
+
}
|
|
55
|
+
/** Register a named filesystem on the engine (shared by the app boundary + mods). */
|
|
56
|
+
export function provideFilesystem(engine, name, fs) {
|
|
57
|
+
filesystems(engine).set(name, fs);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../src/filesystem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAMvD,sEAAsE;AACtE,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,IAAI,WAAW,CAAC,IAAI,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,WAAW,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,YAAY,CAAC,EAAwB;IACnD,OAAO,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACnD,CAAC;AAED,gCAAgC;AAEhC,6EAA6E;AAC7E,MAAM,OAAO,kBAAkB;IACrB,GAAG,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,GAAG,CAAC,IAAY,EAAE,EAAe;QAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK;QACH,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,mEAAmE;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAEjD,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,GAAG,GAAG,MAAM,CAAC,OAAO,CAAqB,mBAAmB,CAAC,CAAC;IAClE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC/B,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,IAAY,EAAE,EAAe;IAC7E,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/http.d.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pattern-js/runtime-node — HTTP host (§6, §7).
|
|
3
|
+
*
|
|
4
|
+
* Routing is **declarative**: the host derives its routes from the
|
|
5
|
+
* `boundary.http.request` nodes of the workflows registered on the engine. Each
|
|
6
|
+
* node's config carries the method, path, port, CORS policy, and JSON-Schema
|
|
7
|
+
* validation for body/query — there is no programmatic route table. When
|
|
8
|
+
* workflows change at runtime (e.g. loaded/updated from a DB), the host
|
|
9
|
+
* re-derives its routes live, opening/closing servers per declared port.
|
|
10
|
+
*
|
|
11
|
+
* Response modes: `buffered`, `sse` (Server-Sent Events), `chunked`.
|
|
12
|
+
*/
|
|
13
|
+
import { type Server } from "node:http";
|
|
14
|
+
import { type Engine } from "@pattern-js/core";
|
|
15
|
+
export interface HttpHostOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Default port for routes that don't declare their own `port`. If omitted,
|
|
18
|
+
* the host uses the `PORT` env var, then falls back to 3000.
|
|
19
|
+
*/
|
|
20
|
+
defaultPort?: number;
|
|
21
|
+
/** Interface to bind. Default all interfaces. */
|
|
22
|
+
host?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Max buffered request-body size in bytes (413 beyond it). Default 10 MiB.
|
|
25
|
+
* Routes with `bodyMode: "stream"` are exempt — they never buffer.
|
|
26
|
+
*/
|
|
27
|
+
maxBodyBytes?: number;
|
|
28
|
+
}
|
|
29
|
+
export declare class HttpHost {
|
|
30
|
+
private readonly engine;
|
|
31
|
+
private readonly opts;
|
|
32
|
+
private servers;
|
|
33
|
+
/** Live sockets per server, so shutdown can force-close lingering connections
|
|
34
|
+
* (e.g. an open SSE stream that would otherwise keep `close()` pending). */
|
|
35
|
+
private sockets;
|
|
36
|
+
private routes;
|
|
37
|
+
private apps;
|
|
38
|
+
private unsubscribe?;
|
|
39
|
+
private readonly defaultPort;
|
|
40
|
+
private readonly serverListeners;
|
|
41
|
+
constructor(engine: Engine, opts?: HttpHostOptions);
|
|
42
|
+
/** Derive routes from registered workflows, open servers, and watch for changes. */
|
|
43
|
+
start(): Promise<{
|
|
44
|
+
ports: number[];
|
|
45
|
+
close: () => Promise<void>;
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* Loud, honest signal: with NO auth provider installed, any route that
|
|
49
|
+
* *declares* `requireAuth` can't be enforced (nobody can authenticate) — the
|
|
50
|
+
* engine serves it open (advisory). Say so plainly at boot so it's never a
|
|
51
|
+
* silent surprise. Add a provider and the same declarations are enforced.
|
|
52
|
+
*/
|
|
53
|
+
private warnIfUnenforceableAuth;
|
|
54
|
+
/** Tail of the rebuild queue — see `rebuild()`. */
|
|
55
|
+
private rebuilding;
|
|
56
|
+
/**
|
|
57
|
+
* Scan workflows for `boundary.http.request` routes and reconcile servers.
|
|
58
|
+
* Rebuilds are serialized: workflow-change events can fire in rapid bursts
|
|
59
|
+
* (project load, admin batch deploys), and two interleaved reconciles would
|
|
60
|
+
* race `openServer` on the same port into EADDRINUSE.
|
|
61
|
+
*/
|
|
62
|
+
private rebuild;
|
|
63
|
+
private rebuildNow;
|
|
64
|
+
/** Close one server, destroying any lingering sockets first. */
|
|
65
|
+
private closeServer;
|
|
66
|
+
private scanRoutes;
|
|
67
|
+
/**
|
|
68
|
+
* Scan workflows for `boundary.http.app` mounts (admin-spec P1). The trigger
|
|
69
|
+
* declares the HTTP side (mount/port/cors/auth); the app itself is *resolved
|
|
70
|
+
* by running the workflow once* — the run flows trigger → app op (e.g.
|
|
71
|
+
* `core.app.static`, `admin.app`) → the `boundary.http.app.serve` out-gate,
|
|
72
|
+
* whose captured `app` descriptor tells the host what to serve.
|
|
73
|
+
*/
|
|
74
|
+
private scanApps;
|
|
75
|
+
/** The first app mount on `port` whose prefix matches `pathname`. */
|
|
76
|
+
private matchApp;
|
|
77
|
+
private openServer;
|
|
78
|
+
/** The live http.Server for `port`, if open (e.g. to attach a WS host). */
|
|
79
|
+
server(port: number): Server | undefined;
|
|
80
|
+
/**
|
|
81
|
+
* Run `cb` for every open server, now and as new ports open (route
|
|
82
|
+
* reconciliation opens/closes servers live) — the WS auto-wiring seam.
|
|
83
|
+
*/
|
|
84
|
+
onServer(cb: (server: Server, port: number) => void): () => void;
|
|
85
|
+
private match;
|
|
86
|
+
private handle;
|
|
87
|
+
/** Serve a static asset (or SPA fallback) for an app mount (admin-spec P1). */
|
|
88
|
+
private serveApp;
|
|
89
|
+
private preflight;
|
|
90
|
+
close(): Promise<void>;
|
|
91
|
+
}
|
|
92
|
+
/** Create an HTTP host that derives its routes from the engine's workflows. */
|
|
93
|
+
export declare function createHttpHost(engine: Engine, opts?: HttpHostOptions): HttpHost;
|
|
94
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAIjG,OAAO,EAKL,KAAK,MAAM,EAMZ,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA+KD,qBAAa,QAAQ;IAYjB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAZvB,OAAO,CAAC,OAAO,CAA6B;IAC5C;iFAC6E;IAC7E,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqD;gBAGlE,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,eAAoB;IAQ7C,oFAAoF;IAC9E,KAAK,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IASvE;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAY/B,mDAAmD;IACnD,OAAO,CAAC,UAAU,CAAoC;IAEtD;;;;;OAKG;IACH,OAAO,CAAC,OAAO;YAOD,UAAU;IAexB,gEAAgE;IAChE,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,UAAU;IAgClB;;;;;;OAMG;YACW,QAAQ;IAuCtB,qEAAqE;IACrE,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAoClB,2EAA2E;IAC3E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAMhE,OAAO,CAAC,KAAK;YAaC,MAAM;IAyIpB,+EAA+E;YACjE,QAAQ;IAgFtB,OAAO,CAAC,SAAS;IAYX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B;AAsLD,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,QAAQ,CAE/E"}
|