@agent-factory-platform/client 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.
@@ -0,0 +1,50 @@
1
+ import { type JsonValue } from "@bufbuild/protobuf";
2
+ import { AgentSessionModel, type AgentRunStatus, type AgentSessionState } from "./session-model.js";
3
+ export declare const DOCUMENT_ASSISTANT_OPERATION_SLOT = "document-assistant.operation";
4
+ export declare const DOCUMENT_ASSISTANT_OUTPUT_SLOT = "document-assistant.output";
5
+ export type DocumentAssistantOperationKind = "explain" | "rewrite" | "continue";
6
+ export interface DocumentAssistantOperation {
7
+ version: 1;
8
+ operation: DocumentAssistantOperationKind;
9
+ documentId: string;
10
+ nodeId: string;
11
+ baseRevision: string;
12
+ range: {
13
+ from: number;
14
+ to: number;
15
+ };
16
+ selection: string;
17
+ instruction: string;
18
+ context: string;
19
+ originalSlice?: JsonValue;
20
+ images: Array<{
21
+ assetId: string;
22
+ url: string;
23
+ }>;
24
+ source?: {
25
+ id: string;
26
+ title: string;
27
+ url: string;
28
+ };
29
+ }
30
+ export interface DocumentAssistantState {
31
+ status: "idle" | "submitting" | AgentRunStatus | "disconnected";
32
+ runId?: string;
33
+ operation?: DocumentAssistantOperation;
34
+ output: string;
35
+ error?: Error;
36
+ pendingInteractionId?: string;
37
+ }
38
+ export declare class DocumentAssistantModel {
39
+ #private;
40
+ readonly session: AgentSessionModel;
41
+ constructor(session: AgentSessionModel);
42
+ getSnapshot: () => DocumentAssistantState;
43
+ subscribe: (listener: () => void) => () => boolean;
44
+ bootstrap: () => Promise<import("./gen/agentfactory/agent/v1/agent_pb.js").Run | undefined>;
45
+ cancel: () => Promise<void>;
46
+ submit(operation: DocumentAssistantOperation): Promise<import("./gen/agentfactory/agent/v1/agent_pb.js").Run>;
47
+ resolvePending(resolution?: "confirmed" | "rejected"): Promise<import("./gen/agentfactory/agent/v1/agent_pb.js").Run>;
48
+ }
49
+ export declare function deriveDocumentAssistantState(state: AgentSessionState): DocumentAssistantState;
50
+ //# sourceMappingURL=document-assistant-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-assistant-model.d.ts","sourceRoot":"","sources":["../src/document-assistant-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG9E,OAAO,EAAE,iBAAiB,EAAW,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE7G,eAAO,MAAM,iCAAiC,iCAAiC,CAAC;AAChF,eAAO,MAAM,8BAA8B,8BAA8B,CAAC;AAE1E,MAAM,MAAM,8BAA8B,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAEhF,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,8BAA8B,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,cAAc,GAAG,cAAc,CAAC;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,0BAA0B,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,sBAAsB;;IAIrB,QAAQ,CAAC,OAAO,EAAE,iBAAiB;gBAA1B,OAAO,EAAE,iBAAiB;IAE/C,WAAW,+BAOT;IAEF,SAAS,GAAI,UAAU,MAAM,IAAI,mBAAsC;IACvE,SAAS,mFAAkC;IAC3C,MAAM,sBAA+B;IAErC,MAAM,CAAC,SAAS,EAAE,0BAA0B;IAS5C,cAAc,CAAC,UAAU,GAAE,WAAW,GAAG,UAAwB;CAKlE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,iBAAiB,GAAG,sBAAsB,CAgC7F"}
@@ -0,0 +1,104 @@
1
+ import { create, fromJson, toJson } from "@bufbuild/protobuf";
2
+ import { ValueSchema } from "@bufbuild/protobuf/wkt";
3
+ import { ContentBlockSchema, DataBlockSchema, TextBlockSchema } from "./gen/agentfactory/agent/v1/agent_pb.js";
4
+ import { project } from "./session-model.js";
5
+ export const DOCUMENT_ASSISTANT_OPERATION_SLOT = "document-assistant.operation";
6
+ export const DOCUMENT_ASSISTANT_OUTPUT_SLOT = "document-assistant.output";
7
+ export class DocumentAssistantModel {
8
+ session;
9
+ #sessionState;
10
+ #snapshot = { status: "idle", output: "" };
11
+ constructor(session) {
12
+ this.session = session;
13
+ }
14
+ getSnapshot = () => {
15
+ const state = this.session.getSnapshot();
16
+ if (state !== this.#sessionState) {
17
+ this.#sessionState = state;
18
+ this.#snapshot = deriveDocumentAssistantState(state);
19
+ }
20
+ return this.#snapshot;
21
+ };
22
+ subscribe = (listener) => this.session.subscribe(listener);
23
+ bootstrap = () => this.session.bootstrap();
24
+ cancel = () => this.session.cancel();
25
+ submit(operation) {
26
+ if (!parseOperation(operation))
27
+ throw new Error("invalid document assistant operation");
28
+ const metadata = JSON.parse(JSON.stringify(operation));
29
+ return this.session.submitContent([
30
+ create(ContentBlockSchema, { block: { case: "text", value: create(TextBlockSchema, { text: operation.instruction }) } }),
31
+ create(ContentBlockSchema, { block: { case: "data", value: create(DataBlockSchema, { slot: DOCUMENT_ASSISTANT_OPERATION_SLOT, value: fromJson(ValueSchema, metadata) }) } }),
32
+ ]);
33
+ }
34
+ resolvePending(resolution = "confirmed") {
35
+ const interactionId = this.getSnapshot().pendingInteractionId;
36
+ if (!interactionId)
37
+ throw new Error("no document assistant interaction is waiting for input");
38
+ return this.session.resolveInteraction(interactionId, resolution);
39
+ }
40
+ }
41
+ export function deriveDocumentAssistantState(state) {
42
+ let operation;
43
+ let runId;
44
+ for (const event of state.events) {
45
+ if (event.event.case !== "message" || event.event.value.role !== "user")
46
+ continue;
47
+ for (const block of event.event.value.content) {
48
+ if (block.block.case !== "data" || block.block.value.slot !== DOCUMENT_ASSISTANT_OPERATION_SLOT)
49
+ continue;
50
+ const parsed = parseOperation(block.block.value.value ? toJson(ValueSchema, block.block.value.value) : undefined);
51
+ if (parsed) {
52
+ operation = parsed;
53
+ runId = event.runId || undefined;
54
+ }
55
+ }
56
+ }
57
+ if (!operation || !runId)
58
+ return { status: state.status, output: "", error: state.error };
59
+ const runEvents = state.events.filter((event) => event.runId === runId);
60
+ const typedOutput = latestOutput(runEvents);
61
+ const output = typedOutput ?? project(runEvents).text;
62
+ const ownRun = state.run?.id === runId;
63
+ const finished = [...runEvents].reverse().find((event) => event.event.case === "lifecycle" && event.event.value.kind === "run_finished");
64
+ const status = ownRun ? state.status : lifecycleStatus(finished) ?? (output ? "completed" : "idle");
65
+ const resolvedInteractions = new Set(runEvents.flatMap((event) => event.event.case === "interaction" && event.event.value.phase === "resolved" ? [event.event.value.interactionId] : []));
66
+ const pendingInteraction = [...runEvents].reverse().find((event) => event.event.case === "interaction" && event.event.value.phase === "requested" && !resolvedInteractions.has(event.event.value.interactionId));
67
+ return {
68
+ status,
69
+ runId,
70
+ operation,
71
+ output,
72
+ error: ownRun ? state.error : undefined,
73
+ pendingInteractionId: pendingInteraction?.event.case === "interaction" ? pendingInteraction.event.value.interactionId : undefined,
74
+ };
75
+ }
76
+ function latestOutput(events) {
77
+ for (const event of [...events].reverse()) {
78
+ if (event.event.case !== "message" || event.event.value.role !== "assistant")
79
+ continue;
80
+ for (const block of [...event.event.value.content].reverse()) {
81
+ if (block.block.case !== "data" || block.block.value.slot !== DOCUMENT_ASSISTANT_OUTPUT_SLOT || !block.block.value.value)
82
+ continue;
83
+ const value = toJson(ValueSchema, block.block.value.value);
84
+ if (value && typeof value === "object" && !Array.isArray(value) && typeof value.markdown === "string")
85
+ return value.markdown;
86
+ }
87
+ }
88
+ }
89
+ function lifecycleStatus(event) {
90
+ if (event?.event.case !== "lifecycle")
91
+ return undefined;
92
+ const status = event.event.value.status;
93
+ return status === "queued" || status === "running" || status === "waiting_for_input" || status === "completed" || status === "failed" || status === "cancelled" || status === "max_steps_reached" ? status : undefined;
94
+ }
95
+ function parseOperation(value) {
96
+ if (!value || typeof value !== "object" || Array.isArray(value))
97
+ return;
98
+ const candidate = value;
99
+ const range = candidate.range;
100
+ if (candidate.version !== 1 || (candidate.operation !== "explain" && candidate.operation !== "rewrite" && candidate.operation !== "continue") || typeof candidate.documentId !== "string" || typeof candidate.nodeId !== "string" || typeof candidate.baseRevision !== "string" || typeof candidate.selection !== "string" || typeof candidate.instruction !== "string" || typeof candidate.context !== "string" || !range || typeof range !== "object" || Array.isArray(range) || !Number.isInteger(range.from) || !Number.isInteger(range.to) || Number(range.from) < 0 || Number(range.to) < Number(range.from))
101
+ return;
102
+ return value;
103
+ }
104
+ //# sourceMappingURL=document-assistant-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-assistant-model.js","sourceRoot":"","sources":["../src/document-assistant-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAkB,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAqB,MAAM,yCAAyC,CAAC;AAClI,OAAO,EAAqB,OAAO,EAA+C,MAAM,oBAAoB,CAAC;AAE7G,MAAM,CAAC,MAAM,iCAAiC,GAAG,8BAA8B,CAAC;AAChF,MAAM,CAAC,MAAM,8BAA8B,GAAG,2BAA2B,CAAC;AA4B1E,MAAM,OAAO,sBAAsB;IAIZ;IAHrB,aAAa,CAAqB;IAClC,SAAS,GAA2B,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAEnE,YAAqB,OAA0B;QAA1B,YAAO,GAAP,OAAO,CAAmB;IAAG,CAAC;IAEnD,WAAW,GAAG,GAAG,EAAE;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,KAAK,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,SAAS,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC,CAAC;IAEF,SAAS,GAAG,CAAC,QAAoB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvE,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAErC,MAAM,CAAC,SAAqC;QAC1C,IAAI,CAAC,cAAc,CAAC,SAAiC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAChH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAc,CAAC;QACpE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;YAChC,MAAM,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACxH,MAAM,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;SAC7K,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,aAAuC,WAAW;QAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,oBAAoB,CAAC;QAC9D,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC9F,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACpE,CAAC;CACF;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAwB;IACnE,IAAI,SAAiD,CAAC;IACtD,IAAI,KAAyB,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QAClF,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC9C,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,iCAAiC;gBAAE,SAAS;YAC1G,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAClH,IAAI,MAAM,EAAE,CAAC;gBACX,SAAS,GAAG,MAAM,CAAC;gBACnB,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAE1F,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;IACtD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,KAAK,CAAC;IACvC,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;IACzI,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACpG,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1L,MAAM,kBAAkB,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IACjN,OAAO;QACL,MAAM;QACN,KAAK;QACL,SAAS;QACT,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QACvC,oBAAoB,EAAE,kBAAkB,EAAE,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;KAClI,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAA+B;IACnD,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QACvF,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7D,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,8BAA8B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK;gBAAE,SAAS;YACnI,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3D,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;QAC/H,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAoB;IAC3C,IAAI,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IACxC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,mBAAmB,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACzN,CAAC;AAED,SAAS,cAAc,CAAC,KAA4B;IAClD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO;IACxE,MAAM,SAAS,GAAG,KAAkC,CAAC;IACrD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IAC9B,IAAI,SAAS,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,UAAU,CAAC,IAAI,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO;IAC3lB,OAAO,KAA8C,CAAC;AACxD,CAAC"}