@evref-bl/plexus-gateway 0.1.0-alpha.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,107 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import { type ImageMcpToolRouter } from "./imageMcpRouter.js";
3
+ import { PlexusRoutingTable, type GatewayProjectRoute, type GatewayProjectState } from "./routingTable.js";
4
+ export interface GatewayImageHealthClient {
5
+ check(port: number): Promise<boolean>;
6
+ }
7
+ export interface HttpGatewayImageHealthClientOptions {
8
+ host?: string;
9
+ paths?: string[];
10
+ mcpPath?: string;
11
+ probeMethods?: string[];
12
+ timeoutMs?: number;
13
+ }
14
+ export declare class HttpGatewayImageHealthClient implements GatewayImageHealthClient {
15
+ private readonly host;
16
+ private readonly paths;
17
+ private readonly mcpPath;
18
+ private readonly probeMethods;
19
+ private readonly timeoutMs;
20
+ constructor(options?: HttpGatewayImageHealthClientOptions);
21
+ check(port: number): Promise<boolean>;
22
+ private fetchWithTimeout;
23
+ private isJsonRpcResponse;
24
+ }
25
+ export interface PlexusGatewayOptions {
26
+ routingTable?: PlexusRoutingTable;
27
+ imageRouter?: ImageMcpToolRouter;
28
+ healthClient?: GatewayImageHealthClient;
29
+ pharoTools?: readonly Tool[];
30
+ pharoScope?: GatewayRouteReferenceInput;
31
+ }
32
+ export interface GatewayRouteReferenceInput {
33
+ projectId?: string;
34
+ workspaceId?: string;
35
+ targetId?: string;
36
+ }
37
+ export interface GatewayRegisterTargetInput {
38
+ projectRoot: string;
39
+ statePath: string;
40
+ state: GatewayProjectState;
41
+ }
42
+ export interface GatewayStatusToolInput extends GatewayRouteReferenceInput {
43
+ refreshHealth?: boolean;
44
+ }
45
+ export interface GatewayUnregisterTargetResult {
46
+ removed: boolean;
47
+ route?: GatewayProjectRoute;
48
+ }
49
+ export interface GatewayCleanupStaleRoutesResult {
50
+ removed: GatewayProjectRoute[];
51
+ }
52
+ export interface RouteToImageToolInput extends GatewayRouteReferenceInput {
53
+ imageId: string;
54
+ toolName: string;
55
+ arguments?: Record<string, unknown>;
56
+ }
57
+ export interface RouteToImageRoute {
58
+ projectId: string;
59
+ workspaceId: string;
60
+ targetId: string;
61
+ imageId: string;
62
+ imageName: string;
63
+ port: number;
64
+ }
65
+ export interface GatewayToolResult<T = unknown> {
66
+ ok: boolean;
67
+ data?: T;
68
+ error?: string;
69
+ route?: RouteToImageRoute;
70
+ }
71
+ export interface RouteToImageResult {
72
+ route: RouteToImageRoute;
73
+ result: unknown;
74
+ }
75
+ export interface RoutedImageToolCall {
76
+ route: RouteToImageRoute;
77
+ result: unknown;
78
+ }
79
+ export declare class PlexusGateway {
80
+ private readonly routingTable;
81
+ private readonly imageRouter;
82
+ private readonly healthClient;
83
+ private readonly pharoTools;
84
+ private readonly pharoToolNames;
85
+ private readonly pharoScope;
86
+ constructor(options?: PlexusGatewayOptions);
87
+ listPharoTools(): Tool[];
88
+ isPharoTool(name: string): boolean;
89
+ registerTarget(input: GatewayRegisterTargetInput): Promise<GatewayToolResult<GatewayProjectRoute>>;
90
+ registerProjectRoute(input: GatewayRegisterTargetInput): Promise<GatewayToolResult<GatewayProjectRoute>>;
91
+ unregisterTarget(input: GatewayRouteReferenceInput): Promise<GatewayToolResult<GatewayUnregisterTargetResult>>;
92
+ unregisterProjectRoute(input: GatewayRouteReferenceInput): Promise<GatewayToolResult<GatewayUnregisterTargetResult>>;
93
+ status(input: GatewayStatusToolInput): Promise<GatewayToolResult<GatewayProjectRoute | GatewayProjectRoute[]>>;
94
+ getRouteStatus(input: GatewayStatusToolInput): Promise<GatewayToolResult<GatewayProjectRoute | GatewayProjectRoute[]>>;
95
+ cleanupStaleRoutes(): Promise<GatewayToolResult<GatewayCleanupStaleRoutesResult>>;
96
+ routeToImage(input: RouteToImageToolInput): Promise<GatewayToolResult<unknown>>;
97
+ callImageTool(reference: GatewayRouteReferenceInput, imageId: string, toolName: string, argumentsValue: Record<string, unknown>): Promise<unknown>;
98
+ callPharoTool(toolName: string, inputValue: unknown): Promise<GatewayToolResult<unknown>>;
99
+ handleTool(name: string, inputValue: unknown): Promise<GatewayToolResult>;
100
+ private findRegisteredRoute;
101
+ private resolveProjectRoutes;
102
+ private resolveSingleProjectRoute;
103
+ private callRoutedImageTool;
104
+ private resolveImageRoute;
105
+ private refreshProjectHealth;
106
+ }
107
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,445 @@
1
+ import { StreamableHttpImageMcpToolRouter, } from "./imageMcpRouter.js";
2
+ import { buildPharoFacadeTools, parsePharoFacadeArguments, } from "./pharoFacade.js";
3
+ import { PlexusRoutingTable, } from "./routingTable.js";
4
+ export class HttpGatewayImageHealthClient {
5
+ host;
6
+ paths;
7
+ mcpPath;
8
+ probeMethods;
9
+ timeoutMs;
10
+ constructor(options = {}) {
11
+ this.host = options.host ?? "127.0.0.1";
12
+ this.paths = options.paths ?? ["/health"];
13
+ this.mcpPath = options.mcpPath ?? "/";
14
+ this.probeMethods = options.probeMethods ?? ["ping"];
15
+ this.timeoutMs = options.timeoutMs ?? 1_000;
16
+ }
17
+ async check(port) {
18
+ for (const method of this.probeMethods) {
19
+ try {
20
+ const response = await this.fetchWithTimeout(`http://${this.host}:${port}${this.mcpPath}`, {
21
+ method: "POST",
22
+ headers: {
23
+ accept: "application/json, text/event-stream",
24
+ "content-type": "application/json",
25
+ },
26
+ body: JSON.stringify({
27
+ jsonrpc: "2.0",
28
+ id: "plexus-gateway-health-check",
29
+ method,
30
+ }),
31
+ });
32
+ if (await this.isJsonRpcResponse(response)) {
33
+ return true;
34
+ }
35
+ }
36
+ catch {
37
+ // Route health is best-effort and should not hide route status.
38
+ }
39
+ }
40
+ for (const pathname of this.paths) {
41
+ try {
42
+ const response = await this.fetchWithTimeout(`http://${this.host}:${port}${pathname}`);
43
+ if (response.ok) {
44
+ return true;
45
+ }
46
+ }
47
+ catch {
48
+ // Route health is best-effort and should not hide route status.
49
+ }
50
+ }
51
+ return false;
52
+ }
53
+ async fetchWithTimeout(input, init = {}) {
54
+ const controller = new AbortController();
55
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
56
+ try {
57
+ const response = await fetch(input, {
58
+ ...init,
59
+ signal: controller.signal,
60
+ });
61
+ return response;
62
+ }
63
+ finally {
64
+ clearTimeout(timeout);
65
+ }
66
+ }
67
+ async isJsonRpcResponse(response) {
68
+ let payload;
69
+ try {
70
+ payload = await response.json();
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ if (!isObject(payload)) {
76
+ return false;
77
+ }
78
+ return (payload.jsonrpc === "2.0" &&
79
+ ("result" in payload || "error" in payload));
80
+ }
81
+ }
82
+ class GatewayInputError extends Error {
83
+ constructor(message) {
84
+ super(message);
85
+ this.name = "GatewayInputError";
86
+ }
87
+ }
88
+ function isObject(value) {
89
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
90
+ }
91
+ function requireString(input, key) {
92
+ const value = input[key];
93
+ if (typeof value !== "string" || value.length === 0) {
94
+ throw new GatewayInputError(`${key} is required`);
95
+ }
96
+ return value;
97
+ }
98
+ function optionalString(input, key) {
99
+ const value = input[key];
100
+ if (value === undefined) {
101
+ return undefined;
102
+ }
103
+ if (typeof value !== "string" || value.length === 0) {
104
+ throw new GatewayInputError(`${key} must be a non-empty string`);
105
+ }
106
+ return value;
107
+ }
108
+ function optionalBoolean(input, key) {
109
+ const value = input[key];
110
+ if (value === undefined) {
111
+ return false;
112
+ }
113
+ if (typeof value !== "boolean") {
114
+ throw new GatewayInputError(`${key} must be a boolean`);
115
+ }
116
+ return value;
117
+ }
118
+ function optionalObject(input, key) {
119
+ const value = input[key];
120
+ if (value === undefined) {
121
+ return {};
122
+ }
123
+ if (!isObject(value)) {
124
+ throw new GatewayInputError(`${key} must be an object`);
125
+ }
126
+ return value;
127
+ }
128
+ function objectInput(input) {
129
+ if (!isObject(input)) {
130
+ return {};
131
+ }
132
+ return input;
133
+ }
134
+ function stateInput(input) {
135
+ const value = input.state;
136
+ if (!isObject(value)) {
137
+ throw new GatewayInputError("state is required");
138
+ }
139
+ const images = value.images;
140
+ if (!Array.isArray(images)) {
141
+ throw new GatewayInputError("state.images must be an array");
142
+ }
143
+ return {
144
+ projectId: requireString(value, "projectId"),
145
+ projectName: requireString(value, "projectName"),
146
+ workspaceId: requireString(value, "workspaceId"),
147
+ targetId: requireString(value, "targetId"),
148
+ updatedAt: requireString(value, "updatedAt"),
149
+ ...(isObject(value.pharoMcpContract)
150
+ ? { pharoMcpContract: value.pharoMcpContract }
151
+ : {}),
152
+ images: images.map((image, index) => {
153
+ if (!isObject(image)) {
154
+ throw new GatewayInputError(`state.images[${index}] must be an object`);
155
+ }
156
+ const assignedPort = image.assignedPort;
157
+ const pid = image.pid;
158
+ if (typeof assignedPort !== "number" || !Number.isInteger(assignedPort)) {
159
+ throw new GatewayInputError(`state.images[${index}].assignedPort must be an integer`);
160
+ }
161
+ if (pid !== undefined && (typeof pid !== "number" || !Number.isInteger(pid))) {
162
+ throw new GatewayInputError(`state.images[${index}].pid must be an integer`);
163
+ }
164
+ const status = requireString(image, "status");
165
+ if (status !== "starting" &&
166
+ status !== "running" &&
167
+ status !== "stopped" &&
168
+ status !== "failed") {
169
+ throw new GatewayInputError(`state.images[${index}].status must be starting, running, stopped, or failed`);
170
+ }
171
+ return {
172
+ id: requireString(image, "id"),
173
+ imageName: requireString(image, "imageName"),
174
+ assignedPort,
175
+ ...(pid ? { pid } : {}),
176
+ status,
177
+ ...(isObject(image.pharoMcpContract)
178
+ ? { pharoMcpContract: image.pharoMcpContract }
179
+ : {}),
180
+ };
181
+ }),
182
+ };
183
+ }
184
+ function assertProjectRoute(route, identity) {
185
+ if (!route) {
186
+ throw new GatewayInputError(`No route is registered for: ${identity}`);
187
+ }
188
+ return route;
189
+ }
190
+ function assertImageRoute(project, imageId) {
191
+ const image = project.images.find((candidate) => candidate.id === imageId);
192
+ if (!image) {
193
+ throw new GatewayInputError(`No route is registered for image ${imageId} in project ${project.projectId}`);
194
+ }
195
+ return image;
196
+ }
197
+ function result(data) {
198
+ return { ok: true, data };
199
+ }
200
+ function failure(error) {
201
+ return {
202
+ ok: false,
203
+ error: error instanceof Error ? error.message : String(error),
204
+ };
205
+ }
206
+ export class PlexusGateway {
207
+ routingTable;
208
+ imageRouter;
209
+ healthClient;
210
+ pharoTools;
211
+ pharoToolNames;
212
+ pharoScope;
213
+ constructor(options = {}) {
214
+ this.routingTable = options.routingTable ?? new PlexusRoutingTable();
215
+ this.imageRouter =
216
+ options.imageRouter ?? new StreamableHttpImageMcpToolRouter();
217
+ this.healthClient =
218
+ options.healthClient ?? new HttpGatewayImageHealthClient();
219
+ this.pharoTools = buildPharoFacadeTools(options.pharoTools ?? []);
220
+ this.pharoToolNames = new Set(this.pharoTools.map((tool) => tool.name));
221
+ this.pharoScope = options.pharoScope ?? {};
222
+ }
223
+ listPharoTools() {
224
+ return this.pharoTools.map((tool) => ({ ...tool }));
225
+ }
226
+ isPharoTool(name) {
227
+ return this.pharoToolNames.has(name);
228
+ }
229
+ async registerTarget(input) {
230
+ try {
231
+ return result(this.routingTable.upsertProject(input.projectRoot, input.statePath, input.state));
232
+ }
233
+ catch (error) {
234
+ return failure(error);
235
+ }
236
+ }
237
+ async registerProjectRoute(input) {
238
+ return this.registerTarget(input);
239
+ }
240
+ async unregisterTarget(input) {
241
+ try {
242
+ const route = this.findRegisteredRoute(input);
243
+ const removed = route
244
+ ? this.routingTable.removeTarget(route.targetId)
245
+ : undefined;
246
+ return result({
247
+ removed: Boolean(removed),
248
+ ...(removed ? { route: removed } : {}),
249
+ });
250
+ }
251
+ catch (error) {
252
+ return failure(error);
253
+ }
254
+ }
255
+ async unregisterProjectRoute(input) {
256
+ return this.unregisterTarget(input);
257
+ }
258
+ async status(input) {
259
+ try {
260
+ const routes = await this.resolveProjectRoutes(input);
261
+ if (input.refreshHealth) {
262
+ for (const route of routes) {
263
+ await this.refreshProjectHealth(route);
264
+ }
265
+ }
266
+ return result(routes.length === 1 ? routes[0] : routes);
267
+ }
268
+ catch (error) {
269
+ return failure(error);
270
+ }
271
+ }
272
+ async getRouteStatus(input) {
273
+ return this.status(input);
274
+ }
275
+ async cleanupStaleRoutes() {
276
+ try {
277
+ return result({
278
+ removed: this.routingTable.removeRoutesWithMissingStatePaths(),
279
+ });
280
+ }
281
+ catch (error) {
282
+ return failure(error);
283
+ }
284
+ }
285
+ async routeToImage(input) {
286
+ try {
287
+ const routed = await this.callRoutedImageTool(input, input.imageId, input.toolName, input.arguments ?? {});
288
+ return {
289
+ ok: true,
290
+ data: routed.result,
291
+ route: routed.route,
292
+ };
293
+ }
294
+ catch (error) {
295
+ return failure(error);
296
+ }
297
+ }
298
+ async callImageTool(reference, imageId, toolName, argumentsValue) {
299
+ const routed = await this.routeToImage({
300
+ ...reference,
301
+ imageId,
302
+ toolName,
303
+ arguments: argumentsValue,
304
+ });
305
+ if (!routed.ok) {
306
+ throw new GatewayInputError(routed.error ?? "Image route failed");
307
+ }
308
+ return routed.data;
309
+ }
310
+ async callPharoTool(toolName, inputValue) {
311
+ try {
312
+ if (!this.isPharoTool(toolName)) {
313
+ throw new GatewayInputError(`Unknown Pharo tool: ${toolName}`);
314
+ }
315
+ const parsed = parsePharoFacadeArguments(inputValue);
316
+ const routed = await this.callRoutedImageTool(this.pharoScope, parsed.imageId, toolName, parsed.argumentsValue);
317
+ return result(routed.result);
318
+ }
319
+ catch (error) {
320
+ return failure(error);
321
+ }
322
+ }
323
+ async handleTool(name, inputValue) {
324
+ try {
325
+ const input = objectInput(inputValue);
326
+ switch (name) {
327
+ case "plexus_gateway_register_target":
328
+ return this.registerTarget({
329
+ projectRoot: requireString(input, "projectRoot"),
330
+ statePath: requireString(input, "statePath"),
331
+ state: stateInput(input),
332
+ });
333
+ case "plexus_gateway_unregister_target":
334
+ return this.unregisterTarget({
335
+ projectId: optionalString(input, "projectId"),
336
+ workspaceId: optionalString(input, "workspaceId"),
337
+ targetId: optionalString(input, "targetId"),
338
+ });
339
+ case "plexus_gateway_status":
340
+ return this.status({
341
+ projectId: optionalString(input, "projectId"),
342
+ workspaceId: optionalString(input, "workspaceId"),
343
+ targetId: optionalString(input, "targetId"),
344
+ refreshHealth: optionalBoolean(input, "refreshHealth"),
345
+ });
346
+ case "plexus_gateway_cleanup_stale_routes":
347
+ return this.cleanupStaleRoutes();
348
+ case "plexus_route_to_image":
349
+ return this.routeToImage({
350
+ projectId: optionalString(input, "projectId"),
351
+ workspaceId: optionalString(input, "workspaceId"),
352
+ targetId: optionalString(input, "targetId"),
353
+ imageId: requireString(input, "imageId"),
354
+ toolName: requireString(input, "toolName"),
355
+ arguments: optionalObject(input, "arguments"),
356
+ });
357
+ default:
358
+ return {
359
+ ok: false,
360
+ error: `Unknown tool: ${name}`,
361
+ };
362
+ }
363
+ }
364
+ catch (error) {
365
+ return failure(error);
366
+ }
367
+ }
368
+ findRegisteredRoute(input) {
369
+ if (input.targetId) {
370
+ return this.routingTable.getTarget(input.targetId);
371
+ }
372
+ if (input.projectId && input.workspaceId) {
373
+ return this.routingTable.getProjectWorkspace(input.projectId, input.workspaceId);
374
+ }
375
+ throw new GatewayInputError("targetId or projectId with workspaceId is required");
376
+ }
377
+ async resolveProjectRoutes(input) {
378
+ if (input.targetId) {
379
+ return [
380
+ assertProjectRoute(this.routingTable.getTarget(input.targetId), input.targetId),
381
+ ];
382
+ }
383
+ if (input.projectId && input.workspaceId) {
384
+ return [
385
+ assertProjectRoute(this.routingTable.getProjectWorkspace(input.projectId, input.workspaceId), `${input.projectId}/${input.workspaceId}`),
386
+ ];
387
+ }
388
+ if (input.projectId) {
389
+ return this.routingTable.listProjectTargets(input.projectId);
390
+ }
391
+ return this.routingTable.listTargets();
392
+ }
393
+ async resolveSingleProjectRoute(input) {
394
+ const routes = await this.resolveProjectRoutes(input);
395
+ if (routes.length === 0) {
396
+ throw new GatewayInputError("targetId or projectId with workspaceId is required");
397
+ }
398
+ if (routes.length > 1) {
399
+ throw new GatewayInputError("Multiple routes match; provide targetId or workspaceId");
400
+ }
401
+ return routes[0];
402
+ }
403
+ async callRoutedImageTool(projectReference, imageId, toolName, argumentsValue) {
404
+ const project = await this.resolveSingleProjectRoute(projectReference);
405
+ const image = this.resolveImageRoute(project, imageId);
406
+ if (!image.routable.ok) {
407
+ throw new GatewayInputError(image.routable.message);
408
+ }
409
+ const route = {
410
+ projectId: project.projectId,
411
+ workspaceId: project.workspaceId,
412
+ targetId: project.targetId,
413
+ imageId: image.id,
414
+ imageName: image.imageName,
415
+ port: image.port,
416
+ };
417
+ const toolResult = await this.imageRouter.callTool(route, toolName, argumentsValue);
418
+ return {
419
+ route,
420
+ result: toolResult,
421
+ };
422
+ }
423
+ resolveImageRoute(project, imageId) {
424
+ const image = project.images.find((candidate) => candidate.id === imageId);
425
+ if (image) {
426
+ return image;
427
+ }
428
+ const otherWorkspace = this.routingTable.findImageOutsideTarget(project.projectId, project.targetId, imageId);
429
+ if (otherWorkspace) {
430
+ throw new GatewayInputError(`Image ${imageId} is registered outside workspace ${project.workspaceId}; requested target ${project.targetId}, found target ${otherWorkspace.targetId}`);
431
+ }
432
+ return assertImageRoute(project, imageId);
433
+ }
434
+ async refreshProjectHealth(route) {
435
+ for (const image of route.images) {
436
+ if (image.status !== "running") {
437
+ this.routingTable.updateImageHealth(route.targetId, image.id, "unknown");
438
+ continue;
439
+ }
440
+ const healthy = await this.healthClient.check(image.port);
441
+ this.routingTable.updateImageHealth(route.targetId, image.id, healthy ? "healthy" : "unhealthy");
442
+ }
443
+ }
444
+ }
445
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface ImageMcpRoute {
2
+ projectId: string;
3
+ workspaceId: string;
4
+ targetId: string;
5
+ imageId: string;
6
+ imageName: string;
7
+ port: number;
8
+ }
9
+ export interface ImageMcpToolRouter {
10
+ callTool(route: ImageMcpRoute, toolName: string, argumentsValue: Record<string, unknown>): Promise<unknown>;
11
+ }
12
+ export interface StreamableHttpImageMcpToolRouterOptions {
13
+ host?: string;
14
+ path?: string;
15
+ timeoutMs?: number;
16
+ }
17
+ export declare class StreamableHttpImageMcpToolRouter implements ImageMcpToolRouter {
18
+ private readonly host;
19
+ private readonly path;
20
+ private readonly timeoutMs;
21
+ constructor(options?: StreamableHttpImageMcpToolRouterOptions);
22
+ callTool(route: ImageMcpRoute, toolName: string, argumentsValue: Record<string, unknown>): Promise<unknown>;
23
+ private postJsonRpc;
24
+ }
25
+ //# sourceMappingURL=imageMcpRouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageMcpRouter.d.ts","sourceRoot":"","sources":["../src/imageMcpRouter.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CACN,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,uCAAuC;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,gCAAiC,YAAW,kBAAkB;IACzE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,GAAE,uCAA4C;IAM3D,QAAQ,CACZ,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,OAAO,CAAC,OAAO,CAAC;YAsBL,WAAW;CA4E1B"}