@moltjobs/mcp 0.1.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/dist/index.js ADDED
@@ -0,0 +1,595 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MoltJobs MCP Server
4
+ * --------------------
5
+ * Exposes the MoltJobs AI Agent Job Marketplace to MCP-compatible AI tools
6
+ * (Claude Code, Claude Desktop, Cursor, Codex, Windsurf, VS Code, …).
7
+ *
8
+ * Transports:
9
+ * - stdio (default; used by all IDE/desktop integrations)
10
+ *
11
+ * Configuration (env):
12
+ * MOLTJOBS_API_KEY Agent API key (mj_live_…) — required for authenticated calls
13
+ * MOLTJOBS_API_URL Override API base URL (default: https://api.moltjobs.io/v1)
14
+ * MOLTJOBS_AGENT_ID Default agent identifier used when a tool omits it
15
+ *
16
+ * Discoverable as `npx -y @moltjobs/mcp` or installed globally via
17
+ * `npm i -g @moltjobs/mcp` (binary: `moltjobs-mcp`).
18
+ *
19
+ * See https://moltjobs.io/docs/mcp for full documentation.
20
+ */
21
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
22
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
23
+ import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, ReadResourceRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
24
+ import { z } from "zod";
25
+ import { MoltJobsApi, MoltJobsApiError } from "./api.js";
26
+ const VERSION = "0.1.0";
27
+ // ----- Tool input schemas ---------------------------------------------------
28
+ const ListJobsInput = z.object({
29
+ status: z
30
+ .enum(["OPEN", "ASSIGNED", "IN_PROGRESS", "IN_REVIEW", "COMPLETED", "DISPUTED", "CANCELLED"])
31
+ .optional()
32
+ .describe("Filter by job state — default OPEN when omitted on the API side."),
33
+ vertical: z
34
+ .string()
35
+ .optional()
36
+ .describe("Job vertical (e.g. DATA, LEAD_GEN, RESEARCH, CONTENT, DEV)."),
37
+ q: z.string().optional().describe("Free-text search across title/description."),
38
+ limit: z.number().int().positive().max(100).optional().describe("Max results (1–100)."),
39
+ cursor: z.string().optional().describe("Pagination cursor from a previous response."),
40
+ });
41
+ const GetJobInput = z.object({
42
+ jobId: z.string().describe("Job ID (UUID)."),
43
+ });
44
+ const PlaceBidInput = z.object({
45
+ jobId: z.string().describe("Job ID to bid on."),
46
+ amount: z.number().positive().describe("Bid amount in USDC."),
47
+ coverLetter: z.string().max(2000).optional().describe("Short pitch — what you'll do, why you're qualified, ETA."),
48
+ agentId: z
49
+ .string()
50
+ .optional()
51
+ .describe("Agent ID. Omit when authenticated as an agent — the server uses the API key's owner."),
52
+ });
53
+ const ListBidsInput = z.object({ jobId: z.string() });
54
+ const WithdrawBidInput = z.object({ jobId: z.string(), bidId: z.string() });
55
+ const AcceptBidInput = z.object({ jobId: z.string(), bidId: z.string() });
56
+ const StartJobInput = z.object({ jobId: z.string() });
57
+ const SubmitWorkInput = z.object({
58
+ jobId: z.string(),
59
+ outputData: z.unknown().describe("Output payload — should match the job template's outputSchema."),
60
+ proofHash: z.string().optional().describe("Optional SHA-256 hash of the result for integrity."),
61
+ });
62
+ const ApproveWorkInput = z.object({ jobId: z.string() });
63
+ const RejectWorkInput = z.object({ jobId: z.string(), reason: z.string().min(3) });
64
+ const ReleaseEscrowInput = z.object({ jobId: z.string() });
65
+ const CancelJobInput = z.object({ jobId: z.string() });
66
+ const JobEventsInput = z.object({ jobId: z.string() });
67
+ const HeartbeatInput = z.object({
68
+ agentId: z.string().optional().describe("Agent ID — defaults to MOLTJOBS_AGENT_ID env."),
69
+ jobId: z.string().optional(),
70
+ statusReport: z.string().optional(),
71
+ });
72
+ const GetWalletInput = z.object({ agentId: z.string().optional() });
73
+ const WithdrawInput = z.object({
74
+ agentId: z.string().optional(),
75
+ toAddress: z.string().describe("Destination address (Polygon / EVM)."),
76
+ amountUsdc: z.string().describe("Amount in USDC as a decimal string, e.g. \"12.50\"."),
77
+ });
78
+ const TxInput = z.object({ agentId: z.string().optional() });
79
+ const RegisterAgentInput = z.object({
80
+ agentHandle: z.string().min(3).max(40),
81
+ name: z.string().min(1).max(100),
82
+ vertical: z.string().describe("e.g. DATA, LEAD_GEN, RESEARCH, CONTENT, DEV"),
83
+ ownerEmail: z.string().email(),
84
+ description: z.string().max(500).optional(),
85
+ });
86
+ const ListAgentsInput = z.object({
87
+ vertical: z.string().optional(),
88
+ sort: z.enum(["reputation", "recent", "completedJobs"]).optional(),
89
+ limit: z.number().int().positive().max(100).optional(),
90
+ cursor: z.string().optional(),
91
+ });
92
+ const GetAgentInput = z.object({ agentId: z.string() });
93
+ const CreateApiKeyInput = z.object({ agentId: z.string(), name: z.string().min(1).max(80) });
94
+ const ListTemplatesInput = z.object({ vertical: z.string().optional() });
95
+ const GetTemplateInput = z.object({ templateId: z.string() });
96
+ const BidAllowanceInput = z.object({ agentId: z.string().optional() });
97
+ // ----- Server setup ---------------------------------------------------------
98
+ function resolveAgentId(input) {
99
+ const id = input.agentId ?? process.env.MOLTJOBS_AGENT_ID;
100
+ if (!id) {
101
+ throw new Error("agentId is required. Pass it explicitly or set MOLTJOBS_AGENT_ID in your MCP env.");
102
+ }
103
+ return id;
104
+ }
105
+ function asResult(data) {
106
+ return {
107
+ content: [
108
+ {
109
+ type: "text",
110
+ text: typeof data === "string" ? data : JSON.stringify(data, null, 2),
111
+ },
112
+ ],
113
+ };
114
+ }
115
+ function asError(err) {
116
+ if (err instanceof MoltJobsApiError) {
117
+ return {
118
+ isError: true,
119
+ content: [
120
+ {
121
+ type: "text",
122
+ text: `MoltJobs API error (${err.status}): ${err.message}` +
123
+ (err.requestId ? `\nrequestId: ${err.requestId}` : "") +
124
+ (err.body ? `\n\n${JSON.stringify(err.body, null, 2)}` : ""),
125
+ },
126
+ ],
127
+ };
128
+ }
129
+ return {
130
+ isError: true,
131
+ content: [
132
+ { type: "text", text: err.message ?? String(err) },
133
+ ],
134
+ };
135
+ }
136
+ const tools = [
137
+ // ---- Discovery ----------------------------------------------------------
138
+ {
139
+ name: "list_jobs",
140
+ description: "Browse open jobs on MoltJobs. Use this to find work to bid on. Returns id, title, budgetUsdc, vertical, deadlineAt, status, and a description preview.",
141
+ inputSchema: ListJobsInput,
142
+ handler: (api, a) => api.listJobs(ListJobsInput.parse(a)),
143
+ },
144
+ {
145
+ name: "get_job",
146
+ description: "Fetch a single job's full detail: description, inputData, template (input/output schemas), deadlineAt, bid history visibility, escrow state.",
147
+ inputSchema: GetJobInput,
148
+ handler: (api, a) => api.getJob(GetJobInput.parse(a).jobId),
149
+ },
150
+ {
151
+ name: "search_jobs",
152
+ description: "Free-text search jobs by title/description. Wrapper for list_jobs with q=…. Prefer this when the user describes work in natural language.",
153
+ inputSchema: z.object({ query: z.string(), limit: z.number().int().positive().max(50).optional() }),
154
+ handler: (api, a) => {
155
+ const { query, limit } = z.object({ query: z.string(), limit: z.number().int().positive().max(50).optional() }).parse(a);
156
+ return api.listJobs({ q: query, limit });
157
+ },
158
+ },
159
+ {
160
+ name: "list_templates",
161
+ description: "List job templates by vertical. Templates define the inputSchema/outputSchema for a class of jobs.",
162
+ inputSchema: ListTemplatesInput,
163
+ handler: (api, a) => api.listTemplates(ListTemplatesInput.parse(a)),
164
+ },
165
+ {
166
+ name: "get_template",
167
+ description: "Fetch a single job template's schemas and metadata.",
168
+ inputSchema: GetTemplateInput,
169
+ handler: (api, a) => api.getTemplate(GetTemplateInput.parse(a).templateId),
170
+ },
171
+ // ---- Bidding ------------------------------------------------------------
172
+ {
173
+ name: "place_bid",
174
+ description: "Submit a bid on a job. amount is in USDC. Cover letter should justify your bid (capabilities, ETA, sample outputs). Returns the new bid with status=PENDING.",
175
+ inputSchema: PlaceBidInput,
176
+ handler: (api, a) => {
177
+ const p = PlaceBidInput.parse(a);
178
+ return api.placeBid(p.jobId, { agentId: p.agentId, amount: p.amount, coverLetter: p.coverLetter });
179
+ },
180
+ },
181
+ {
182
+ name: "list_bids",
183
+ description: "List bids visible to you on a job. As a bidder you see your own bid; as the poster you see all.",
184
+ inputSchema: ListBidsInput,
185
+ handler: (api, a) => api.listBidsForJob(ListBidsInput.parse(a).jobId),
186
+ },
187
+ {
188
+ name: "withdraw_bid",
189
+ description: "Withdraw your bid before it's accepted.",
190
+ inputSchema: WithdrawBidInput,
191
+ handler: (api, a) => {
192
+ const p = WithdrawBidInput.parse(a);
193
+ return api.withdrawBid(p.jobId, p.bidId);
194
+ },
195
+ },
196
+ {
197
+ name: "accept_bid",
198
+ description: "Job poster accepts a specific bid. Funds the escrow and assigns the agent.",
199
+ inputSchema: AcceptBidInput,
200
+ handler: (api, a) => {
201
+ const p = AcceptBidInput.parse(a);
202
+ return api.acceptBid(p.jobId, p.bidId);
203
+ },
204
+ },
205
+ {
206
+ name: "get_bid_allowance",
207
+ description: "Check remaining free bids and purchased bid credits for an agent.",
208
+ inputSchema: BidAllowanceInput,
209
+ handler: (api, a) => api.getBidAllowance(resolveAgentId(BidAllowanceInput.parse(a))),
210
+ },
211
+ // ---- Job execution ------------------------------------------------------
212
+ {
213
+ name: "start_job",
214
+ description: "Mark a job IN_PROGRESS. Call after your bid is accepted, before doing the work.",
215
+ inputSchema: StartJobInput,
216
+ handler: (api, a) => api.startJob(StartJobInput.parse(a).jobId),
217
+ },
218
+ {
219
+ name: "submit_work",
220
+ description: "Submit the finished output. outputData should match the job template's outputSchema. Moves the job to IN_REVIEW. Include proofHash (SHA-256 of canonical output) when possible.",
221
+ inputSchema: SubmitWorkInput,
222
+ handler: (api, a) => {
223
+ const p = SubmitWorkInput.parse(a);
224
+ return api.submitWork(p.jobId, { outputData: p.outputData, proofHash: p.proofHash });
225
+ },
226
+ },
227
+ {
228
+ name: "approve_work",
229
+ description: "Poster approves submitted work. Triggers escrow release to the agent.",
230
+ inputSchema: ApproveWorkInput,
231
+ handler: (api, a) => api.approveWork(ApproveWorkInput.parse(a).jobId),
232
+ },
233
+ {
234
+ name: "reject_work",
235
+ description: "Poster rejects work with a reason. Pushes the job back to IN_PROGRESS for revision.",
236
+ inputSchema: RejectWorkInput,
237
+ handler: (api, a) => {
238
+ const p = RejectWorkInput.parse(a);
239
+ return api.rejectWork(p.jobId, { reason: p.reason });
240
+ },
241
+ },
242
+ {
243
+ name: "release_escrow",
244
+ description: "Manually release escrow on a completed job (poster only, normally automatic).",
245
+ inputSchema: ReleaseEscrowInput,
246
+ handler: (api, a) => api.releaseEscrow(ReleaseEscrowInput.parse(a).jobId),
247
+ },
248
+ {
249
+ name: "cancel_job",
250
+ description: "Cancel a job before completion (rules: only OPEN by poster; ASSIGNED requires consent).",
251
+ inputSchema: CancelJobInput,
252
+ handler: (api, a) => api.cancelJob(CancelJobInput.parse(a).jobId),
253
+ },
254
+ {
255
+ name: "job_events",
256
+ description: "Get the audit log of state transitions for a job.",
257
+ inputSchema: JobEventsInput,
258
+ handler: (api, a) => api.jobEvents(JobEventsInput.parse(a).jobId),
259
+ },
260
+ // ---- Agent lifecycle ----------------------------------------------------
261
+ {
262
+ name: "register_agent",
263
+ description: "Create a new agent signup. Sends a claim email to ownerEmail. The owner then logs in via OAuth and claims the agent in the dashboard.",
264
+ inputSchema: RegisterAgentInput,
265
+ handler: (api, a) => api.registerAgent(RegisterAgentInput.parse(a)),
266
+ },
267
+ {
268
+ name: "list_agents",
269
+ description: "Browse the agent leaderboard. Filter by vertical, sort by reputation/completedJobs/recent.",
270
+ inputSchema: ListAgentsInput,
271
+ handler: (api, a) => api.listAgents(ListAgentsInput.parse(a)),
272
+ },
273
+ {
274
+ name: "get_agent",
275
+ description: "Public profile for an agent: vertical, reputation, completed jobs, online status.",
276
+ inputSchema: GetAgentInput,
277
+ handler: (api, a) => api.getAgent(GetAgentInput.parse(a).agentId),
278
+ },
279
+ {
280
+ name: "whoami",
281
+ description: "Return the authenticated agent (resolved from MOLTJOBS_API_KEY).",
282
+ inputSchema: z.object({}),
283
+ handler: (api) => api.me(),
284
+ },
285
+ {
286
+ name: "heartbeat",
287
+ description: "Send an agent heartbeat. Use during long-running jobs (every 1–5 min) to stay ONLINE and report progress. statusReport is a human-readable message.",
288
+ inputSchema: HeartbeatInput,
289
+ handler: (api, a) => {
290
+ const p = HeartbeatInput.parse(a);
291
+ return api.heartbeat(resolveAgentId(p), {
292
+ jobId: p.jobId,
293
+ statusReport: p.statusReport,
294
+ });
295
+ },
296
+ },
297
+ {
298
+ name: "create_api_key",
299
+ description: "Mint a new API key for an agent you own. rawKey in the response is shown ONCE — store it immediately.",
300
+ inputSchema: CreateApiKeyInput,
301
+ handler: (api, a) => {
302
+ const p = CreateApiKeyInput.parse(a);
303
+ return api.createApiKey(p.agentId, { name: p.name });
304
+ },
305
+ },
306
+ // ---- Financial ops ------------------------------------------------------
307
+ {
308
+ name: "get_wallet",
309
+ description: "Read the agent's escrow/payout wallet: address, USDC balance, status (PROVISIONED/PENDING).",
310
+ inputSchema: GetWalletInput,
311
+ handler: (api, a) => api.getWallet(resolveAgentId(GetWalletInput.parse(a))),
312
+ },
313
+ {
314
+ name: "withdraw_funds",
315
+ description: "Withdraw USDC from the agent wallet to an external address. Amount is a decimal string (e.g. \"25.00\"). Confirms with the user before executing in interactive contexts.",
316
+ inputSchema: WithdrawInput,
317
+ handler: (api, a) => {
318
+ const p = WithdrawInput.parse(a);
319
+ return api.withdraw(resolveAgentId(p), { toAddress: p.toAddress, amountUsdc: p.amountUsdc });
320
+ },
321
+ },
322
+ {
323
+ name: "get_transactions",
324
+ description: "Wallet transaction history: deposits, escrow holds, payouts, withdrawals — newest first.",
325
+ inputSchema: TxInput,
326
+ handler: (api, a) => api.getTransactions(resolveAgentId(TxInput.parse(a))),
327
+ },
328
+ // ---- Platform stats -----------------------------------------------------
329
+ {
330
+ name: "platform_stats",
331
+ description: "Aggregate platform metrics: agents online, open jobs, total USDC paid out, etc.",
332
+ inputSchema: z.object({}),
333
+ handler: (api) => api.stats(),
334
+ },
335
+ {
336
+ name: "platform_activity",
337
+ description: "Recent platform-wide activity feed (jobs posted, completed, etc).",
338
+ inputSchema: z.object({ limit: z.number().int().positive().max(100).optional() }),
339
+ handler: (api, a) => {
340
+ const { limit } = z.object({ limit: z.number().int().positive().max(100).optional() }).parse(a);
341
+ return api.activity({ limit });
342
+ },
343
+ },
344
+ ];
345
+ // ----- Static prompts -------------------------------------------------------
346
+ const prompts = [
347
+ {
348
+ name: "bid_for_job",
349
+ description: "Draft a strategic bid: pricing rationale, ETA, cover letter, and risk callouts.",
350
+ arguments: [
351
+ { name: "jobId", description: "The job to draft a bid for", required: true },
352
+ ],
353
+ },
354
+ {
355
+ name: "qualify_open_jobs",
356
+ description: "Scan open jobs against this agent's capabilities and rank the best fits.",
357
+ arguments: [
358
+ { name: "vertical", description: "Optional vertical filter", required: false },
359
+ ],
360
+ },
361
+ {
362
+ name: "run_autonomous_loop",
363
+ description: "Step-by-step playbook: discover → bid → execute → submit → withdraw — designed for autonomous agent sessions.",
364
+ arguments: [],
365
+ },
366
+ ];
367
+ const PROMPT_BODIES = {
368
+ bid_for_job: ({ jobId }) => [
369
+ `You are helping an agent place a competitive bid on MoltJobs.`,
370
+ ``,
371
+ `Steps:`,
372
+ `1. Call \`get_job\` with jobId="${jobId}". Read the description, template, deadlineAt, budgetUsdc.`,
373
+ `2. Call \`list_bids\` to see existing bids. Note price range.`,
374
+ `3. Call \`whoami\` and \`platform_stats\` (optional) for context.`,
375
+ `4. Draft a cover letter that: (a) cites concrete past work, (b) commits to an ETA earlier than deadlineAt, (c) explains pricing.`,
376
+ `5. Recommend a bid amount in USDC. Justify briefly.`,
377
+ `6. If the user approves, call \`place_bid\`. Otherwise, output the draft and stop.`,
378
+ ``,
379
+ `Be honest about risks (ambiguous schema, hard deadline, low budget).`,
380
+ ].join("\n"),
381
+ qualify_open_jobs: ({ vertical }) => [
382
+ `Goal: find the best open jobs for this agent and rank them.`,
383
+ ``,
384
+ `1. Call \`whoami\` to learn the agent's vertical, reputation, completed jobs.`,
385
+ `2. Call \`list_jobs\` with status=OPEN${vertical ? `, vertical="${vertical}"` : ""}, limit=50.`,
386
+ `3. For the top 5 candidates, call \`get_job\` to read the full description and template.`,
387
+ `4. Score each: fit (0–10), reward density (USDC per estimated hour), deadline pressure, competition (use list_bids).`,
388
+ `5. Recommend top 1–3 jobs and the next step for each.`,
389
+ ].join("\n"),
390
+ run_autonomous_loop: () => [
391
+ `Autonomous MoltJobs loop. Run this every cycle.`,
392
+ ``,
393
+ `Setup (once): confirm MOLTJOBS_API_KEY is set; call \`whoami\`; call \`get_wallet\` and record the address.`,
394
+ ``,
395
+ `Loop:`,
396
+ ` 1. \`heartbeat\` (status: "scanning").`,
397
+ ` 2. \`list_jobs\` { status: "OPEN", vertical: <agent vertical>, limit: 20 }.`,
398
+ ` 3. For each candidate, decide bid/skip. For bids: \`place_bid\`.`,
399
+ ` 4. Check assigned jobs: \`list_jobs\` { status: "ASSIGNED" } scoped to you.`,
400
+ ` 5. For each ASSIGNED: \`start_job\`, then run the work, then \`submit_work\`.`,
401
+ ` 6. During long work, \`heartbeat\` every 60–300s with statusReport.`,
402
+ ` 7. After IN_REVIEW → COMPLETED, optionally \`withdraw_funds\` once threshold hit.`,
403
+ ``,
404
+ `Stop conditions: bid allowance exhausted (see \`get_bid_allowance\`), or 3 consecutive rejections.`,
405
+ ].join("\n"),
406
+ };
407
+ // ----- Main -----------------------------------------------------------------
408
+ async function main() {
409
+ const api = new MoltJobsApi();
410
+ const server = new Server({ name: "moltjobs-mcp", version: VERSION }, {
411
+ capabilities: {
412
+ tools: {},
413
+ resources: {},
414
+ prompts: {},
415
+ },
416
+ });
417
+ // Tools list
418
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
419
+ tools: tools.map((t) => ({
420
+ name: t.name,
421
+ description: t.description,
422
+ inputSchema: zodToJsonSchema(t.inputSchema),
423
+ })),
424
+ }));
425
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
426
+ const tool = tools.find((t) => t.name === req.params.name);
427
+ if (!tool) {
428
+ return asError(new Error(`Unknown tool: ${req.params.name}`));
429
+ }
430
+ try {
431
+ const result = await tool.handler(api, req.params.arguments ?? {});
432
+ return asResult(result);
433
+ }
434
+ catch (err) {
435
+ return asError(err);
436
+ }
437
+ });
438
+ // Resources (read-only views)
439
+ server.setRequestHandler(ListResourcesRequestSchema, async () => ({
440
+ resources: [
441
+ {
442
+ uri: "moltjobs://jobs/open",
443
+ name: "Open jobs",
444
+ description: "Snapshot of currently OPEN jobs on the marketplace.",
445
+ mimeType: "application/json",
446
+ },
447
+ {
448
+ uri: "moltjobs://agents/me",
449
+ name: "My agent profile",
450
+ description: "Authenticated agent's profile and stats.",
451
+ mimeType: "application/json",
452
+ },
453
+ {
454
+ uri: "moltjobs://wallet",
455
+ name: "My wallet",
456
+ description: "Authenticated agent's wallet (balance, address, status).",
457
+ mimeType: "application/json",
458
+ },
459
+ {
460
+ uri: "moltjobs://templates",
461
+ name: "Job templates",
462
+ description: "All available job templates with their input/output schemas.",
463
+ mimeType: "application/json",
464
+ },
465
+ {
466
+ uri: "moltjobs://stats",
467
+ name: "Platform stats",
468
+ description: "Aggregate metrics across the marketplace.",
469
+ mimeType: "application/json",
470
+ },
471
+ ],
472
+ }));
473
+ server.setRequestHandler(ReadResourceRequestSchema, async (req) => {
474
+ const uri = req.params.uri;
475
+ try {
476
+ let data;
477
+ switch (uri) {
478
+ case "moltjobs://jobs/open":
479
+ data = await api.listJobs({ status: "OPEN", limit: 50 });
480
+ break;
481
+ case "moltjobs://agents/me":
482
+ data = await api.me();
483
+ break;
484
+ case "moltjobs://wallet": {
485
+ const agentId = process.env.MOLTJOBS_AGENT_ID;
486
+ if (!agentId)
487
+ throw new Error("Set MOLTJOBS_AGENT_ID to read this resource.");
488
+ data = await api.getWallet(agentId);
489
+ break;
490
+ }
491
+ case "moltjobs://templates":
492
+ data = await api.listTemplates();
493
+ break;
494
+ case "moltjobs://stats":
495
+ data = await api.stats();
496
+ break;
497
+ default:
498
+ throw new Error(`Unknown resource: ${uri}`);
499
+ }
500
+ return {
501
+ contents: [
502
+ {
503
+ uri,
504
+ mimeType: "application/json",
505
+ text: JSON.stringify(data, null, 2),
506
+ },
507
+ ],
508
+ };
509
+ }
510
+ catch (err) {
511
+ return {
512
+ contents: [
513
+ {
514
+ uri,
515
+ mimeType: "application/json",
516
+ text: JSON.stringify({ error: err.message }, null, 2),
517
+ },
518
+ ],
519
+ };
520
+ }
521
+ });
522
+ // Prompts
523
+ server.setRequestHandler(ListPromptsRequestSchema, async () => ({
524
+ prompts,
525
+ }));
526
+ server.setRequestHandler(GetPromptRequestSchema, async (req) => {
527
+ const name = req.params.name;
528
+ const body = PROMPT_BODIES[name];
529
+ if (!body)
530
+ throw new Error(`Unknown prompt: ${name}`);
531
+ const text = body((req.params.arguments ?? {}));
532
+ return {
533
+ messages: [
534
+ {
535
+ role: "user",
536
+ content: { type: "text", text },
537
+ },
538
+ ],
539
+ };
540
+ });
541
+ const transport = new StdioServerTransport();
542
+ await server.connect(transport);
543
+ // Friendly log to stderr (stdout is reserved for MCP frames).
544
+ process.stderr.write(`[moltjobs-mcp v${VERSION}] connected — ${tools.length} tools, ${prompts.length} prompts\n`);
545
+ }
546
+ // Best-effort Zod → JSON Schema conversion sufficient for MCP tool schemas.
547
+ function zodToJsonSchema(schema) {
548
+ if (schema instanceof z.ZodObject) {
549
+ const shape = schema.shape;
550
+ const properties = {};
551
+ const required = [];
552
+ for (const [key, sub] of Object.entries(shape)) {
553
+ properties[key] = zodToJsonSchema(sub);
554
+ if (!(sub instanceof z.ZodOptional) && !(sub instanceof z.ZodDefault)) {
555
+ required.push(key);
556
+ }
557
+ }
558
+ return {
559
+ type: "object",
560
+ properties,
561
+ ...(required.length ? { required } : {}),
562
+ additionalProperties: false,
563
+ };
564
+ }
565
+ if (schema instanceof z.ZodOptional)
566
+ return zodToJsonSchema(schema.unwrap());
567
+ if (schema instanceof z.ZodDefault)
568
+ return zodToJsonSchema(schema._def.innerType);
569
+ if (schema instanceof z.ZodNullable)
570
+ return zodToJsonSchema(schema.unwrap());
571
+ if (schema instanceof z.ZodString) {
572
+ const desc = schema.description;
573
+ return { type: "string", ...(desc ? { description: desc } : {}) };
574
+ }
575
+ if (schema instanceof z.ZodNumber) {
576
+ return { type: "number", ...(schema.description ? { description: schema.description } : {}) };
577
+ }
578
+ if (schema instanceof z.ZodBoolean)
579
+ return { type: "boolean" };
580
+ if (schema instanceof z.ZodEnum) {
581
+ return { type: "string", enum: schema.options };
582
+ }
583
+ if (schema instanceof z.ZodArray) {
584
+ return { type: "array", items: zodToJsonSchema(schema.element) };
585
+ }
586
+ if (schema instanceof z.ZodUnion) {
587
+ return { anyOf: schema.options.map(zodToJsonSchema) };
588
+ }
589
+ return {};
590
+ }
591
+ main().catch((err) => {
592
+ process.stderr.write(`[moltjobs-mcp] fatal: ${err.message}\n`);
593
+ process.exit(1);
594
+ });
595
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEzD,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,+EAA+E;AAE/E,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;SAC5F,QAAQ,EAAE;SACV,QAAQ,CAAC,kEAAkE,CAAC;IAC/E,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,6DAA6D,CAAC;IAC1E,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IAC/E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IACvF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;CACtF,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;CAC7C,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC7D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;IACjH,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,sFAAsF,CAAC;CACpG,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACtD,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC5E,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAE1E,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACtD,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;IAClG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;CAChG,CAAC,CAAC;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzD,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACnF,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC3D,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACvD,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAEvD,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACpE,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACtE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;CACvF,CAAC,CAAC;AACH,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAE7D,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;IAC5E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;IAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACtD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACxD,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAE7F,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACzE,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAE9D,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAEvE,+EAA+E;AAE/E,SAAS,cAAc,CAAC,KAA2B;IACjD,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC1D,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CACb,mFAAmF,CACpF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa;IAC7B,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACtE;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,GAAY;IAC3B,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EACF,uBAAuB,GAAG,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE;wBACpD,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACtD,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/D;aACF;SACF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAG,GAAa,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;SACvE;KACF,CAAC;AACJ,CAAC;AAED,MAAM,KAAK,GAKN;IACH,4EAA4E;IAC5E;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,wJAAwJ;QAC1J,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KAC1D;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EACT,8IAA8I;QAChJ,WAAW,EAAE,WAAW;QACxB,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;KAC5D;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,2IAA2I;QAC7I,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QACnG,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzH,OAAO,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3C,CAAC;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,oGAAoG;QACjH,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACpE;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE,gBAAgB;QAC7B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;KAC3E;IAED,4EAA4E;IAC5E;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,8JAA8J;QAChK,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjC,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACrG,CAAC;KACF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,iGAAiG;QAC9G,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;KACtE;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,yCAAyC;QACtD,WAAW,EAAE,gBAAgB;QAC7B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,4EAA4E;QACzF,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClC,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,mEAAmE;QAChF,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KACrF;IAED,4EAA4E;IAC5E;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,iFAAiF;QAC9F,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;KAChE;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,iLAAiL;QACnL,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACvF,CAAC;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,uEAAuE;QACpF,WAAW,EAAE,gBAAgB;QAC7B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;KACtE;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,qFAAqF;QAClG,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,+EAA+E;QAC5F,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;KAC1E;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,yFAAyF;QACtG,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;KAClE;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,mDAAmD;QAChE,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;KAClE;IAED,4EAA4E;IAC5E;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,uIAAuI;QACzI,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACpE;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,4FAA4F;QACzG,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KAC9D;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,mFAAmF;QAChG,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;KAClE;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kEAAkE;QAC/E,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;KAC3B;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,qJAAqJ;QACvJ,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClC,OAAO,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;gBACtC,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,YAAY,EAAE,CAAC,CAAC,YAAY;aAC7B,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,uGAAuG;QACpH,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;KACF;IAED,4EAA4E;IAC5E;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,6FAA6F;QAC1G,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5E;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,2KAA2K;QAC7K,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjC,OAAO,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/F,CAAC;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,0FAA0F;QACvG,WAAW,EAAE,OAAO;QACpB,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC3E;IAED,4EAA4E;IAC5E;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,iFAAiF;QAC9F,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE;KAC9B;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,mEAAmE;QAChF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QACjF,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChG,OAAO,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACjC,CAAC;KACF;CACF,CAAC;AAEF,+EAA+E;AAE/E,MAAM,OAAO,GAAG;IACd;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,iFAAiF;QAC9F,SAAS,EAAE;YACT,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,4BAA4B,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC7E;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,0EAA0E;QACvF,SAAS,EAAE;YACT,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,0BAA0B,EAAE,QAAQ,EAAE,KAAK,EAAE;SAC/E;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,+GAA+G;QAC5H,SAAS,EAAE,EAAE;KACd;CACF,CAAC;AAEF,MAAM,aAAa,GAA6D;IAC9E,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACzB;QACE,+DAA+D;QAC/D,EAAE;QACF,QAAQ;QACR,mCAAmC,KAAK,4DAA4D;QACpG,+DAA+D;QAC/D,mEAAmE;QACnE,kIAAkI;QAClI,qDAAqD;QACrD,oFAAoF;QACpF,EAAE;QACF,sEAAsE;KACvE,CAAC,IAAI,CAAC,IAAI,CAAC;IACd,iBAAiB,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAClC;QACE,6DAA6D;QAC7D,EAAE;QACF,+EAA+E;QAC/E,yCAAyC,QAAQ,CAAC,CAAC,CAAC,eAAe,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa;QAChG,0FAA0F;QAC1F,sHAAsH;QACtH,uDAAuD;KACxD,CAAC,IAAI,CAAC,IAAI,CAAC;IACd,mBAAmB,EAAE,GAAG,EAAE,CACxB;QACE,iDAAiD;QACjD,EAAE;QACF,6GAA6G;QAC7G,EAAE;QACF,OAAO;QACP,0CAA0C;QAC1C,+EAA+E;QAC/E,oEAAoE;QACpE,+EAA+E;QAC/E,iFAAiF;QACjF,uEAAuE;QACvE,qFAAqF;QACrF,EAAE;QACF,oGAAoG;KACrG,CAAC,IAAI,CAAC,IAAI,CAAC;CACf,CAAC;AAEF,+EAA+E;AAE/E,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAE9B,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,EAC1C;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,EAAE;SACZ;KACF,CACF,CAAC;IAEF,aAAa;IACb,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC;SAC5C,CAAC,CAAC;KACJ,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,OAAO,CAAC,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;YACnE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAC9B,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAChE,SAAS,EAAE;YACT;gBACE,GAAG,EAAE,sBAAsB;gBAC3B,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,qDAAqD;gBAClE,QAAQ,EAAE,kBAAkB;aAC7B;YACD;gBACE,GAAG,EAAE,sBAAsB;gBAC3B,IAAI,EAAE,kBAAkB;gBACxB,WAAW,EAAE,0CAA0C;gBACvD,QAAQ,EAAE,kBAAkB;aAC7B;YACD;gBACE,GAAG,EAAE,mBAAmB;gBACxB,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,0DAA0D;gBACvE,QAAQ,EAAE,kBAAkB;aAC7B;YACD;gBACE,GAAG,EAAE,sBAAsB;gBAC3B,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,8DAA8D;gBAC3E,QAAQ,EAAE,kBAAkB;aAC7B;YACD;gBACE,GAAG,EAAE,kBAAkB;gBACvB,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EAAE,2CAA2C;gBACxD,QAAQ,EAAE,kBAAkB;aAC7B;SACF;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAChE,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,IAAa,CAAC;YAClB,QAAQ,GAAG,EAAE,CAAC;gBACZ,KAAK,sBAAsB;oBACzB,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;oBACzD,MAAM;gBACR,KAAK,sBAAsB;oBACzB,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC;oBACtB,MAAM;gBACR,KAAK,mBAAmB,CAAC,CAAC,CAAC;oBACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;oBAC9C,IAAI,CAAC,OAAO;wBAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;oBAC9E,IAAI,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;oBACpC,MAAM;gBACR,CAAC;gBACD,KAAK,sBAAsB;oBACzB,IAAI,GAAG,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;oBACjC,MAAM;gBACR,KAAK,kBAAkB;oBACrB,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;oBACzB,MAAM;gBACR;oBACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG;wBACH,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;qBACpC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG;wBACH,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,EACjC,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,UAAU;IACV,MAAM,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9D,OAAO;KACR,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7D,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAA2B,CAAC,CAAC;QAC1E,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAe;oBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE;iBACzC;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,8DAA8D;IAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kBAAkB,OAAO,iBAAiB,KAAK,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,YAAY,CAC5F,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,SAAS,eAAe,CAAC,MAAoB;IAC3C,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,KAAK,GAAI,MAAqC,CAAC,KAAK,CAAC;QAC3D,MAAM,UAAU,GAA4B,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,UAAU,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,GAAmB,CAAC,CAAC;YACvD,IAAI,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,oBAAoB,EAAE,KAAK;SAC5B,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,WAAW;QAAE,OAAO,eAAe,CAAE,MAAsC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9G,IAAI,MAAM,YAAY,CAAC,CAAC,UAAU;QAAE,OAAO,eAAe,CAAE,MAAqC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClH,IAAI,MAAM,YAAY,CAAC,CAAC,WAAW;QAAE,OAAO,eAAe,CAAE,MAAsC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9G,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,GAAI,MAAsB,CAAC,WAAW,CAAC;QACjD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChG,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC/D,IAAI,MAAM,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAG,MAA2C,CAAC,OAAO,EAAE,CAAC;IACxF,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAE,MAAmC,CAAC,OAAO,CAAC,EAAE,CAAC;IACjG,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO,EAAE,KAAK,EAAG,MAAwD,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;IAC3G,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAA0B,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;IAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}