@nifrajs/coding-agent 3.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/EXTENSIONS.md +25 -0
- package/PERFORMANCE.md +19 -0
- package/README.md +69 -0
- package/REGISTRY.md +15 -0
- package/SECURITY.md +32 -0
- package/dist/approvals.d.ts +70 -0
- package/dist/approvals.d.ts.map +1 -0
- package/dist/approvals.js +174 -0
- package/dist/approvals.js.map +1 -0
- package/dist/capabilities.d.ts +20 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +49 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/cli.d.ts +24 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +380 -0
- package/dist/cli.js.map +1 -0
- package/dist/context.d.ts +17 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +66 -0
- package/dist/context.js.map +1 -0
- package/dist/deployment-adapters.d.ts +40 -0
- package/dist/deployment-adapters.d.ts.map +1 -0
- package/dist/deployment-adapters.js +147 -0
- package/dist/deployment-adapters.js.map +1 -0
- package/dist/diff.d.ts +17 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +61 -0
- package/dist/diff.js.map +1 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +35 -0
- package/dist/errors.js.map +1 -0
- package/dist/extensions.d.ts +104 -0
- package/dist/extensions.d.ts.map +1 -0
- package/dist/extensions.js +284 -0
- package/dist/extensions.js.map +1 -0
- package/dist/handoffs.d.ts +97 -0
- package/dist/handoffs.d.ts.map +1 -0
- package/dist/handoffs.js +199 -0
- package/dist/handoffs.js.map +1 -0
- package/dist/healing.d.ts +56 -0
- package/dist/healing.d.ts.map +1 -0
- package/dist/healing.js +54 -0
- package/dist/healing.js.map +1 -0
- package/dist/host.d.ts +61 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +369 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/isolated-worker.d.ts +2 -0
- package/dist/isolated-worker.d.ts.map +1 -0
- package/dist/isolated-worker.js +155 -0
- package/dist/isolated-worker.js.map +1 -0
- package/dist/isolated.d.ts +52 -0
- package/dist/isolated.d.ts.map +1 -0
- package/dist/isolated.js +293 -0
- package/dist/isolated.js.map +1 -0
- package/dist/native.d.ts +92 -0
- package/dist/native.d.ts.map +1 -0
- package/dist/native.js +339 -0
- package/dist/native.js.map +1 -0
- package/dist/orchestration/artifact-port.d.ts +30 -0
- package/dist/orchestration/artifact-port.d.ts.map +1 -0
- package/dist/orchestration/artifact-port.js +59 -0
- package/dist/orchestration/artifact-port.js.map +1 -0
- package/dist/orchestration/catalog.d.ts +71 -0
- package/dist/orchestration/catalog.d.ts.map +1 -0
- package/dist/orchestration/catalog.js +46 -0
- package/dist/orchestration/catalog.js.map +1 -0
- package/dist/orchestration/compile.d.ts +59 -0
- package/dist/orchestration/compile.d.ts.map +1 -0
- package/dist/orchestration/compile.js +268 -0
- package/dist/orchestration/compile.js.map +1 -0
- package/dist/orchestration/dispatch.d.ts +115 -0
- package/dist/orchestration/dispatch.d.ts.map +1 -0
- package/dist/orchestration/dispatch.js +220 -0
- package/dist/orchestration/dispatch.js.map +1 -0
- package/dist/orchestration/durable-jobs.d.ts +35 -0
- package/dist/orchestration/durable-jobs.d.ts.map +1 -0
- package/dist/orchestration/durable-jobs.js +273 -0
- package/dist/orchestration/durable-jobs.js.map +1 -0
- package/dist/orchestration/effect-key.d.ts +23 -0
- package/dist/orchestration/effect-key.d.ts.map +1 -0
- package/dist/orchestration/effect-key.js +24 -0
- package/dist/orchestration/effect-key.js.map +1 -0
- package/dist/orchestration/evidence-store.d.ts +75 -0
- package/dist/orchestration/evidence-store.d.ts.map +1 -0
- package/dist/orchestration/evidence-store.js +183 -0
- package/dist/orchestration/evidence-store.js.map +1 -0
- package/dist/orchestration/hash.d.ts +12 -0
- package/dist/orchestration/hash.d.ts.map +1 -0
- package/dist/orchestration/hash.js +43 -0
- package/dist/orchestration/hash.js.map +1 -0
- package/dist/orchestration/host.d.ts +121 -0
- package/dist/orchestration/host.d.ts.map +1 -0
- package/dist/orchestration/host.js +334 -0
- package/dist/orchestration/host.js.map +1 -0
- package/dist/orchestration/index.d.ts +20 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +19 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/policy.d.ts +63 -0
- package/dist/orchestration/policy.d.ts.map +1 -0
- package/dist/orchestration/policy.js +80 -0
- package/dist/orchestration/policy.js.map +1 -0
- package/dist/orchestration/recovery.d.ts +87 -0
- package/dist/orchestration/recovery.d.ts.map +1 -0
- package/dist/orchestration/recovery.js +197 -0
- package/dist/orchestration/recovery.js.map +1 -0
- package/dist/orchestration/tracer.d.ts +31 -0
- package/dist/orchestration/tracer.d.ts.map +1 -0
- package/dist/orchestration/tracer.js +141 -0
- package/dist/orchestration/tracer.js.map +1 -0
- package/dist/plans.d.ts +35 -0
- package/dist/plans.d.ts.map +1 -0
- package/dist/plans.js +63 -0
- package/dist/plans.js.map +1 -0
- package/dist/presets.d.ts +10 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +70 -0
- package/dist/presets.js.map +1 -0
- package/dist/process.d.ts +6 -0
- package/dist/process.d.ts.map +1 -0
- package/dist/process.js +42 -0
- package/dist/process.js.map +1 -0
- package/dist/registry.d.ts +37 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +51 -0
- package/dist/registry.js.map +1 -0
- package/dist/replay.d.ts +24 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +154 -0
- package/dist/replay.js.map +1 -0
- package/dist/rpc.d.ts +51 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +412 -0
- package/dist/rpc.js.map +1 -0
- package/dist/session-migration.d.ts +59 -0
- package/dist/session-migration.d.ts.map +1 -0
- package/dist/session-migration.js +315 -0
- package/dist/session-migration.js.map +1 -0
- package/dist/sessions.d.ts +74 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +222 -0
- package/dist/sessions.js.map +1 -0
- package/dist/subagents.d.ts +51 -0
- package/dist/subagents.d.ts.map +1 -0
- package/dist/subagents.js +141 -0
- package/dist/subagents.js.map +1 -0
- package/dist/tools.d.ts +13 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +37 -0
- package/dist/tools.js.map +1 -0
- package/dist/ui.d.ts +42 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +93 -0
- package/dist/ui.js.map +1 -0
- package/dist/verification.d.ts +34 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +91 -0
- package/dist/verification.js.map +1 -0
- package/dist/workflows.d.ts +98 -0
- package/dist/workflows.d.ts.map +1 -0
- package/dist/workflows.js +174 -0
- package/dist/workflows.js.map +1 -0
- package/package.json +84 -0
- package/src/approvals.ts +249 -0
- package/src/capabilities.ts +74 -0
- package/src/cli.ts +405 -0
- package/src/context.ts +81 -0
- package/src/deployment-adapters.ts +181 -0
- package/src/diff.ts +80 -0
- package/src/errors.ts +46 -0
- package/src/extensions.ts +402 -0
- package/src/handoffs.ts +299 -0
- package/src/healing.ts +93 -0
- package/src/host.ts +465 -0
- package/src/index.ts +165 -0
- package/src/isolated-worker.ts +177 -0
- package/src/isolated.ts +344 -0
- package/src/native.ts +478 -0
- package/src/orchestration/artifact-port.ts +75 -0
- package/src/orchestration/catalog.ts +102 -0
- package/src/orchestration/compile.ts +373 -0
- package/src/orchestration/dispatch.ts +383 -0
- package/src/orchestration/durable-jobs.ts +374 -0
- package/src/orchestration/effect-key.ts +35 -0
- package/src/orchestration/evidence-store.ts +233 -0
- package/src/orchestration/hash.ts +43 -0
- package/src/orchestration/host.ts +445 -0
- package/src/orchestration/index.ts +131 -0
- package/src/orchestration/policy.ts +116 -0
- package/src/orchestration/recovery.ts +271 -0
- package/src/orchestration/tracer.ts +177 -0
- package/src/plans.ts +105 -0
- package/src/presets.ts +90 -0
- package/src/process.ts +47 -0
- package/src/registry.ts +80 -0
- package/src/replay.ts +190 -0
- package/src/rpc.ts +598 -0
- package/src/session-migration.ts +401 -0
- package/src/sessions.ts +303 -0
- package/src/subagents.ts +210 -0
- package/src/tools.ts +52 -0
- package/src/ui.ts +137 -0
- package/src/verification.ts +133 -0
- package/src/workflows.ts +279 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export { PiBackend } from "@nifrajs/pi";
|
|
2
|
+
export { ApprovalManager, approvalRequestFromEvent, approvalResolvedEvent, } from "./approvals.js";
|
|
3
|
+
export { AGENT_CAPABILITY_MANIFEST_VERSION, createCapabilityManifest, deniedCapabilities, parseCapabilityManifest, } from "./capabilities.js";
|
|
4
|
+
export { runNifraContext, } from "./context.js";
|
|
5
|
+
export { CiDeploymentAdapter, createCiDeploymentAdapter, createLocalProcessDeploymentAdapter, createReplayDeploymentAdapter, DEPLOYMENT_REFERENCE_PROFILES, LocalProcessDeploymentAdapter, ReplayDeploymentAdapter, } from "./deployment-adapters.js";
|
|
6
|
+
export { readProjectDiff } from "./diff.js";
|
|
7
|
+
export { discoverExtensions, ExtensionHost, validateExtensionModule, } from "./extensions.js";
|
|
8
|
+
export { HandoffCoordinator, HandoffError, } from "./handoffs.js";
|
|
9
|
+
export { SelfHealingController, } from "./healing.js";
|
|
10
|
+
export { CodingAgentHost } from "./host.js";
|
|
11
|
+
export { IsolatedExtensionWorker, } from "./isolated.js";
|
|
12
|
+
export { createNativeGatewayModelPort, NifraBackend, } from "./native.js";
|
|
13
|
+
export { PlanRunner, } from "./plans.js";
|
|
14
|
+
export { AGENT_PRESETS, createPresetSpec, getAgentPreset, } from "./presets.js";
|
|
15
|
+
export { readBoundedText } from "./process.js";
|
|
16
|
+
export { extensionDescriptor, extensionDescriptors, } from "./registry.js";
|
|
17
|
+
export { ReplayBackend, readReplayEvents } from "./replay.js";
|
|
18
|
+
export { CodingAgentRpcServer, } from "./rpc.js";
|
|
19
|
+
export { migrateLegacySession, parseSessionEvidenceRecord, SESSION_EVIDENCE_VERSION, SessionMigrationError, stableSessionEventCode, } from "./session-migration.js";
|
|
20
|
+
export { ContextWindow, FileSessionStore, } from "./sessions.js";
|
|
21
|
+
export { BoundedSubagentRunner, } from "./subagents.js";
|
|
22
|
+
export { createNifraTools, NIFRA_AGENT_INSTRUCTIONS } from "./tools.js";
|
|
23
|
+
export { UiExtensionHost, } from "./ui.js";
|
|
24
|
+
export { createVerificationRepairTask, runNifraVerification, } from "./verification.js";
|
|
25
|
+
export { WorkflowRunner, } from "./workflows.js";
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,aAAa,CAAA;AAC9D,OAAO,EAEL,eAAe,EAKf,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,iCAAiC,EAGjC,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAGL,eAAe,GAChB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,mCAAmC,EACnC,6BAA6B,EAC7B,6BAA6B,EAC7B,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAmD,eAAe,EAAE,MAAM,WAAW,CAAA;AAC5F,OAAO,EAEL,kBAAkB,EAIlB,aAAa,EAMb,uBAAuB,GACxB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,kBAAkB,EAGlB,YAAY,GAIb,MAAM,eAAe,CAAA;AACtB,OAAO,EAKL,qBAAqB,GACtB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,eAAe,EAA+B,MAAM,WAAW,CAAA;AACxE,OAAO,EAGL,uBAAuB,GAExB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,4BAA4B,EAS5B,YAAY,GAEb,MAAM,aAAa,CAAA;AACpB,OAAO,EAKL,UAAU,GAEX,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,aAAa,EAGb,gBAAgB,EAChB,cAAc,GACf,MAAM,cAAc,CAAA;AACrB,OAAO,EAAoB,eAAe,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAIL,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,aAAa,EAA6B,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACxF,OAAO,EACL,oBAAoB,GAGrB,MAAM,UAAU,CAAA;AACjB,OAAO,EAEL,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,EAExB,qBAAqB,EAErB,sBAAsB,GACvB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAGL,aAAa,EAEb,gBAAgB,GAIjB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,qBAAqB,GAKtB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAuB,MAAM,YAAY,CAAA;AAC5F,OAAO,EACL,eAAe,GAOhB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,GAIrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAIL,cAAc,GAGf,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolated-worker.d.ts","sourceRoot":"","sources":["../src/isolated-worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import { realpathSync } from "node:fs";
|
|
10
|
+
import { publicErrorDetails } from "./errors.js";
|
|
11
|
+
import { readBoundedText } from "./process.js";
|
|
12
|
+
const modulePath = process.argv[2];
|
|
13
|
+
const cwd = process.argv[3];
|
|
14
|
+
if (modulePath === undefined || cwd === undefined)
|
|
15
|
+
throw new Error("isolated extension worker: modulePath and cwd are required");
|
|
16
|
+
const token = process.env.NIFRA_EXTENSION_TOKEN;
|
|
17
|
+
const maxMessageBytes = Number(process.env.NIFRA_EXTENSION_MAX_MESSAGE_BYTES);
|
|
18
|
+
const exposeErrorStacks = process.env.NIFRA_EXTENSION_EXPOSE_ERROR_STACKS === "1";
|
|
19
|
+
if (token === undefined ||
|
|
20
|
+
token.length < 32 ||
|
|
21
|
+
!Number.isSafeInteger(maxMessageBytes) ||
|
|
22
|
+
maxMessageBytes < 1024) {
|
|
23
|
+
post({ type: "fatal", error: "isolated extension worker: invalid control configuration" });
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const tools = new Map();
|
|
27
|
+
let ready = false;
|
|
28
|
+
const context = {
|
|
29
|
+
cwd,
|
|
30
|
+
registerCommand(name) {
|
|
31
|
+
post({ type: "command", name });
|
|
32
|
+
},
|
|
33
|
+
registerTool(tool) {
|
|
34
|
+
tools.set(tool.name, tool);
|
|
35
|
+
post({
|
|
36
|
+
type: "registration",
|
|
37
|
+
name: tool.name,
|
|
38
|
+
description: tool.description,
|
|
39
|
+
capabilities: tool.capabilities ?? [],
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
registerWorkflow(name) {
|
|
43
|
+
post({ type: "workflow", name });
|
|
44
|
+
},
|
|
45
|
+
registerSubagent(role) {
|
|
46
|
+
post({ type: "subagent", name: role.name });
|
|
47
|
+
},
|
|
48
|
+
registerProvider(provider) {
|
|
49
|
+
post({ type: "provider", name: provider.name });
|
|
50
|
+
},
|
|
51
|
+
on(event) {
|
|
52
|
+
post({ type: "event", name: event });
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
let server;
|
|
56
|
+
try {
|
|
57
|
+
// Bind only to loopback and require the per-worker token. The endpoint is a transport seam, not
|
|
58
|
+
// a security boundary: the extension already executes inside this process by design.
|
|
59
|
+
server = Bun.serve({
|
|
60
|
+
hostname: "127.0.0.1",
|
|
61
|
+
port: 0,
|
|
62
|
+
async fetch(request) {
|
|
63
|
+
if (request.method !== "POST" || new URL(request.url).pathname !== "/invoke")
|
|
64
|
+
return new Response("", { status: 404 });
|
|
65
|
+
if (request.headers.get("authorization") !== `Bearer ${token}`)
|
|
66
|
+
return new Response("", { status: 401 });
|
|
67
|
+
const body = await readBoundedText(request.body, maxMessageBytes);
|
|
68
|
+
if (body.truncated)
|
|
69
|
+
return new Response("", { status: 413 });
|
|
70
|
+
let message;
|
|
71
|
+
try {
|
|
72
|
+
message = JSON.parse(body.text);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return new Response("", { status: 400 });
|
|
76
|
+
}
|
|
77
|
+
if (!isWorkerRequest(message) || message.type !== "invoke")
|
|
78
|
+
return new Response("", { status: 400 });
|
|
79
|
+
if (!ready)
|
|
80
|
+
return new Response("", { status: 503 });
|
|
81
|
+
const result = await handle(message);
|
|
82
|
+
return result === undefined ? new Response("", { status: 400 }) : jsonResponse(result);
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
const module = (await import(__rewriteRelativeImportExtension(`${realpathSync(modulePath)}?isolated=${Date.now()}`)));
|
|
86
|
+
if (typeof module.default !== "function")
|
|
87
|
+
throw new Error("extension has no default factory");
|
|
88
|
+
await module.default(context);
|
|
89
|
+
post({ type: "ready", port: server.port });
|
|
90
|
+
ready = true;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
server?.stop();
|
|
94
|
+
const details = publicErrorDetails(error, "isolated extension worker failed to start", exposeErrorStacks);
|
|
95
|
+
post({
|
|
96
|
+
type: "fatal",
|
|
97
|
+
error: details.message,
|
|
98
|
+
...(details.stack === undefined ? {} : { stack: details.stack }),
|
|
99
|
+
});
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
async function handle(request) {
|
|
103
|
+
if (request.type === "shutdown") {
|
|
104
|
+
server?.stop();
|
|
105
|
+
process.exit(0);
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
if (request.type !== "invoke" ||
|
|
109
|
+
typeof request.id !== "string" ||
|
|
110
|
+
typeof request.name !== "string")
|
|
111
|
+
return undefined;
|
|
112
|
+
const tool = tools.get(request.name);
|
|
113
|
+
if (tool === undefined) {
|
|
114
|
+
return { type: "result", id: request.id, error: `unknown tool: ${request.name}` };
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const output = await tool.execute(request.input, context);
|
|
118
|
+
return { type: "result", id: request.id, output };
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
const details = publicErrorDetails(error, "tool execution failed", exposeErrorStacks);
|
|
122
|
+
return {
|
|
123
|
+
type: "result",
|
|
124
|
+
id: request.id,
|
|
125
|
+
error: details.message,
|
|
126
|
+
...(details.stack === undefined ? {} : { stack: details.stack }),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function isWorkerRequest(message) {
|
|
131
|
+
return message !== null && typeof message === "object" && !Array.isArray(message);
|
|
132
|
+
}
|
|
133
|
+
function jsonResponse(message) {
|
|
134
|
+
let text;
|
|
135
|
+
try {
|
|
136
|
+
text = JSON.stringify(message, exposeErrorStacks
|
|
137
|
+
? undefined
|
|
138
|
+
: (key, nested) => (key === "stack" ? undefined : nested));
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
text = JSON.stringify({ type: "result", id: message.id, error: "tool output is not JSON-safe" });
|
|
142
|
+
}
|
|
143
|
+
if (Buffer.byteLength(text, "utf8") > maxMessageBytes)
|
|
144
|
+
text = JSON.stringify({ type: "result", id: message.id, error: "tool output is too large" });
|
|
145
|
+
// lgtm [js/stack-trace-exposure] stacks are emitted only when the parent explicitly enables local
|
|
146
|
+
// diagnostics; the default protocol response contains only the bounded public message.
|
|
147
|
+
return new Response(text, {
|
|
148
|
+
status: 200,
|
|
149
|
+
headers: { "content-type": "application/json" },
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function post(message) {
|
|
153
|
+
process.stdout.write(`${JSON.stringify(message)}\n`);
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=isolated-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolated-worker.js","sourceRoot":"","sources":["../src/isolated-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface IsolatedExtensionWorkerOptions {
|
|
2
|
+
readonly modulePath: string;
|
|
3
|
+
readonly cwd: string;
|
|
4
|
+
readonly timeoutMs?: number;
|
|
5
|
+
readonly maxMessageBytes?: number;
|
|
6
|
+
/** Include bounded worker exception stacks for trusted local debugging. */
|
|
7
|
+
readonly exposeErrorStacks?: boolean;
|
|
8
|
+
readonly trustedCapabilities?: readonly string[];
|
|
9
|
+
}
|
|
10
|
+
export interface IsolatedExtensionTool {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly description: string;
|
|
13
|
+
readonly capabilities: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
export interface IsolatedExtensionSnapshot {
|
|
16
|
+
readonly tools: readonly IsolatedExtensionTool[];
|
|
17
|
+
readonly commands: readonly string[];
|
|
18
|
+
readonly events: readonly string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Optional process-backed extension runner. A worker crash rejects callers instead of taking down
|
|
22
|
+
* the host. It is intentionally not advertised as a hostile-code sandbox: use an OS sandbox and a
|
|
23
|
+
* capability decision before loading code you do not trust.
|
|
24
|
+
*/
|
|
25
|
+
export declare class IsolatedExtensionWorker {
|
|
26
|
+
private readonly options;
|
|
27
|
+
private process;
|
|
28
|
+
private readonly pending;
|
|
29
|
+
private readonly tools;
|
|
30
|
+
private readonly commands;
|
|
31
|
+
private readonly events;
|
|
32
|
+
private buffer;
|
|
33
|
+
private readonly token;
|
|
34
|
+
private port;
|
|
35
|
+
private started;
|
|
36
|
+
private closed;
|
|
37
|
+
private readyResolve;
|
|
38
|
+
private readyReject;
|
|
39
|
+
private readonly ready;
|
|
40
|
+
constructor(options: IsolatedExtensionWorkerOptions);
|
|
41
|
+
start(): Promise<IsolatedExtensionSnapshot>;
|
|
42
|
+
get snapshot(): IsolatedExtensionSnapshot;
|
|
43
|
+
invokeTool(name: string, input: unknown): Promise<unknown>;
|
|
44
|
+
close(): Promise<void>;
|
|
45
|
+
private sendInvoke;
|
|
46
|
+
private readOutput;
|
|
47
|
+
private readErrors;
|
|
48
|
+
private consume;
|
|
49
|
+
private handle;
|
|
50
|
+
private fail;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=isolated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolated.d.ts","sourceRoot":"","sources":["../src/isolated.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,2EAA2E;IAC3E,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IACpC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACjD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,qBAAqB,EAAE,CAAA;IAChD,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;AAwBD;;;;GAIG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGQ;IAChC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2C;IACjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,YAAY,CAA6D;IACjF,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAGpB;gBAEU,OAAO,EAAE,8BAA8B;IAuB7C,KAAK,IAAI,OAAO,CAAC,yBAAyB,CAAC;IA8BjD,IAAI,QAAQ,IAAI,yBAAyB,CAMxC;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAQd,UAAU;YAyCV,UAAU;YAmBV,UAAU;IAMxB,OAAO,CAAC,OAAO;IAuBf,OAAO,CAAC,MAAM;IAkDd,OAAO,CAAC,IAAI;CAWb"}
|
package/dist/isolated.js
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { realpathSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { readBoundedText } from "./process.js";
|
|
5
|
+
/**
|
|
6
|
+
* Optional process-backed extension runner. A worker crash rejects callers instead of taking down
|
|
7
|
+
* the host. It is intentionally not advertised as a hostile-code sandbox: use an OS sandbox and a
|
|
8
|
+
* capability decision before loading code you do not trust.
|
|
9
|
+
*/
|
|
10
|
+
export class IsolatedExtensionWorker {
|
|
11
|
+
options;
|
|
12
|
+
process;
|
|
13
|
+
pending = new Map();
|
|
14
|
+
tools = new Map();
|
|
15
|
+
commands = new Set();
|
|
16
|
+
events = new Set();
|
|
17
|
+
buffer = "";
|
|
18
|
+
token;
|
|
19
|
+
port;
|
|
20
|
+
started = false;
|
|
21
|
+
closed = false;
|
|
22
|
+
readyResolve;
|
|
23
|
+
readyReject;
|
|
24
|
+
ready = new Promise((resolveReady, rejectReady) => {
|
|
25
|
+
this.readyResolve = resolveReady;
|
|
26
|
+
this.readyReject = rejectReady;
|
|
27
|
+
});
|
|
28
|
+
constructor(options) {
|
|
29
|
+
this.options = {
|
|
30
|
+
...options,
|
|
31
|
+
timeoutMs: options.timeoutMs ?? 30_000,
|
|
32
|
+
maxMessageBytes: options.maxMessageBytes ?? 256 * 1024,
|
|
33
|
+
};
|
|
34
|
+
this.token = crypto.randomUUID().replaceAll("-", "");
|
|
35
|
+
if (!isAbsolute(options.modulePath))
|
|
36
|
+
throw new TypeError("isolated extension: modulePath must be absolute");
|
|
37
|
+
if (!isAbsolute(options.cwd))
|
|
38
|
+
throw new TypeError("isolated extension: cwd must be absolute");
|
|
39
|
+
if (!Number.isSafeInteger(this.options.timeoutMs) ||
|
|
40
|
+
this.options.timeoutMs < 1 ||
|
|
41
|
+
this.options.timeoutMs > 24 * 60 * 60_000)
|
|
42
|
+
throw new RangeError("isolated extension: timeoutMs is invalid");
|
|
43
|
+
if (!Number.isSafeInteger(this.options.maxMessageBytes) || this.options.maxMessageBytes < 1024)
|
|
44
|
+
throw new RangeError("isolated extension: maxMessageBytes must be at least 1024");
|
|
45
|
+
const modulePath = realpathSync(options.modulePath);
|
|
46
|
+
if (!isWithin(options.cwd, modulePath))
|
|
47
|
+
throw new Error("isolated extension: module escapes cwd");
|
|
48
|
+
}
|
|
49
|
+
async start() {
|
|
50
|
+
if (this.started)
|
|
51
|
+
return this.ready;
|
|
52
|
+
this.started = true;
|
|
53
|
+
const workerPath = fileURLToPath(new URL("./isolated-worker.ts", import.meta.url));
|
|
54
|
+
// Bun 1.4's Windows child IPC can start the worker but drop parent→child messages. The
|
|
55
|
+
// loopback endpoint keeps the command channel cross-platform without exposing it remotely.
|
|
56
|
+
this.process = Bun.spawn([process.execPath, workerPath, realpathSync(this.options.modulePath), this.options.cwd], {
|
|
57
|
+
cwd: this.options.cwd,
|
|
58
|
+
env: {
|
|
59
|
+
...filteredEnv(),
|
|
60
|
+
NIFRA_EXTENSION_TOKEN: this.token,
|
|
61
|
+
NIFRA_EXTENSION_MAX_MESSAGE_BYTES: String(this.options.maxMessageBytes),
|
|
62
|
+
NIFRA_EXTENSION_EXPOSE_ERROR_STACKS: this.options.exposeErrorStacks === true ? "1" : "0",
|
|
63
|
+
},
|
|
64
|
+
stdin: "ignore",
|
|
65
|
+
stdout: "pipe",
|
|
66
|
+
stderr: "pipe",
|
|
67
|
+
});
|
|
68
|
+
void this.readOutput();
|
|
69
|
+
void this.readErrors();
|
|
70
|
+
void this.process.exited.then((status) => {
|
|
71
|
+
if (!this.closed && status !== 0)
|
|
72
|
+
this.fail(new Error(`isolated extension worker exited with code ${status}`));
|
|
73
|
+
});
|
|
74
|
+
return this.ready;
|
|
75
|
+
}
|
|
76
|
+
get snapshot() {
|
|
77
|
+
return Object.freeze({
|
|
78
|
+
tools: Object.freeze([...this.tools.values()]),
|
|
79
|
+
commands: Object.freeze([...this.commands].sort()),
|
|
80
|
+
events: Object.freeze([...this.events].sort()),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async invokeTool(name, input) {
|
|
84
|
+
await this.start();
|
|
85
|
+
if (!this.tools.has(name))
|
|
86
|
+
throw new Error(`isolated extension: unknown tool ${name}`);
|
|
87
|
+
const id = crypto.randomUUID().replaceAll("-", "");
|
|
88
|
+
const abort = new AbortController();
|
|
89
|
+
const result = new Promise((resolveResult, rejectResult) => {
|
|
90
|
+
const timer = setTimeout(() => {
|
|
91
|
+
this.pending.delete(id);
|
|
92
|
+
abort.abort();
|
|
93
|
+
rejectResult(new Error(`isolated extension: tool ${name} timed out`));
|
|
94
|
+
}, this.options.timeoutMs);
|
|
95
|
+
timer.unref?.();
|
|
96
|
+
this.pending.set(id, { resolve: resolveResult, reject: rejectResult, timer, abort });
|
|
97
|
+
});
|
|
98
|
+
void this.sendInvoke(id, name, input, abort.signal).catch((error) => {
|
|
99
|
+
const pending = this.pending.get(id);
|
|
100
|
+
if (pending === undefined)
|
|
101
|
+
return;
|
|
102
|
+
clearTimeout(pending.timer);
|
|
103
|
+
this.pending.delete(id);
|
|
104
|
+
pending.reject(error);
|
|
105
|
+
});
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
async close() {
|
|
109
|
+
if (this.closed)
|
|
110
|
+
return;
|
|
111
|
+
this.closed = true;
|
|
112
|
+
this.fail(new Error("isolated extension worker closed"));
|
|
113
|
+
this.process?.kill();
|
|
114
|
+
await this.process?.exited;
|
|
115
|
+
}
|
|
116
|
+
async sendInvoke(id, name, input, signal) {
|
|
117
|
+
const port = this.port;
|
|
118
|
+
if (!isValidPort(port))
|
|
119
|
+
throw new Error("isolated extension: worker control endpoint unavailable");
|
|
120
|
+
const text = JSON.stringify({ type: "invoke", id, name, input });
|
|
121
|
+
if (Buffer.byteLength(text, "utf8") > this.options.maxMessageBytes)
|
|
122
|
+
throw new RangeError("isolated extension: message is too large");
|
|
123
|
+
const response = await fetch(`http://127.0.0.1:${port}/invoke`, {
|
|
124
|
+
method: "POST",
|
|
125
|
+
headers: {
|
|
126
|
+
authorization: `Bearer ${this.token}`,
|
|
127
|
+
"content-type": "application/json",
|
|
128
|
+
},
|
|
129
|
+
body: text,
|
|
130
|
+
signal,
|
|
131
|
+
});
|
|
132
|
+
const body = await readBoundedText(response.body, this.options.maxMessageBytes);
|
|
133
|
+
if (body.truncated)
|
|
134
|
+
throw new Error("isolated extension: worker response exceeded limit");
|
|
135
|
+
if (!response.ok)
|
|
136
|
+
throw new Error(`isolated extension: worker request failed (${response.status})`);
|
|
137
|
+
let message;
|
|
138
|
+
try {
|
|
139
|
+
message = JSON.parse(body.text);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
throw new Error("isolated extension: worker returned invalid JSON");
|
|
143
|
+
}
|
|
144
|
+
if (message.type !== "result" || message.id !== id)
|
|
145
|
+
throw new Error("isolated extension: worker returned an invalid result");
|
|
146
|
+
const pending = this.pending.get(id);
|
|
147
|
+
if (pending === undefined)
|
|
148
|
+
return;
|
|
149
|
+
clearTimeout(pending.timer);
|
|
150
|
+
this.pending.delete(id);
|
|
151
|
+
if (message.error !== undefined)
|
|
152
|
+
pending.reject(workerError(message));
|
|
153
|
+
else
|
|
154
|
+
pending.resolve(message.output);
|
|
155
|
+
}
|
|
156
|
+
async readOutput() {
|
|
157
|
+
const stdout = this.process?.stdout;
|
|
158
|
+
if (stdout === undefined || stdout === null || typeof stdout === "number")
|
|
159
|
+
return;
|
|
160
|
+
const reader = stdout.getReader();
|
|
161
|
+
const decoder = new TextDecoder();
|
|
162
|
+
try {
|
|
163
|
+
for (;;) {
|
|
164
|
+
const { done, value } = await reader.read();
|
|
165
|
+
if (done)
|
|
166
|
+
break;
|
|
167
|
+
if (value !== undefined)
|
|
168
|
+
this.consume(decoder.decode(value, { stream: true }));
|
|
169
|
+
}
|
|
170
|
+
this.consume(decoder.decode());
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
this.fail(error);
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
reader.releaseLock();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async readErrors() {
|
|
180
|
+
const stderr = this.process?.stderr;
|
|
181
|
+
if (stderr === undefined || stderr === null || typeof stderr === "number")
|
|
182
|
+
return;
|
|
183
|
+
await readBoundedText(stderr, this.options.maxMessageBytes).catch(() => { });
|
|
184
|
+
}
|
|
185
|
+
consume(text) {
|
|
186
|
+
this.buffer += text;
|
|
187
|
+
if (Buffer.byteLength(this.buffer, "utf8") > this.options.maxMessageBytes * 2) {
|
|
188
|
+
this.fail(new Error("isolated extension: worker output exceeded limit"));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
for (;;) {
|
|
192
|
+
const newline = this.buffer.indexOf("\n");
|
|
193
|
+
if (newline < 0)
|
|
194
|
+
return;
|
|
195
|
+
const line = this.buffer.slice(0, newline);
|
|
196
|
+
this.buffer = this.buffer.slice(newline + 1);
|
|
197
|
+
if (line.length === 0)
|
|
198
|
+
continue;
|
|
199
|
+
let message;
|
|
200
|
+
try {
|
|
201
|
+
message = JSON.parse(line);
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
this.fail(new Error("isolated extension: worker emitted invalid JSON"));
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
this.handle(message);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
handle(message) {
|
|
211
|
+
if (message.type === "ready") {
|
|
212
|
+
const port = message.port;
|
|
213
|
+
if (!isValidPort(port)) {
|
|
214
|
+
this.fail(new Error("isolated extension: worker control endpoint is invalid"));
|
|
215
|
+
this.process?.kill();
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
this.port = port;
|
|
219
|
+
this.readyResolve?.(this.snapshot);
|
|
220
|
+
this.readyResolve = undefined;
|
|
221
|
+
this.readyReject = undefined;
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (message.type === "registration") {
|
|
225
|
+
const denied = (message.capabilities ?? []).find((capability) => !(this.options.trustedCapabilities ?? []).includes(capability));
|
|
226
|
+
if (denied !== undefined) {
|
|
227
|
+
this.fail(new Error(`isolated extension: untrusted capability ${denied}`));
|
|
228
|
+
this.process?.kill();
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (typeof message.name === "string")
|
|
232
|
+
this.tools.set(message.name, Object.freeze({
|
|
233
|
+
name: message.name,
|
|
234
|
+
description: message.description ?? "",
|
|
235
|
+
capabilities: Object.freeze([...(message.capabilities ?? [])]),
|
|
236
|
+
}));
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
if (message.type === "fatal") {
|
|
240
|
+
this.fail(workerError(message));
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (message.type === "command" && typeof message.name === "string")
|
|
244
|
+
this.commands.add(message.name);
|
|
245
|
+
if (message.type === "event" && typeof message.name === "string")
|
|
246
|
+
this.events.add(message.name);
|
|
247
|
+
if (message.type !== "result" || typeof message.id !== "string")
|
|
248
|
+
return;
|
|
249
|
+
const pending = this.pending.get(message.id);
|
|
250
|
+
if (pending === undefined)
|
|
251
|
+
return;
|
|
252
|
+
clearTimeout(pending.timer);
|
|
253
|
+
this.pending.delete(message.id);
|
|
254
|
+
if (message.error !== undefined)
|
|
255
|
+
pending.reject(workerError(message));
|
|
256
|
+
else
|
|
257
|
+
pending.resolve(message.output);
|
|
258
|
+
}
|
|
259
|
+
fail(error) {
|
|
260
|
+
this.readyReject?.(error);
|
|
261
|
+
this.readyReject = undefined;
|
|
262
|
+
this.readyResolve = undefined;
|
|
263
|
+
for (const pending of this.pending.values()) {
|
|
264
|
+
clearTimeout(pending.timer);
|
|
265
|
+
pending.abort.abort();
|
|
266
|
+
pending.reject(error);
|
|
267
|
+
}
|
|
268
|
+
this.pending.clear();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function isWithin(root, candidate) {
|
|
272
|
+
const path = relative(resolve(root), resolve(candidate));
|
|
273
|
+
return path === "" || (!path.startsWith("..") && !path.includes("/.."));
|
|
274
|
+
}
|
|
275
|
+
function isValidPort(value) {
|
|
276
|
+
return Number.isSafeInteger(value) && value >= 1 && value <= 65_535;
|
|
277
|
+
}
|
|
278
|
+
function workerError(message) {
|
|
279
|
+
const error = new Error(message.error ?? "isolated extension worker failed");
|
|
280
|
+
if (message.stack !== undefined)
|
|
281
|
+
error.stack = message.stack;
|
|
282
|
+
return error;
|
|
283
|
+
}
|
|
284
|
+
function filteredEnv() {
|
|
285
|
+
const result = {};
|
|
286
|
+
for (const name of ["PATH", "HOME", "LANG", "LC_ALL", "TERM"]) {
|
|
287
|
+
const value = process.env[name];
|
|
288
|
+
if (value !== undefined)
|
|
289
|
+
result[name] = value;
|
|
290
|
+
}
|
|
291
|
+
return result;
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=isolated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolated.js","sourceRoot":"","sources":["../src/isolated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AA8C9C;;;;GAIG;AACH,MAAM,OAAO,uBAAuB;IACjB,OAAO,CAGQ;IACxB,OAAO,CAA4B;IAC1B,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAA;IACxC,KAAK,GAAG,IAAI,GAAG,EAAiC,CAAA;IAChD,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAC5B,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;IACnC,MAAM,GAAG,EAAE,CAAA;IACF,KAAK,CAAQ;IACtB,IAAI,CAAoB;IACxB,OAAO,GAAG,KAAK,CAAA;IACf,MAAM,GAAG,KAAK,CAAA;IACd,YAAY,CAA6D;IACzE,WAAW,CAA0C;IAC5C,KAAK,GAAG,IAAI,OAAO,CAA4B,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE;QAC5F,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,YAAY,OAAuC;QACjD,IAAI,CAAC,OAAO,GAAG;YACb,GAAG,OAAO;YACV,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,MAAM;YACtC,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,GAAG,GAAG,IAAI;SACvD,CAAA;QACD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QACpD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC;YACjC,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAA;QACxE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAA;QAC7F,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM;YAEzC,MAAM,IAAI,UAAU,CAAC,0CAA0C,CAAC,CAAA;QAClE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,IAAI;YAC5F,MAAM,IAAI,UAAU,CAAC,2DAA2D,CAAC,CAAA;QACnF,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACnD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAClF,uFAAuF;QACvF,2FAA2F;QAC3F,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,KAAK,CACtB,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EACvF;YACE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;YACrB,GAAG,EAAE;gBACH,GAAG,WAAW,EAAE;gBAChB,qBAAqB,EAAE,IAAI,CAAC,KAAK;gBACjC,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;gBACvE,mCAAmC,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;aACzF;YACD,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;SACf,CACF,CAAA;QACD,KAAK,IAAI,CAAC,UAAU,EAAE,CAAA;QACtB,KAAK,IAAI,CAAC,UAAU,EAAE,CAAA;QACtB,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACvC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,8CAA8C,MAAM,EAAE,CAAC,CAAC,CAAA;QAChF,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YAClD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;SAC/C,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,KAAc;QAC3C,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;QAClB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAA;QACtF,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAClD,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,MAAM,MAAM,GAAG,IAAI,OAAO,CAAU,CAAC,aAAa,EAAE,YAAY,EAAE,EAAE;YAClE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBACvB,KAAK,CAAC,KAAK,EAAE,CAAA;gBACb,YAAY,CAAC,IAAI,KAAK,CAAC,4BAA4B,IAAI,YAAY,CAAC,CAAC,CAAA;YACvE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CACzB;YAAC,KAA2C,CAAC,KAAK,EAAE,EAAE,CAAA;YACvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QACtF,CAAC,CAAC,CAAA;QACF,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACpC,IAAI,OAAO,KAAK,SAAS;gBAAE,OAAM;YACjC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;QACF,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAA;QACxD,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAA;QACpB,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,CAAA;IAC5B,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,EAAU,EACV,IAAY,EACZ,KAAc,EACd,MAAmB;QAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAChE,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe;YAChE,MAAM,IAAI,UAAU,CAAC,0CAA0C,CAAC,CAAA;QAClE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,SAAS,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;gBACrC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI;YACV,MAAM;SACP,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;QAC/E,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;QACzF,IAAI,CAAC,QAAQ,CAAC,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,8CAA8C,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;QACnF,IAAI,OAAsB,CAAA;QAC1B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAkB,CAAA;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;QACrE,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE;YAChD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACpC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAM;QACjC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACvB,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;;YAChE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAA;QACnC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAM;QACjF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;QACjC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;QACjC,IAAI,CAAC;YACH,SAAS,CAAC;gBACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;gBAC3C,IAAI,IAAI;oBAAE,MAAK;gBACf,IAAI,KAAK,KAAK,SAAS;oBAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YAChF,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClB,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAA;QACtB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAA;QACnC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAM;QACjF,MAAM,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC7E,CAAC;IAEO,OAAO,CAAC,IAAY;QAC1B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAA;QACnB,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YAC9E,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC,CAAA;YACxE,OAAM;QACR,CAAC;QACD,SAAS,CAAC;YACR,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACzC,IAAI,OAAO,GAAG,CAAC;gBAAE,OAAM;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;YAC5C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAQ;YAC/B,IAAI,OAAsB,CAAA;YAC1B,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAA;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC,CAAA;gBACvE,OAAM;YACR,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,OAAsB;QACnC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;YACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC,CAAA;gBAC9E,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAA;gBACpB,OAAM;YACR,CAAC;YACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAA;YAC7B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;YAC5B,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,CAC9C,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC/E,CAAA;YACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,4CAA4C,MAAM,EAAE,CAAC,CAAC,CAAA;gBAC1E,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAA;gBACpB,OAAM;YACR,CAAC;YACD,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;gBAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,OAAO,CAAC,IAAI,EACZ,MAAM,CAAC,MAAM,CAAC;oBACZ,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;oBACtC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;iBAC/D,CAAC,CACH,CAAA;YACH,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;YAC/B,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;YAChE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC/F,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;YAAE,OAAM;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC5C,IAAI,OAAO,KAAK,SAAS;YAAE,OAAM;QACjC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;;YAChE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC;IAEO,IAAI,CAAC,KAAc;QACzB,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAA;QACzB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;QAC5B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAA;QAC7B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACvB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,SAAiB;IAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;IACxD,OAAO,IAAI,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;AACzE,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAK,KAAgB,IAAI,CAAC,IAAK,KAAgB,IAAI,MAAM,CAAA;AAC7F,CAAC;AAED,SAAS,WAAW,CAAC,OAAsB;IACzC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,kCAAkC,CAAC,CAAA;IAC5E,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;IAC5D,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IAC/C,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|