@laminapdf/sdk 0.0.0-stage → 0.2.0-alpha.2
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 +208 -2
- package/dist/api.d.ts +23 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +11 -0
- package/dist/api.js.map +1 -0
- package/dist/builder.d.ts +319 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +540 -0
- package/dist/builder.js.map +1 -0
- package/dist/defined.d.ts +5 -0
- package/dist/defined.d.ts.map +1 -0
- package/dist/defined.js +7 -0
- package/dist/defined.js.map +1 -0
- package/dist/document.d.ts +241 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +427 -0
- package/dist/document.js.map +1 -0
- package/dist/entry/node.d.ts +30 -0
- package/dist/entry/node.d.ts.map +1 -0
- package/dist/entry/node.js +37 -0
- package/dist/entry/node.js.map +1 -0
- package/dist/entry/workerd.d.ts +30 -0
- package/dist/entry/workerd.d.ts.map +1 -0
- package/dist/entry/workerd.js +37 -0
- package/dist/entry/workerd.js.map +1 -0
- package/dist/errors.d.ts +102 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +137 -0
- package/dist/errors.js.map +1 -0
- package/dist/explain.d.ts +20 -0
- package/dist/explain.d.ts.map +1 -0
- package/dist/explain.js +14 -0
- package/dist/explain.js.map +1 -0
- package/dist/font.d.ts +66 -0
- package/dist/font.d.ts.map +1 -0
- package/dist/font.js +103 -0
- package/dist/font.js.map +1 -0
- package/dist/generated/builder-enums.d.ts +29 -0
- package/dist/generated/builder-enums.d.ts.map +1 -0
- package/dist/generated/builder-enums.js +80 -0
- package/dist/generated/builder-enums.js.map +1 -0
- package/dist/generated/codes.d.ts +97 -0
- package/dist/generated/codes.d.ts.map +1 -0
- package/dist/generated/codes.js +453 -0
- package/dist/generated/codes.js.map +1 -0
- package/dist/generated/explain.d.ts +6 -0
- package/dist/generated/explain.d.ts.map +1 -0
- package/dist/generated/explain.js +138 -0
- package/dist/generated/explain.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +80 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +127 -0
- package/dist/init.js.map +1 -0
- package/dist/loader/fetch.d.ts +3 -0
- package/dist/loader/fetch.d.ts.map +1 -0
- package/dist/loader/fetch.js +2 -0
- package/dist/loader/fetch.js.map +1 -0
- package/dist/loader/node.d.ts +3 -0
- package/dist/loader/node.d.ts.map +1 -0
- package/dist/loader/node.js +9 -0
- package/dist/loader/node.js.map +1 -0
- package/dist/loader/workerd.d.ts +3 -0
- package/dist/loader/workerd.d.ts.map +1 -0
- package/dist/loader/workerd.js +15 -0
- package/dist/loader/workerd.js.map +1 -0
- package/dist/matrix.d.ts +16 -0
- package/dist/matrix.d.ts.map +1 -0
- package/dist/matrix.js +36 -0
- package/dist/matrix.js.map +1 -0
- package/dist/path.d.ts +34 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +49 -0
- package/dist/path.js.map +1 -0
- package/dist/source/http.d.ts +36 -0
- package/dist/source/http.d.ts.map +1 -0
- package/dist/source/http.js +211 -0
- package/dist/source/http.js.map +1 -0
- package/dist/source/range.d.ts +70 -0
- package/dist/source/range.d.ts.map +1 -0
- package/dist/source/range.js +96 -0
- package/dist/source/range.js.map +1 -0
- package/dist/text.d.ts +90 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +127 -0
- package/dist/text.js.map +1 -0
- package/dist/transaction.d.ts +36 -0
- package/dist/transaction.d.ts.map +1 -0
- package/dist/transaction.js +47 -0
- package/dist/transaction.js.map +1 -0
- package/dist/types.d.ts +79 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/dist/worker/client.d.ts +87 -0
- package/dist/worker/client.d.ts.map +1 -0
- package/dist/worker/client.js +405 -0
- package/dist/worker/client.js.map +1 -0
- package/dist/worker/emitter.d.ts +12 -0
- package/dist/worker/emitter.d.ts.map +1 -0
- package/dist/worker/emitter.js +34 -0
- package/dist/worker/emitter.js.map +1 -0
- package/dist/worker/entry.d.ts +2 -0
- package/dist/worker/entry.d.ts.map +1 -0
- package/dist/worker/entry.js +4 -0
- package/dist/worker/entry.js.map +1 -0
- package/dist/worker/index.d.ts +7 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +4 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/protocol.d.ts +82 -0
- package/dist/worker/protocol.d.ts.map +1 -0
- package/dist/worker/protocol.js +11 -0
- package/dist/worker/protocol.js.map +1 -0
- package/dist/worker/server.d.ts +51 -0
- package/dist/worker/server.d.ts.map +1 -0
- package/dist/worker/server.js +460 -0
- package/dist/worker/server.js.map +1 -0
- package/dist/worker/support.d.ts +39 -0
- package/dist/worker/support.d.ts.map +1 -0
- package/dist/worker/support.js +25 -0
- package/dist/worker/support.js.map +1 -0
- package/dist/worker/transfer.d.ts +3 -0
- package/dist/worker/transfer.d.ts.map +1 -0
- package/dist/worker/transfer.js +13 -0
- package/dist/worker/transfer.js.map +1 -0
- package/dist/worker/types.d.ts +43 -0
- package/dist/worker/types.d.ts.map +1 -0
- package/dist/worker/types.js +2 -0
- package/dist/worker/types.js.map +1 -0
- package/package.json +91 -3
- package/schemas/error.schema.json +288 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { Diagnostic } from "../errors.js";
|
|
2
|
+
import type { ErrorCode } from "../generated/codes.js";
|
|
3
|
+
/** Bumped whenever a message's shape changes (2: priorities, coalescing keys, extension events). */
|
|
4
|
+
export declare const PROTOCOL_VERSION = 2;
|
|
5
|
+
/** What both ends compare on connect. */
|
|
6
|
+
export interface Handshake {
|
|
7
|
+
readonly protocol: number;
|
|
8
|
+
readonly version: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const HANDSHAKE: Handshake;
|
|
11
|
+
/** The page's first message: the client's handshake and how to `init()`. */
|
|
12
|
+
export interface Hello {
|
|
13
|
+
readonly kind: "hello";
|
|
14
|
+
readonly client: Handshake;
|
|
15
|
+
readonly init?: unknown;
|
|
16
|
+
}
|
|
17
|
+
/** The worker's answer to `hello`: its own handshake, and whether `init()` worked. */
|
|
18
|
+
interface Welcome {
|
|
19
|
+
readonly kind: "welcome";
|
|
20
|
+
readonly worker: Handshake;
|
|
21
|
+
readonly error?: Diagnostic<ErrorCode>;
|
|
22
|
+
}
|
|
23
|
+
/** A call: `method` on the handle `handle` (0 is the client itself). */
|
|
24
|
+
export interface Request {
|
|
25
|
+
readonly kind: "call";
|
|
26
|
+
readonly id: number;
|
|
27
|
+
readonly handle: number;
|
|
28
|
+
readonly method: string;
|
|
29
|
+
readonly params: readonly unknown[];
|
|
30
|
+
/** Higher runs first (default 0); FIFO within one priority. */
|
|
31
|
+
readonly priority?: number;
|
|
32
|
+
/** Calls with the same key are coalesced: they run once, and each caller gets its own answer. */
|
|
33
|
+
readonly key?: string;
|
|
34
|
+
}
|
|
35
|
+
/** Stops call `id`: dropped if it hasn't started, cancelled at its next step if it is stepped. */
|
|
36
|
+
export interface Cancel {
|
|
37
|
+
readonly kind: "cancel";
|
|
38
|
+
readonly id: number;
|
|
39
|
+
}
|
|
40
|
+
type Response = {
|
|
41
|
+
readonly kind: "result";
|
|
42
|
+
readonly id: number;
|
|
43
|
+
readonly ok: true;
|
|
44
|
+
readonly result: unknown;
|
|
45
|
+
} | {
|
|
46
|
+
readonly kind: "result";
|
|
47
|
+
readonly id: number;
|
|
48
|
+
readonly ok: false;
|
|
49
|
+
readonly error: Diagnostic<ErrorCode>;
|
|
50
|
+
};
|
|
51
|
+
/** Fire-and-forget news from the worker. */
|
|
52
|
+
type Event = {
|
|
53
|
+
readonly kind: "progress";
|
|
54
|
+
readonly id: number;
|
|
55
|
+
readonly progress: unknown;
|
|
56
|
+
} | {
|
|
57
|
+
readonly kind: "crashed";
|
|
58
|
+
readonly reason: string;
|
|
59
|
+
}
|
|
60
|
+
/** An extension's own news (`emit()` in the worker, `on("event")` on the page). */
|
|
61
|
+
| {
|
|
62
|
+
readonly kind: "event";
|
|
63
|
+
readonly name: string;
|
|
64
|
+
readonly data: unknown;
|
|
65
|
+
};
|
|
66
|
+
export type ToWorker = Hello | Request | Cancel;
|
|
67
|
+
export type FromWorker = Welcome | Response | Event;
|
|
68
|
+
/** A handle the worker made, as the page sees it: its number and what it is. */
|
|
69
|
+
export interface HandleRef {
|
|
70
|
+
readonly $handle: number;
|
|
71
|
+
readonly type: "document" | "page";
|
|
72
|
+
/** Values known when the handle was made (a page's `id` and `index`). */
|
|
73
|
+
readonly fields?: Readonly<Record<string, unknown>>;
|
|
74
|
+
}
|
|
75
|
+
export declare function isHandleRef(value: unknown): value is HandleRef;
|
|
76
|
+
/** A `PageText` as data: the raw arrays the page rebuilds it from. */
|
|
77
|
+
export interface PageTextData {
|
|
78
|
+
readonly $pageText: unknown;
|
|
79
|
+
}
|
|
80
|
+
export declare function isPageTextData(value: unknown): value is PageTextData;
|
|
81
|
+
export {};
|
|
82
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/worker/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { VERSION } from "../version.js";
|
|
2
|
+
/** Bumped whenever a message's shape changes (2: priorities, coalescing keys, extension events). */
|
|
3
|
+
export const PROTOCOL_VERSION = 2;
|
|
4
|
+
export const HANDSHAKE = Object.freeze({ protocol: PROTOCOL_VERSION, version: VERSION });
|
|
5
|
+
export function isHandleRef(value) {
|
|
6
|
+
return typeof value === "object" && value !== null && typeof value.$handle === "number";
|
|
7
|
+
}
|
|
8
|
+
export function isPageTextData(value) {
|
|
9
|
+
return typeof value === "object" && value !== null && "$pageText" in value;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/worker/protocol.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,oGAAoG;AACpG,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAQlC,MAAM,CAAC,MAAM,SAAS,GAAc,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAyDpG,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAQ,KAA+B,CAAC,OAAO,KAAK,QAAQ,CAAC;AACrH,CAAC;AAOD,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,IAAI,KAAK,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** What an extension method sees of its call. */
|
|
2
|
+
export interface CallContext {
|
|
3
|
+
/** Trips when every caller of this (possibly coalesced) call has cancelled. */
|
|
4
|
+
readonly signal: AbortSignal;
|
|
5
|
+
/** Sends a progress event to each caller (`onProgress`). */
|
|
6
|
+
progress(progress: unknown): void;
|
|
7
|
+
}
|
|
8
|
+
/** A method an extension adds (called on the client itself, handle 0). */
|
|
9
|
+
export interface ExtensionMethod {
|
|
10
|
+
/** Runs the method in the worker: its result, or a promise of it; what it throws is the caller's error. */
|
|
11
|
+
run(params: readonly unknown[], context: CallContext): unknown;
|
|
12
|
+
/**
|
|
13
|
+
* One caller's answer from the result, and what to transfer with it. Called once per caller of
|
|
14
|
+
* a coalesced call, so each gets its own transferables (an ImageBitmap each). Omitted, the
|
|
15
|
+
* result is posted as is, its buffers transferred to the last caller and copied to the others.
|
|
16
|
+
*/
|
|
17
|
+
reply?(result: unknown): [unknown, Transferable[]] | Promise<[unknown, Transferable[]]>;
|
|
18
|
+
}
|
|
19
|
+
/** What a package adds to the worker: methods on the client (handle 0). */
|
|
20
|
+
export interface ServerExtension {
|
|
21
|
+
readonly methods: Readonly<Record<string, ExtensionMethod>>;
|
|
22
|
+
/**
|
|
23
|
+
* Work units per save step (default 20,000: a cancel waits at most a few milliseconds). A
|
|
24
|
+
* smaller budget answers a cancel sooner and reports progress more often, at some cost in speed.
|
|
25
|
+
*/
|
|
26
|
+
readonly saveBudget?: number;
|
|
27
|
+
}
|
|
28
|
+
/** What the worker holds and has done: for diagnostics, such as checking that handles are freed. */
|
|
29
|
+
export interface WorkerStats {
|
|
30
|
+
/** Calls that started running (a call cancelled while queued never starts). */
|
|
31
|
+
readonly started: number;
|
|
32
|
+
/** Documents and pages the page side holds a handle to. */
|
|
33
|
+
readonly handles: number;
|
|
34
|
+
/** Calls waiting their turn. */
|
|
35
|
+
readonly queued: number;
|
|
36
|
+
}
|
|
37
|
+
/** Posts an extension event (`client.on("event", …)` on the page side). */
|
|
38
|
+
export declare function emit(name: string, data?: unknown, transfer?: Transferable[]): void;
|
|
39
|
+
/**
|
|
40
|
+
* Lets queued messages (calls, a `cancel`) in, without the 4 ms clamp of nested `setTimeout`s.
|
|
41
|
+
* Exported for extensions whose methods must notice a cancel before committing a change.
|
|
42
|
+
*/
|
|
43
|
+
export declare function yieldToMessages(): Promise<void>;
|
|
44
|
+
/** What this worker holds and has done (see {@link WorkerStats}). */
|
|
45
|
+
export declare function workerStats(): WorkerStats;
|
|
46
|
+
/**
|
|
47
|
+
* Serves the worker client's protocol in this worker, with `ext`'s methods added. Call it once,
|
|
48
|
+
* at the top of the worker's module.
|
|
49
|
+
*/
|
|
50
|
+
export declare function serve(ext?: ServerExtension): void;
|
|
51
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/worker/server.ts"],"names":[],"mappings":"AAoCA,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;CACnC;AAED,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,2GAA2G;IAC3G,GAAG,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC;IAC/D;;;;OAIG;IACH,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;CACzF;AAED,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAC5D;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,oGAAoG;AACpG,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AA8CD,2EAA2E;AAC3E,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,GAAE,YAAY,EAAO,GAAG,IAAI,CAEtF;AA+BD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAU/C;AA4VD,qEAAqE;AACrE,wBAAgB,WAAW,IAAI,WAAW,CAEzC;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,GAAG,CAAC,EAAE,eAAe,GAAG,IAAI,CA6BjD"}
|
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
// The worker side of `@laminapdf/sdk/worker` (L2a, extended for C3a): `serve()` answers the
|
|
2
|
+
// handshake, calls `init()`, keeps the documents and pages it made in a handle table, and runs one
|
|
3
|
+
// call at a time (the WASM is synchronous). `dist/worker/entry.js` is `serve()` alone; a package
|
|
4
|
+
// that needs more in the same worker (`@laminapdf/viewer`: render methods) passes a ServerExtension
|
|
5
|
+
// and gets the same protocol, queue, cancellation and errors, so there is one RPC, not two.
|
|
6
|
+
//
|
|
7
|
+
// The queue runs the highest `priority` first (FIFO within one), and coalesces calls with the same
|
|
8
|
+
// `key`: a call whose key matches a queued or running one joins it, runs once, and each caller gets
|
|
9
|
+
// its own reply (an extension's `reply` builds one per caller, so transferables aren't shared). A
|
|
10
|
+
// queued call can be cancelled before it starts; a running one sees its AbortSignal trip once all
|
|
11
|
+
// its callers cancelled: `save` and `saveWithReport` run as stepped jobs that yield between steps
|
|
12
|
+
// (ADR 0028), and a range document's fetches take the signal. A WebAssembly trap is reported as a
|
|
13
|
+
// crash and ends the worker.
|
|
14
|
+
import { defined } from "../defined.js";
|
|
15
|
+
import { Document, PageRef } from "../document.js";
|
|
16
|
+
import { isDiagnostic, LaminaPdfError, packageError } from "../errors.js";
|
|
17
|
+
import { init, loadExtract, loadText } from "../index.js";
|
|
18
|
+
import { httpRangeSource } from "../source/http.js";
|
|
19
|
+
import { PageText, rawOf } from "../text.js";
|
|
20
|
+
import { HANDSHAKE, isHandleRef, } from "./protocol.js";
|
|
21
|
+
import { DOCUMENT_METHODS, PAGE_METHODS } from "./support.js";
|
|
22
|
+
import { whole } from "./transfer.js";
|
|
23
|
+
/** Work units per save step: small enough that a cancel waits at most a few milliseconds. */
|
|
24
|
+
const SAVE_BUDGET = 20_000;
|
|
25
|
+
/** The budget in use: `serve()`'s `saveBudget`, or the default. */
|
|
26
|
+
let saveBudget = SAVE_BUDGET;
|
|
27
|
+
/** Least time between two progress events of one call, in ms. */
|
|
28
|
+
const PROGRESS_EVERY = 50;
|
|
29
|
+
const scope = globalThis;
|
|
30
|
+
const handles = new Map();
|
|
31
|
+
/** Each document's page handles by page ID: `page(i)` again returns the same handle. */
|
|
32
|
+
const pageHandles = new Map();
|
|
33
|
+
let nextHandle = 1;
|
|
34
|
+
/** Jobs waiting their turn, highest priority first (FIFO within one); the running one. */
|
|
35
|
+
const queue = [];
|
|
36
|
+
let current;
|
|
37
|
+
let running = false;
|
|
38
|
+
/** Jobs actually started (a cancelled call never starts). */
|
|
39
|
+
let started = 0;
|
|
40
|
+
let ready = false;
|
|
41
|
+
let extension = { methods: {} };
|
|
42
|
+
function post(message, transfer = []) {
|
|
43
|
+
scope.postMessage(message, transfer);
|
|
44
|
+
}
|
|
45
|
+
/** Posts an extension event (`client.on("event", …)` on the page side). */
|
|
46
|
+
export function emit(name, data, transfer = []) {
|
|
47
|
+
post({ kind: "event", name, data }, transfer);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The ADR 0026 object for anything thrown. Lamina PDF's own errors pass through, and so does the §1
|
|
51
|
+
* object the WASM modules throw. Any other error that can describe itself (`toDiagnostic()`,
|
|
52
|
+
* as `@laminapdf/render`'s RenderError does) is posted as that object, so a render
|
|
53
|
+
* `data-pending` keeps its `[offset, length]` ranges in `data.ranges` (`LaminaPdfError.ranges`).
|
|
54
|
+
* Anything else is a failure of the worker itself (`worker-failed`, kind internal). Caller
|
|
55
|
+
* mistakes the worker detects (an unknown method) are thrown as `invalid-argument` where they
|
|
56
|
+
* are found.
|
|
57
|
+
*/
|
|
58
|
+
function diagnostic(e) {
|
|
59
|
+
if (e instanceof LaminaPdfError)
|
|
60
|
+
return e.toJSON();
|
|
61
|
+
if (isDiagnostic(e))
|
|
62
|
+
return e;
|
|
63
|
+
const described = fromToDiagnostic(e);
|
|
64
|
+
if (described !== undefined)
|
|
65
|
+
return described;
|
|
66
|
+
return packageError("worker-failed", e instanceof Error ? e.message : String(e)).toJSON();
|
|
67
|
+
}
|
|
68
|
+
/** What `e.toDiagnostic()` returns, when `e` has that method and it returns a §1 object. */
|
|
69
|
+
function fromToDiagnostic(e) {
|
|
70
|
+
const toDiagnostic = e?.toDiagnostic;
|
|
71
|
+
if (typeof toDiagnostic !== "function")
|
|
72
|
+
return undefined;
|
|
73
|
+
const value = toDiagnostic.call(e);
|
|
74
|
+
return isDiagnostic(value) ? value : undefined;
|
|
75
|
+
}
|
|
76
|
+
/** One channel for every yield, and the yields waiting on it (in order). */
|
|
77
|
+
let yieldChannel;
|
|
78
|
+
const yielding = [];
|
|
79
|
+
/**
|
|
80
|
+
* Lets queued messages (calls, a `cancel`) in, without the 4 ms clamp of nested `setTimeout`s.
|
|
81
|
+
* Exported for extensions whose methods must notice a cancel before committing a change.
|
|
82
|
+
*/
|
|
83
|
+
export function yieldToMessages() {
|
|
84
|
+
if (yieldChannel === undefined) {
|
|
85
|
+
yieldChannel = new MessageChannel();
|
|
86
|
+
yieldChannel.port1.onmessage = () => yielding.shift()?.();
|
|
87
|
+
}
|
|
88
|
+
const channel = yieldChannel;
|
|
89
|
+
return new Promise((resolve) => {
|
|
90
|
+
yielding.push(resolve);
|
|
91
|
+
channel.port2.postMessage(null);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/** The client methods the worker itself serves; an extension can't reuse their names. */
|
|
95
|
+
const BUILT_IN = new Set(["open", "openUrl", "loadText", "loadExtract"]);
|
|
96
|
+
function register(entry, fields) {
|
|
97
|
+
const handle = nextHandle++;
|
|
98
|
+
handles.set(handle, entry);
|
|
99
|
+
return { $handle: handle, type: entry.type, ...(fields === undefined ? {} : { fields }) };
|
|
100
|
+
}
|
|
101
|
+
function pageRef(page, document) {
|
|
102
|
+
const fields = { id: page.id, index: page.index };
|
|
103
|
+
let pages = pageHandles.get(document);
|
|
104
|
+
if (pages === undefined) {
|
|
105
|
+
pages = new Map();
|
|
106
|
+
pageHandles.set(document, pages);
|
|
107
|
+
}
|
|
108
|
+
const known = pages.get(page.id);
|
|
109
|
+
if (known !== undefined && handles.has(known))
|
|
110
|
+
return { $handle: known, type: "page", fields };
|
|
111
|
+
const ref = register({ type: "page", value: page, document }, fields);
|
|
112
|
+
pages.set(page.id, ref.$handle);
|
|
113
|
+
return ref;
|
|
114
|
+
}
|
|
115
|
+
/** Values to transfer out of `result`, and the result as it should be posted. */
|
|
116
|
+
function outgoing(result) {
|
|
117
|
+
if (result instanceof Uint8Array)
|
|
118
|
+
return [result, whole(result)];
|
|
119
|
+
if (result instanceof PageText) {
|
|
120
|
+
const raw = rawOf(result);
|
|
121
|
+
return [{ $pageText: raw }, [...whole(raw.quads), ...whole(raw.glyphOffsets)]];
|
|
122
|
+
}
|
|
123
|
+
if (typeof result === "object" && result !== null && "bytes" in result && result.bytes instanceof Uint8Array) {
|
|
124
|
+
return [result, whole(result.bytes)];
|
|
125
|
+
}
|
|
126
|
+
return [result, []];
|
|
127
|
+
}
|
|
128
|
+
/** Frees a document handle (and its pages), or a page handle. */
|
|
129
|
+
function release(handle) {
|
|
130
|
+
const entry = handles.get(handle);
|
|
131
|
+
if (entry === undefined)
|
|
132
|
+
return;
|
|
133
|
+
handles.delete(handle);
|
|
134
|
+
if (entry.type === "document") {
|
|
135
|
+
for (const h of pageHandles.get(handle)?.values() ?? [])
|
|
136
|
+
handles.delete(h);
|
|
137
|
+
pageHandles.delete(handle);
|
|
138
|
+
entry.value.free();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function stepSave(context, doc, method, options) {
|
|
142
|
+
const job = doc.saveJob(options);
|
|
143
|
+
// The first progress event goes out after the first step, so a caller hears at once that a
|
|
144
|
+
// stepped save is under way; later ones at most every PROGRESS_EVERY ms. (Counting from 0 would
|
|
145
|
+
// wait for the worker's own clock, which starts when the worker does.)
|
|
146
|
+
let last = Number.NEGATIVE_INFINITY;
|
|
147
|
+
try {
|
|
148
|
+
for (;;) {
|
|
149
|
+
if (context.signal.aborted)
|
|
150
|
+
job.cancel();
|
|
151
|
+
const step = job.step(saveBudget);
|
|
152
|
+
if (step.state === "done") {
|
|
153
|
+
return method === "save" ? step.bytes : { bytes: step.bytes, report: step.report };
|
|
154
|
+
}
|
|
155
|
+
const now = performance.now();
|
|
156
|
+
if (now - last >= PROGRESS_EVERY) {
|
|
157
|
+
last = now;
|
|
158
|
+
const { state: _, ...progress } = step;
|
|
159
|
+
context.progress(progress);
|
|
160
|
+
}
|
|
161
|
+
await yieldToMessages();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
job.free();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** `openRange`'s own options; the rest of `openUrl`'s go to `httpRangeSource`. */
|
|
169
|
+
const RANGE_KEYS = ["readahead", "maxRounds", "budget"];
|
|
170
|
+
async function clientCall(method, params, context) {
|
|
171
|
+
const { signal } = context;
|
|
172
|
+
switch (method) {
|
|
173
|
+
case "open": {
|
|
174
|
+
const [bytes, options] = params;
|
|
175
|
+
return register({ type: "document", value: Document.open(bytes, options), range: false });
|
|
176
|
+
}
|
|
177
|
+
case "openUrl": {
|
|
178
|
+
const [url, options] = params;
|
|
179
|
+
const { password, strict, limits, ...http } = options ?? {};
|
|
180
|
+
const open = {
|
|
181
|
+
signal,
|
|
182
|
+
...defined({ password, strict, limits, blockSize: http.blockSize }),
|
|
183
|
+
};
|
|
184
|
+
for (const key of RANGE_KEYS) {
|
|
185
|
+
if (http[key] !== undefined)
|
|
186
|
+
open[key] = http[key];
|
|
187
|
+
delete http[key];
|
|
188
|
+
}
|
|
189
|
+
const doc = await Document.openRange(httpRangeSource(url, { ...http, signal }), open);
|
|
190
|
+
return register({ type: "document", value: doc, range: true });
|
|
191
|
+
}
|
|
192
|
+
case "loadText":
|
|
193
|
+
return loadText();
|
|
194
|
+
case "loadExtract":
|
|
195
|
+
return loadExtract();
|
|
196
|
+
default: {
|
|
197
|
+
const own = Object.hasOwn(extension.methods, method) ? extension.methods[method] : undefined;
|
|
198
|
+
if (own === undefined)
|
|
199
|
+
throw packageError("invalid-argument", `the worker client has no method ${method}`);
|
|
200
|
+
return own.run(params, context);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async function documentCall(context, handle, entry, method, params) {
|
|
205
|
+
const doc = entry.value;
|
|
206
|
+
if (method === "close") {
|
|
207
|
+
release(handle);
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
if (!Object.hasOwn(DOCUMENT_METHODS, method)) {
|
|
211
|
+
throw packageError("invalid-argument", `Document has no remote method ${method}`);
|
|
212
|
+
}
|
|
213
|
+
const run = async () => {
|
|
214
|
+
if (method === "save" || method === "saveWithReport") {
|
|
215
|
+
return stepSave(context, doc, method, params[0]);
|
|
216
|
+
}
|
|
217
|
+
const member = doc[method];
|
|
218
|
+
const value = typeof member === "function" ? member.apply(doc, [...params]) : member;
|
|
219
|
+
if (value instanceof PageRef)
|
|
220
|
+
return pageRef(value, handle);
|
|
221
|
+
return value;
|
|
222
|
+
};
|
|
223
|
+
// A range document fetches what a call needs, then calls again (L2c).
|
|
224
|
+
return entry.range ? doc.ensure(run, { signal: context.signal }) : run();
|
|
225
|
+
}
|
|
226
|
+
function pageCall(context, entry, method, params) {
|
|
227
|
+
if (!Object.hasOwn(PAGE_METHODS, method)) {
|
|
228
|
+
throw packageError("invalid-argument", `PageRef has no remote method ${method}`);
|
|
229
|
+
}
|
|
230
|
+
const member = entry.value[method];
|
|
231
|
+
const run = () => typeof member === "function" ? member.apply(entry.value, [...params]) : member;
|
|
232
|
+
const doc = handles.get(entry.document);
|
|
233
|
+
return doc?.type === "document" && doc.range ? doc.value.ensure(run, { signal: context.signal }) : run();
|
|
234
|
+
}
|
|
235
|
+
/** The extension method `request` calls, if it is one (it may build a reply per caller). */
|
|
236
|
+
function extensionMethod(request) {
|
|
237
|
+
return request.handle === 0 && !BUILT_IN.has(request.method) && Object.hasOwn(extension.methods, request.method)
|
|
238
|
+
? extension.methods[request.method]
|
|
239
|
+
: undefined;
|
|
240
|
+
}
|
|
241
|
+
async function execute(job) {
|
|
242
|
+
const { signal } = job.controller;
|
|
243
|
+
const context = {
|
|
244
|
+
signal,
|
|
245
|
+
progress: (progress) => {
|
|
246
|
+
for (const w of job.waiters)
|
|
247
|
+
post({ kind: "progress", id: w.id, progress });
|
|
248
|
+
},
|
|
249
|
+
};
|
|
250
|
+
current = job;
|
|
251
|
+
started++;
|
|
252
|
+
try {
|
|
253
|
+
const result = await run(job.first, context);
|
|
254
|
+
if (signal.aborted) {
|
|
255
|
+
// Nobody will hold a handle the cancelled call made (`openUrl` aborted mid-fetch): free it.
|
|
256
|
+
if (isHandleRef(result))
|
|
257
|
+
release(result.$handle);
|
|
258
|
+
throw packageError("cancelled", "the call was cancelled");
|
|
259
|
+
}
|
|
260
|
+
// The result is in: no caller joins this job any more (a reply can take a while, and a caller
|
|
261
|
+
// that joined now would get none); a same-key call from here on runs again.
|
|
262
|
+
current = undefined;
|
|
263
|
+
await replyAll(job, result);
|
|
264
|
+
}
|
|
265
|
+
catch (e) {
|
|
266
|
+
if (e instanceof WebAssembly.RuntimeError) {
|
|
267
|
+
// A trap: the module's state can't be trusted any more.
|
|
268
|
+
post({ kind: "crashed", reason: "trap" });
|
|
269
|
+
scope.close();
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
// The page dropped an aborted call's promise already; the answer is only for the record.
|
|
273
|
+
const error = signal.aborted ? packageError("cancelled", "the call was cancelled").toJSON() : diagnostic(e);
|
|
274
|
+
for (const w of job.waiters)
|
|
275
|
+
post({ kind: "result", id: w.id, ok: false, error });
|
|
276
|
+
}
|
|
277
|
+
finally {
|
|
278
|
+
current = undefined;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/** Runs the call: a client method, or a method of the document or page its handle names. */
|
|
282
|
+
async function run(request, context) {
|
|
283
|
+
const { handle, method, params } = request;
|
|
284
|
+
if (handle === 0)
|
|
285
|
+
return clientCall(method, params, context);
|
|
286
|
+
const entry = handles.get(handle);
|
|
287
|
+
if (entry === undefined)
|
|
288
|
+
throw packageError("disposed", "the handle was closed or belongs to another worker");
|
|
289
|
+
return entry.type === "document"
|
|
290
|
+
? documentCall(context, handle, entry, method, params)
|
|
291
|
+
: pageCall(context, entry, method, params);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Answers each caller of the job on its own: a reply that fails (createImageBitmap out of
|
|
295
|
+
* memory) fails only that caller, and those already answered aren't answered twice.
|
|
296
|
+
*/
|
|
297
|
+
async function replyAll(job, result) {
|
|
298
|
+
const own = extensionMethod(job.first);
|
|
299
|
+
const waiters = [...job.waiters];
|
|
300
|
+
for (const [i, w] of waiters.entries()) {
|
|
301
|
+
try {
|
|
302
|
+
const [value, transfer] = await answer(own, result, i === waiters.length - 1);
|
|
303
|
+
post({ kind: "result", id: w.id, ok: true, result: value }, transfer);
|
|
304
|
+
}
|
|
305
|
+
catch (e) {
|
|
306
|
+
post({ kind: "result", id: w.id, ok: false, error: diagnostic(e) });
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/** One caller's answer and what it transfers: the extension's reply, else the result itself. */
|
|
311
|
+
async function answer(own, result, last) {
|
|
312
|
+
if (own?.reply !== undefined)
|
|
313
|
+
return own.reply(result);
|
|
314
|
+
const [value, transfer] = outgoing(result);
|
|
315
|
+
// One set of buffers: transferred to the last caller, copied to the others.
|
|
316
|
+
return [value, last ? transfer : []];
|
|
317
|
+
}
|
|
318
|
+
async function drain() {
|
|
319
|
+
if (running)
|
|
320
|
+
return;
|
|
321
|
+
running = true;
|
|
322
|
+
try {
|
|
323
|
+
for (;;) {
|
|
324
|
+
// Let every message already sent in first, so the queue sees all waiting calls and
|
|
325
|
+
// cancels before it picks: a synchronous call otherwise finishes inside one message's
|
|
326
|
+
// handler, before the next is even read, and nothing is ever queued to order or drop.
|
|
327
|
+
await yieldToMessages();
|
|
328
|
+
const job = queue.shift();
|
|
329
|
+
if (job === undefined)
|
|
330
|
+
break;
|
|
331
|
+
await execute(job);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
finally {
|
|
335
|
+
running = false;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/** Puts `job` after every job of its priority or higher. */
|
|
339
|
+
function enqueue(job) {
|
|
340
|
+
const at = queue.findIndex((j) => j.priority < job.priority);
|
|
341
|
+
if (at === -1)
|
|
342
|
+
queue.push(job);
|
|
343
|
+
else
|
|
344
|
+
queue.splice(at, 0, job);
|
|
345
|
+
}
|
|
346
|
+
function call(request) {
|
|
347
|
+
const { key } = request;
|
|
348
|
+
const priority = request.priority ?? 0;
|
|
349
|
+
if (key !== undefined) {
|
|
350
|
+
// Same key, method and handle: a key from one method never answers another's call.
|
|
351
|
+
const same = (j) => j.first.key === key && j.first.method === request.method && j.first.handle === request.handle;
|
|
352
|
+
if (current !== undefined && same(current) && !current.controller.signal.aborted) {
|
|
353
|
+
current.waiters.push(request);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
const queued = queue.find(same);
|
|
357
|
+
if (queued !== undefined) {
|
|
358
|
+
queued.waiters.push(request);
|
|
359
|
+
if (priority > queued.priority) {
|
|
360
|
+
// The more urgent caller moves the shared job up.
|
|
361
|
+
queue.splice(queue.indexOf(queued), 1);
|
|
362
|
+
queued.priority = priority;
|
|
363
|
+
enqueue(queued);
|
|
364
|
+
}
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
enqueue({ first: request, waiters: [request], priority, controller: new AbortController() });
|
|
369
|
+
if (ready)
|
|
370
|
+
void drain();
|
|
371
|
+
}
|
|
372
|
+
function cancel(id) {
|
|
373
|
+
// Only a call still queued or running can be cancelled; a cancel that crossed its answer is
|
|
374
|
+
// ignored (and leaves nothing behind).
|
|
375
|
+
const job = current?.waiters.some((w) => w.id === id)
|
|
376
|
+
? current
|
|
377
|
+
: queue.find((j) => j.waiters.some((w) => w.id === id));
|
|
378
|
+
if (job === undefined)
|
|
379
|
+
return;
|
|
380
|
+
job.waiters.splice(job.waiters.findIndex((w) => w.id === id), 1);
|
|
381
|
+
if (job.waiters.length > 0) {
|
|
382
|
+
// The job keeps the priority of its most urgent remaining caller.
|
|
383
|
+
const priority = Math.max(...job.waiters.map((w) => w.priority ?? 0));
|
|
384
|
+
if (job !== current && priority !== job.priority) {
|
|
385
|
+
queue.splice(queue.indexOf(job), 1);
|
|
386
|
+
job.priority = priority;
|
|
387
|
+
enqueue(job);
|
|
388
|
+
}
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
if (job === current) {
|
|
392
|
+
job.controller.abort();
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
queue.splice(queue.indexOf(job), 1);
|
|
396
|
+
post({
|
|
397
|
+
kind: "result",
|
|
398
|
+
id,
|
|
399
|
+
ok: false,
|
|
400
|
+
error: packageError("cancelled", "the call was cancelled before it started").toJSON(),
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
async function hello(message) {
|
|
404
|
+
const { protocol, version } = message.client;
|
|
405
|
+
if (protocol !== HANDSHAKE.protocol || version !== HANDSHAKE.version) {
|
|
406
|
+
// Answer with what this worker is, and do nothing else: the client rejects.
|
|
407
|
+
post({ kind: "welcome", worker: HANDSHAKE });
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
try {
|
|
411
|
+
await init(message.init);
|
|
412
|
+
ready = true;
|
|
413
|
+
post({ kind: "welcome", worker: HANDSHAKE });
|
|
414
|
+
void drain();
|
|
415
|
+
}
|
|
416
|
+
catch (e) {
|
|
417
|
+
post({ kind: "welcome", worker: HANDSHAKE, error: diagnostic(e) });
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
let serving = false;
|
|
421
|
+
/** What this worker holds and has done (see {@link WorkerStats}). */
|
|
422
|
+
export function workerStats() {
|
|
423
|
+
return { started, handles: handles.size, queued: queue.length };
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Serves the worker client's protocol in this worker, with `ext`'s methods added. Call it once,
|
|
427
|
+
* at the top of the worker's module.
|
|
428
|
+
*/
|
|
429
|
+
export function serve(ext) {
|
|
430
|
+
if (serving)
|
|
431
|
+
throw packageError("invalid-argument", "serve() was already called in this worker");
|
|
432
|
+
if (ext !== undefined) {
|
|
433
|
+
const clash = Object.keys(ext.methods).find((m) => BUILT_IN.has(m));
|
|
434
|
+
if (clash !== undefined)
|
|
435
|
+
throw packageError("invalid-argument", `an extension can't redefine the built-in method ${clash}`);
|
|
436
|
+
extension = ext;
|
|
437
|
+
if (ext.saveBudget !== undefined) {
|
|
438
|
+
if (!(Number.isInteger(ext.saveBudget) && ext.saveBudget > 0))
|
|
439
|
+
throw packageError("invalid-argument", "saveBudget must be a positive whole number of work units");
|
|
440
|
+
saveBudget = ext.saveBudget;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
serving = true;
|
|
444
|
+
scope.addEventListener("message", (event) => {
|
|
445
|
+
const message = event.data;
|
|
446
|
+
switch (message.kind) {
|
|
447
|
+
case "hello":
|
|
448
|
+
void hello(message);
|
|
449
|
+
return;
|
|
450
|
+
case "cancel":
|
|
451
|
+
cancel(message.id);
|
|
452
|
+
return;
|
|
453
|
+
case "call":
|
|
454
|
+
// Calls before the handshake finished wait for it (hello() drains them).
|
|
455
|
+
call(message);
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/worker/server.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,mGAAmG;AACnG,iGAAiG;AACjG,oGAAoG;AACpG,4FAA4F;AAC5F,EAAE;AACF,mGAAmG;AACnG,oGAAoG;AACpG,kGAAkG;AAClG,kGAAkG;AAClG,kGAAkG;AAClG,kGAAkG;AAClG,6BAA6B;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAmB,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE3F,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAGL,SAAS,EAGT,WAAW,GAGZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AA0CtC,6FAA6F;AAC7F,MAAM,WAAW,GAAG,MAAM,CAAC;AAC3B,mEAAmE;AACnE,IAAI,UAAU,GAAG,WAAW,CAAC;AAC7B,iEAAiE;AACjE,MAAM,cAAc,GAAG,EAAE,CAAC;AAO1B,MAAM,KAAK,GAAG,UAA8B,CAAC;AAM7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;AACzC,wFAAwF;AACxF,MAAM,WAAW,GAAG,IAAI,GAAG,EAA+B,CAAC;AAC3D,IAAI,UAAU,GAAG,CAAC,CAAC;AAUnB,0FAA0F;AAC1F,MAAM,KAAK,GAAU,EAAE,CAAC;AACxB,IAAI,OAAwB,CAAC;AAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;AACpB,6DAA6D;AAC7D,IAAI,OAAO,GAAG,CAAC,CAAC;AAChB,IAAI,KAAK,GAAG,KAAK,CAAC;AAClB,IAAI,SAAS,GAAoB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAEjD,SAAS,IAAI,CAAC,OAAmB,EAAE,QAAQ,GAAmB,EAAE;IAC9D,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,IAAc,EAAE,QAAQ,GAAmB,EAAE;IAC9E,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,UAAU,CAAC,CAAU;IAC5B,IAAI,CAAC,YAAY,cAAc;QAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;IACnD,IAAI,YAAY,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,YAAY,CAAC,eAAe,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AAC5F,CAAC;AAED,4FAA4F;AAC5F,SAAS,gBAAgB,CAAC,CAAU;IAClC,MAAM,YAAY,GAAI,CAAmD,EAAE,YAAY,CAAC;IACxF,IAAI,OAAO,YAAY,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IACzD,MAAM,KAAK,GAAY,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AAED,4EAA4E;AAC5E,IAAI,YAAwC,CAAC;AAC7C,MAAM,QAAQ,GAAmB,EAAE,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,YAAY,GAAG,IAAI,cAAc,EAAE,CAAC;QACpC,YAAY,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC;IAC5D,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yFAAyF;AACzF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;AAEzE,SAAS,QAAQ,CAAC,KAAY,EAAE,MAAgC;IAC9D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAC5F,CAAC;AAED,SAAS,OAAO,CAAC,IAAa,EAAE,QAAgB;IAC9C,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAClD,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QAClB,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC/F,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;IACtE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAChC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AACjF,SAAS,QAAQ,CAAC,MAAe;IAC/B,IAAI,MAAM,YAAY,UAAU;QAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,YAAY,UAAU,EAAE,CAAC;QAC7G,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,iEAAiE;AACjE,SAAS,OAAO,CAAC,MAAc;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO;IAChC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;YAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3E,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,OAAoB,EAAE,GAAa,EAAE,MAAc,EAAE,OAAgC;IAC3G,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,2FAA2F;IAC3F,gGAAgG;IAChG,uEAAuE;IACvE,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACpC,IAAI,CAAC;QACH,SAAS,CAAC;YACR,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO;gBAAE,GAAG,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC1B,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YACrF,CAAC;YACD,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC9B,IAAI,GAAG,GAAG,IAAI,IAAI,cAAc,EAAE,CAAC;gBACjC,IAAI,GAAG,GAAG,CAAC;gBACX,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC;gBACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC;AAEjE,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,MAA0B,EAAE,OAAoB;IACxF,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,MAA+C,CAAC;YACzE,OAAO,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,KAAK,SAAS,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,MAAuD,CAAC;YAC/E,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;YAC5D,MAAM,IAAI,GAA4B;gBACpC,MAAM;gBACN,GAAG,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;aACpE,CAAC;YACF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,CAClC,eAAe,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,EACzC,IAAkC,CACnC,CAAC;YACF,OAAO,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,UAAU;YACb,OAAO,QAAQ,EAAE,CAAC;QACpB,KAAK,aAAa;YAChB,OAAO,WAAW,EAAE,CAAC;QACvB,SAAS,CAAC;YACR,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7F,IAAI,GAAG,KAAK,SAAS;gBAAE,MAAM,YAAY,CAAC,kBAAkB,EAAE,mCAAmC,MAAM,EAAE,CAAC,CAAC;YAC3G,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,OAAoB,EACpB,MAAc,EACd,KAA2C,EAC3C,MAAc,EACd,MAA0B;IAE1B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;IACxB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC;QAC7C,MAAM,YAAY,CAAC,kBAAkB,EAAE,iCAAiC,MAAM,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,IAAsB,EAAE;QACvC,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;YACrD,OAAO,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAA4B,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,MAAM,GAAI,GAA0C,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,KAAK,GACT,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAE,MAAuC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3G,IAAI,KAAK,YAAY,OAAO;YAAE,OAAO,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,sEAAsE;IACtE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,QAAQ,CACf,OAAoB,EACpB,KAAuC,EACvC,MAAc,EACd,MAA0B;IAE1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC;QACzC,MAAM,YAAY,CAAC,kBAAkB,EAAE,gCAAgC,MAAM,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,MAAM,GAAI,KAAK,CAAC,KAA4C,CAAC,MAAM,CAAC,CAAC;IAC3E,MAAM,GAAG,GAAG,GAAG,EAAE,CACf,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAE,MAAuC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACnH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,GAAG,EAAE,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC3G,CAAC;AAED,4FAA4F;AAC5F,SAAS,eAAe,CAAC,OAAgB;IACvC,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;QAC9G,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QACnC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAQ;IAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;IAClC,MAAM,OAAO,GAAgB;QAC3B,MAAM;QACN,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;YACrB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO;gBAAE,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9E,CAAC;KACF,CAAC;IACF,OAAO,GAAG,GAAG,CAAC;IACd,OAAO,EAAE,CAAC;IACV,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,4FAA4F;YAC5F,IAAI,WAAW,CAAC,MAAM,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,YAAY,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;QAC5D,CAAC;QACD,8FAA8F;QAC9F,4EAA4E;QAC5E,OAAO,GAAG,SAAS,CAAC;QACpB,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,WAAW,CAAC,YAAY,EAAE,CAAC;YAC1C,wDAAwD;YACxD,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1C,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,yFAAyF;QACzF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5G,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO;YAAE,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC;YAAS,CAAC;QACT,OAAO,GAAG,SAAS,CAAC;IACtB,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,KAAK,UAAU,GAAG,CAAC,OAAgB,EAAE,OAAoB;IACvD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3C,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,YAAY,CAAC,UAAU,EAAE,oDAAoD,CAAC,CAAC;IAC9G,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU;QAC9B,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;QACtD,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,QAAQ,CAAC,GAAQ,EAAE,MAAe;IAC/C,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC9E,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;AACH,CAAC;AAED,gGAAgG;AAChG,KAAK,UAAU,MAAM,CACnB,GAAgC,EAChC,MAAe,EACf,IAAa;IAEb,IAAI,GAAG,EAAE,KAAK,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,4EAA4E;IAC5E,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,KAAK;IAClB,IAAI,OAAO;QAAE,OAAO;IACpB,OAAO,GAAG,IAAI,CAAC;IACf,IAAI,CAAC;QACH,SAAS,CAAC;YACR,mFAAmF;YACnF,sFAAsF;YACtF,sFAAsF;YACtF,MAAM,eAAe,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,GAAG,KAAK,SAAS;gBAAE,MAAM;YAC7B,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,SAAS,OAAO,CAAC,GAAQ;IACvB,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7D,IAAI,EAAE,KAAK,CAAC,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;QAC1B,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,IAAI,CAAC,OAAgB;IAC5B,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,mFAAmF;QACnF,MAAM,IAAI,GAAG,CAAC,CAAM,EAAE,EAAE,CACtB,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;QAChG,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACjF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC/B,kDAAkD;gBAClD,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC3B,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;IACD,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,eAAe,EAAE,EAAE,CAAC,CAAC;IAC7F,IAAI,KAAK;QAAE,KAAK,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,MAAM,CAAC,EAAU;IACxB,4FAA4F;IAC5F,uCAAuC;IACvC,MAAM,GAAG,GAAG,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACnD,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC1D,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO;IAC9B,GAAG,CAAC,OAAO,CAAC,MAAM,CAChB,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EACzC,CAAC,CACF,CAAC;IACF,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,kEAAkE;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,GAAG,KAAK,OAAO,IAAI,QAAQ,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjD,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,IAAI,EAAE,QAAQ;QACd,EAAE;QACF,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,YAAY,CAAC,WAAW,EAAE,0CAA0C,CAAC,CAAC,MAAM,EAAE;KACtF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,OAAc;IACjC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7C,IAAI,QAAQ,KAAK,SAAS,CAAC,QAAQ,IAAI,OAAO,KAAK,SAAS,CAAC,OAAO,EAAE,CAAC;QACrE,4EAA4E;QAC5E,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,OAAO,CAAC,IAAkC,CAAC,CAAC;QACvD,KAAK,GAAG,IAAI,CAAC;QACb,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7C,KAAK,KAAK,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB,qEAAqE;AACrE,MAAM,UAAU,WAAW;IACzB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,GAAqB;IACzC,IAAI,OAAO;QAAE,MAAM,YAAY,CAAC,kBAAkB,EAAE,2CAA2C,CAAC,CAAC;IACjG,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,IAAI,KAAK,KAAK,SAAS;YACrB,MAAM,YAAY,CAAC,kBAAkB,EAAE,mDAAmD,KAAK,EAAE,CAAC,CAAC;QACrG,SAAS,GAAG,GAAG,CAAC;QAChB,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;gBAC3D,MAAM,YAAY,CAAC,kBAAkB,EAAE,0DAA0D,CAAC,CAAC;YACrG,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,IAAI,CAAC;IACf,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;QAC3B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,OAAO;gBACV,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;gBACpB,OAAO;YACT,KAAK,QAAQ;gBACX,MAAM,CAAE,OAAkB,CAAC,EAAE,CAAC,CAAC;gBAC/B,OAAO;YACT,KAAK,MAAM;gBACT,yEAAyE;gBACzE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACd,OAAO;QACX,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|